@datarecce/ui 1.53.1 → 1.54.0-nightly.20260617

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/advanced.d.ts +3 -3
  2. package/dist/advanced.js +1 -1
  3. package/dist/advanced.js.map +1 -1
  4. package/dist/api-S5ho3Qs3.js +3 -0
  5. package/dist/{api-DTKI1Y_n.js.map → api-S5ho3Qs3.js.map} +1 -1
  6. package/dist/api.js +1 -1
  7. package/dist/components-run.js +1 -1
  8. package/dist/components.d.ts +3 -3
  9. package/dist/components.js +1 -1
  10. package/dist/contexts.js +1 -1
  11. package/dist/{fetchClient-Bf9Q3QKq.js → fetchClient-D0p358nB.js} +2 -2
  12. package/dist/{fetchClient-Bf9Q3QKq.js.map → fetchClient-D0p358nB.js.map} +1 -1
  13. package/dist/hooks-lhWocOS8.js +7 -0
  14. package/dist/hooks-lhWocOS8.js.map +1 -0
  15. package/dist/hooks.js +1 -1
  16. package/dist/{index-BI0TA-5T.d.ts → index-DveSUwHm.d.ts} +2 -2
  17. package/dist/{index-BI0TA-5T.d.ts.map → index-DveSUwHm.d.ts.map} +1 -1
  18. package/dist/index.d.ts +3 -3
  19. package/dist/index.js +1 -1
  20. package/dist/{keepAlive-Bowms1oa.js → keepAlive-bjIHulj-.js} +2 -2
  21. package/dist/{keepAlive-Bowms1oa.js.map → keepAlive-bjIHulj-.js.map} +1 -1
  22. package/dist/lib/api/user.js +1 -1
  23. package/dist/{lineage-DQYm0BLV.d.ts → lineage-CH52TNrQ.d.ts} +4 -4
  24. package/dist/{lineage-DQYm0BLV.d.ts.map → lineage-CH52TNrQ.d.ts.map} +1 -1
  25. package/dist/{primitives-CMRs10su.d.ts → primitives-BjFY8zYY.d.ts} +3 -3
  26. package/dist/{primitives-CMRs10su.d.ts.map → primitives-BjFY8zYY.d.ts.map} +1 -1
  27. package/dist/primitives.d.ts +1 -1
  28. package/dist/primitives.js +1 -1
  29. package/dist/result.js +1 -1
  30. package/dist/src-C3oHx0rY.js +12 -0
  31. package/dist/src-C3oHx0rY.js.map +1 -0
  32. package/dist/style.css +23 -23
  33. package/dist/theme-u98ih3Tv.js +3 -0
  34. package/dist/theme-u98ih3Tv.js.map +1 -0
  35. package/dist/theme.js +1 -1
  36. package/dist/types.d.ts +2 -2
  37. package/dist/utils-Dl2dMzK8.js +6 -0
  38. package/dist/utils-Dl2dMzK8.js.map +1 -0
  39. package/dist/utils-FOrjYCpW.js +3 -0
  40. package/dist/{utils-BzZEjJAS.js.map → utils-FOrjYCpW.js.map} +1 -1
  41. package/dist/utils.js +1 -1
  42. package/package.json +1 -1
  43. package/dist/api-DTKI1Y_n.js +0 -3
  44. package/dist/components-CX4IKLp2.js +0 -3
  45. package/dist/components-CX4IKLp2.js.map +0 -1
  46. package/dist/lineage-yiiuC0Il.js +0 -7
  47. package/dist/lineage-yiiuC0Il.js.map +0 -1
  48. package/dist/src-BjFwHKOB.js +0 -3
  49. package/dist/src-BjFwHKOB.js.map +0 -1
  50. package/dist/theme-wN7zbYoG.js +0 -3
  51. package/dist/theme-wN7zbYoG.js.map +0 -1
  52. package/dist/utils-BzZEjJAS.js +0 -3
  53. package/dist/utils-D1bvitEj.js +0 -6
  54. package/dist/utils-D1bvitEj.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"api-DTKI1Y_n.js","names":["defaultApiClient"],"sources":["../src/api/types/run.ts","../src/api/runs.ts","../src/api/adhocQuery.ts","../src/api/checkEvents.ts","../src/api/checks.ts","../src/api/cll.ts","../src/api/info.ts","../src/api/lineagecheck.ts","../src/api/rowcount.ts","../src/api/models.ts","../src/api/profile.ts","../src/api/schemacheck.ts","../src/api/select.ts","../src/api/state.ts","../src/api/storageKeys.ts","../src/api/valuediff.ts","../src/api/version.ts"],"sourcesContent":["// packages/ui/src/api/types/run.ts\n// Run types for @datarecce/ui API layer\n// These types define the structure of run objects and their variants\n\nimport type {\n QueryDiffParams,\n QueryDiffResult,\n QueryResult,\n QueryRunParams,\n} from \"../adhocQuery\";\nimport type { LineageDiffResult } from \"../info\";\n// Import param/result types from API modules\nimport type {\n HistogramDiffParams,\n HistogramDiffResult,\n ProfileDiffParams,\n ProfileDiffResult,\n TopKDiffParams,\n TopKDiffResult,\n} from \"../profile\";\nimport type {\n RowCountDiffParams,\n RowCountDiffResult,\n RowCountParams,\n RowCountResult,\n} from \"../rowcount\";\nimport type {\n ValueDiffDetailParams,\n ValueDiffDetailResult,\n ValueDiffParams,\n ValueDiffResult,\n} from \"../valuediff\";\n\n// ============================================================================\n// Run Type Enum\n// ============================================================================\n\n/**\n * All possible run types in the Recce system.\n * This is the canonical definition - consumers should import from here.\n *\n * Note: ``profile_distribution`` is a backend-only run type (DRC-3390). It\n * feeds into schema-view cells rather than rendering as a checklist run, so\n * the run registry has no entry for it — `findByRunType` returns `undefined`.\n * The dispatcher accepts it; the registry does not.\n */\nexport type RunType =\n | \"simple\"\n | \"query\"\n | \"query_base\"\n | \"query_diff\"\n | \"value_diff\"\n | \"value_diff_detail\"\n | \"schema_diff\"\n | \"profile\"\n | \"profile_diff\"\n | \"row_count\"\n | \"row_count_diff\"\n | \"lineage_diff\"\n | \"top_k_diff\"\n | \"histogram_diff\"\n | \"profile_distribution\";\n\n// ============================================================================\n// Run Status Types\n// ============================================================================\n\n/**\n * Possible status values for a run\n */\nexport type RunStatus = \"Finished\" | \"Failed\" | \"Cancelled\" | \"Running\";\n\n/**\n * Progress information for a running task\n */\nexport interface RunProgress {\n message?: string;\n percentage?: number;\n}\n\n// ============================================================================\n// Base Run Interface\n// ============================================================================\n\n/**\n * Base interface for all run objects.\n * All run variants extend this interface with specific params and results.\n */\nexport interface BaseRun {\n /** The type of run - determines params/result structure */\n type: RunType;\n /** Unique identifier for this run */\n run_id: string;\n /** ISO timestamp when the run was executed */\n run_at: string;\n /** Optional human-readable name for the run */\n name?: string;\n /** ID of the check this run belongs to, if any */\n check_id?: string;\n /** Progress information for running tasks */\n progress?: RunProgress;\n /** Error message if the run failed */\n error?: string;\n /** Current status of the run */\n status?: RunStatus;\n /** Who triggered this run: \"user\" | \"recce_ai\" */\n triggered_by?: string;\n}\n\n// ============================================================================\n// Run Param Types (without external dependencies)\n// ============================================================================\n\n/**\n * Schema diff params - used by schema_diff runs\n * Compares schema between base and current environments\n */\nexport interface SchemaDiffParams {\n /** Node ID(s) to compare - can be single or multiple */\n node_id?: string | string[];\n /** dbt select syntax for filtering nodes */\n select?: string;\n /** dbt exclude syntax for filtering nodes */\n exclude?: string;\n /** Package names to include */\n packages?: string[];\n /** View mode - show all models or only changed ones */\n view_mode?: \"all\" | \"changed_models\";\n}\n\n/**\n * Lineage diff params - used by lineage_diff runs\n * Compares lineage graph between base and current environments\n */\nexport interface LineageDiffParams {\n /** dbt select syntax for filtering nodes */\n select?: string;\n /** dbt exclude syntax for filtering nodes */\n exclude?: string;\n /** Package names to include */\n packages?: string[];\n /** View mode - show all models or only changed ones */\n view_mode?: \"all\" | \"changed_models\";\n}\n\n// ============================================================================\n// Run Param Types - Union of all possible run parameters\n// ============================================================================\n\n/**\n * Union of all possible run parameter types.\n * Use this when you need to accept any run params type.\n */\nexport type RunParamTypes =\n | QueryRunParams\n | QueryDiffParams\n | ValueDiffParams\n | ValueDiffDetailParams\n | SchemaDiffParams\n | ProfileDiffParams\n | RowCountParams\n | RowCountDiffParams\n | LineageDiffParams\n | TopKDiffParams\n | HistogramDiffParams\n | ProfileDistributionParams\n | undefined;\n\n// ============================================================================\n// Profile Distribution (DRC-3390 Stage B)\n//\n// Backend-only run type — Stage C's schema-view cells consume these payloads,\n// they don't render as a checklist run. The shape is the API contract Stage B\n// freezes; the backend serves DuckDB; non-DuckDB adapters return the\n// ``unsupported`` envelope variant.\n// ============================================================================\n\n/**\n * Params for a profile_distribution run.\n *\n * Pass ``model`` (the dbt model unique id) and optionally a ``columns``\n * subset to scope the run to just those columns. Omit ``columns`` to profile\n * every non-skipped column in the model.\n */\nexport interface ProfileDistributionParams {\n model: string;\n columns?: string[];\n}\n\n/**\n * Paired-histogram payload for a continuous (numeric or datetime) column.\n *\n * Each env carries its OWN edge array, built from its OWN quantiles:\n * ``base_bin_edges`` / ``current_bin_edges`` hold up to ``NUM_BINS + 1`` edges\n * in the full-quantile case, but a tied/degenerate column collapses adjacent\n * quantiles and yields fewer — edge counts are NOT fixed, so never index a\n * hard-coded position. The only invariant is per-env\n * ``density.length === edges.length - 1``. The two edge\n * arrays intentionally do NOT line up — the backend renders each env on its\n * own quantile spans (``density = (1/NUM_BINS)/span``), the only assumption-\n * free rendering of percentile-only data. The frontend overlays the two\n * staircases on a shared value axis; it must not assume aligned bins. See\n * PR #1398 / DRC-3390 for the contract rationale.\n *\n * Edge encoding is always numeric, but the UNIT depends on the column type:\n * numeric columns emit raw values, datetime columns emit epoch SECONDS (the\n * DRC-3504 ``epoch()`` cast). The payload carries no numeric-vs-datetime\n * marker, so the consumer must use the column's out-of-band dbt type to\n * decide whether to format edges as dates. Stage C owns that formatting.\n */\nexport interface ProfileDistributionHistogramPayload {\n kind: \"histogram\";\n /** Numeric values, or epoch seconds for datetime columns — see above. */\n base_bin_edges: number[];\n current_bin_edges: number[];\n base_density: number[];\n current_density: number[];\n base_total: number;\n current_total: number;\n}\n\n/**\n * Categorical top-K payload, **counts mode** — emitted by adapters whose\n * sketch exposes per-value counts (Snowflake / BigQuery / … in Stage D).\n *\n * ``values`` is the union of the two envs' top-K, base-first then current-only\n * (the same fair merge the ranks variant uses — interleaved before the ``k``\n * cap so neither env's divergent values are dropped).\n * ``base_counts`` / ``current_counts`` are aligned onto ``values`` (same\n * length, ``null`` in the slots where that env didn't have the value in its\n * top-K — Stage C renders those as gap-on-absent). The column-wide\n * denominator for proportions is the envelope's ``base_total`` /\n * ``current_total``, not the sum of the shown slots.\n *\n * When the adapter exposes **no** counts (DuckDB ``approx_top_k`` in Stage B),\n * the backend emits {@link ProfileDistributionTopKRanksPayload} instead — the\n * counts arrays here are therefore never wholly ``null``.\n *\n * ``trimmed`` is true when either env hit the sketch's ``k`` cap, meaning\n * there are more distinct values than fit in the slice.\n */\nexport interface ProfileDistributionTopKPayload {\n kind: \"topk\";\n /** Absent or ``\"counts\"`` selects this variant (vs ``\"ranks\"``). */\n mode?: \"counts\";\n values: unknown[];\n base_counts: (number | null)[];\n current_counts: (number | null)[];\n trimmed: boolean;\n}\n\n/**\n * Categorical top-K payload, **ranks mode** — emitted when the adapter\n * returns the top-K values but no counts (DuckDB ``approx_top_k``, the\n * Stage B hot path). Bar heights encode rank position only.\n *\n * Slot order is baked in by the backend: base's top-K in base-rank order,\n * then values present only in current's top-K appended on the right (in\n * current-rank order). ``base_ranks`` / ``current_ranks`` carry each value's\n * 1-indexed rank within that env's top-K, or ``null`` where the value isn't\n * in that env's top-K (no bar drawn for that side — gap-on-absent). ``k`` is\n * the top-K cap, driving bar-height scaling.\n *\n * Promoting this variant into the wire contract (it previously lived only in\n * the Storybook fixtures) is what lets DuckDB categorical columns render a\n * real paired cell — see DRC-3390's 2026-05-29 contract correction.\n */\nexport interface ProfileDistributionTopKRanksPayload {\n kind: \"topk\";\n mode: \"ranks\";\n values: unknown[];\n base_ranks: (number | null)[];\n current_ranks: (number | null)[];\n k: number;\n trimmed: boolean;\n}\n\n/**\n * Per-column failure marker — the column was attempted but couldn't be\n * computed (e.g., its percentile fragment errored even after the per-column\n * retry path). The frontend renders the column's cell as an inline error\n * without blanking the rest of the row.\n */\nexport interface ProfileDistributionNullPayload {\n kind: null;\n}\n\n/**\n * Per-column payload — one of the variants above. Stage C narrows on ``kind``\n * (histogram / topk / null), then on ``mode`` within ``topk`` (counts vs\n * ranks), to pick the right cell renderer.\n */\nexport type ProfileDistributionColumnPayload =\n | ProfileDistributionHistogramPayload\n | ProfileDistributionTopKPayload\n | ProfileDistributionTopKRanksPayload\n | ProfileDistributionNullPayload;\n\n/**\n * \"Ok\" envelope — the adapter supports the feature; ``columns`` holds the\n * per-column payloads keyed by column name.\n */\nexport interface ProfileDistributionOkResult {\n status: \"ok\";\n /** Strategy router picked this branch — Stage B only emits ``approx_all``. */\n strategy: \"approx_all\";\n columns: Record<string, ProfileDistributionColumnPayload>;\n base_total: number;\n current_total: number;\n /** True when this payload came from the in-memory memoization cache. */\n cache_hit?: boolean;\n}\n\n/**\n * \"Unsupported\" envelope — the adapter lacks native approximate-aggregate\n * support. Stage B's hot path for everything that isn't DuckDB; Stage D\n * extends adapter coverage so fewer adapters fall here.\n *\n * Stage C renders a single banner (not per-column markers) when it sees\n * this envelope.\n */\nexport interface ProfileDistributionUnsupportedResult {\n status: \"unsupported\";\n reason: string;\n columns: Record<string, never>;\n}\n\n/**\n * Discriminated union for the profile_distribution result.\n *\n * Narrow on ``status``:\n * ```ts\n * if (result.status === \"ok\") {\n * // result.columns is fully typed\n * } else {\n * // result.reason is the unsupported banner message\n * }\n * ```\n */\nexport type ProfileDistributionResult =\n | ProfileDistributionOkResult\n | ProfileDistributionUnsupportedResult;\n\n// ============================================================================\n// Run - Full Discriminated Union Type\n// ============================================================================\n\n/**\n * Run type with full discriminated union for type narrowing.\n * TypeScript can narrow params/result types based on the `type` field.\n *\n * Example:\n * ```ts\n * if (run.type === \"query_diff\") {\n * // TypeScript knows run.result is QueryDiffResult | undefined\n * console.log(run.result?.diff);\n * }\n * ```\n */\nexport type Run =\n | (BaseRun & {\n type: \"simple\";\n params?: undefined;\n result?: undefined;\n })\n | (BaseRun & {\n type: \"query\";\n params?: QueryRunParams;\n result?: QueryResult;\n })\n | (BaseRun & {\n type: \"query_base\";\n params?: QueryRunParams;\n result?: QueryResult;\n })\n | (BaseRun & {\n type: \"query_diff\";\n params?: QueryDiffParams;\n result?: QueryDiffResult;\n })\n | (BaseRun & {\n type: \"value_diff\";\n params?: ValueDiffParams;\n result?: ValueDiffResult;\n })\n | (BaseRun & {\n type: \"value_diff_detail\";\n params?: ValueDiffDetailParams;\n result?: ValueDiffDetailResult;\n })\n | (BaseRun & {\n type: \"schema_diff\";\n params?: SchemaDiffParams;\n result?: undefined;\n })\n | (BaseRun & {\n type: \"profile\";\n params?: ProfileDiffParams;\n result?: ProfileDiffResult;\n })\n | (BaseRun & {\n type: \"profile_diff\";\n params?: ProfileDiffParams;\n result?: ProfileDiffResult;\n })\n | (BaseRun & {\n type: \"row_count\";\n params?: RowCountParams;\n result?: RowCountResult;\n })\n | (BaseRun & {\n type: \"row_count_diff\";\n params?: RowCountDiffParams;\n result?: RowCountDiffResult;\n })\n | (BaseRun & {\n type: \"lineage_diff\";\n params?: LineageDiffParams;\n result?: LineageDiffResult;\n })\n | (BaseRun & {\n type: \"top_k_diff\";\n params?: TopKDiffParams;\n result?: TopKDiffResult;\n })\n | (BaseRun & {\n type: \"histogram_diff\";\n params?: HistogramDiffParams;\n result?: HistogramDiffResult;\n })\n | (BaseRun & {\n type: \"profile_distribution\";\n params?: ProfileDistributionParams;\n result?: ProfileDistributionResult;\n });\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard for simple runs\n */\nexport function isSimpleRun(run: Run): run is Run & { type: \"simple\" } {\n return run.type === \"simple\";\n}\n\n/**\n * Type guard for query runs\n */\nexport function isQueryRun(run: Run): run is Run & { type: \"query\" } {\n return run.type === \"query\";\n}\n\n/**\n * Type guard for query_base runs\n */\nexport function isQueryBaseRun(run: Run): run is Run & { type: \"query_base\" } {\n return run.type === \"query_base\";\n}\n\n/**\n * Type guard for query_diff runs\n */\nexport function isQueryDiffRun(run: Run): run is Run & { type: \"query_diff\" } {\n return run.type === \"query_diff\";\n}\n\n/**\n * Type guard for value_diff runs\n */\nexport function isValueDiffRun(run: Run): run is Run & { type: \"value_diff\" } {\n return run.type === \"value_diff\";\n}\n\n/**\n * Type guard for value_diff_detail runs\n */\nexport function isValueDiffDetailRun(\n run: Run,\n): run is Run & { type: \"value_diff_detail\" } {\n return run.type === \"value_diff_detail\";\n}\n\n/**\n * Type guard for schema_diff runs\n */\nexport function isSchemaDiffRun(\n run: Run,\n): run is Run & { type: \"schema_diff\" } {\n return run.type === \"schema_diff\";\n}\n\n/**\n * Type guard for profile runs\n */\nexport function isProfileRun(run: Run): run is Run & { type: \"profile\" } {\n return run.type === \"profile\";\n}\n\n/**\n * Type guard for profile_diff runs\n */\nexport function isProfileDiffRun(\n run: Run,\n): run is Run & { type: \"profile_diff\" } {\n return run.type === \"profile_diff\";\n}\n\n/**\n * Type guard for row_count runs\n */\nexport function isRowCountRun(run: Run): run is Run & { type: \"row_count\" } {\n return run.type === \"row_count\";\n}\n\n/**\n * Type guard for row_count_diff runs\n */\nexport function isRowCountDiffRun(\n run: Run,\n): run is Run & { type: \"row_count_diff\" } {\n return run.type === \"row_count_diff\";\n}\n\n/**\n * Type guard for lineage_diff runs\n */\nexport function isLineageDiffRun(\n run: Run,\n): run is Run & { type: \"lineage_diff\" } {\n return run.type === \"lineage_diff\";\n}\n\n/**\n * Type guard for top_k_diff runs\n */\nexport function isTopKDiffRun(run: Run): run is Run & { type: \"top_k_diff\" } {\n return run.type === \"top_k_diff\";\n}\n\n/**\n * Type guard for histogram_diff runs\n */\nexport function isHistogramDiffRun(\n run: Run,\n): run is Run & { type: \"histogram_diff\" } {\n return run.type === \"histogram_diff\";\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Array of all run type values - useful for iteration and validation\n */\nexport const RUN_TYPES: readonly RunType[] = [\n \"simple\",\n \"query\",\n \"query_base\",\n \"query_diff\",\n \"value_diff\",\n \"value_diff_detail\",\n \"schema_diff\",\n \"profile\",\n \"profile_diff\",\n \"row_count\",\n \"row_count_diff\",\n \"lineage_diff\",\n \"top_k_diff\",\n \"histogram_diff\",\n \"profile_distribution\",\n] as const;\n\n/**\n * Check if a string is a valid RunType\n */\nexport function isValidRunType(value: string): value is RunType {\n return RUN_TYPES.includes(value as RunType);\n}\n\n/**\n * Run types that support screenshot/ref functionality.\n * These are run types that render a visual result view with forwardRef support.\n *\n * Declared with ``as const satisfies readonly RunType[]`` so the literal-tuple\n * type survives — that lets {@link runTypeHasRef} act as a true type guard\n * narrowing to ``RunTypeWithRef`` instead of bare ``boolean``.\n */\nconst RUN_TYPES_WITH_REF = [\n \"query\",\n \"query_base\",\n \"query_diff\",\n \"row_count\",\n \"row_count_diff\",\n \"profile\",\n \"profile_diff\",\n \"value_diff\",\n \"value_diff_detail\",\n \"top_k_diff\",\n \"histogram_diff\",\n] as const satisfies readonly RunType[];\n\n/**\n * Subset of {@link RunType} whose result view supports forwardRef. A narrower\n * type than ``RunType`` so a positive {@link runTypeHasRef} check transitively\n * narrows to a registered run type (every entry here also has a registry entry).\n */\nexport type RunTypeWithRef = (typeof RUN_TYPES_WITH_REF)[number];\n\n/**\n * Check if a run type supports ref forwarding (for screenshots).\n * Run types with refs can capture screenshots of their result views.\n */\nexport function runTypeHasRef(runType: RunType): runType is RunTypeWithRef {\n return (RUN_TYPES_WITH_REF as readonly RunType[]).includes(runType);\n}\n","import type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\nimport { isQueryRun, type Run, type RunType } from \"./types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Aggregated run results by model and run type\n */\nexport type RunsAggregated = Record<\n string,\n Record<\n \"row_count_diff\" | \"value_diff\" | \"row_count\",\n {\n run_id: string;\n result: unknown;\n }\n >\n>;\n\n/**\n * Properties for tracking run submissions (analytics)\n */\nexport interface SubmitRunTrackProps {\n breaking_change_analysis?: boolean;\n source?: \"lineage_model_node\" | \"lineage_column_node\" | \"schema_view\";\n [key: string]: unknown;\n}\n\n/**\n * Options for submitting a run\n */\nexport interface SubmitOptions {\n nowait?: boolean;\n trackProps?: SubmitRunTrackProps;\n}\n\n// ============================================================================\n// Core Run API Functions\n// ============================================================================\n\n/**\n * Submit a new run of the specified type.\n * @param type - The type of run to execute\n * @param params - Parameters specific to the run type\n * @param options - Submission options (nowait, tracking)\n * @param client - Required API client instance (no default - library pattern)\n * @returns The created run, or just run_id if nowait is true\n */\nexport async function submitRun(\n type: RunType,\n params: unknown,\n options: SubmitOptions | undefined,\n client: ApiClient,\n): Promise<Run | Pick<Run, \"run_id\">> {\n const track_props = options?.trackProps ? { ...options.trackProps } : {};\n // NOTE: Removed getExperimentTrackingBreakingChangeEnabled() - OSS-specific\n\n const response = await client.post<\n unknown,\n ApiResponse<Run | Pick<Run, \"run_id\">>\n >(\"/api/runs\", {\n type,\n params,\n nowait: options?.nowait,\n track_props,\n });\n\n return response.data;\n}\n\n/**\n * Get a run by ID.\n * @param runId - The ID of the run to retrieve\n * @param client - Required API client instance\n * @returns The run object\n */\nexport async function getRun(runId: string, client: ApiClient): Promise<Run> {\n const response = await client.get<never, ApiResponse<Run>>(\n `/api/runs/${runId}`,\n );\n return response.data;\n}\n\n/**\n * Wait for a run to complete.\n * @param runId - The ID of the run to wait for\n * @param timeout - Optional timeout in seconds\n * @param client - Required API client instance\n * @returns The completed run object with result\n */\nexport async function waitRun(\n runId: string,\n timeout: number | undefined,\n client: ApiClient,\n): Promise<Run> {\n const response = await client.get<unknown, ApiResponse<Run>>(\n `/api/runs/${runId}/wait`,\n { params: { timeout } },\n );\n return mutateAddKey(response.data);\n}\n\n/**\n * Cancel a running run.\n * @param runId - The ID of the run to cancel\n * @param client - Required API client instance\n */\nexport async function cancelRun(\n runId: string,\n client: ApiClient,\n): Promise<void> {\n try {\n await client.post(`/api/runs/${runId}/cancel`);\n } catch {\n // Fire-and-forget: the UI has already detached. Network failures\n // here do not affect the user's ability to continue working.\n }\n}\n\n/**\n * Submit a run from an existing check.\n * Re-runs the check with its stored parameters.\n * @param checkId - The ID of the check to run\n * @param options - Submission options (nowait)\n * @param client - Required API client instance\n * @returns The created run, or just run_id if nowait is true\n */\nexport async function submitRunFromCheck(\n checkId: string,\n options: SubmitOptions | undefined,\n client: ApiClient,\n): Promise<Run | Pick<Run, \"run_id\">> {\n const response = await client.post<\n unknown,\n ApiResponse<Run | Pick<Run, \"run_id\">>\n >(`/api/checks/${checkId}/run`, {\n nowait: options?.nowait,\n });\n return response.data;\n}\n\n/**\n * Search for runs matching criteria.\n * @param type - The run type to search for\n * @param params - Parameters to match against run params\n * @param limit - Maximum number of results to return\n * @param client - Required API client instance\n * @returns Array of matching runs\n */\nexport async function searchRuns(\n type: string,\n params: Record<string, unknown> | undefined,\n limit: number | undefined,\n client: ApiClient,\n): Promise<Run[]> {\n const response = await client.post<unknown, ApiResponse<Run[]>>(\n \"/api/runs/search\",\n { type, params, limit },\n );\n return response.data;\n}\n\n/**\n * List all runs.\n * @param client - Required API client instance\n * @returns Array of all runs\n */\nexport async function listRuns(client: ApiClient): Promise<Run[]> {\n const response = await client.get<never, ApiResponse<Run[]>>(\"/api/runs\");\n return response.data;\n}\n\n/**\n * Aggregate runs from API.\n * Returns run results grouped by model and run type.\n * @param client - Required API client instance\n * @returns Aggregated run results\n */\nexport async function aggregateRuns(\n client: ApiClient,\n): Promise<RunsAggregated> {\n const response = await client.post<unknown, ApiResponse<RunsAggregated>>(\n \"/api/runs/aggregate\",\n {},\n );\n return response.data;\n}\n\n// ============================================================================\n// Internal Helpers\n// ============================================================================\n\n/**\n * Internal helper to add key to query result columns.\n * Query results may have columns without a key property set.\n * This ensures all columns have a key for data grid rendering.\n */\nfunction mutateAddKey(run: Run): Run {\n if (run.result == null) {\n return run;\n }\n if (isQueryRun(run) && run.result) {\n // Type narrowing - run.result structure for query runs\n const result = run.result as {\n columns?: Array<{ key?: string; name: string }>;\n };\n if (result.columns) {\n result.columns = result.columns.map((c) => {\n if (c.key) return c;\n return { ...c, key: c.name };\n });\n }\n }\n return run;\n}\n","import type { ApiClient } from \"../lib/fetchClient\";\nimport { type SubmitOptions, submitRun } from \"./runs\";\nimport { type ColumnRenderMode, type DataFrame } from \"./types\";\n\n// ============================================================================\n// Query Types\n// ============================================================================\n\nexport interface QueryRunParams {\n sql_template: string;\n}\n\nexport type QueryResult = DataFrame;\n\nexport interface QueryViewOptions {\n pinned_columns?: string[];\n columnsRenderMode?: Record<string, ColumnRenderMode>;\n}\n\n// ============================================================================\n// Query Diff Types\n// ============================================================================\n\nexport interface QueryDiffParams {\n sql_template: string;\n base_sql_template?: string;\n primary_keys?: string[];\n}\n\nexport interface QueryDiffResult {\n base?: DataFrame;\n current?: DataFrame;\n diff?: DataFrame;\n}\n\nexport interface QueryDiffViewOptions {\n changed_only?: boolean;\n primary_keys?: string[];\n pinned_columns?: string[];\n display_mode?: \"inline\" | \"side_by_side\";\n columnsRenderMode?: Record<string, ColumnRenderMode>;\n}\n\n// ============================================================================\n// Preview Change Types\n// ============================================================================\n\nexport interface QueryPreviewChangeParams {\n current_model?: string;\n sql_template: string;\n primary_keys?: string[];\n}\n\nexport interface QueryParams\n extends QueryRunParams,\n QueryDiffParams,\n QueryPreviewChangeParams {}\n\n// ============================================================================\n// API Functions\n// ============================================================================\n\nexport async function submitQuery(\n params: QueryRunParams,\n options: SubmitOptions | undefined,\n client: ApiClient,\n) {\n return await submitRun(\"query\", params, options, client);\n}\n\nexport async function submitQueryBase(\n params: QueryRunParams,\n options: SubmitOptions | undefined,\n client: ApiClient,\n) {\n return await submitRun(\"query_base\", params, options, client);\n}\n\nexport async function submitQueryDiff(\n params: QueryDiffParams,\n options: SubmitOptions | undefined,\n client: ApiClient,\n) {\n return await submitRun(\"query_diff\", params, options, client);\n}\n","/**\n * Check Events API - Types and Client Functions\n *\n * Provides timeline/conversation functionality for Checks, enabling\n * GitHub PR-style discussions with comments and automatic tracking\n * of state changes.\n *\n * NOTE: This feature is only available when connected to Recce Cloud.\n */\n\nimport type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\nexport type CheckEventType =\n | \"check_created\"\n | \"comment\"\n | \"approval_change\"\n | \"description_change\"\n | \"name_change\"\n | \"preset_applied\";\n\nexport type ActorType = \"user\" | \"recce_ai\" | \"preset_system\";\n\n// ============================================================================\n// Actor Interface\n// ============================================================================\n\nexport interface CheckEventActor {\n type: ActorType;\n user_id: number | null;\n login: string | null;\n fullname: string | null;\n}\n\n// ============================================================================\n// Check Event Interface\n// ============================================================================\n\nexport interface CheckEvent {\n id: string;\n check_id: string;\n event_type: CheckEventType;\n actor: CheckEventActor;\n content: string | null;\n old_value: string | null;\n new_value: string | null;\n is_edited: boolean;\n is_deleted: boolean;\n created_at: string;\n updated_at: string;\n}\n\n// ============================================================================\n// Request/Response Types\n// ============================================================================\n\nexport interface CreateCommentRequest {\n content: string;\n}\n\nexport interface UpdateCommentRequest {\n content: string;\n}\n\nexport interface CheckEventsListResponse {\n events: CheckEvent[];\n}\n\n// ============================================================================\n// API Client Functions\n// ============================================================================\n\n/**\n * List all events for a check in chronological order.\n *\n * @param checkId - The check ID\n * @param client - Axios instance for API configuration\n * @returns Promise resolving to array of CheckEvent objects\n */\nexport async function listCheckEvents(\n checkId: string,\n client: ApiClient,\n): Promise<CheckEvent[]> {\n const response = await client.get<never, ApiResponse<CheckEvent[]>>(\n `/api/checks/${checkId}/events`,\n );\n return response.data;\n}\n\n/**\n * Get a specific event by ID.\n *\n * @param checkId - The check ID\n * @param eventId - The event ID\n * @param client - Axios instance for API configuration\n * @returns Promise resolving to a CheckEvent object\n */\nexport async function getCheckEvent(\n checkId: string,\n eventId: string,\n client: ApiClient,\n): Promise<CheckEvent> {\n const response = await client.get<never, ApiResponse<CheckEvent>>(\n `/api/checks/${checkId}/events/${eventId}`,\n );\n return response.data;\n}\n\n/**\n * Create a new comment on a check.\n *\n * @param checkId - The check ID\n * @param content - The comment content (plain text for now, markdown later)\n * @param client - Axios instance for API configuration\n * @returns Promise resolving to the created CheckEvent\n */\nexport async function createComment(\n checkId: string,\n content: string,\n client: ApiClient,\n): Promise<CheckEvent> {\n const response = await client.post<\n CreateCommentRequest,\n ApiResponse<CheckEvent>\n >(`/api/checks/${checkId}/events`, { content });\n return response.data;\n}\n\n/**\n * Update an existing comment.\n * Only the author or an admin can update a comment.\n *\n * @param checkId - The check ID\n * @param eventId - The event ID of the comment to update\n * @param content - The new comment content\n * @param client - Axios instance for API configuration\n * @returns Promise resolving to the updated CheckEvent\n */\nexport async function updateComment(\n checkId: string,\n eventId: string,\n content: string,\n client: ApiClient,\n): Promise<CheckEvent> {\n const response = await client.patch<\n UpdateCommentRequest,\n ApiResponse<CheckEvent>\n >(`/api/checks/${checkId}/events/${eventId}`, { content });\n return response.data;\n}\n\n/**\n * Delete a comment (soft delete).\n * Only the author or an admin can delete a comment.\n *\n * @param checkId - The check ID\n * @param eventId - The event ID of the comment to delete\n * @param client - Axios instance for API configuration\n * @returns Promise resolving when deletion is complete\n */\nexport async function deleteComment(\n checkId: string,\n eventId: string,\n client: ApiClient,\n): Promise<void> {\n await client.delete(`/api/checks/${checkId}/events/${eventId}`);\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport function isCommentEvent(event: CheckEvent): boolean {\n return event.event_type === \"comment\";\n}\n\nexport function isStateChangeEvent(event: CheckEvent): boolean {\n return (\n event.event_type === \"approval_change\" ||\n event.event_type === \"description_change\" ||\n event.event_type === \"name_change\"\n );\n}\n\nexport function isSystemEvent(event: CheckEvent): boolean {\n return (\n event.event_type === \"check_created\" ||\n event.event_type === \"preset_applied\"\n );\n}\n\n// ============================================================================\n// Display Helpers\n// ============================================================================\n\n/**\n * Get a human-readable description of an event for display.\n */\nexport function getEventDescription(event: CheckEvent): string {\n const actorName = event.actor.fullname || event.actor.login || \"Someone\";\n\n switch (event.event_type) {\n case \"check_created\":\n return `${actorName} created this check`;\n case \"comment\":\n if (event.is_deleted) {\n return \"Comment deleted\";\n }\n return event.content || \"\";\n case \"approval_change\":\n if (event.new_value === \"true\") {\n return `${actorName} approved this check`;\n }\n return `${actorName} unapproved this check`;\n case \"description_change\":\n return `${actorName} updated the description`;\n case \"name_change\":\n return `${actorName} renamed this check`;\n case \"preset_applied\":\n return `${actorName} applied a preset`;\n default:\n return `${actorName} made a change`;\n }\n}\n\n/**\n * Get the appropriate icon name for an event type.\n * Returns a string that can be used with react-icons.\n */\nexport function getEventIconType(\n event: CheckEvent,\n): \"comment\" | \"approve\" | \"unapprove\" | \"edit\" | \"create\" | \"preset\" {\n switch (event.event_type) {\n case \"check_created\":\n return \"create\";\n case \"comment\":\n return \"comment\";\n case \"approval_change\":\n return event.new_value === \"true\" ? \"approve\" : \"unapprove\";\n case \"description_change\":\n case \"name_change\":\n return \"edit\";\n case \"preset_applied\":\n return \"preset\";\n default:\n return \"edit\";\n }\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport {\n type ApiClient,\n type ApiResponse,\n createFetchClient,\n} from \"../lib/fetchClient\";\nimport { useApiConfigOptional } from \"../providers/contexts/ApiContext\";\nimport { cacheKeys } from \"./cacheKeys\";\nimport type { Run, RunType } from \"./types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * A check object representing a saved validation check.\n * @template PT - The type of params for this check\n * @template VO - The type of view options for this check\n */\nexport interface Check<PT = unknown, VO = unknown> {\n check_id: string;\n name: string;\n description?: string;\n type: RunType;\n params?: PT;\n view_options?: VO;\n is_checked?: boolean;\n is_preset?: boolean;\n last_run?: Run;\n is_outdated?: boolean;\n actor_type?: string; // \"recce_ai\" | \"user\" | \"preset_system\" — Cloud-only, undefined in OSS\n}\n\n/**\n * Request body for creating a new check.\n */\nexport interface CreateCheckBody {\n name?: string;\n description?: string;\n run_id?: string;\n type?: RunType;\n params?: Record<string, unknown>;\n view_options?: Record<string, unknown>;\n track_props?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Default Client (for hooks used outside RecceProvider)\n// ============================================================================\n\n/**\n * Default API client for hooks that may be used outside RecceProvider.\n * This is a fallback - components inside RecceProvider will use the configured client.\n */\nconst defaultApiClient = createFetchClient({ baseURL: \"\" });\n\n// ============================================================================\n// API Functions\n// ============================================================================\n\n/**\n * Create a simple check (no run association).\n * @param client - Required API client instance\n * @returns The created check\n */\nexport async function createSimpleCheck(client: ApiClient): Promise<Check> {\n const response = await client.post<CreateCheckBody, ApiResponse<Check>>(\n \"/api/checks\",\n {\n type: \"simple\",\n },\n );\n return response.data;\n}\n\n/**\n * Create a check from an existing run.\n * @param runId - The ID of the run to create a check from\n * @param viewOptions - Optional view options for the check\n * @param client - Required API client instance\n * @returns The created check\n */\nexport async function createCheckByRun(\n runId: string,\n viewOptions: Record<string, unknown> | undefined,\n client: ApiClient,\n): Promise<Check> {\n // NOTE: Removed getExperimentTrackingBreakingChangeEnabled() - OSS-specific\n const response = await client.post<CreateCheckBody, ApiResponse<Check>>(\n \"/api/checks\",\n {\n run_id: runId,\n view_options: viewOptions,\n },\n );\n return response.data;\n}\n\n/**\n * List all checks.\n * @param client - Required API client instance\n * @returns Array of all checks\n */\nexport async function listChecks(client: ApiClient): Promise<Check[]> {\n return (await client.get<never, ApiResponse<Check[]>>(\"/api/checks\")).data;\n}\n\n/**\n * Get a check by ID.\n * @param checkId - The ID of the check to retrieve\n * @param client - Required API client instance\n * @returns The check object\n */\nexport async function getCheck(\n checkId: string,\n client: ApiClient,\n): Promise<Check> {\n const response = await client.get<never, ApiResponse<Check>>(\n `/api/checks/${checkId}`,\n );\n return response.data;\n}\n\n/**\n * Update an existing check.\n * @param checkId - The ID of the check to update\n * @param payload - Partial check data to update\n * @param client - Required API client instance\n * @returns The updated check\n */\nexport async function updateCheck(\n checkId: string,\n payload: Partial<Check>,\n client: ApiClient,\n): Promise<Check> {\n const response = await client.patch<Partial<Check>, ApiResponse<Check>>(\n `/api/checks/${checkId}`,\n payload,\n );\n return response.data;\n}\n\n/**\n * Delete a check.\n * @param checkId - The ID of the check to delete\n * @param client - Required API client instance\n * @returns The deleted check ID\n */\nexport async function deleteCheck(\n checkId: string,\n client: ApiClient,\n): Promise<Pick<Check, \"check_id\">> {\n const response = await client.delete<\n never,\n ApiResponse<Pick<Check, \"check_id\">>\n >(`/api/checks/${checkId}`);\n return response.data;\n}\n\n/**\n * Reorder checks.\n * @param order - Source and destination indices\n * @param client - Required API client instance\n */\nexport async function reorderChecks(\n order: {\n source: number;\n destination: number;\n },\n client: ApiClient,\n): Promise<void> {\n await client.post(\"/api/checks/reorder\", order);\n}\n\n/**\n * Mark a check as a preset check.\n * @param checkId - The ID of the check to mark as preset\n * @param client - Required API client instance\n */\nexport async function markAsPresetCheck(\n checkId: string,\n client: ApiClient,\n): Promise<void> {\n await client.post(`/api/checks/${checkId}/mark-as-preset`);\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Hook to fetch and cache the list of checks.\n * Can be used outside RecceProvider with a fallback to default API client.\n *\n * @param enabled - Whether the query should be enabled\n * @returns TanStack Query result with checks data\n */\nexport function useChecks(enabled: boolean) {\n const apiConfig = useApiConfigOptional();\n const apiClient = apiConfig?.apiClient ?? defaultApiClient;\n\n return useQuery({\n queryKey: cacheKeys.checks(),\n queryFn: () => listChecks(apiClient),\n enabled,\n });\n}\n","/**\n * Column-Level Lineage (CLL) API - Types and Client Functions\n *\n * Provides column-level lineage analysis functionality for data models.\n */\n\nimport type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\nimport type { NodeColumnData } from \"./info\";\n\n// ============================================================================\n// Input Types\n// ============================================================================\n\nexport interface CllInput {\n node_id?: string;\n column?: string;\n change_analysis?: boolean;\n no_cll?: boolean;\n no_upstream?: boolean;\n no_downstream?: boolean;\n}\n\nexport interface ImpactRadiusParams {\n node_id: string;\n}\n\n// ============================================================================\n// Result Types\n// ============================================================================\n\nexport interface CllNodeData {\n id: string;\n name: string;\n source_name: string;\n resource_type: string;\n raw_code?: string;\n change_status?: \"added\" | \"removed\" | \"modified\" | \"unknown\";\n change_category?:\n | \"breaking\"\n | \"non_breaking\"\n | \"partial_breaking\"\n | \"unknown\";\n impacted?: boolean;\n columns?: Record<string, NodeColumnData>;\n}\n\nexport interface ColumnLineageData {\n current: {\n nodes: Record<string, CllNodeData>;\n columns: Record<string, NodeColumnData>;\n /** JSON arrays from API - iterable like Set but properly typed */\n parent_map: Record<string, string[]>;\n /** JSON arrays from API - iterable like Set but properly typed */\n child_map: Record<string, string[]>;\n };\n}\n\n// ============================================================================\n// API Client Functions\n// ============================================================================\n\n/**\n * Get column-level lineage data.\n *\n * @param input - CLL input parameters\n * @param client - Axios instance for API configuration\n * @returns Promise resolving to column lineage data\n */\nexport async function getCll(\n input: CllInput,\n client: ApiClient,\n): Promise<ColumnLineageData> {\n const response = await client.post<CllInput, ApiResponse<ColumnLineageData>>(\n \"/api/cll\",\n input,\n );\n\n return response.data;\n}\n","import type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\n\n/**\n * Column-level data for a node\n */\nexport interface NodeColumnData {\n name: string;\n type: string;\n transformation_type?: string;\n change_status?: \"added\" | \"removed\" | \"modified\" | \"unknown\";\n not_null?: boolean;\n unique?: boolean;\n}\n\n/**\n * Node data within lineage\n */\nexport interface NodeData {\n id: string;\n unique_id: string;\n name: string;\n schema?: string;\n checksum?: {\n name: string;\n checksum: string;\n };\n raw_code?: string;\n resource_type?: string;\n package_name?: string;\n columns?: Record<string, NodeColumnData | undefined>;\n primary_key?: string;\n config?: {\n materialized?: string;\n };\n}\n\n/**\n * dbt artifact metadata\n * @see https://docs.getdbt.com/reference/artifacts/dbt-artifacts#common-metadata\n */\ninterface ArtifactMetadata {\n dbt_version: string;\n dbt_schema_version: string;\n generated_at: string;\n adapter_type: string;\n env: Record<string, string>;\n invocation_id: string;\n}\n\n/**\n * Manifest metadata extends artifact metadata\n */\nexport interface ManifestMetadata extends ArtifactMetadata {\n project_id?: string;\n project_name?: string;\n user_id?: string;\n}\n\n/**\n * SQLMesh environment info\n */\nexport interface SQLMeshInfo {\n base_env: string;\n current_env: string;\n}\n\nexport type CatalogMetadata = ArtifactMetadata;\n\n/**\n * Merged node from server-side lineage merge (DRC-3258).\n * Contains unified metadata from base+current with baked-in diff.\n */\nexport interface MergedNodeData {\n name: string;\n resource_type: string;\n package_name: string;\n schema?: string;\n materialized?: string;\n tags?: string[];\n source_name?: string;\n change_status?: \"added\" | \"removed\" | \"modified\" | \"unknown\";\n change?: {\n category: \"breaking\" | \"non_breaking\" | \"partial_breaking\" | \"unknown\";\n columns?: Record<string, \"added\" | \"removed\" | \"modified\" | \"unknown\">;\n };\n}\n\n/**\n * Merged edge from server-side lineage merge (DRC-3258).\n */\nexport interface MergedEdgeData {\n source: string;\n target: string;\n change_status?: \"added\" | \"removed\";\n}\n\n/**\n * Per-environment metadata in merged lineage response.\n */\nexport interface MergedLineageEnvMetadata {\n manifest_metadata?: ManifestMetadata;\n catalog_metadata?: CatalogMetadata;\n}\n\n/**\n * Server-side merged lineage response from /api/info.\n * Replaces the old {base, current, diff} triple.\n */\nexport interface MergedLineageResponse {\n nodes: Record<string, MergedNodeData>;\n edges: MergedEdgeData[];\n metadata: {\n base: MergedLineageEnvMetadata;\n current: MergedLineageEnvMetadata;\n };\n}\n\n/**\n * Lineage data structure\n */\nexport interface LineageData {\n metadata: {\n pr_url: string;\n git_branch?: string;\n };\n nodes: Record<string, NodeData>;\n parent_map: Record<string, string[]>;\n manifest_metadata?: ManifestMetadata | null;\n catalog_metadata?: CatalogMetadata | null;\n}\n\nexport interface LineageDataFromMetadata extends Omit<LineageData, \"nodes\"> {\n nodes: Record<string, NodeData | undefined>;\n}\n\n/**\n * Lineage diff result from lineage_diff run type\n */\nexport interface LineageDiffResult {\n base?: LineageData;\n current?: LineageData;\n base_error?: string;\n current_error?: string;\n}\n\n/**\n * State metadata for recce state file\n */\nexport interface StateMetadata {\n schema_version: string;\n recce_version: string;\n generated_at: string;\n}\n\n/**\n * Session staleness fields returned by the backend when the PR session's\n * frozen-snapshot base may have diverged from the project's current shared base.\n * All fields are null for legacy sessions (pre-DRC-3309) or OSS mode.\n */\nexport interface SessionStaleness {\n /** ID of the shared-base session that was cloned into this PR session. */\n source_session_id: string | null;\n /** Timestamp of the shared-base session at clone time (ISO 8601). */\n source_session_updated_at: string | null;\n /** ID of the project's current shared-base session. */\n current_base_session_id: string | null;\n /** Timestamp of the project's current shared-base session (ISO 8601). */\n current_base_updated_at: string | null;\n}\n\n/**\n * Returns true when the PR session's frozen snapshot is outdated relative to\n * the project's current shared base.\n *\n * Conditions:\n * - source_session_id must be non-null (i.e. session was auto-snapshotted)\n * - Either the source session ID or its timestamp differs from the current base\n */\nexport function isSessionBaseOutdated(s: SessionStaleness): boolean {\n return (\n s.source_session_id !== null &&\n (s.source_session_id !== s.current_base_session_id ||\n s.source_session_updated_at !== s.current_base_updated_at)\n );\n}\n\n/**\n * Git information\n */\nexport interface GitInfo {\n branch?: string;\n}\n\n/**\n * Pull request information\n */\nexport interface PullRequestInfo {\n id?: string | number;\n title?: string;\n url?: string;\n branch?: string;\n base_branch?: string;\n}\n\n/**\n * Server info result from /api/info endpoint\n */\nexport interface ServerInfoResult {\n state_metadata: StateMetadata;\n adapter_type: string;\n review_mode: boolean;\n cloud_mode: boolean;\n file_mode: boolean;\n filename?: string;\n git?: GitInfo;\n pull_request?: PullRequestInfo;\n sqlmesh?: SQLMeshInfo;\n lineage: MergedLineageResponse;\n demo: boolean;\n codespace: boolean;\n support_tasks: Record<string, boolean>;\n /** Session staleness fields (cloud mode only, null for OSS / legacy sessions). */\n session_staleness?: SessionStaleness;\n}\n\n/**\n * Fetch server info from API\n */\nexport async function getServerInfo(\n client: ApiClient,\n): Promise<ServerInfoResult> {\n const response = await client.get<never, ApiResponse<ServerInfoResult>>(\n \"/api/info\",\n );\n return response.data;\n}\n\n/**\n * Per-environment model detail returned by /api/models/:model\n *\n * `raw_code` is served on-demand here so it can be stripped from the bulk\n * /api/info lineage payload (DRC-3263).\n */\nexport interface ModelEnvDetail {\n columns?: Record<string, NodeColumnData>;\n primary_key?: string;\n raw_code?: string;\n}\n\n/**\n * Model info result from /api/models/:model endpoint\n */\nexport interface ModelInfoResult {\n model: {\n base: ModelEnvDetail;\n current: ModelEnvDetail;\n };\n}\n\n/**\n * Fetch model info (columns and primary key) from API\n */\nexport async function getModelInfo(\n model: string,\n client: ApiClient,\n): Promise<ModelInfoResult> {\n const response = await client.get<never, ApiResponse<ModelInfoResult>>(\n `/api/models/${model}`,\n );\n return response.data;\n}\n\n/**\n * Refresh the PR session's frozen-snapshot base from the project's current\n * shared base. Backend resolves the session via the `/api/v2/sessions/<id>`\n * mount prefix (cloud mode); takes no body.\n *\n * On success, the backend emits a `metadata_updated` WS event which the\n * frontend uses to invalidate the lineage cache.\n */\nexport async function refreshSessionBase(client: ApiClient): Promise<void> {\n await client.post<never, ApiResponse<void>>(\"/api/refresh-base\");\n}\n","/**\n * Lineage Check API - Types and Client Functions\n *\n * Provides functionality for creating lineage diff checks.\n */\n\nimport type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\nimport type { Check } from \"./checks\";\nimport type { CllInput } from \"./cll\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface LineageDiffViewOptions {\n view_mode?: \"changed_models\" | \"all\";\n node_ids?: string[];\n packages?: string[];\n select?: string;\n exclude?: string;\n column_level_lineage?: CllInput;\n}\n\ninterface CreateLineageDiffCheckBody {\n type: string;\n params: Record<string, string | boolean | number>;\n view_options: LineageDiffViewOptions;\n}\n\n// ============================================================================\n// API Client Functions\n// ============================================================================\n\n/**\n * Create a lineage diff check.\n *\n * @param viewOptions - View options for the lineage diff\n * @param client - Axios instance for API configuration\n * @returns Promise resolving to the created check\n */\nexport async function createLineageDiffCheck(\n viewOptions: LineageDiffViewOptions,\n client: ApiClient,\n): Promise<Check> {\n const response = await client.post<\n CreateLineageDiffCheckBody,\n ApiResponse<Check>\n >(\"/api/checks\", {\n type: \"lineage_diff\",\n params: {},\n view_options: viewOptions,\n });\n\n return response.data;\n}\n","import type { ApiClient } from \"../lib/fetchClient\";\nimport { type SubmitOptions, submitRun } from \"./runs\";\n\n// ============================================================================\n// Row Count Types\n// ============================================================================\n\nexport interface RowCountParams {\n node_names: string[];\n}\n\nexport interface RowCount {\n name?: string;\n curr: number | null;\n}\n\nexport type RowCountResult = Record<string, RowCount>;\n\n// ============================================================================\n// Row Count Diff Types\n// ============================================================================\n\nexport interface RowCountDiffParams {\n node_names: string[];\n}\n\nexport interface RowCountDiff {\n name?: string;\n base: number | null;\n curr: number | null;\n}\n\nexport type RowCountDiffResult = Record<string, RowCountDiff>;\n\n// ============================================================================\n// API Functions\n// ============================================================================\n\nexport async function submitRowCountDiff(\n params: RowCountDiffParams,\n options: SubmitOptions | undefined,\n client: ApiClient,\n) {\n return await submitRun(\"row_count_diff\", params, options, client);\n}\n","import type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\nimport type { RowCountDiff, RowCountDiffResult } from \"./rowcount\";\nimport { submitRowCountDiff } from \"./rowcount\";\nimport { waitRun } from \"./runs\";\n\n// Re-export for convenience (types are defined in rowcount.ts)\nexport type { RowCountDiff } from \"./rowcount\";\n\n// ============================================================================\n// Model Row Count Types\n// ============================================================================\n\nexport interface QueryRowCountResult {\n runId: string;\n result: RowCountDiffResult;\n}\n\n// ============================================================================\n// Model Row Count API Functions\n// ============================================================================\n\n/**\n * Fetch model row count from the API (cached value).\n * @param modelName - The name of the model\n * @param client - Required API client instance\n * @returns The row count diff for the model\n */\nexport async function fetchModelRowCount(\n modelName: string,\n client: ApiClient,\n): Promise<RowCountDiff> {\n const response = await client.get<never, ApiResponse<RowCountDiff>>(\n `/api/models/${modelName}/row_count`,\n );\n return response.data;\n}\n\n/**\n * Query model row count by executing a row count diff run.\n * @param modelName - The name of the model\n * @param client - Required API client instance\n * @returns The row count diff for the model\n */\nexport async function queryModelRowCount(\n modelName: string,\n client: ApiClient,\n): Promise<RowCountDiff> {\n const { result } = await queryRowCount([modelName], client);\n return result[modelName];\n}\n\n/**\n * Query row counts for multiple models.\n * @param modelNames - Array of model names to query\n * @param client - Required API client instance\n * @returns The run ID and row count diff results for all models\n */\nexport async function queryRowCount(\n modelNames: string[],\n client: ApiClient,\n): Promise<QueryRowCountResult> {\n if (modelNames.length === 0) {\n throw new Error(\"No model names provided\");\n }\n\n const { run_id } = await submitRowCountDiff(\n { node_names: modelNames },\n { nowait: true },\n client,\n );\n const run = await waitRun(run_id, undefined, client);\n\n return {\n runId: run_id,\n result: run.result as RowCountDiffResult,\n };\n}\n","import type { ApiClient } from \"../lib/fetchClient\";\nimport { type SubmitOptions, submitRun } from \"./runs\";\nimport { type ColumnRenderMode, type DataFrame } from \"./types\";\nimport type { ProfileDistributionParams } from \"./types/run\";\n\n// ============================================================================\n// Profile Diff Types\n// ============================================================================\n\nexport interface ProfileDiffParams {\n model: string;\n columns?: string[];\n}\n\nexport interface ProfileDiffResult {\n base?: DataFrame;\n current?: DataFrame;\n}\n\nexport interface ProfileDiffViewOptions {\n pinned_columns?: string[];\n display_mode?: \"side_by_side\" | \"inline\";\n columnsRenderMode?: Record<string, ColumnRenderMode>;\n}\n\n// ============================================================================\n// API Functions\n// ============================================================================\n\nexport async function submitProfileDiff(\n params: ProfileDiffParams,\n options: SubmitOptions | undefined,\n client: ApiClient,\n) {\n return await submitRun(\"profile_diff\", params, options, client);\n}\n\n/**\n * Submit a `profile_distribution` run (DRC-3390 Stage C).\n *\n * Backed by the DuckDB-only `approx_all` pipeline in Stage B. The result is a\n * {@link ProfileDistributionResult} discriminated union (`ok` with per-column\n * payloads, or an `unsupported` envelope for adapters without native\n * approx-aggregate support). Callers normally drive this through\n * {@link useInlineProfileDistribution} rather than calling it directly.\n */\nexport async function submitProfileDistribution(\n params: ProfileDistributionParams,\n options: SubmitOptions | undefined,\n client: ApiClient,\n) {\n return await submitRun(\"profile_distribution\", params, options, client);\n}\n\n// ============================================================================\n// Top-K Types\n// ============================================================================\n\nexport interface TopKDiffParams {\n model: string;\n column_name: string;\n k: number;\n}\n\nexport interface TopKResult {\n values: (string | number | undefined)[];\n counts: number[];\n valids: number;\n}\n\nexport interface TopKDiffResult {\n base: TopKResult;\n current: TopKResult;\n}\n\n/**\n * View options for TopKDiffResultView.\n * Controls display preferences for top-K diff visualization.\n */\nexport interface TopKViewOptions {\n /**\n * When true, show all items instead of just top 10.\n * Default is false (show top 10 only).\n */\n show_all?: boolean;\n}\n\n// ============================================================================\n// Histogram Types\n// ============================================================================\n\nexport interface HistogramDiffParams {\n model: string;\n column_name: string;\n column_type: string;\n}\n\nexport interface HistogramResult {\n counts: number[];\n total: number;\n}\n\nexport interface HistogramDiffResult {\n base: HistogramResult;\n current: HistogramResult;\n min: number;\n max: number;\n bin_edges: number[];\n labels?: string[];\n}\n","/**\n * Schema Check API - Types and Client Functions\n *\n * Provides functionality for creating schema diff checks.\n */\n\nimport type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\nimport type { Check } from \"./checks\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SchemaDiffViewParams {\n node_id?: string | string[];\n select?: string;\n exclude?: string;\n view_mode?: \"all\" | \"changed_models\";\n packages?: string[];\n}\n\ninterface CreateSchemaDiffCheckBody {\n type: string;\n params: SchemaDiffViewParams;\n}\n\n// ============================================================================\n// API Client Functions\n// ============================================================================\n\n/**\n * Create a schema diff check.\n *\n * @param params - Schema diff parameters\n * @param client - Axios instance for API configuration\n * @returns Promise resolving to the created check\n */\nexport async function createSchemaDiffCheck(\n params: SchemaDiffViewParams,\n client: ApiClient,\n): Promise<Check> {\n const response = await client.post<\n CreateSchemaDiffCheckBody,\n ApiResponse<Check>\n >(\"/api/checks\", {\n type: \"schema_diff\",\n params: params,\n });\n\n return response.data;\n}\n","\"use client\";\n\nimport type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\n\nexport interface SelectInput {\n select?: string;\n exclude?: string;\n packages?: string[];\n view_mode?: \"all\" | \"changed_models\";\n}\n\nexport interface SelectOutput {\n nodes: string[];\n}\n\nexport async function select(\n input: SelectInput,\n client: ApiClient,\n): Promise<SelectOutput> {\n return (\n await client.post<SelectInput, ApiResponse<SelectOutput>>(\n `/api/select`,\n input,\n )\n ).data;\n}\n","\"use client\";\n\nimport type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\nimport { isHttpError } from \"../lib/fetchClient\";\n\nexport interface SaveAsInput {\n filename: string;\n overwrite?: boolean;\n}\n\nexport interface ImportedState {\n runs: number;\n checks: number;\n}\n\nexport async function saveAs(\n input: SaveAsInput,\n client: ApiClient,\n): Promise<void> {\n return (\n await client.post<SaveAsInput, ApiResponse<void>>(\"/api/save-as\", input)\n ).data;\n}\n\nexport async function rename(\n input: SaveAsInput,\n client: ApiClient,\n): Promise<void> {\n return (\n await client.post<SaveAsInput, ApiResponse<void>>(\"/api/rename\", input)\n ).data;\n}\n\nexport async function exportState(client: ApiClient): Promise<string> {\n return (await client.post<never, ApiResponse<string>>(\"/api/export\")).data;\n}\n\ninterface ImportStateBody {\n file: File;\n checks_only: \"true\" | \"false\";\n}\n\nexport async function importState(\n file: File,\n checksOnly: boolean | undefined,\n client: ApiClient,\n): Promise<ImportedState> {\n const formData = new FormData();\n formData.append(\"file\", file);\n formData.append(\"checks_only\", (!!checksOnly).toString());\n\n return (\n await client.post<ImportStateBody, ApiResponse<ImportedState>>(\n \"/api/import\",\n formData,\n )\n ).data;\n}\n\nexport async function isStateSyncing(client: ApiClient): Promise<boolean> {\n const response = await client.get<never, ApiResponse<boolean>>(\"/api/sync\");\n return response.status === 208;\n}\n\nexport interface SyncStateInput {\n method?: \"overwrite\" | \"revert\" | \"merge\";\n}\n\nexport interface SyncStateResponse {\n status: \"accepted\" | \"conflict\" | \"syncing\";\n}\n\nexport async function syncState(\n input: SyncStateInput,\n client: ApiClient,\n): Promise<SyncStateResponse> {\n try {\n const response = await client.post<\n SyncStateInput,\n ApiResponse<SyncStateResponse>\n >(\"/api/sync\", input);\n\n if (response.status === 202) {\n return {\n status: \"accepted\",\n };\n }\n if (response.status === 208) {\n return {\n status: \"syncing\",\n };\n }\n } catch (error) {\n if (isHttpError(error)) {\n if (error.status === 409) {\n // 409 conflict case\n return { status: \"conflict\" };\n }\n }\n }\n throw new Error(\"Failed to sync state\");\n}\n\nexport interface ShareStateResponse {\n status: string;\n message: string;\n share_url?: string;\n}\n\nexport async function shareState(\n client: ApiClient,\n): Promise<ShareStateResponse> {\n return (\n await client.post<never, ApiResponse<ShareStateResponse>>(\"/api/share\")\n ).data;\n}\n","\"use client\";\n\nconst localPrefix = \"recce-\";\n\nexport const LOCAL_STORAGE_KEYS = {\n bypassSaveOverwrite: `${localPrefix}-bypass-save-overwrite`,\n previewChangeFeedbackID: `${localPrefix}-preview-change-feedback`,\n prepareEnvGuideID: `${localPrefix}-prepare-env`,\n snapshotBaseIntroSeen: `${localPrefix}-snapshot-base-intro-seen`,\n};\n\nconst sessionPrefix = \"recce\";\n\nexport const SESSION_STORAGE_KEYS = {\n recommendationIgnored: `${sessionPrefix}-recommendation-ignored`,\n recommendationShowed: `${sessionPrefix}-recommendation-showed`,\n prevRefreshTimeStamp: `${sessionPrefix}-prev-refresh-timestamp`,\n lineageNotificationDismissed: `${sessionPrefix}-lineage-notification-dismissed`,\n};\n","import type { ApiClient } from \"../lib/fetchClient\";\nimport { type SubmitOptions, submitRun } from \"./runs\";\nimport { type ColumnRenderMode, type DataFrame } from \"./types\";\n\n// ============================================================================\n// Value Diff Types\n// ============================================================================\n\nexport interface ValueDiffParams {\n model: string;\n primary_key: string | string[];\n columns?: string[];\n}\n\nexport interface ValueDiffResult {\n summary: {\n total: number;\n added: number;\n removed: number;\n };\n data: DataFrame;\n}\n\n// ============================================================================\n// Value Diff Detail Types\n// ============================================================================\n\nexport type ValueDiffDetailParams = ValueDiffParams;\nexport type ValueDiffDetailResult = DataFrame;\n\nexport interface ValueDiffDetailViewOptions {\n changed_only?: boolean;\n pinned_columns?: string[];\n display_mode?: \"inline\" | \"side_by_side\";\n columnsRenderMode?: Record<string, ColumnRenderMode>;\n}\n\n// ============================================================================\n// API Functions\n// ============================================================================\n\nexport async function submitValueDiff(\n params: ValueDiffParams,\n options: SubmitOptions | undefined,\n client: ApiClient,\n) {\n return await submitRun(\"value_diff\", params, options, client);\n}\n\nexport async function submitValueDiffDetail(\n params: ValueDiffParams,\n options: SubmitOptions | undefined,\n client: ApiClient,\n) {\n return await submitRun(\"value_diff_detail\", params, options, client);\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport {\n type ApiClient,\n type ApiResponse,\n createFetchClient,\n} from \"../lib/fetchClient\";\nimport { useApiConfigOptional } from \"../providers/contexts/ApiContext\";\n\nconst defaultApiClient = createFetchClient({ baseURL: \"\" });\n\nexport interface VersionResponse {\n version: string;\n latestVersion: string;\n}\n\nexport async function getVersion(client: ApiClient): Promise<VersionResponse> {\n const response = await client.get<never, ApiResponse<VersionResponse>>(\n \"/api/version\",\n );\n return response.data;\n}\n\nexport function useVersionNumber() {\n const [version, setVersion] = useState(\"\");\n const [latestVersion, setLatestVersion] = useState(\"\");\n const apiConfig = useApiConfigOptional();\n const apiClient = apiConfig?.apiClient ?? defaultApiClient;\n\n useEffect(() => {\n async function fetchVersion() {\n try {\n const { version, latestVersion } = await getVersion(apiClient);\n\n setVersion(version);\n setLatestVersion(latestVersion);\n } catch (error) {\n console.error(\"Error fetching version number:\", error);\n }\n }\n void fetchVersion();\n }, [apiClient]);\n\n return { version, latestVersion };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"api-S5ho3Qs3.js","names":["defaultApiClient"],"sources":["../src/api/types/run.ts","../src/api/runs.ts","../src/api/adhocQuery.ts","../src/api/checkEvents.ts","../src/api/checks.ts","../src/api/cll.ts","../src/api/info.ts","../src/api/lineagecheck.ts","../src/api/rowcount.ts","../src/api/models.ts","../src/api/profile.ts","../src/api/schemacheck.ts","../src/api/select.ts","../src/api/state.ts","../src/api/storageKeys.ts","../src/api/valuediff.ts","../src/api/version.ts"],"sourcesContent":["// packages/ui/src/api/types/run.ts\n// Run types for @datarecce/ui API layer\n// These types define the structure of run objects and their variants\n\nimport type {\n QueryDiffParams,\n QueryDiffResult,\n QueryResult,\n QueryRunParams,\n} from \"../adhocQuery\";\nimport type { LineageDiffResult } from \"../info\";\n// Import param/result types from API modules\nimport type {\n HistogramDiffParams,\n HistogramDiffResult,\n ProfileDiffParams,\n ProfileDiffResult,\n TopKDiffParams,\n TopKDiffResult,\n} from \"../profile\";\nimport type {\n RowCountDiffParams,\n RowCountDiffResult,\n RowCountParams,\n RowCountResult,\n} from \"../rowcount\";\nimport type {\n ValueDiffDetailParams,\n ValueDiffDetailResult,\n ValueDiffParams,\n ValueDiffResult,\n} from \"../valuediff\";\n\n// ============================================================================\n// Run Type Enum\n// ============================================================================\n\n/**\n * All possible run types in the Recce system.\n * This is the canonical definition - consumers should import from here.\n *\n * Note: ``profile_distribution`` is a backend-only run type (DRC-3390). It\n * feeds into schema-view cells rather than rendering as a checklist run, so\n * the run registry has no entry for it — `findByRunType` returns `undefined`.\n * The dispatcher accepts it; the registry does not.\n */\nexport type RunType =\n | \"simple\"\n | \"query\"\n | \"query_base\"\n | \"query_diff\"\n | \"value_diff\"\n | \"value_diff_detail\"\n | \"schema_diff\"\n | \"profile\"\n | \"profile_diff\"\n | \"row_count\"\n | \"row_count_diff\"\n | \"lineage_diff\"\n | \"top_k_diff\"\n | \"histogram_diff\"\n | \"profile_distribution\";\n\n// ============================================================================\n// Run Status Types\n// ============================================================================\n\n/**\n * Possible status values for a run\n */\nexport type RunStatus = \"Finished\" | \"Failed\" | \"Cancelled\" | \"Running\";\n\n/**\n * Progress information for a running task\n */\nexport interface RunProgress {\n message?: string;\n percentage?: number;\n}\n\n// ============================================================================\n// Base Run Interface\n// ============================================================================\n\n/**\n * Base interface for all run objects.\n * All run variants extend this interface with specific params and results.\n */\nexport interface BaseRun {\n /** The type of run - determines params/result structure */\n type: RunType;\n /** Unique identifier for this run */\n run_id: string;\n /** ISO timestamp when the run was executed */\n run_at: string;\n /** Optional human-readable name for the run */\n name?: string;\n /** ID of the check this run belongs to, if any */\n check_id?: string;\n /** Progress information for running tasks */\n progress?: RunProgress;\n /** Error message if the run failed */\n error?: string;\n /** Current status of the run */\n status?: RunStatus;\n /** Who triggered this run: \"user\" | \"recce_ai\" */\n triggered_by?: string;\n}\n\n// ============================================================================\n// Run Param Types (without external dependencies)\n// ============================================================================\n\n/**\n * Schema diff params - used by schema_diff runs\n * Compares schema between base and current environments\n */\nexport interface SchemaDiffParams {\n /** Node ID(s) to compare - can be single or multiple */\n node_id?: string | string[];\n /** dbt select syntax for filtering nodes */\n select?: string;\n /** dbt exclude syntax for filtering nodes */\n exclude?: string;\n /** Package names to include */\n packages?: string[];\n /** View mode - show all models or only changed ones */\n view_mode?: \"all\" | \"changed_models\";\n}\n\n/**\n * Lineage diff params - used by lineage_diff runs\n * Compares lineage graph between base and current environments\n */\nexport interface LineageDiffParams {\n /** dbt select syntax for filtering nodes */\n select?: string;\n /** dbt exclude syntax for filtering nodes */\n exclude?: string;\n /** Package names to include */\n packages?: string[];\n /** View mode - show all models or only changed ones */\n view_mode?: \"all\" | \"changed_models\";\n}\n\n// ============================================================================\n// Run Param Types - Union of all possible run parameters\n// ============================================================================\n\n/**\n * Union of all possible run parameter types.\n * Use this when you need to accept any run params type.\n */\nexport type RunParamTypes =\n | QueryRunParams\n | QueryDiffParams\n | ValueDiffParams\n | ValueDiffDetailParams\n | SchemaDiffParams\n | ProfileDiffParams\n | RowCountParams\n | RowCountDiffParams\n | LineageDiffParams\n | TopKDiffParams\n | HistogramDiffParams\n | ProfileDistributionParams\n | undefined;\n\n// ============================================================================\n// Profile Distribution (DRC-3390 Stage B)\n//\n// Backend-only run type — Stage C's schema-view cells consume these payloads,\n// they don't render as a checklist run. The shape is the API contract Stage B\n// freezes; the backend serves DuckDB; non-DuckDB adapters return the\n// ``unsupported`` envelope variant.\n// ============================================================================\n\n/**\n * Params for a profile_distribution run.\n *\n * Pass ``model`` (the dbt model unique id) and optionally a ``columns``\n * subset to scope the run to just those columns. Omit ``columns`` to profile\n * every non-skipped column in the model.\n */\nexport interface ProfileDistributionParams {\n model: string;\n columns?: string[];\n}\n\n/**\n * Paired-histogram payload for a continuous (numeric or datetime) column.\n *\n * Each env carries its OWN edge array, built from its OWN quantiles:\n * ``base_bin_edges`` / ``current_bin_edges`` hold up to ``NUM_BINS + 1`` edges\n * in the full-quantile case, but a tied/degenerate column collapses adjacent\n * quantiles and yields fewer — edge counts are NOT fixed, so never index a\n * hard-coded position. The only invariant is per-env\n * ``density.length === edges.length - 1``. The two edge\n * arrays intentionally do NOT line up — the backend renders each env on its\n * own quantile spans (``density = (1/NUM_BINS)/span``), the only assumption-\n * free rendering of percentile-only data. The frontend overlays the two\n * staircases on a shared value axis; it must not assume aligned bins. See\n * PR #1398 / DRC-3390 for the contract rationale.\n *\n * Edge encoding is always numeric, but the UNIT depends on the column type:\n * numeric columns emit raw values, datetime columns emit epoch SECONDS (the\n * DRC-3504 ``epoch()`` cast). The payload carries no numeric-vs-datetime\n * marker, so the consumer must use the column's out-of-band dbt type to\n * decide whether to format edges as dates. Stage C owns that formatting.\n */\nexport interface ProfileDistributionHistogramPayload {\n kind: \"histogram\";\n /** Numeric values, or epoch seconds for datetime columns — see above. */\n base_bin_edges: number[];\n current_bin_edges: number[];\n base_density: number[];\n current_density: number[];\n base_total: number;\n current_total: number;\n}\n\n/**\n * Categorical top-K payload, **counts mode** — emitted by adapters whose\n * sketch exposes per-value counts (Snowflake / BigQuery / … in Stage D).\n *\n * ``values`` is the union of the two envs' top-K, base-first then current-only\n * (the same fair merge the ranks variant uses — interleaved before the ``k``\n * cap so neither env's divergent values are dropped).\n * ``base_counts`` / ``current_counts`` are aligned onto ``values`` (same\n * length, ``null`` in the slots where that env didn't have the value in its\n * top-K — Stage C renders those as gap-on-absent). The column-wide\n * denominator for proportions is the envelope's ``base_total`` /\n * ``current_total``, not the sum of the shown slots.\n *\n * When the adapter exposes **no** counts (DuckDB ``approx_top_k`` in Stage B),\n * the backend emits {@link ProfileDistributionTopKRanksPayload} instead — the\n * counts arrays here are therefore never wholly ``null``.\n *\n * ``trimmed`` is true when either env hit the sketch's ``k`` cap, meaning\n * there are more distinct values than fit in the slice.\n */\nexport interface ProfileDistributionTopKPayload {\n kind: \"topk\";\n /** Absent or ``\"counts\"`` selects this variant (vs ``\"ranks\"``). */\n mode?: \"counts\";\n values: unknown[];\n base_counts: (number | null)[];\n current_counts: (number | null)[];\n trimmed: boolean;\n}\n\n/**\n * Categorical top-K payload, **ranks mode** — emitted when the adapter\n * returns the top-K values but no counts (DuckDB ``approx_top_k``, the\n * Stage B hot path). Bar heights encode rank position only.\n *\n * Slot order is baked in by the backend: base's top-K in base-rank order,\n * then values present only in current's top-K appended on the right (in\n * current-rank order). ``base_ranks`` / ``current_ranks`` carry each value's\n * 1-indexed rank within that env's top-K, or ``null`` where the value isn't\n * in that env's top-K (no bar drawn for that side — gap-on-absent). ``k`` is\n * the top-K cap, driving bar-height scaling.\n *\n * Promoting this variant into the wire contract (it previously lived only in\n * the Storybook fixtures) is what lets DuckDB categorical columns render a\n * real paired cell — see DRC-3390's 2026-05-29 contract correction.\n */\nexport interface ProfileDistributionTopKRanksPayload {\n kind: \"topk\";\n mode: \"ranks\";\n values: unknown[];\n base_ranks: (number | null)[];\n current_ranks: (number | null)[];\n k: number;\n trimmed: boolean;\n}\n\n/**\n * Per-column failure marker — the column was attempted but couldn't be\n * computed (e.g., its percentile fragment errored even after the per-column\n * retry path). The frontend renders the column's cell as an inline error\n * without blanking the rest of the row.\n */\nexport interface ProfileDistributionNullPayload {\n kind: null;\n}\n\n/**\n * Per-column payload — one of the variants above. Stage C narrows on ``kind``\n * (histogram / topk / null), then on ``mode`` within ``topk`` (counts vs\n * ranks), to pick the right cell renderer.\n */\nexport type ProfileDistributionColumnPayload =\n | ProfileDistributionHistogramPayload\n | ProfileDistributionTopKPayload\n | ProfileDistributionTopKRanksPayload\n | ProfileDistributionNullPayload;\n\n/**\n * \"Ok\" envelope — the adapter supports the feature; ``columns`` holds the\n * per-column payloads keyed by column name.\n */\nexport interface ProfileDistributionOkResult {\n status: \"ok\";\n /** Strategy router picked this branch — Stage B only emits ``approx_all``. */\n strategy: \"approx_all\";\n columns: Record<string, ProfileDistributionColumnPayload>;\n base_total: number;\n current_total: number;\n /** True when this payload came from the in-memory memoization cache. */\n cache_hit?: boolean;\n}\n\n/**\n * \"Unsupported\" envelope — the adapter lacks native approximate-aggregate\n * support. Stage B's hot path for everything that isn't DuckDB; Stage D\n * extends adapter coverage so fewer adapters fall here.\n *\n * Stage C renders a single banner (not per-column markers) when it sees\n * this envelope.\n */\nexport interface ProfileDistributionUnsupportedResult {\n status: \"unsupported\";\n reason: string;\n columns: Record<string, never>;\n}\n\n/**\n * Discriminated union for the profile_distribution result.\n *\n * Narrow on ``status``:\n * ```ts\n * if (result.status === \"ok\") {\n * // result.columns is fully typed\n * } else {\n * // result.reason is the unsupported banner message\n * }\n * ```\n */\nexport type ProfileDistributionResult =\n | ProfileDistributionOkResult\n | ProfileDistributionUnsupportedResult;\n\n// ============================================================================\n// Run - Full Discriminated Union Type\n// ============================================================================\n\n/**\n * Run type with full discriminated union for type narrowing.\n * TypeScript can narrow params/result types based on the `type` field.\n *\n * Example:\n * ```ts\n * if (run.type === \"query_diff\") {\n * // TypeScript knows run.result is QueryDiffResult | undefined\n * console.log(run.result?.diff);\n * }\n * ```\n */\nexport type Run =\n | (BaseRun & {\n type: \"simple\";\n params?: undefined;\n result?: undefined;\n })\n | (BaseRun & {\n type: \"query\";\n params?: QueryRunParams;\n result?: QueryResult;\n })\n | (BaseRun & {\n type: \"query_base\";\n params?: QueryRunParams;\n result?: QueryResult;\n })\n | (BaseRun & {\n type: \"query_diff\";\n params?: QueryDiffParams;\n result?: QueryDiffResult;\n })\n | (BaseRun & {\n type: \"value_diff\";\n params?: ValueDiffParams;\n result?: ValueDiffResult;\n })\n | (BaseRun & {\n type: \"value_diff_detail\";\n params?: ValueDiffDetailParams;\n result?: ValueDiffDetailResult;\n })\n | (BaseRun & {\n type: \"schema_diff\";\n params?: SchemaDiffParams;\n result?: undefined;\n })\n | (BaseRun & {\n type: \"profile\";\n params?: ProfileDiffParams;\n result?: ProfileDiffResult;\n })\n | (BaseRun & {\n type: \"profile_diff\";\n params?: ProfileDiffParams;\n result?: ProfileDiffResult;\n })\n | (BaseRun & {\n type: \"row_count\";\n params?: RowCountParams;\n result?: RowCountResult;\n })\n | (BaseRun & {\n type: \"row_count_diff\";\n params?: RowCountDiffParams;\n result?: RowCountDiffResult;\n })\n | (BaseRun & {\n type: \"lineage_diff\";\n params?: LineageDiffParams;\n result?: LineageDiffResult;\n })\n | (BaseRun & {\n type: \"top_k_diff\";\n params?: TopKDiffParams;\n result?: TopKDiffResult;\n })\n | (BaseRun & {\n type: \"histogram_diff\";\n params?: HistogramDiffParams;\n result?: HistogramDiffResult;\n })\n | (BaseRun & {\n type: \"profile_distribution\";\n params?: ProfileDistributionParams;\n result?: ProfileDistributionResult;\n });\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard for simple runs\n */\nexport function isSimpleRun(run: Run): run is Run & { type: \"simple\" } {\n return run.type === \"simple\";\n}\n\n/**\n * Type guard for query runs\n */\nexport function isQueryRun(run: Run): run is Run & { type: \"query\" } {\n return run.type === \"query\";\n}\n\n/**\n * Type guard for query_base runs\n */\nexport function isQueryBaseRun(run: Run): run is Run & { type: \"query_base\" } {\n return run.type === \"query_base\";\n}\n\n/**\n * Type guard for query_diff runs\n */\nexport function isQueryDiffRun(run: Run): run is Run & { type: \"query_diff\" } {\n return run.type === \"query_diff\";\n}\n\n/**\n * Type guard for value_diff runs\n */\nexport function isValueDiffRun(run: Run): run is Run & { type: \"value_diff\" } {\n return run.type === \"value_diff\";\n}\n\n/**\n * Type guard for value_diff_detail runs\n */\nexport function isValueDiffDetailRun(\n run: Run,\n): run is Run & { type: \"value_diff_detail\" } {\n return run.type === \"value_diff_detail\";\n}\n\n/**\n * Type guard for schema_diff runs\n */\nexport function isSchemaDiffRun(\n run: Run,\n): run is Run & { type: \"schema_diff\" } {\n return run.type === \"schema_diff\";\n}\n\n/**\n * Type guard for profile runs\n */\nexport function isProfileRun(run: Run): run is Run & { type: \"profile\" } {\n return run.type === \"profile\";\n}\n\n/**\n * Type guard for profile_diff runs\n */\nexport function isProfileDiffRun(\n run: Run,\n): run is Run & { type: \"profile_diff\" } {\n return run.type === \"profile_diff\";\n}\n\n/**\n * Type guard for row_count runs\n */\nexport function isRowCountRun(run: Run): run is Run & { type: \"row_count\" } {\n return run.type === \"row_count\";\n}\n\n/**\n * Type guard for row_count_diff runs\n */\nexport function isRowCountDiffRun(\n run: Run,\n): run is Run & { type: \"row_count_diff\" } {\n return run.type === \"row_count_diff\";\n}\n\n/**\n * Type guard for lineage_diff runs\n */\nexport function isLineageDiffRun(\n run: Run,\n): run is Run & { type: \"lineage_diff\" } {\n return run.type === \"lineage_diff\";\n}\n\n/**\n * Type guard for top_k_diff runs\n */\nexport function isTopKDiffRun(run: Run): run is Run & { type: \"top_k_diff\" } {\n return run.type === \"top_k_diff\";\n}\n\n/**\n * Type guard for histogram_diff runs\n */\nexport function isHistogramDiffRun(\n run: Run,\n): run is Run & { type: \"histogram_diff\" } {\n return run.type === \"histogram_diff\";\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Array of all run type values - useful for iteration and validation\n */\nexport const RUN_TYPES: readonly RunType[] = [\n \"simple\",\n \"query\",\n \"query_base\",\n \"query_diff\",\n \"value_diff\",\n \"value_diff_detail\",\n \"schema_diff\",\n \"profile\",\n \"profile_diff\",\n \"row_count\",\n \"row_count_diff\",\n \"lineage_diff\",\n \"top_k_diff\",\n \"histogram_diff\",\n \"profile_distribution\",\n] as const;\n\n/**\n * Check if a string is a valid RunType\n */\nexport function isValidRunType(value: string): value is RunType {\n return RUN_TYPES.includes(value as RunType);\n}\n\n/**\n * Run types that support screenshot/ref functionality.\n * These are run types that render a visual result view with forwardRef support.\n *\n * Declared with ``as const satisfies readonly RunType[]`` so the literal-tuple\n * type survives — that lets {@link runTypeHasRef} act as a true type guard\n * narrowing to ``RunTypeWithRef`` instead of bare ``boolean``.\n */\nconst RUN_TYPES_WITH_REF = [\n \"query\",\n \"query_base\",\n \"query_diff\",\n \"row_count\",\n \"row_count_diff\",\n \"profile\",\n \"profile_diff\",\n \"value_diff\",\n \"value_diff_detail\",\n \"top_k_diff\",\n \"histogram_diff\",\n] as const satisfies readonly RunType[];\n\n/**\n * Subset of {@link RunType} whose result view supports forwardRef. A narrower\n * type than ``RunType`` so a positive {@link runTypeHasRef} check transitively\n * narrows to a registered run type (every entry here also has a registry entry).\n */\nexport type RunTypeWithRef = (typeof RUN_TYPES_WITH_REF)[number];\n\n/**\n * Check if a run type supports ref forwarding (for screenshots).\n * Run types with refs can capture screenshots of their result views.\n */\nexport function runTypeHasRef(runType: RunType): runType is RunTypeWithRef {\n return (RUN_TYPES_WITH_REF as readonly RunType[]).includes(runType);\n}\n","import type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\nimport { isQueryRun, type Run, type RunType } from \"./types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Aggregated run results by model and run type\n */\nexport type RunsAggregated = Record<\n string,\n Record<\n \"row_count_diff\" | \"value_diff\" | \"row_count\",\n {\n run_id: string;\n result: unknown;\n }\n >\n>;\n\n/**\n * Properties for tracking run submissions (analytics)\n */\nexport interface SubmitRunTrackProps {\n breaking_change_analysis?: boolean;\n source?: \"lineage_model_node\" | \"lineage_column_node\" | \"schema_view\";\n [key: string]: unknown;\n}\n\n/**\n * Options for submitting a run\n */\nexport interface SubmitOptions {\n nowait?: boolean;\n trackProps?: SubmitRunTrackProps;\n}\n\n// ============================================================================\n// Core Run API Functions\n// ============================================================================\n\n/**\n * Submit a new run of the specified type.\n * @param type - The type of run to execute\n * @param params - Parameters specific to the run type\n * @param options - Submission options (nowait, tracking)\n * @param client - Required API client instance (no default - library pattern)\n * @returns The created run, or just run_id if nowait is true\n */\nexport async function submitRun(\n type: RunType,\n params: unknown,\n options: SubmitOptions | undefined,\n client: ApiClient,\n): Promise<Run | Pick<Run, \"run_id\">> {\n const track_props = options?.trackProps ? { ...options.trackProps } : {};\n // NOTE: Removed getExperimentTrackingBreakingChangeEnabled() - OSS-specific\n\n const response = await client.post<\n unknown,\n ApiResponse<Run | Pick<Run, \"run_id\">>\n >(\"/api/runs\", {\n type,\n params,\n nowait: options?.nowait,\n track_props,\n });\n\n return response.data;\n}\n\n/**\n * Get a run by ID.\n * @param runId - The ID of the run to retrieve\n * @param client - Required API client instance\n * @returns The run object\n */\nexport async function getRun(runId: string, client: ApiClient): Promise<Run> {\n const response = await client.get<never, ApiResponse<Run>>(\n `/api/runs/${runId}`,\n );\n return response.data;\n}\n\n/**\n * Wait for a run to complete.\n * @param runId - The ID of the run to wait for\n * @param timeout - Optional timeout in seconds\n * @param client - Required API client instance\n * @returns The completed run object with result\n */\nexport async function waitRun(\n runId: string,\n timeout: number | undefined,\n client: ApiClient,\n): Promise<Run> {\n const response = await client.get<unknown, ApiResponse<Run>>(\n `/api/runs/${runId}/wait`,\n { params: { timeout } },\n );\n return mutateAddKey(response.data);\n}\n\n/**\n * Cancel a running run.\n * @param runId - The ID of the run to cancel\n * @param client - Required API client instance\n */\nexport async function cancelRun(\n runId: string,\n client: ApiClient,\n): Promise<void> {\n try {\n await client.post(`/api/runs/${runId}/cancel`);\n } catch {\n // Fire-and-forget: the UI has already detached. Network failures\n // here do not affect the user's ability to continue working.\n }\n}\n\n/**\n * Submit a run from an existing check.\n * Re-runs the check with its stored parameters.\n * @param checkId - The ID of the check to run\n * @param options - Submission options (nowait)\n * @param client - Required API client instance\n * @returns The created run, or just run_id if nowait is true\n */\nexport async function submitRunFromCheck(\n checkId: string,\n options: SubmitOptions | undefined,\n client: ApiClient,\n): Promise<Run | Pick<Run, \"run_id\">> {\n const response = await client.post<\n unknown,\n ApiResponse<Run | Pick<Run, \"run_id\">>\n >(`/api/checks/${checkId}/run`, {\n nowait: options?.nowait,\n });\n return response.data;\n}\n\n/**\n * Search for runs matching criteria.\n * @param type - The run type to search for\n * @param params - Parameters to match against run params\n * @param limit - Maximum number of results to return\n * @param client - Required API client instance\n * @returns Array of matching runs\n */\nexport async function searchRuns(\n type: string,\n params: Record<string, unknown> | undefined,\n limit: number | undefined,\n client: ApiClient,\n): Promise<Run[]> {\n const response = await client.post<unknown, ApiResponse<Run[]>>(\n \"/api/runs/search\",\n { type, params, limit },\n );\n return response.data;\n}\n\n/**\n * List all runs.\n * @param client - Required API client instance\n * @returns Array of all runs\n */\nexport async function listRuns(client: ApiClient): Promise<Run[]> {\n const response = await client.get<never, ApiResponse<Run[]>>(\"/api/runs\");\n return response.data;\n}\n\n/**\n * Aggregate runs from API.\n * Returns run results grouped by model and run type.\n * @param client - Required API client instance\n * @returns Aggregated run results\n */\nexport async function aggregateRuns(\n client: ApiClient,\n): Promise<RunsAggregated> {\n const response = await client.post<unknown, ApiResponse<RunsAggregated>>(\n \"/api/runs/aggregate\",\n {},\n );\n return response.data;\n}\n\n// ============================================================================\n// Internal Helpers\n// ============================================================================\n\n/**\n * Internal helper to add key to query result columns.\n * Query results may have columns without a key property set.\n * This ensures all columns have a key for data grid rendering.\n */\nfunction mutateAddKey(run: Run): Run {\n if (run.result == null) {\n return run;\n }\n if (isQueryRun(run) && run.result) {\n // Type narrowing - run.result structure for query runs\n const result = run.result as {\n columns?: Array<{ key?: string; name: string }>;\n };\n if (result.columns) {\n result.columns = result.columns.map((c) => {\n if (c.key) return c;\n return { ...c, key: c.name };\n });\n }\n }\n return run;\n}\n","import type { ApiClient } from \"../lib/fetchClient\";\nimport { type SubmitOptions, submitRun } from \"./runs\";\nimport { type ColumnRenderMode, type DataFrame } from \"./types\";\n\n// ============================================================================\n// Query Types\n// ============================================================================\n\nexport interface QueryRunParams {\n sql_template: string;\n}\n\nexport type QueryResult = DataFrame;\n\nexport interface QueryViewOptions {\n pinned_columns?: string[];\n columnsRenderMode?: Record<string, ColumnRenderMode>;\n}\n\n// ============================================================================\n// Query Diff Types\n// ============================================================================\n\nexport interface QueryDiffParams {\n sql_template: string;\n base_sql_template?: string;\n primary_keys?: string[];\n}\n\nexport interface QueryDiffResult {\n base?: DataFrame;\n current?: DataFrame;\n diff?: DataFrame;\n}\n\nexport interface QueryDiffViewOptions {\n changed_only?: boolean;\n primary_keys?: string[];\n pinned_columns?: string[];\n display_mode?: \"inline\" | \"side_by_side\";\n columnsRenderMode?: Record<string, ColumnRenderMode>;\n}\n\n// ============================================================================\n// Preview Change Types\n// ============================================================================\n\nexport interface QueryPreviewChangeParams {\n current_model?: string;\n sql_template: string;\n primary_keys?: string[];\n}\n\nexport interface QueryParams\n extends QueryRunParams,\n QueryDiffParams,\n QueryPreviewChangeParams {}\n\n// ============================================================================\n// API Functions\n// ============================================================================\n\nexport async function submitQuery(\n params: QueryRunParams,\n options: SubmitOptions | undefined,\n client: ApiClient,\n) {\n return await submitRun(\"query\", params, options, client);\n}\n\nexport async function submitQueryBase(\n params: QueryRunParams,\n options: SubmitOptions | undefined,\n client: ApiClient,\n) {\n return await submitRun(\"query_base\", params, options, client);\n}\n\nexport async function submitQueryDiff(\n params: QueryDiffParams,\n options: SubmitOptions | undefined,\n client: ApiClient,\n) {\n return await submitRun(\"query_diff\", params, options, client);\n}\n","/**\n * Check Events API - Types and Client Functions\n *\n * Provides timeline/conversation functionality for Checks, enabling\n * GitHub PR-style discussions with comments and automatic tracking\n * of state changes.\n *\n * NOTE: This feature is only available when connected to Recce Cloud.\n */\n\nimport type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\nexport type CheckEventType =\n | \"check_created\"\n | \"comment\"\n | \"approval_change\"\n | \"description_change\"\n | \"name_change\"\n | \"preset_applied\";\n\nexport type ActorType = \"user\" | \"recce_ai\" | \"preset_system\";\n\n// ============================================================================\n// Actor Interface\n// ============================================================================\n\nexport interface CheckEventActor {\n type: ActorType;\n user_id: number | null;\n login: string | null;\n fullname: string | null;\n}\n\n// ============================================================================\n// Check Event Interface\n// ============================================================================\n\nexport interface CheckEvent {\n id: string;\n check_id: string;\n event_type: CheckEventType;\n actor: CheckEventActor;\n content: string | null;\n old_value: string | null;\n new_value: string | null;\n is_edited: boolean;\n is_deleted: boolean;\n created_at: string;\n updated_at: string;\n}\n\n// ============================================================================\n// Request/Response Types\n// ============================================================================\n\nexport interface CreateCommentRequest {\n content: string;\n}\n\nexport interface UpdateCommentRequest {\n content: string;\n}\n\nexport interface CheckEventsListResponse {\n events: CheckEvent[];\n}\n\n// ============================================================================\n// API Client Functions\n// ============================================================================\n\n/**\n * List all events for a check in chronological order.\n *\n * @param checkId - The check ID\n * @param client - Axios instance for API configuration\n * @returns Promise resolving to array of CheckEvent objects\n */\nexport async function listCheckEvents(\n checkId: string,\n client: ApiClient,\n): Promise<CheckEvent[]> {\n const response = await client.get<never, ApiResponse<CheckEvent[]>>(\n `/api/checks/${checkId}/events`,\n );\n return response.data;\n}\n\n/**\n * Get a specific event by ID.\n *\n * @param checkId - The check ID\n * @param eventId - The event ID\n * @param client - Axios instance for API configuration\n * @returns Promise resolving to a CheckEvent object\n */\nexport async function getCheckEvent(\n checkId: string,\n eventId: string,\n client: ApiClient,\n): Promise<CheckEvent> {\n const response = await client.get<never, ApiResponse<CheckEvent>>(\n `/api/checks/${checkId}/events/${eventId}`,\n );\n return response.data;\n}\n\n/**\n * Create a new comment on a check.\n *\n * @param checkId - The check ID\n * @param content - The comment content (plain text for now, markdown later)\n * @param client - Axios instance for API configuration\n * @returns Promise resolving to the created CheckEvent\n */\nexport async function createComment(\n checkId: string,\n content: string,\n client: ApiClient,\n): Promise<CheckEvent> {\n const response = await client.post<\n CreateCommentRequest,\n ApiResponse<CheckEvent>\n >(`/api/checks/${checkId}/events`, { content });\n return response.data;\n}\n\n/**\n * Update an existing comment.\n * Only the author or an admin can update a comment.\n *\n * @param checkId - The check ID\n * @param eventId - The event ID of the comment to update\n * @param content - The new comment content\n * @param client - Axios instance for API configuration\n * @returns Promise resolving to the updated CheckEvent\n */\nexport async function updateComment(\n checkId: string,\n eventId: string,\n content: string,\n client: ApiClient,\n): Promise<CheckEvent> {\n const response = await client.patch<\n UpdateCommentRequest,\n ApiResponse<CheckEvent>\n >(`/api/checks/${checkId}/events/${eventId}`, { content });\n return response.data;\n}\n\n/**\n * Delete a comment (soft delete).\n * Only the author or an admin can delete a comment.\n *\n * @param checkId - The check ID\n * @param eventId - The event ID of the comment to delete\n * @param client - Axios instance for API configuration\n * @returns Promise resolving when deletion is complete\n */\nexport async function deleteComment(\n checkId: string,\n eventId: string,\n client: ApiClient,\n): Promise<void> {\n await client.delete(`/api/checks/${checkId}/events/${eventId}`);\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport function isCommentEvent(event: CheckEvent): boolean {\n return event.event_type === \"comment\";\n}\n\nexport function isStateChangeEvent(event: CheckEvent): boolean {\n return (\n event.event_type === \"approval_change\" ||\n event.event_type === \"description_change\" ||\n event.event_type === \"name_change\"\n );\n}\n\nexport function isSystemEvent(event: CheckEvent): boolean {\n return (\n event.event_type === \"check_created\" ||\n event.event_type === \"preset_applied\"\n );\n}\n\n// ============================================================================\n// Display Helpers\n// ============================================================================\n\n/**\n * Get a human-readable description of an event for display.\n */\nexport function getEventDescription(event: CheckEvent): string {\n const actorName = event.actor.fullname || event.actor.login || \"Someone\";\n\n switch (event.event_type) {\n case \"check_created\":\n return `${actorName} created this check`;\n case \"comment\":\n if (event.is_deleted) {\n return \"Comment deleted\";\n }\n return event.content || \"\";\n case \"approval_change\":\n if (event.new_value === \"true\") {\n return `${actorName} approved this check`;\n }\n return `${actorName} unapproved this check`;\n case \"description_change\":\n return `${actorName} updated the description`;\n case \"name_change\":\n return `${actorName} renamed this check`;\n case \"preset_applied\":\n return `${actorName} applied a preset`;\n default:\n return `${actorName} made a change`;\n }\n}\n\n/**\n * Get the appropriate icon name for an event type.\n * Returns a string that can be used with react-icons.\n */\nexport function getEventIconType(\n event: CheckEvent,\n): \"comment\" | \"approve\" | \"unapprove\" | \"edit\" | \"create\" | \"preset\" {\n switch (event.event_type) {\n case \"check_created\":\n return \"create\";\n case \"comment\":\n return \"comment\";\n case \"approval_change\":\n return event.new_value === \"true\" ? \"approve\" : \"unapprove\";\n case \"description_change\":\n case \"name_change\":\n return \"edit\";\n case \"preset_applied\":\n return \"preset\";\n default:\n return \"edit\";\n }\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport {\n type ApiClient,\n type ApiResponse,\n createFetchClient,\n} from \"../lib/fetchClient\";\nimport { useApiConfigOptional } from \"../providers/contexts/ApiContext\";\nimport { cacheKeys } from \"./cacheKeys\";\nimport type { Run, RunType } from \"./types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * A check object representing a saved validation check.\n * @template PT - The type of params for this check\n * @template VO - The type of view options for this check\n */\nexport interface Check<PT = unknown, VO = unknown> {\n check_id: string;\n name: string;\n description?: string;\n type: RunType;\n params?: PT;\n view_options?: VO;\n is_checked?: boolean;\n is_preset?: boolean;\n last_run?: Run;\n is_outdated?: boolean;\n actor_type?: string; // \"recce_ai\" | \"user\" | \"preset_system\" — Cloud-only, undefined in OSS\n}\n\n/**\n * Request body for creating a new check.\n */\nexport interface CreateCheckBody {\n name?: string;\n description?: string;\n run_id?: string;\n type?: RunType;\n params?: Record<string, unknown>;\n view_options?: Record<string, unknown>;\n track_props?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Default Client (for hooks used outside RecceProvider)\n// ============================================================================\n\n/**\n * Default API client for hooks that may be used outside RecceProvider.\n * This is a fallback - components inside RecceProvider will use the configured client.\n */\nconst defaultApiClient = createFetchClient({ baseURL: \"\" });\n\n// ============================================================================\n// API Functions\n// ============================================================================\n\n/**\n * Create a simple check (no run association).\n * @param client - Required API client instance\n * @returns The created check\n */\nexport async function createSimpleCheck(client: ApiClient): Promise<Check> {\n const response = await client.post<CreateCheckBody, ApiResponse<Check>>(\n \"/api/checks\",\n {\n type: \"simple\",\n },\n );\n return response.data;\n}\n\n/**\n * Create a check from an existing run.\n * @param runId - The ID of the run to create a check from\n * @param viewOptions - Optional view options for the check\n * @param client - Required API client instance\n * @returns The created check\n */\nexport async function createCheckByRun(\n runId: string,\n viewOptions: Record<string, unknown> | undefined,\n client: ApiClient,\n): Promise<Check> {\n // NOTE: Removed getExperimentTrackingBreakingChangeEnabled() - OSS-specific\n const response = await client.post<CreateCheckBody, ApiResponse<Check>>(\n \"/api/checks\",\n {\n run_id: runId,\n view_options: viewOptions,\n },\n );\n return response.data;\n}\n\n/**\n * List all checks.\n * @param client - Required API client instance\n * @returns Array of all checks\n */\nexport async function listChecks(client: ApiClient): Promise<Check[]> {\n return (await client.get<never, ApiResponse<Check[]>>(\"/api/checks\")).data;\n}\n\n/**\n * Get a check by ID.\n * @param checkId - The ID of the check to retrieve\n * @param client - Required API client instance\n * @returns The check object\n */\nexport async function getCheck(\n checkId: string,\n client: ApiClient,\n): Promise<Check> {\n const response = await client.get<never, ApiResponse<Check>>(\n `/api/checks/${checkId}`,\n );\n return response.data;\n}\n\n/**\n * Update an existing check.\n * @param checkId - The ID of the check to update\n * @param payload - Partial check data to update\n * @param client - Required API client instance\n * @returns The updated check\n */\nexport async function updateCheck(\n checkId: string,\n payload: Partial<Check>,\n client: ApiClient,\n): Promise<Check> {\n const response = await client.patch<Partial<Check>, ApiResponse<Check>>(\n `/api/checks/${checkId}`,\n payload,\n );\n return response.data;\n}\n\n/**\n * Delete a check.\n * @param checkId - The ID of the check to delete\n * @param client - Required API client instance\n * @returns The deleted check ID\n */\nexport async function deleteCheck(\n checkId: string,\n client: ApiClient,\n): Promise<Pick<Check, \"check_id\">> {\n const response = await client.delete<\n never,\n ApiResponse<Pick<Check, \"check_id\">>\n >(`/api/checks/${checkId}`);\n return response.data;\n}\n\n/**\n * Reorder checks.\n * @param order - Source and destination indices\n * @param client - Required API client instance\n */\nexport async function reorderChecks(\n order: {\n source: number;\n destination: number;\n },\n client: ApiClient,\n): Promise<void> {\n await client.post(\"/api/checks/reorder\", order);\n}\n\n/**\n * Mark a check as a preset check.\n * @param checkId - The ID of the check to mark as preset\n * @param client - Required API client instance\n */\nexport async function markAsPresetCheck(\n checkId: string,\n client: ApiClient,\n): Promise<void> {\n await client.post(`/api/checks/${checkId}/mark-as-preset`);\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Hook to fetch and cache the list of checks.\n * Can be used outside RecceProvider with a fallback to default API client.\n *\n * @param enabled - Whether the query should be enabled\n * @returns TanStack Query result with checks data\n */\nexport function useChecks(enabled: boolean) {\n const apiConfig = useApiConfigOptional();\n const apiClient = apiConfig?.apiClient ?? defaultApiClient;\n\n return useQuery({\n queryKey: cacheKeys.checks(),\n queryFn: () => listChecks(apiClient),\n enabled,\n });\n}\n","/**\n * Column-Level Lineage (CLL) API - Types and Client Functions\n *\n * Provides column-level lineage analysis functionality for data models.\n */\n\nimport type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\nimport type { NodeColumnData } from \"./info\";\n\n// ============================================================================\n// Input Types\n// ============================================================================\n\nexport interface CllInput {\n node_id?: string;\n column?: string;\n change_analysis?: boolean;\n no_cll?: boolean;\n no_upstream?: boolean;\n no_downstream?: boolean;\n}\n\nexport interface ImpactRadiusParams {\n node_id: string;\n}\n\n// ============================================================================\n// Result Types\n// ============================================================================\n\nexport interface CllNodeData {\n id: string;\n name: string;\n source_name: string;\n resource_type: string;\n raw_code?: string;\n change_status?: \"added\" | \"removed\" | \"modified\" | \"unknown\";\n change_category?:\n | \"breaking\"\n | \"non_breaking\"\n | \"partial_breaking\"\n | \"unknown\";\n impacted?: boolean;\n columns?: Record<string, NodeColumnData>;\n}\n\nexport interface ColumnLineageData {\n current: {\n nodes: Record<string, CllNodeData>;\n columns: Record<string, NodeColumnData>;\n /** JSON arrays from API - iterable like Set but properly typed */\n parent_map: Record<string, string[]>;\n /** JSON arrays from API - iterable like Set but properly typed */\n child_map: Record<string, string[]>;\n };\n}\n\n// ============================================================================\n// API Client Functions\n// ============================================================================\n\n/**\n * Get column-level lineage data.\n *\n * @param input - CLL input parameters\n * @param client - Axios instance for API configuration\n * @returns Promise resolving to column lineage data\n */\nexport async function getCll(\n input: CllInput,\n client: ApiClient,\n): Promise<ColumnLineageData> {\n const response = await client.post<CllInput, ApiResponse<ColumnLineageData>>(\n \"/api/cll\",\n input,\n );\n\n return response.data;\n}\n","import type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\n\n/**\n * Column-level data for a node\n */\nexport interface NodeColumnData {\n name: string;\n type: string;\n transformation_type?: string;\n change_status?: \"added\" | \"removed\" | \"modified\" | \"unknown\";\n not_null?: boolean;\n unique?: boolean;\n}\n\n/**\n * Node data within lineage\n */\nexport interface NodeData {\n id: string;\n unique_id: string;\n name: string;\n schema?: string;\n checksum?: {\n name: string;\n checksum: string;\n };\n raw_code?: string;\n resource_type?: string;\n package_name?: string;\n columns?: Record<string, NodeColumnData | undefined>;\n primary_key?: string;\n config?: {\n materialized?: string;\n };\n}\n\n/**\n * dbt artifact metadata\n * @see https://docs.getdbt.com/reference/artifacts/dbt-artifacts#common-metadata\n */\ninterface ArtifactMetadata {\n dbt_version: string;\n dbt_schema_version: string;\n generated_at: string;\n adapter_type: string;\n env: Record<string, string>;\n invocation_id: string;\n}\n\n/**\n * Manifest metadata extends artifact metadata\n */\nexport interface ManifestMetadata extends ArtifactMetadata {\n project_id?: string;\n project_name?: string;\n user_id?: string;\n}\n\n/**\n * SQLMesh environment info\n */\nexport interface SQLMeshInfo {\n base_env: string;\n current_env: string;\n}\n\nexport type CatalogMetadata = ArtifactMetadata;\n\n/**\n * Merged node from server-side lineage merge (DRC-3258).\n * Contains unified metadata from base+current with baked-in diff.\n */\nexport interface MergedNodeData {\n name: string;\n resource_type: string;\n package_name: string;\n schema?: string;\n materialized?: string;\n tags?: string[];\n source_name?: string;\n change_status?: \"added\" | \"removed\" | \"modified\" | \"unknown\";\n change?: {\n category: \"breaking\" | \"non_breaking\" | \"partial_breaking\" | \"unknown\";\n columns?: Record<string, \"added\" | \"removed\" | \"modified\" | \"unknown\">;\n };\n}\n\n/**\n * Merged edge from server-side lineage merge (DRC-3258).\n */\nexport interface MergedEdgeData {\n source: string;\n target: string;\n change_status?: \"added\" | \"removed\";\n}\n\n/**\n * Per-environment metadata in merged lineage response.\n */\nexport interface MergedLineageEnvMetadata {\n manifest_metadata?: ManifestMetadata;\n catalog_metadata?: CatalogMetadata;\n}\n\n/**\n * Server-side merged lineage response from /api/info.\n * Replaces the old {base, current, diff} triple.\n */\nexport interface MergedLineageResponse {\n nodes: Record<string, MergedNodeData>;\n edges: MergedEdgeData[];\n metadata: {\n base: MergedLineageEnvMetadata;\n current: MergedLineageEnvMetadata;\n };\n}\n\n/**\n * Lineage data structure\n */\nexport interface LineageData {\n metadata: {\n pr_url: string;\n git_branch?: string;\n };\n nodes: Record<string, NodeData>;\n parent_map: Record<string, string[]>;\n manifest_metadata?: ManifestMetadata | null;\n catalog_metadata?: CatalogMetadata | null;\n}\n\nexport interface LineageDataFromMetadata extends Omit<LineageData, \"nodes\"> {\n nodes: Record<string, NodeData | undefined>;\n}\n\n/**\n * Lineage diff result from lineage_diff run type\n */\nexport interface LineageDiffResult {\n base?: LineageData;\n current?: LineageData;\n base_error?: string;\n current_error?: string;\n}\n\n/**\n * State metadata for recce state file\n */\nexport interface StateMetadata {\n schema_version: string;\n recce_version: string;\n generated_at: string;\n}\n\n/**\n * Session staleness fields returned by the backend when the PR session's\n * frozen-snapshot base may have diverged from the project's current shared base.\n * All fields are null for legacy sessions (pre-DRC-3309) or OSS mode.\n */\nexport interface SessionStaleness {\n /** ID of the shared-base session that was cloned into this PR session. */\n source_session_id: string | null;\n /** Timestamp of the shared-base session at clone time (ISO 8601). */\n source_session_updated_at: string | null;\n /** ID of the project's current shared-base session. */\n current_base_session_id: string | null;\n /** Timestamp of the project's current shared-base session (ISO 8601). */\n current_base_updated_at: string | null;\n}\n\n/**\n * Returns true when the PR session's frozen snapshot is outdated relative to\n * the project's current shared base.\n *\n * Conditions:\n * - source_session_id must be non-null (i.e. session was auto-snapshotted)\n * - Either the source session ID or its timestamp differs from the current base\n */\nexport function isSessionBaseOutdated(s: SessionStaleness): boolean {\n return (\n s.source_session_id !== null &&\n (s.source_session_id !== s.current_base_session_id ||\n s.source_session_updated_at !== s.current_base_updated_at)\n );\n}\n\n/**\n * Git information\n */\nexport interface GitInfo {\n branch?: string;\n}\n\n/**\n * Pull request information\n */\nexport interface PullRequestInfo {\n id?: string | number;\n title?: string;\n url?: string;\n branch?: string;\n base_branch?: string;\n}\n\n/**\n * Server info result from /api/info endpoint\n */\nexport interface ServerInfoResult {\n state_metadata: StateMetadata;\n adapter_type: string;\n review_mode: boolean;\n cloud_mode: boolean;\n file_mode: boolean;\n filename?: string;\n git?: GitInfo;\n pull_request?: PullRequestInfo;\n sqlmesh?: SQLMeshInfo;\n lineage: MergedLineageResponse;\n demo: boolean;\n codespace: boolean;\n support_tasks: Record<string, boolean>;\n /** Session staleness fields (cloud mode only, null for OSS / legacy sessions). */\n session_staleness?: SessionStaleness;\n}\n\n/**\n * Fetch server info from API\n */\nexport async function getServerInfo(\n client: ApiClient,\n): Promise<ServerInfoResult> {\n const response = await client.get<never, ApiResponse<ServerInfoResult>>(\n \"/api/info\",\n );\n return response.data;\n}\n\n/**\n * Per-environment model detail returned by /api/models/:model\n *\n * `raw_code` is served on-demand here so it can be stripped from the bulk\n * /api/info lineage payload (DRC-3263).\n */\nexport interface ModelEnvDetail {\n columns?: Record<string, NodeColumnData>;\n primary_key?: string;\n raw_code?: string;\n}\n\n/**\n * Model info result from /api/models/:model endpoint\n */\nexport interface ModelInfoResult {\n model: {\n base: ModelEnvDetail;\n current: ModelEnvDetail;\n };\n}\n\n/**\n * Fetch model info (columns and primary key) from API\n */\nexport async function getModelInfo(\n model: string,\n client: ApiClient,\n): Promise<ModelInfoResult> {\n const response = await client.get<never, ApiResponse<ModelInfoResult>>(\n `/api/models/${model}`,\n );\n return response.data;\n}\n\n/**\n * Refresh the PR session's frozen-snapshot base from the project's current\n * shared base. Backend resolves the session via the `/api/v2/sessions/<id>`\n * mount prefix (cloud mode); takes no body.\n *\n * On success, the backend emits a `metadata_updated` WS event which the\n * frontend uses to invalidate the lineage cache.\n */\nexport async function refreshSessionBase(client: ApiClient): Promise<void> {\n await client.post<never, ApiResponse<void>>(\"/api/refresh-base\");\n}\n","/**\n * Lineage Check API - Types and Client Functions\n *\n * Provides functionality for creating lineage diff checks.\n */\n\nimport type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\nimport type { Check } from \"./checks\";\nimport type { CllInput } from \"./cll\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface LineageDiffViewOptions {\n view_mode?: \"changed_models\" | \"all\";\n node_ids?: string[];\n packages?: string[];\n select?: string;\n exclude?: string;\n column_level_lineage?: CllInput;\n}\n\ninterface CreateLineageDiffCheckBody {\n type: string;\n params: Record<string, string | boolean | number>;\n view_options: LineageDiffViewOptions;\n}\n\n// ============================================================================\n// API Client Functions\n// ============================================================================\n\n/**\n * Create a lineage diff check.\n *\n * @param viewOptions - View options for the lineage diff\n * @param client - Axios instance for API configuration\n * @returns Promise resolving to the created check\n */\nexport async function createLineageDiffCheck(\n viewOptions: LineageDiffViewOptions,\n client: ApiClient,\n): Promise<Check> {\n const response = await client.post<\n CreateLineageDiffCheckBody,\n ApiResponse<Check>\n >(\"/api/checks\", {\n type: \"lineage_diff\",\n params: {},\n view_options: viewOptions,\n });\n\n return response.data;\n}\n","import type { ApiClient } from \"../lib/fetchClient\";\nimport { type SubmitOptions, submitRun } from \"./runs\";\n\n// ============================================================================\n// Row Count Types\n// ============================================================================\n\nexport interface RowCountParams {\n node_names: string[];\n}\n\nexport interface RowCount {\n name?: string;\n curr: number | null;\n}\n\nexport type RowCountResult = Record<string, RowCount>;\n\n// ============================================================================\n// Row Count Diff Types\n// ============================================================================\n\nexport interface RowCountDiffParams {\n node_names: string[];\n}\n\nexport interface RowCountDiff {\n name?: string;\n base: number | null;\n curr: number | null;\n}\n\nexport type RowCountDiffResult = Record<string, RowCountDiff>;\n\n// ============================================================================\n// API Functions\n// ============================================================================\n\nexport async function submitRowCountDiff(\n params: RowCountDiffParams,\n options: SubmitOptions | undefined,\n client: ApiClient,\n) {\n return await submitRun(\"row_count_diff\", params, options, client);\n}\n","import type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\nimport type { RowCountDiff, RowCountDiffResult } from \"./rowcount\";\nimport { submitRowCountDiff } from \"./rowcount\";\nimport { waitRun } from \"./runs\";\n\n// Re-export for convenience (types are defined in rowcount.ts)\nexport type { RowCountDiff } from \"./rowcount\";\n\n// ============================================================================\n// Model Row Count Types\n// ============================================================================\n\nexport interface QueryRowCountResult {\n runId: string;\n result: RowCountDiffResult;\n}\n\n// ============================================================================\n// Model Row Count API Functions\n// ============================================================================\n\n/**\n * Fetch model row count from the API (cached value).\n * @param modelName - The name of the model\n * @param client - Required API client instance\n * @returns The row count diff for the model\n */\nexport async function fetchModelRowCount(\n modelName: string,\n client: ApiClient,\n): Promise<RowCountDiff> {\n const response = await client.get<never, ApiResponse<RowCountDiff>>(\n `/api/models/${modelName}/row_count`,\n );\n return response.data;\n}\n\n/**\n * Query model row count by executing a row count diff run.\n * @param modelName - The name of the model\n * @param client - Required API client instance\n * @returns The row count diff for the model\n */\nexport async function queryModelRowCount(\n modelName: string,\n client: ApiClient,\n): Promise<RowCountDiff> {\n const { result } = await queryRowCount([modelName], client);\n return result[modelName];\n}\n\n/**\n * Query row counts for multiple models.\n * @param modelNames - Array of model names to query\n * @param client - Required API client instance\n * @returns The run ID and row count diff results for all models\n */\nexport async function queryRowCount(\n modelNames: string[],\n client: ApiClient,\n): Promise<QueryRowCountResult> {\n if (modelNames.length === 0) {\n throw new Error(\"No model names provided\");\n }\n\n const { run_id } = await submitRowCountDiff(\n { node_names: modelNames },\n { nowait: true },\n client,\n );\n const run = await waitRun(run_id, undefined, client);\n\n return {\n runId: run_id,\n result: run.result as RowCountDiffResult,\n };\n}\n","import type { ApiClient } from \"../lib/fetchClient\";\nimport { type SubmitOptions, submitRun } from \"./runs\";\nimport { type ColumnRenderMode, type DataFrame } from \"./types\";\nimport type { ProfileDistributionParams } from \"./types/run\";\n\n// ============================================================================\n// Profile Diff Types\n// ============================================================================\n\nexport interface ProfileDiffParams {\n model: string;\n columns?: string[];\n}\n\nexport interface ProfileDiffResult {\n base?: DataFrame;\n current?: DataFrame;\n}\n\nexport interface ProfileDiffViewOptions {\n pinned_columns?: string[];\n display_mode?: \"side_by_side\" | \"inline\";\n columnsRenderMode?: Record<string, ColumnRenderMode>;\n}\n\n// ============================================================================\n// API Functions\n// ============================================================================\n\nexport async function submitProfileDiff(\n params: ProfileDiffParams,\n options: SubmitOptions | undefined,\n client: ApiClient,\n) {\n return await submitRun(\"profile_diff\", params, options, client);\n}\n\n/**\n * Submit a `profile_distribution` run (DRC-3390 Stage C).\n *\n * Backed by the DuckDB-only `approx_all` pipeline in Stage B. The result is a\n * {@link ProfileDistributionResult} discriminated union (`ok` with per-column\n * payloads, or an `unsupported` envelope for adapters without native\n * approx-aggregate support). Callers normally drive this through\n * {@link useInlineProfileDistribution} rather than calling it directly.\n */\nexport async function submitProfileDistribution(\n params: ProfileDistributionParams,\n options: SubmitOptions | undefined,\n client: ApiClient,\n) {\n return await submitRun(\"profile_distribution\", params, options, client);\n}\n\n// ============================================================================\n// Top-K Types\n// ============================================================================\n\nexport interface TopKDiffParams {\n model: string;\n column_name: string;\n k: number;\n}\n\nexport interface TopKResult {\n values: (string | number | undefined)[];\n counts: number[];\n valids: number;\n}\n\nexport interface TopKDiffResult {\n base: TopKResult;\n current: TopKResult;\n}\n\n/**\n * View options for TopKDiffResultView.\n * Controls display preferences for top-K diff visualization.\n */\nexport interface TopKViewOptions {\n /**\n * When true, show all items instead of just top 10.\n * Default is false (show top 10 only).\n */\n show_all?: boolean;\n}\n\n// ============================================================================\n// Histogram Types\n// ============================================================================\n\nexport interface HistogramDiffParams {\n model: string;\n column_name: string;\n column_type: string;\n}\n\nexport interface HistogramResult {\n counts: number[];\n total: number;\n}\n\nexport interface HistogramDiffResult {\n base: HistogramResult;\n current: HistogramResult;\n min: number;\n max: number;\n bin_edges: number[];\n labels?: string[];\n}\n","/**\n * Schema Check API - Types and Client Functions\n *\n * Provides functionality for creating schema diff checks.\n */\n\nimport type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\nimport type { Check } from \"./checks\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SchemaDiffViewParams {\n node_id?: string | string[];\n select?: string;\n exclude?: string;\n view_mode?: \"all\" | \"changed_models\";\n packages?: string[];\n}\n\ninterface CreateSchemaDiffCheckBody {\n type: string;\n params: SchemaDiffViewParams;\n}\n\n// ============================================================================\n// API Client Functions\n// ============================================================================\n\n/**\n * Create a schema diff check.\n *\n * @param params - Schema diff parameters\n * @param client - Axios instance for API configuration\n * @returns Promise resolving to the created check\n */\nexport async function createSchemaDiffCheck(\n params: SchemaDiffViewParams,\n client: ApiClient,\n): Promise<Check> {\n const response = await client.post<\n CreateSchemaDiffCheckBody,\n ApiResponse<Check>\n >(\"/api/checks\", {\n type: \"schema_diff\",\n params: params,\n });\n\n return response.data;\n}\n","\"use client\";\n\nimport type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\n\nexport interface SelectInput {\n select?: string;\n exclude?: string;\n packages?: string[];\n view_mode?: \"all\" | \"changed_models\";\n}\n\nexport interface SelectOutput {\n nodes: string[];\n}\n\nexport async function select(\n input: SelectInput,\n client: ApiClient,\n): Promise<SelectOutput> {\n return (\n await client.post<SelectInput, ApiResponse<SelectOutput>>(\n `/api/select`,\n input,\n )\n ).data;\n}\n","\"use client\";\n\nimport type { ApiClient, ApiResponse } from \"../lib/fetchClient\";\nimport { isHttpError } from \"../lib/fetchClient\";\n\nexport interface SaveAsInput {\n filename: string;\n overwrite?: boolean;\n}\n\nexport interface ImportedState {\n runs: number;\n checks: number;\n}\n\nexport async function saveAs(\n input: SaveAsInput,\n client: ApiClient,\n): Promise<void> {\n return (\n await client.post<SaveAsInput, ApiResponse<void>>(\"/api/save-as\", input)\n ).data;\n}\n\nexport async function rename(\n input: SaveAsInput,\n client: ApiClient,\n): Promise<void> {\n return (\n await client.post<SaveAsInput, ApiResponse<void>>(\"/api/rename\", input)\n ).data;\n}\n\nexport async function exportState(client: ApiClient): Promise<string> {\n return (await client.post<never, ApiResponse<string>>(\"/api/export\")).data;\n}\n\ninterface ImportStateBody {\n file: File;\n checks_only: \"true\" | \"false\";\n}\n\nexport async function importState(\n file: File,\n checksOnly: boolean | undefined,\n client: ApiClient,\n): Promise<ImportedState> {\n const formData = new FormData();\n formData.append(\"file\", file);\n formData.append(\"checks_only\", (!!checksOnly).toString());\n\n return (\n await client.post<ImportStateBody, ApiResponse<ImportedState>>(\n \"/api/import\",\n formData,\n )\n ).data;\n}\n\nexport async function isStateSyncing(client: ApiClient): Promise<boolean> {\n const response = await client.get<never, ApiResponse<boolean>>(\"/api/sync\");\n return response.status === 208;\n}\n\nexport interface SyncStateInput {\n method?: \"overwrite\" | \"revert\" | \"merge\";\n}\n\nexport interface SyncStateResponse {\n status: \"accepted\" | \"conflict\" | \"syncing\";\n}\n\nexport async function syncState(\n input: SyncStateInput,\n client: ApiClient,\n): Promise<SyncStateResponse> {\n try {\n const response = await client.post<\n SyncStateInput,\n ApiResponse<SyncStateResponse>\n >(\"/api/sync\", input);\n\n if (response.status === 202) {\n return {\n status: \"accepted\",\n };\n }\n if (response.status === 208) {\n return {\n status: \"syncing\",\n };\n }\n } catch (error) {\n if (isHttpError(error)) {\n if (error.status === 409) {\n // 409 conflict case\n return { status: \"conflict\" };\n }\n }\n }\n throw new Error(\"Failed to sync state\");\n}\n\nexport interface ShareStateResponse {\n status: string;\n message: string;\n share_url?: string;\n}\n\nexport async function shareState(\n client: ApiClient,\n): Promise<ShareStateResponse> {\n return (\n await client.post<never, ApiResponse<ShareStateResponse>>(\"/api/share\")\n ).data;\n}\n","\"use client\";\n\nconst localPrefix = \"recce-\";\n\nexport const LOCAL_STORAGE_KEYS = {\n bypassSaveOverwrite: `${localPrefix}-bypass-save-overwrite`,\n previewChangeFeedbackID: `${localPrefix}-preview-change-feedback`,\n prepareEnvGuideID: `${localPrefix}-prepare-env`,\n snapshotBaseIntroSeen: `${localPrefix}-snapshot-base-intro-seen`,\n};\n\nconst sessionPrefix = \"recce\";\n\nexport const SESSION_STORAGE_KEYS = {\n recommendationIgnored: `${sessionPrefix}-recommendation-ignored`,\n recommendationShowed: `${sessionPrefix}-recommendation-showed`,\n prevRefreshTimeStamp: `${sessionPrefix}-prev-refresh-timestamp`,\n lineageNotificationDismissed: `${sessionPrefix}-lineage-notification-dismissed`,\n};\n","import type { ApiClient } from \"../lib/fetchClient\";\nimport { type SubmitOptions, submitRun } from \"./runs\";\nimport { type ColumnRenderMode, type DataFrame } from \"./types\";\n\n// ============================================================================\n// Value Diff Types\n// ============================================================================\n\nexport interface ValueDiffParams {\n model: string;\n primary_key: string | string[];\n columns?: string[];\n}\n\nexport interface ValueDiffResult {\n summary: {\n total: number;\n added: number;\n removed: number;\n };\n data: DataFrame;\n}\n\n// ============================================================================\n// Value Diff Detail Types\n// ============================================================================\n\nexport type ValueDiffDetailParams = ValueDiffParams;\nexport type ValueDiffDetailResult = DataFrame;\n\nexport interface ValueDiffDetailViewOptions {\n changed_only?: boolean;\n pinned_columns?: string[];\n display_mode?: \"inline\" | \"side_by_side\";\n columnsRenderMode?: Record<string, ColumnRenderMode>;\n}\n\n// ============================================================================\n// API Functions\n// ============================================================================\n\nexport async function submitValueDiff(\n params: ValueDiffParams,\n options: SubmitOptions | undefined,\n client: ApiClient,\n) {\n return await submitRun(\"value_diff\", params, options, client);\n}\n\nexport async function submitValueDiffDetail(\n params: ValueDiffParams,\n options: SubmitOptions | undefined,\n client: ApiClient,\n) {\n return await submitRun(\"value_diff_detail\", params, options, client);\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport {\n type ApiClient,\n type ApiResponse,\n createFetchClient,\n} from \"../lib/fetchClient\";\nimport { useApiConfigOptional } from \"../providers/contexts/ApiContext\";\n\nconst defaultApiClient = createFetchClient({ baseURL: \"\" });\n\nexport interface VersionResponse {\n version: string;\n latestVersion: string;\n}\n\nexport async function getVersion(client: ApiClient): Promise<VersionResponse> {\n const response = await client.get<never, ApiResponse<VersionResponse>>(\n \"/api/version\",\n );\n return response.data;\n}\n\nexport function useVersionNumber() {\n const [version, setVersion] = useState(\"\");\n const [latestVersion, setLatestVersion] = useState(\"\");\n const apiConfig = useApiConfigOptional();\n const apiClient = apiConfig?.apiClient ?? defaultApiClient;\n\n useEffect(() => {\n async function fetchVersion() {\n try {\n const { version, latestVersion } = await getVersion(apiClient);\n\n setVersion(version);\n setLatestVersion(latestVersion);\n } catch (error) {\n console.error(\"Error fetching version number:\", error);\n }\n }\n void fetchVersion();\n }, [apiClient]);\n\n return { version, latestVersion };\n}\n"],"mappings":"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"}
package/dist/api.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- "use client";import{$ as e,A as t,B as n,C as r,D as i,E as a,F as o,G as s,H as c,I as l,J as u,K as d,L as f,M as p,N as m,O as h,P as g,Q as _,R as v,S as y,T as b,U as x,V as S,W as C,X as w,Y as T,Z as E,_ as D,_t as O,a as k,at as A,b as j,bt as M,c as N,ct as P,d as F,dt as I,et as L,f as R,ft as z,g as B,gt as V,h as H,ht as U,i as W,it as G,j as K,k as q,l as J,lt as Y,m as X,mt as Z,n as Q,nt as $,o as ee,ot as te,p as ne,pt as re,q as ie,r as ae,rt as oe,s as se,st as ce,t as le,tt as ue,u as de,ut as fe,v as pe,vt as me,w as he,x as ge,y as _e,yt as ve,z as ye}from"./api-DTKI1Y_n.js";import{a as be,f as xe,i as Se,n as Ce,o as we,r as Te,s as Ee,t as De}from"./keepAlive-Bowms1oa.js";export{k as LOCAL_STORAGE_KEYS,G as RUN_TYPES,ee as SESSION_STORAGE_KEYS,w as aggregateRuns,xe as cacheKeys,E as cancelRun,h as createCheckByRun,f as createComment,y as createLineageDiffCheck,H as createSchemaDiffCheck,q as createSimpleCheck,t as deleteCheck,v as deleteComment,se as exportState,pe as fetchModelRowCount,K as getCheck,ye as getCheckEvent,i as getCll,n as getEventDescription,S as getEventIconType,De as getLastKeepAliveTime,r as getModelInfo,be as getRecceInstanceInfo,_ as getRun,we as getServerFlag,he as getServerInfo,le as getVersion,N as importState,c as isCommentEvent,A as isHistogramDiffRun,te as isLineageDiffRun,ce as isProfileDiffRun,P as isProfileRun,Y as isQueryBaseRun,fe as isQueryDiffRun,I as isQueryRun,z as isRowCountDiffRun,re as isRowCountRun,Z as isSchemaDiffRun,b as isSessionBaseOutdated,U as isSimpleRun,x as isStateChangeEvent,J as isStateSyncing,C as isSystemEvent,V as isTopKDiffRun,O as isValidRunType,me as isValueDiffDetailRun,ve as isValueDiffRun,s as listCheckEvents,p as listChecks,e as listRuns,m as markAsPresetCheck,Ee as markRelaunchHintCompleted,_e as queryModelRowCount,j as queryRowCount,a as refreshSessionBase,de as rename,g as reorderChecks,Ce as resetKeepAliveState,M as runTypeHasRef,F as saveAs,L as searchRuns,X as select,Te as sendKeepAlive,Se as setKeepAliveCallback,R as shareState,B as submitProfileDiff,D as submitProfileDistribution,ie as submitQuery,u as submitQueryBase,T as submitQueryDiff,ge as submitRowCountDiff,ue as submitRun,$ as submitRunFromCheck,ae as submitValueDiff,W as submitValueDiffDetail,ne as syncState,o as updateCheck,d as updateComment,l as useChecks,Q as useVersionNumber,oe as waitRun};
2
+ "use client";import{$ as e,A as t,B as n,C as r,D as i,E as a,F as o,G as s,H as c,I as l,J as u,K as d,L as f,M as p,N as m,O as h,P as g,Q as _,R as v,S as y,T as b,U as x,V as S,W as C,X as w,Y as T,Z as E,_ as D,_t as O,a as k,at as A,b as j,bt as M,c as N,ct as P,d as F,dt as I,et as L,f as R,ft as z,g as B,gt as V,h as H,ht as U,i as W,it as G,j as K,k as q,l as J,lt as Y,m as X,mt as Z,n as Q,nt as $,o as ee,ot as te,p as ne,pt as re,q as ie,r as ae,rt as oe,s as se,st as ce,t as le,tt as ue,u as de,ut as fe,v as pe,vt as me,w as he,x as ge,y as _e,yt as ve,z as ye}from"./api-S5ho3Qs3.js";import{a as be,f as xe,i as Se,n as Ce,o as we,r as Te,s as Ee,t as De}from"./keepAlive-bjIHulj-.js";export{k as LOCAL_STORAGE_KEYS,G as RUN_TYPES,ee as SESSION_STORAGE_KEYS,w as aggregateRuns,xe as cacheKeys,E as cancelRun,h as createCheckByRun,f as createComment,y as createLineageDiffCheck,H as createSchemaDiffCheck,q as createSimpleCheck,t as deleteCheck,v as deleteComment,se as exportState,pe as fetchModelRowCount,K as getCheck,ye as getCheckEvent,i as getCll,n as getEventDescription,S as getEventIconType,De as getLastKeepAliveTime,r as getModelInfo,be as getRecceInstanceInfo,_ as getRun,we as getServerFlag,he as getServerInfo,le as getVersion,N as importState,c as isCommentEvent,A as isHistogramDiffRun,te as isLineageDiffRun,ce as isProfileDiffRun,P as isProfileRun,Y as isQueryBaseRun,fe as isQueryDiffRun,I as isQueryRun,z as isRowCountDiffRun,re as isRowCountRun,Z as isSchemaDiffRun,b as isSessionBaseOutdated,U as isSimpleRun,x as isStateChangeEvent,J as isStateSyncing,C as isSystemEvent,V as isTopKDiffRun,O as isValidRunType,me as isValueDiffDetailRun,ve as isValueDiffRun,s as listCheckEvents,p as listChecks,e as listRuns,m as markAsPresetCheck,Ee as markRelaunchHintCompleted,_e as queryModelRowCount,j as queryRowCount,a as refreshSessionBase,de as rename,g as reorderChecks,Ce as resetKeepAliveState,M as runTypeHasRef,F as saveAs,L as searchRuns,X as select,Te as sendKeepAlive,Se as setKeepAliveCallback,R as shareState,B as submitProfileDiff,D as submitProfileDistribution,ie as submitQuery,u as submitQueryBase,T as submitQueryDiff,ge as submitRowCountDiff,ue as submitRun,$ as submitRunFromCheck,ae as submitValueDiff,W as submitValueDiffDetail,ne as syncState,o as updateCheck,d as updateComment,l as useChecks,Q as useVersionNumber,oe as waitRun};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- "use client";import{A as e,B as t,Bt as n,F as r,Ht as i,I as a,It as o,L as s,Lt as c,M as l,N as u,P as d,R as f,Rt as p,Ut as m,Vt as h,dt as g,ft as _,j as v,k as y,ut as b,z as x,zt as S}from"./lineage-yiiuC0Il.js";export{o as RunList,c as RunListItem,r as RunListOss,d as RunModal,u as RunModalOss,g as RunProgress,_ as RunProgressOverlay,v as RunResultPane,e as RunResultPaneOss,p as RunStatusAndDate,S as RunStatusBadge,n as RunStatusWithDate,b as RunToolbar,l as RunView,y as RunViewOss,a as createBoundFindByRunType,s as createRunTypeRegistry,f as defaultRunTypeConfig,x as findByRunType,h as formatRunDate,i as formatRunDateTime,m as inferRunStatus,t as registry};
2
+ "use client";import{At as e,B as t,Dt as n,E as r,Et as i,F as a,H as o,I as s,L as c,Mt as l,N as u,Nt as d,O as f,Ot as p,P as m,Pt as h,R as g,Tt as _,V as v,jt as y,kt as b,wt as x,z as S}from"./hooks-lhWocOS8.js";export{n as RunList,p as RunListItem,c as RunListOss,s as RunModal,a as RunModalOss,_ as RunProgress,i as RunProgressOverlay,u as RunResultPane,f as RunResultPaneOss,b as RunStatusAndDate,e as RunStatusBadge,y as RunStatusWithDate,x as RunToolbar,m as RunView,r as RunViewOss,g as createBoundFindByRunType,S as createRunTypeRegistry,t as defaultRunTypeConfig,v as findByRunType,l as formatRunDate,d as formatRunDateTime,h as inferRunStatus,o as registry};
@@ -1,8 +1,8 @@
1
1
 
2
2
  import { Nt as QueryViewOptions, Ot as QueryDiffViewOptions, nt as ValueDiffDetailViewOptions } from "./instanceInfo-D3d5flul.js";
3
- import { $ as QueryForm, A as getIconForChangeStatus, At as HistogramDiffResultView, B as RowCountDiffRun, Bt as CheckDetailOss, C as TopKDiffResultView, D as IdleTimeoutBadge, E as TopKDiffForm, F as ChangeSummaryResult, Ft as ErrorBoundary, G as DualSqlEditorProps, H as RowCountResultViewProps, Ht as MainLayout, I as ColumnChangeResult, It as CheckPageLoadingOss, J as SetupConnectionGuide, K as SqlEditor, L as NODE_CHANGE_STATUS_MSGS, Lt as CheckPageContentOss, M as ChangeSummary, Mt as HistogramResultViewProps, N as ChangeStatus, Nt as HistogramDiffForm, O as calculateChangeSummary, Ot as LineagePageOss, P as ChangeSummaryProps, Pt as supportsHistogramDiff, Q as QueryPageOss, R as HistoryToggle, Rt as CheckListOss, S as classifyType, T as TopKDiffRun, U as RowCountRun, Ut as EnvInfo, V as RowCountResultView, Vt as Main, W as DualSqlEditor, X as QueryResultView, Y as SetupConnectionGuideProps, Z as QueryResultViewProps, _ as DataTypeIcon, _t as StalenessMessageVariant, a as ChecksView, at as ProfileResultView, b as buildColumnTooltip, c as ValueDiffResultViewProps, ct as ProfileDiffForm, d as ValueDiffFormParams, dt as RecceNotification, et as QueryFormProps, f as ValueDiffDetailResultView, ft as LineageViewNotification, g as SquareIconProps, gt as StalenessBannerVariant, h as SquareIcon, ht as StalenessBannerProps, it as ProfileDiffRun, j as SchemaSummary, jt as HistogramDiffRun, k as calculateColumnChange, kt as FirstTimePopover, l as ValueDiffRun, lt as ProfileDiffFormParams, m as ValueDiffDetailRun, mt as StalenessBanner, nt as QueryDiffResultViewProps, o as ChecksViewProps, ot as ProfileResultViewProps, p as ValueDiffDetailResultViewProps, pt as NotificationProps, q as SqlEditorProps, rt as ProfileDiffResultView, s as ValueDiffResultView, st as ProfileRun, tt as QueryDiffResultView, u as ValueDiffForm, ut as LearnHowLink, v as DataTypeIconProps, vt as StalenessToastAdapter, w as TopKDiffResultViewProps, x as TypeCategory, y as ColumnTooltipInput, z as RowCountDiffResultView, zt as CheckEmptyStateOss } from "./lineage-DQYm0BLV.js";
4
- import { $ as SchemaLegend, $t as CheckEmptyState, A as DiffTextProps, Dt as isDisabledByNoResult, F as ChangedOnlyCheckboxProps, M as DiffDisplayModeSwitch, N as DiffDisplayModeSwitchProps, P as ChangedOnlyCheckbox, Qt as CheckListProps, W as SchemaDiffStatus, Zt as CheckList, _n as LineageView, an as CheckDescriptionProps, cn as CheckCardProps, dn as CheckBreadcrumb, en as CheckEmptyStateProps, et as SchemaView, f as HSplit, fn as CheckBreadcrumbProps, gn as CheckActionsProps, hn as CheckActions, in as CheckDescription, j as DiffDisplayMode, k as DiffText, ln as CheckRunStatus, m as VSplit, mn as CheckActionType, n as ToggleSwitch, nn as CheckDetailProps, nt as ColumnNameCell, on as CheckCard, p as SplitProps, pn as CheckAction, q as SchemaDiffRow, r as ToggleSwitchProps, rn as CheckDetailTab, rt as ColumnNameCellProps, sn as CheckCardData, tn as CheckDetail, tt as SingleEnvSchemaView, un as CheckType, vn as LineageViewProps, yn as LineageViewRef } from "./primitives-CMRs10su.js";
5
- import { b as LineageCanvasProps, y as LineageCanvas } from "./index-BI0TA-5T.js";
3
+ import { $ as QueryForm, A as getIconForChangeStatus, At as HistogramDiffResultView, B as RowCountDiffRun, Bt as CheckDetailOss, C as TopKDiffResultView, D as IdleTimeoutBadge, E as TopKDiffForm, F as ChangeSummaryResult, Ft as ErrorBoundary, G as DualSqlEditorProps, H as RowCountResultViewProps, Ht as MainLayout, I as ColumnChangeResult, It as CheckPageLoadingOss, J as SetupConnectionGuide, K as SqlEditor, L as NODE_CHANGE_STATUS_MSGS, Lt as CheckPageContentOss, M as ChangeSummary, Mt as HistogramResultViewProps, N as ChangeStatus, Nt as HistogramDiffForm, O as calculateChangeSummary, Ot as LineagePageOss, P as ChangeSummaryProps, Pt as supportsHistogramDiff, Q as QueryPageOss, R as HistoryToggle, Rt as CheckListOss, S as classifyType, T as TopKDiffRun, U as RowCountRun, Ut as EnvInfo, V as RowCountResultView, Vt as Main, W as DualSqlEditor, X as QueryResultView, Y as SetupConnectionGuideProps, Z as QueryResultViewProps, _ as DataTypeIcon, _t as StalenessMessageVariant, a as ChecksView, at as ProfileResultView, b as buildColumnTooltip, c as ValueDiffResultViewProps, ct as ProfileDiffForm, d as ValueDiffFormParams, dt as RecceNotification, et as QueryFormProps, f as ValueDiffDetailResultView, ft as LineageViewNotification, g as SquareIconProps, gt as StalenessBannerVariant, h as SquareIcon, ht as StalenessBannerProps, it as ProfileDiffRun, j as SchemaSummary, jt as HistogramDiffRun, k as calculateColumnChange, kt as FirstTimePopover, l as ValueDiffRun, lt as ProfileDiffFormParams, m as ValueDiffDetailRun, mt as StalenessBanner, nt as QueryDiffResultViewProps, o as ChecksViewProps, ot as ProfileResultViewProps, p as ValueDiffDetailResultViewProps, pt as NotificationProps, q as SqlEditorProps, rt as ProfileDiffResultView, s as ValueDiffResultView, st as ProfileRun, tt as QueryDiffResultView, u as ValueDiffForm, ut as LearnHowLink, v as DataTypeIconProps, vt as StalenessToastAdapter, w as TopKDiffResultViewProps, x as TypeCategory, y as ColumnTooltipInput, z as RowCountDiffResultView, zt as CheckEmptyStateOss } from "./lineage-CH52TNrQ.js";
4
+ import { $ as SchemaLegend, $t as CheckEmptyState, A as DiffTextProps, Dt as isDisabledByNoResult, F as ChangedOnlyCheckboxProps, M as DiffDisplayModeSwitch, N as DiffDisplayModeSwitchProps, P as ChangedOnlyCheckbox, Qt as CheckListProps, W as SchemaDiffStatus, Zt as CheckList, _n as LineageView, an as CheckDescriptionProps, cn as CheckCardProps, dn as CheckBreadcrumb, en as CheckEmptyStateProps, et as SchemaView, f as HSplit, fn as CheckBreadcrumbProps, gn as CheckActionsProps, hn as CheckActions, in as CheckDescription, j as DiffDisplayMode, k as DiffText, ln as CheckRunStatus, m as VSplit, mn as CheckActionType, n as ToggleSwitch, nn as CheckDetailProps, nt as ColumnNameCell, on as CheckCard, p as SplitProps, pn as CheckAction, q as SchemaDiffRow, r as ToggleSwitchProps, rn as CheckDetailTab, rt as ColumnNameCellProps, sn as CheckCardData, tn as CheckDetail, tt as SingleEnvSchemaView, un as CheckType, vn as LineageViewProps, yn as LineageViewRef } from "./primitives-BjFY8zYY.js";
5
+ import { b as LineageCanvasProps, y as LineageCanvas } from "./index-DveSUwHm.js";
6
6
  import { A as RunListProps, C as RunProgressOverlayProps, D as RunListItem, E as RunList, F as RunStatusBadgeProps, I as RunStatusWithDate, L as RunStatusWithDateProps, O as RunListItemData, P as RunStatusBadge, R as formatRunDate, S as RunProgressOverlay, T as RunProgressVariant, b as RunToolbarProps, c as RunResultViewRef, g as findByRunType, h as defaultRunTypeConfig, j as RunStatus, k as RunListItemProps, l as RunTypeConfig, m as createRunTypeRegistry, n as PartialRunTypeRegistry, o as RunFormProps, p as createBoundFindByRunType, s as RunResultViewProps, t as IconComponent, u as RunTypeRegistry, w as RunProgressProps, x as RunProgress, y as RunToolbar, z as formatRunDateTime } from "./types-Je-sKjuJ.js";
7
7
  import { t as RunViewOss, y as RunListOss } from "./index-JMq11hbe.js";
8
8
  export { type ChangeStatus, ChangeSummary, type ChangeSummaryProps, type ChangeSummaryResult, ChangedOnlyCheckbox, type ChangedOnlyCheckboxProps, type CheckAction, type CheckActionType, CheckActions, type CheckActionsProps, CheckBreadcrumb, type CheckBreadcrumbProps, CheckCard, type CheckCardData, type CheckCardProps, CheckDescription, type CheckDescriptionProps, CheckDetail, CheckDetailOss, type CheckDetailProps, type CheckDetailTab, CheckEmptyState, CheckEmptyStateOss, type CheckEmptyStateProps, CheckList, CheckListOss, type CheckListProps, CheckPageContentOss, CheckPageLoadingOss, type CheckRunStatus, type CheckType, ChecksView, type ChecksViewProps, type ColumnChangeResult, ColumnNameCell, type ColumnNameCellProps, type ColumnTooltipInput, DataTypeIcon, type DataTypeIconProps, type DiffDisplayMode, DiffDisplayModeSwitch, type DiffDisplayModeSwitchProps, DiffText, type DiffTextProps, DualSqlEditor, type DualSqlEditorProps, EnvInfo, ErrorBoundary, FirstTimePopover, HSplit, HistogramDiffForm, HistogramDiffResultView, type HistogramDiffRun, type HistogramResultViewProps, HistoryToggle, type IconComponent, IdleTimeoutBadge, LearnHowLink, LineageCanvas, type LineageCanvasProps, LineagePageOss, LineageView, LineageViewNotification, type LineageViewProps, type LineageViewRef, Main, MainLayout, NODE_CHANGE_STATUS_MSGS, type NotificationProps, type PartialRunTypeRegistry, ProfileDiffForm, type ProfileDiffFormParams, ProfileDiffResultView, type ProfileDiffRun, ProfileResultView, type ProfileResultViewProps, type ProfileRun, QueryDiffResultView, type QueryDiffResultViewProps, type QueryDiffViewOptions, QueryForm, type QueryFormProps, QueryPageOss, QueryResultView, type QueryResultViewProps, type QueryViewOptions, RecceNotification, RowCountDiffResultView, type RowCountDiffRun, RowCountResultView, type RowCountResultViewProps, type RowCountRun, type RunFormProps, RunList, RunListItem, type RunListItemData, type RunListItemProps, RunListOss, type RunListProps, RunProgress, RunProgressOverlay, type RunProgressOverlayProps, type RunProgressProps, type RunProgressVariant, type RunResultViewProps, type RunResultViewRef, type RunStatus, RunStatusBadge, type RunStatusBadgeProps, RunStatusWithDate, type RunStatusWithDateProps, RunToolbar, type RunToolbarProps, type RunTypeConfig, type RunTypeRegistry, RunViewOss, type SchemaDiffRow, type SchemaDiffStatus, SchemaLegend, SchemaSummary, SchemaView, SetupConnectionGuide, type SetupConnectionGuideProps, SingleEnvSchemaView, type SplitProps, SqlEditor, type SqlEditorProps, SquareIcon, type SquareIconProps, StalenessBanner, type StalenessBannerProps, type StalenessBannerVariant, type StalenessMessageVariant, type StalenessToastAdapter, ToggleSwitch, type ToggleSwitchProps, TopKDiffForm, TopKDiffResultView, type TopKDiffResultViewProps, type TopKDiffRun, type TypeCategory, VSplit, ValueDiffDetailResultView, type ValueDiffDetailResultViewProps, type ValueDiffDetailRun, type ValueDiffDetailViewOptions, ValueDiffForm, type ValueDiffFormParams, ValueDiffResultView, type ValueDiffResultViewProps, type ValueDiffRun, buildColumnTooltip, calculateChangeSummary, calculateColumnChange, classifyType, createBoundFindByRunType, createRunTypeRegistry, defaultRunTypeConfig, findByRunType, formatRunDate, formatRunDateTime, getIconForChangeStatus, isDisabledByNoResult, supportsHistogramDiff };
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- "use client";import{$t as e,Ot as t,_t as n,bt as r,en as i,gt as a,ht as o,tn as s,vt as c,yt as l}from"./utils-D1bvitEj.js";import{c as u,n as d,r as f,s as p,t as m}from"./lineage-yiiuC0Il.js";import{$ as h,A as g,B as _,C as v,D as y,E as b,F as x,G as S,H as C,I as w,J as T,K as E,L as D,M as O,N as k,O as A,P as j,Q as M,R as N,S as P,T as F,U as I,V as L,W as R,X as z,Y as B,Z as V,_ as H,a as U,at as W,b as G,c as K,ct as q,d as J,dt as Y,et as X,f as Z,ft as Q,g as $,h as ee,i as te,it as ne,j as re,k as ie,l as ae,lt as oe,m as se,mt as ce,n as le,nt as ue,o as de,ot as fe,p as pe,pt as me,q as he,r as ge,rt as _e,s as ve,st as ye,t as be,tt as xe,u as Se,ut as Ce,v as we,w as Te,x as Ee,y as De,z as Oe}from"./components-CX4IKLp2.js";export{be as ChangeSummary,o as ChangedOnlyCheckbox,le as CheckActions,ge as CheckBreadcrumb,te as CheckCard,U as CheckDescription,de as CheckDetail,ve as CheckDetailOss,K as CheckEmptyState,ae as CheckEmptyStateOss,Se as CheckList,J as CheckListOss,Z as CheckPageContentOss,pe as CheckPageLoadingOss,me as ChecksView,se as ColumnNameCell,e as DataTypeIcon,a as DiffDisplayModeSwitch,t as DiffText,ee as DualSqlEditor,$ as EnvInfo,H as ErrorBoundary,m as FirstTimePopover,l as HSplit,we as HistogramDiffForm,De as HistogramDiffResultView,ce as HistoryToggle,G as IdleTimeoutBadge,Ee as LearnHowLink,u as LineageCanvas,d as LineagePageOss,p as LineageView,P as LineageViewNotification,v as Main,Te as MainLayout,F as NODE_CHANGE_STATUS_MSGS,b as ProfileDiffForm,y as ProfileDiffResultView,A as ProfileResultView,ie as QueryDiffResultView,g as QueryForm,re as QueryPageOss,O as QueryResultView,k as RecceNotification,j as RowCountDiffResultView,x as RowCountResultView,w as RunList,D as RunListItem,N as RunListOss,Oe as RunProgress,_ as RunProgressOverlay,L as RunStatusBadge,C as RunStatusWithDate,I as RunToolbar,R as RunViewOss,S as SchemaLegend,E as SchemaSummary,he as SchemaView,T as SetupConnectionGuide,B as SingleEnvSchemaView,z as SqlEditor,c as SquareIcon,f as StalenessBanner,n as ToggleSwitch,V as TopKDiffForm,M as TopKDiffResultView,r as VSplit,h as ValueDiffDetailResultView,X as ValueDiffForm,xe as ValueDiffResultView,i as buildColumnTooltip,ue as calculateChangeSummary,_e as calculateColumnChange,s as classifyType,ne as createBoundFindByRunType,W as createRunTypeRegistry,fe as defaultRunTypeConfig,ye as findByRunType,q as formatRunDate,oe as formatRunDateTime,Ce as getIconForChangeStatus,Y as isDisabledByNoResult,Q as supportsHistogramDiff};
2
+ "use client";import{$ as e,A as t,At as n,B as r,D as i,Dt as a,E as o,Et as s,Fn as c,G as l,Gt as u,In as d,J as f,K as p,Kt as m,L as h,Ln as g,M as _,Mt as v,Nt as y,Ot as b,Q as x,R as S,Rt as C,Tt as w,U as T,V as E,W as D,Wt as O,X as k,Xt as A,Y as j,Yt as M,Z as N,Zt as P,at as F,cn as I,et as L,fn as R,j as z,jt as B,k as V,lt as H,mn as U,ot as W,pn as G,q as K,qt as q,sn as J,ut as Y,wt as X,z as Z}from"./hooks-lhWocOS8.js";import{B as Q,D as $,F as ee,I as te,L as ne,O as re,P as ie,R as ae,_ as oe,a as se,b as ce,c as le,d as ue,f as de,g as fe,h as pe,i as me,k as he,l as ge,m as _e,n as ve,o as ye,p as be,r as xe,s as Se,u as Ce,v as we,x as Te,y as Ee,z as De}from"./src-C3oHx0rY.js";import{ht as Oe}from"./utils-Dl2dMzK8.js";export{me as ChangeSummary,U as ChangedOnlyCheckbox,P as CheckActions,A as CheckBreadcrumb,M as CheckCard,q as CheckDescription,m as CheckDetail,be as CheckDetailOss,u as CheckEmptyState,de as CheckEmptyStateOss,O as CheckList,ue as CheckListOss,Ce as CheckPageContentOss,ge as CheckPageLoadingOss,ve as ChecksView,F as ColumnNameCell,c as DataTypeIcon,R as DiffDisplayModeSwitch,Oe as DiffText,V as DualSqlEditor,oe as EnvInfo,i as ErrorBoundary,te as FirstTimePopover,H as HSplit,J as HistogramDiffForm,W as HistogramDiffResultView,Te as HistoryToggle,fe as IdleTimeoutBadge,z as LearnHowLink,ee as LineageCanvas,ce as LineagePageOss,Ee as LineageView,ie as LineageViewNotification,_e as Main,pe as MainLayout,le as NODE_CHANGE_STATUS_MSGS,L as ProfileDiffForm,x as ProfileDiffResultView,e as ProfileResultView,N as QueryDiffResultView,De as QueryForm,ne as QueryPageOss,k as QueryResultView,_ as RecceNotification,f as RowCountDiffResultView,j as RowCountResultView,a as RunList,b as RunListItem,h as RunListOss,w as RunProgress,s as RunProgressOverlay,n as RunStatusBadge,B as RunStatusWithDate,X as RunToolbar,o as RunViewOss,$ as SchemaLegend,xe as SchemaSummary,re as SchemaView,ae as SetupConnectionGuide,he as SingleEnvSchemaView,t as SqlEditor,Q as SquareIcon,we as StalenessBanner,G as ToggleSwitch,K as TopKDiffForm,p as TopKDiffResultView,Y as VSplit,l as ValueDiffDetailResultView,D as ValueDiffForm,T as ValueDiffResultView,d as buildColumnTooltip,se as calculateChangeSummary,ye as calculateColumnChange,g as classifyType,S as createBoundFindByRunType,Z as createRunTypeRegistry,r as defaultRunTypeConfig,E as findByRunType,v as formatRunDate,y as formatRunDateTime,Se as getIconForChangeStatus,C as isDisabledByNoResult,I as supportsHistogramDiff};
package/dist/contexts.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- "use client";import{c as e,d as t,l as n,u as r}from"./keepAlive-Bowms1oa.js";import{A as i,C as a,D as o,E as s,M as c,N as l,O as u,S as d,T as f,_ as p,a as m,b as h,c as g,d as _,f as v,g as y,h as b,i as x,j as S,k as C,l as w,m as T,n as E,o as D,p as O,r as k,s as A,t as j,v as M,w as N,x as P,y as F}from"./utils-BzZEjJAS.js";export{e as ApiProvider,j as COLUMN_HEIGHT,h as IdleTimeoutProvider,p as LineageGraphProvider,T as LineageViewContext,C as RecceActionProvider,N as RecceInstanceInfoProvider,S as RouteConfigProvider,E as buildLineageGraph,o as defaultFeatureToggles,u as defaultInstanceInfo,k as getNeighborSet,x as intersect,v as isLineageGraphColumnNode,O as isLineageGraphNode,m as layoutWithDagre,D as selectDownstream,A as selectUpstream,g as toReactFlowBasic,w as union,n as useApiClient,r as useApiConfig,t as useApiConfigOptional,d as useIdleDetection,P as useIdleTimeout,a as useIdleTimeoutSafe,M as useLineageGraphContext,b as useLineageViewContext,y as useLineageViewContextSafe,i as useRecceActionContext,f as useRecceInstanceContext,s as useRecceInstanceInfo,_ as useRecceServerFlag,c as useRouteConfig,l as useRouteConfigSafe,F as useRunsAggregated};
2
+ "use client";import{c as e,d as t,l as n,u as r}from"./keepAlive-bjIHulj-.js";import{A as i,C as a,D as o,E as s,M as c,N as l,O as u,P as d,S as f,T as p,_ as m,a as h,b as g,c as _,f as v,g as y,h as b,i as x,j as S,k as C,l as w,m as T,n as E,o as D,p as O,r as k,s as A,t as j,v as M,w as N,x as P,y as F}from"./utils-FOrjYCpW.js";export{e as ApiProvider,j as COLUMN_HEIGHT,P as IdleTimeoutProvider,M as LineageGraphProvider,b as LineageViewContext,i as RecceActionProvider,p as RecceInstanceInfoProvider,c as RouteConfigProvider,E as buildLineageGraph,u as defaultFeatureToggles,C as defaultInstanceInfo,k as getNeighborSet,x as intersect,O as isLineageGraphColumnNode,T as isLineageGraphNode,h as layoutWithDagre,D as selectDownstream,A as selectUpstream,_ as toReactFlowBasic,w as union,n as useApiClient,r as useApiConfig,t as useApiConfigOptional,a as useIdleDetection,f as useIdleTimeout,N as useIdleTimeoutSafe,F as useLineageGraphContext,y as useLineageViewContext,m as useLineageViewContextSafe,S as useRecceActionContext,s as useRecceInstanceContext,o as useRecceInstanceInfo,v as useRecceServerFlag,l as useRouteConfig,d as useRouteConfigSafe,g as useRunsAggregated};
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- var e=class extends Error{status;data;__isHttpError=!0;constructor(e,t,n){super(n),this.name=`HttpError`,this.status=e,this.data=t}get response(){return{status:this.status,data:this.data}}};function t(t){return t instanceof e||typeof t==`object`&&!!t&&`__isHttpError`in t&&t.__isHttpError===!0}function n(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))if(r!==void 0)if(Array.isArray(r))for(let e of r)t.append(n,String(e));else t.set(n,String(r));let n=t.toString();return n?`?${n}`:``}function r(e,t,r){if(!e)return r?`${t}${n(r)}`:t;if(/^https?:\/\//.test(t)){if(r){let e=new URL(t);for(let[t,n]of Object.entries(r))if(n!==void 0)if(Array.isArray(n))for(let r of n)e.searchParams.append(t,String(r));else e.searchParams.set(t,String(n));return e.toString()}return t}let i=`${e.endsWith(`/`)?e.slice(0,-1):e}${t.startsWith(`/`)?t:`/${t}`}`;if(r){let e=new URL(i);for(let[t,n]of Object.entries(r))if(n!==void 0)if(Array.isArray(n))for(let r of n)e.searchParams.append(t,String(r));else e.searchParams.set(t,String(n));return e.toString()}return i}function i(e){return e.status===204?null:(e.headers.get(`content-type`)??``).includes(`application/json`)?e.json():e.text()}function a(t){let{baseURL:n,headers:a,timeout:o,middleware:s}=t;async function c(t,c,l,u){let d=new Headers(a),f={method:t,headers:d};l!=null&&(l instanceof FormData?(d.delete(`Content-Type`),f.body=l):(d.set(`Content-Type`,`application/json`),f.body=JSON.stringify(l))),o!==void 0&&(f.signal=AbortSignal.timeout(o));let p=c,m=f;if(s){let e=s(p,m);p=e.url,m=e.init}let h=r(n,p,u?.params),g;try{g=await fetch(h,m)}catch(t){throw new e(0,null,t instanceof Error?t.message:String(t))}let _;try{_=await Promise.resolve(i(g))}catch{throw new e(g.status,null,`Failed to parse response: ${g.statusText}`)}if(!g.ok)throw new e(g.status,_,`Request failed with status ${g.status}`);return{data:_,status:g.status,headers:g.headers}}return{get(e,t){return c(`GET`,e,void 0,t)},post(e,t,n){return c(`POST`,e,t,n)},patch(e,t,n){return c(`PATCH`,e,t,n)},delete(e,t){return c(`DELETE`,e,void 0,t)}}}export{t as n,a as t};
3
- //# sourceMappingURL=fetchClient-Bf9Q3QKq.js.map
2
+ var e=class extends Error{status;data;__isHttpError=!0;constructor(e,t,n){super(n),this.name=`HttpError`,this.status=e,this.data=t}get response(){return{status:this.status,data:this.data}}};function t(t){return t instanceof e||typeof t==`object`&&!!t&&`__isHttpError`in t&&t.__isHttpError===!0}function n(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))if(r!==void 0)if(Array.isArray(r))for(let e of r)t.append(n,String(e));else t.set(n,String(r));let n=t.toString();return n?`?${n}`:``}function r(e,t,r){if(!e)return r?`${t}${n(r)}`:t;if(/^https?:\/\//.test(t)){if(r){let e=new URL(t);for(let[t,n]of Object.entries(r))if(n!==void 0)if(Array.isArray(n))for(let r of n)e.searchParams.append(t,String(r));else e.searchParams.set(t,String(n));return e.toString()}return t}let i=`${e.endsWith(`/`)?e.slice(0,-1):e}${t.startsWith(`/`)?t:`/${t}`}`;if(r){let e=new URL(i);for(let[t,n]of Object.entries(r))if(n!==void 0)if(Array.isArray(n))for(let r of n)e.searchParams.append(t,String(r));else e.searchParams.set(t,String(n));return e.toString()}return i}function i(e){return e.status===204?null:(e.headers.get(`content-type`)??``).includes(`application/json`)?e.json():e.text()}function a(t){let{baseURL:n,headers:a,timeout:o,middleware:s}=t;async function c(t,c,l,u){let d=new Headers(a),f={method:t,headers:d};l!=null&&(l instanceof FormData?(d.delete(`Content-Type`),f.body=l):(d.set(`Content-Type`,`application/json`),f.body=JSON.stringify(l))),o!==void 0&&(f.signal=AbortSignal.timeout(o));let p=c,m=f;if(s){let e=s(p,m);p=e.url,m=e.init}let h=r(n,p,u?.params),g;try{g=await fetch(h,m)}catch(t){throw new e(0,null,t instanceof Error?t.message:String(t))}let _;try{_=await Promise.resolve(i(g))}catch{throw new e(g.status,null,`Failed to parse response: ${g.statusText}`)}if(!g.ok)throw new e(g.status,_,`Request failed with status ${g.status}`);return{data:_,status:g.status,headers:g.headers}}return{get(e,t){return c(`GET`,e,void 0,t)},post(e,t,n){return c(`POST`,e,t,n)},patch(e,t,n){return c(`PATCH`,e,t,n)},delete(e,t){return c(`DELETE`,e,void 0,t)}}}export{a as n,t as r,e as t};
3
+ //# sourceMappingURL=fetchClient-D0p358nB.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetchClient-Bf9Q3QKq.js","names":[],"sources":["../src/lib/fetchClient.ts"],"sourcesContent":["/**\n * Thin native `fetch` wrapper that replaces Axios.\n * Provides HttpError, ApiClient interface, and createFetchClient factory.\n */\n\n// ---------------------------------------------------------------------------\n// HttpError\n// ---------------------------------------------------------------------------\n\nexport class HttpError<T = unknown> extends Error {\n public readonly status: number;\n public readonly data: T;\n readonly __isHttpError = true as const;\n\n constructor(status: number, data: T, message: string) {\n super(message);\n this.name = \"HttpError\";\n this.status = status;\n this.data = data;\n }\n\n /** Backward-compat shim matching AxiosError.response shape */\n get response(): { status: number; data: T } {\n return { status: this.status, data: this.data };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Type guard\n// ---------------------------------------------------------------------------\n\nexport function isHttpError<T = unknown>(\n error: unknown,\n): error is HttpError<T> {\n return (\n error instanceof HttpError ||\n (error != null &&\n typeof error === \"object\" &&\n \"__isHttpError\" in error &&\n (error as { __isHttpError: unknown }).__isHttpError === true)\n );\n}\n\n// ---------------------------------------------------------------------------\n// Interfaces & types\n// ---------------------------------------------------------------------------\n\nexport interface ApiResponse<T = unknown> {\n data: T;\n status: number;\n headers: Headers;\n}\n\nexport interface RequestConfig {\n params?: Record<string, string | number | string[] | number[] | undefined>;\n}\n\nexport type RequestMiddleware = (\n url: string,\n init: { headers: Headers; [key: string]: unknown },\n) => { url: string; init: { headers: Headers; [key: string]: unknown } };\n\nexport interface ApiClient {\n get<_TBody = never, TResponse = ApiResponse>(\n url: string,\n config?: RequestConfig,\n ): Promise<TResponse>;\n\n post<_TBody = unknown, TResponse = ApiResponse>(\n url: string,\n data?: unknown,\n config?: RequestConfig,\n ): Promise<TResponse>;\n\n patch<_TBody = unknown, TResponse = ApiResponse>(\n url: string,\n data?: unknown,\n config?: RequestConfig,\n ): Promise<TResponse>;\n\n delete<_TBody = never, TResponse = ApiResponse>(\n url: string,\n config?: RequestConfig,\n ): Promise<TResponse>;\n}\n\n// ---------------------------------------------------------------------------\n// Factory config\n// ---------------------------------------------------------------------------\n\nexport interface FetchClientConfig {\n baseURL: string;\n headers?: Record<string, string>;\n timeout?: number;\n middleware?: RequestMiddleware;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction serializeParams(params: NonNullable<RequestConfig[\"params\"]>): string {\n const sp = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n for (const item of value) {\n sp.append(key, String(item));\n }\n } else {\n sp.set(key, String(value));\n }\n }\n const qs = sp.toString();\n return qs ? `?${qs}` : \"\";\n}\n\nfunction buildURL(\n baseURL: string,\n path: string,\n params?: RequestConfig[\"params\"],\n): string {\n if (!baseURL) {\n // OSS mode: baseURL is empty, use path directly\n return params ? `${path}${serializeParams(params)}` : path;\n }\n\n // Absolute URLs bypass baseURL entirely (matching Axios behavior).\n if (/^https?:\\/\\//.test(path)) {\n if (params) {\n const url = new URL(path);\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n for (const item of value) {\n url.searchParams.append(key, String(item));\n }\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n return url.toString();\n }\n return path;\n }\n\n // Concatenate baseURL + path (matching Axios behavior).\n // new URL(path, base) drops the base path for absolute paths, so we\n // use simple string concatenation instead.\n const base = baseURL.endsWith(\"/\") ? baseURL.slice(0, -1) : baseURL;\n const suffix = path.startsWith(\"/\") ? path : `/${path}`;\n const fullUrl = `${base}${suffix}`;\n\n if (params) {\n const url = new URL(fullUrl);\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n for (const item of value) {\n url.searchParams.append(key, String(item));\n }\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n return url.toString();\n }\n\n return fullUrl;\n}\n\nfunction parseResponseBody(res: Response): Promise<unknown> | null {\n if (res.status === 204) return null;\n\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n return res.json();\n }\n return res.text();\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createFetchClient(config: FetchClientConfig): ApiClient {\n const { baseURL, headers: defaultHeaders, timeout, middleware } = config;\n\n async function request<TResponse>(\n method: string,\n url: string,\n body?: unknown,\n reqConfig?: RequestConfig,\n ): Promise<TResponse> {\n const headers = new Headers(defaultHeaders);\n\n const init: Record<string, unknown> = { method, headers };\n\n if (body !== undefined && body !== null) {\n if (body instanceof FormData) {\n // Let the browser set Content-Type with boundary\n headers.delete(\"Content-Type\");\n init.body = body;\n } else {\n headers.set(\"Content-Type\", \"application/json\");\n init.body = JSON.stringify(body);\n }\n }\n\n if (timeout !== undefined) {\n init.signal = AbortSignal.timeout(timeout);\n }\n\n // Run middleware on the relative path FIRST (matches Axios interceptor\n // ordering where interceptors ran before baseURL was prepended).\n let resolvedPath = url;\n let resolvedInit = init as { headers: Headers; [key: string]: unknown };\n\n if (middleware) {\n const result = middleware(resolvedPath, resolvedInit);\n resolvedPath = result.url;\n resolvedInit = result.init;\n }\n\n // Then build the full URL with baseURL\n const resolvedURL = buildURL(baseURL, resolvedPath, reqConfig?.params);\n\n let res: Response;\n try {\n res = await fetch(resolvedURL, resolvedInit as RequestInit);\n } catch (networkError) {\n // Wrap network-level errors (TypeError for DNS/connection failures,\n // AbortError for timeouts) in HttpError so consumers can use a single\n // isHttpError() check for ALL request failures — matching Axios behavior\n // where isAxiosError() returned true for network errors too.\n throw new HttpError(\n 0,\n null,\n networkError instanceof Error\n ? networkError.message\n : String(networkError),\n );\n }\n\n let data: unknown;\n try {\n data = await Promise.resolve(parseResponseBody(res));\n } catch {\n throw new HttpError(\n res.status,\n null,\n `Failed to parse response: ${res.statusText}`,\n );\n }\n\n if (!res.ok) {\n throw new HttpError(\n res.status,\n data,\n `Request failed with status ${res.status}`,\n );\n }\n\n return {\n data,\n status: res.status,\n headers: res.headers,\n } as TResponse;\n }\n\n return {\n get<_TBody = never, TResponse = ApiResponse>(\n url: string,\n config?: RequestConfig,\n ): Promise<TResponse> {\n return request<TResponse>(\"GET\", url, undefined, config);\n },\n\n post<_TBody = unknown, TResponse = ApiResponse>(\n url: string,\n data?: unknown,\n config?: RequestConfig,\n ): Promise<TResponse> {\n return request<TResponse>(\"POST\", url, data, config);\n },\n\n patch<_TBody = unknown, TResponse = ApiResponse>(\n url: string,\n data?: unknown,\n config?: RequestConfig,\n ): Promise<TResponse> {\n return request<TResponse>(\"PATCH\", url, data, config);\n },\n\n delete<_TBody = never, TResponse = ApiResponse>(\n url: string,\n config?: RequestConfig,\n ): Promise<TResponse> {\n return request<TResponse>(\"DELETE\", url, undefined, config);\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"fetchClient-D0p358nB.js","names":[],"sources":["../src/lib/fetchClient.ts"],"sourcesContent":["/**\n * Thin native `fetch` wrapper that replaces Axios.\n * Provides HttpError, ApiClient interface, and createFetchClient factory.\n */\n\n// ---------------------------------------------------------------------------\n// HttpError\n// ---------------------------------------------------------------------------\n\nexport class HttpError<T = unknown> extends Error {\n public readonly status: number;\n public readonly data: T;\n readonly __isHttpError = true as const;\n\n constructor(status: number, data: T, message: string) {\n super(message);\n this.name = \"HttpError\";\n this.status = status;\n this.data = data;\n }\n\n /** Backward-compat shim matching AxiosError.response shape */\n get response(): { status: number; data: T } {\n return { status: this.status, data: this.data };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Type guard\n// ---------------------------------------------------------------------------\n\nexport function isHttpError<T = unknown>(\n error: unknown,\n): error is HttpError<T> {\n return (\n error instanceof HttpError ||\n (error != null &&\n typeof error === \"object\" &&\n \"__isHttpError\" in error &&\n (error as { __isHttpError: unknown }).__isHttpError === true)\n );\n}\n\n// ---------------------------------------------------------------------------\n// Interfaces & types\n// ---------------------------------------------------------------------------\n\nexport interface ApiResponse<T = unknown> {\n data: T;\n status: number;\n headers: Headers;\n}\n\nexport interface RequestConfig {\n params?: Record<string, string | number | string[] | number[] | undefined>;\n}\n\nexport type RequestMiddleware = (\n url: string,\n init: { headers: Headers; [key: string]: unknown },\n) => { url: string; init: { headers: Headers; [key: string]: unknown } };\n\nexport interface ApiClient {\n get<_TBody = never, TResponse = ApiResponse>(\n url: string,\n config?: RequestConfig,\n ): Promise<TResponse>;\n\n post<_TBody = unknown, TResponse = ApiResponse>(\n url: string,\n data?: unknown,\n config?: RequestConfig,\n ): Promise<TResponse>;\n\n patch<_TBody = unknown, TResponse = ApiResponse>(\n url: string,\n data?: unknown,\n config?: RequestConfig,\n ): Promise<TResponse>;\n\n delete<_TBody = never, TResponse = ApiResponse>(\n url: string,\n config?: RequestConfig,\n ): Promise<TResponse>;\n}\n\n// ---------------------------------------------------------------------------\n// Factory config\n// ---------------------------------------------------------------------------\n\nexport interface FetchClientConfig {\n baseURL: string;\n headers?: Record<string, string>;\n timeout?: number;\n middleware?: RequestMiddleware;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction serializeParams(params: NonNullable<RequestConfig[\"params\"]>): string {\n const sp = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n for (const item of value) {\n sp.append(key, String(item));\n }\n } else {\n sp.set(key, String(value));\n }\n }\n const qs = sp.toString();\n return qs ? `?${qs}` : \"\";\n}\n\nfunction buildURL(\n baseURL: string,\n path: string,\n params?: RequestConfig[\"params\"],\n): string {\n if (!baseURL) {\n // OSS mode: baseURL is empty, use path directly\n return params ? `${path}${serializeParams(params)}` : path;\n }\n\n // Absolute URLs bypass baseURL entirely (matching Axios behavior).\n if (/^https?:\\/\\//.test(path)) {\n if (params) {\n const url = new URL(path);\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n for (const item of value) {\n url.searchParams.append(key, String(item));\n }\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n return url.toString();\n }\n return path;\n }\n\n // Concatenate baseURL + path (matching Axios behavior).\n // new URL(path, base) drops the base path for absolute paths, so we\n // use simple string concatenation instead.\n const base = baseURL.endsWith(\"/\") ? baseURL.slice(0, -1) : baseURL;\n const suffix = path.startsWith(\"/\") ? path : `/${path}`;\n const fullUrl = `${base}${suffix}`;\n\n if (params) {\n const url = new URL(fullUrl);\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n for (const item of value) {\n url.searchParams.append(key, String(item));\n }\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n return url.toString();\n }\n\n return fullUrl;\n}\n\nfunction parseResponseBody(res: Response): Promise<unknown> | null {\n if (res.status === 204) return null;\n\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n return res.json();\n }\n return res.text();\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createFetchClient(config: FetchClientConfig): ApiClient {\n const { baseURL, headers: defaultHeaders, timeout, middleware } = config;\n\n async function request<TResponse>(\n method: string,\n url: string,\n body?: unknown,\n reqConfig?: RequestConfig,\n ): Promise<TResponse> {\n const headers = new Headers(defaultHeaders);\n\n const init: Record<string, unknown> = { method, headers };\n\n if (body !== undefined && body !== null) {\n if (body instanceof FormData) {\n // Let the browser set Content-Type with boundary\n headers.delete(\"Content-Type\");\n init.body = body;\n } else {\n headers.set(\"Content-Type\", \"application/json\");\n init.body = JSON.stringify(body);\n }\n }\n\n if (timeout !== undefined) {\n init.signal = AbortSignal.timeout(timeout);\n }\n\n // Run middleware on the relative path FIRST (matches Axios interceptor\n // ordering where interceptors ran before baseURL was prepended).\n let resolvedPath = url;\n let resolvedInit = init as { headers: Headers; [key: string]: unknown };\n\n if (middleware) {\n const result = middleware(resolvedPath, resolvedInit);\n resolvedPath = result.url;\n resolvedInit = result.init;\n }\n\n // Then build the full URL with baseURL\n const resolvedURL = buildURL(baseURL, resolvedPath, reqConfig?.params);\n\n let res: Response;\n try {\n res = await fetch(resolvedURL, resolvedInit as RequestInit);\n } catch (networkError) {\n // Wrap network-level errors (TypeError for DNS/connection failures,\n // AbortError for timeouts) in HttpError so consumers can use a single\n // isHttpError() check for ALL request failures — matching Axios behavior\n // where isAxiosError() returned true for network errors too.\n throw new HttpError(\n 0,\n null,\n networkError instanceof Error\n ? networkError.message\n : String(networkError),\n );\n }\n\n let data: unknown;\n try {\n data = await Promise.resolve(parseResponseBody(res));\n } catch {\n throw new HttpError(\n res.status,\n null,\n `Failed to parse response: ${res.statusText}`,\n );\n }\n\n if (!res.ok) {\n throw new HttpError(\n res.status,\n data,\n `Request failed with status ${res.status}`,\n );\n }\n\n return {\n data,\n status: res.status,\n headers: res.headers,\n } as TResponse;\n }\n\n return {\n get<_TBody = never, TResponse = ApiResponse>(\n url: string,\n config?: RequestConfig,\n ): Promise<TResponse> {\n return request<TResponse>(\"GET\", url, undefined, config);\n },\n\n post<_TBody = unknown, TResponse = ApiResponse>(\n url: string,\n data?: unknown,\n config?: RequestConfig,\n ): Promise<TResponse> {\n return request<TResponse>(\"POST\", url, data, config);\n },\n\n patch<_TBody = unknown, TResponse = ApiResponse>(\n url: string,\n data?: unknown,\n config?: RequestConfig,\n ): Promise<TResponse> {\n return request<TResponse>(\"PATCH\", url, data, config);\n },\n\n delete<_TBody = never, TResponse = ApiResponse>(\n url: string,\n config?: RequestConfig,\n ): Promise<TResponse> {\n return request<TResponse>(\"DELETE\", url, undefined, config);\n },\n };\n}\n"],"mappings":"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"}