@thinkai/tai-api-contract 2.34.0-pr.810.e54f7dcd → 2.35.0-pr.811.d57af044

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.
@@ -394,7 +394,7 @@ export interface paths {
394
394
  };
395
395
  /**
396
396
  * Productivity insights — contributor drilldown
397
- * @description Weekly and daily activity rollups for a single contributor on `/phase-c/c4/contributors/:id`. Distributes weekly merged PR counts from precomputed person metrics across weekdays; includes fail-rate signals and period-over-period summary deltas. Accepts org-chart person ids (typically email) and synthetic GitHub scopes (`__github:{login}`) for contributors not in the org chart.
397
+ * @description Weekly and daily activity rollups for a single contributor on `/insights/productivity/contributors/:loginOrId`. Accepts GitHub login slugs (preferred public URL), org-chart person ids (typically email), and synthetic GitHub scopes (`__github:{login}`) for contributors not in the org chart.
398
398
  */
399
399
  get: operations["getProductivityInsightsContributor"];
400
400
  put?: never;
@@ -641,7 +641,7 @@ export interface paths {
641
641
  put?: never;
642
642
  /**
643
643
  * Create GitHub App installation URL
644
- * @description Creates a GitHub App installation URL scoped to the workspace and caller. Body is optional; when omitted, defaults to `/phase-a/p4` return path. Optional `pickerSession` (from user OAuth org picker) recovers `returnPath` from the server-side picker snapshot when the multi-hop authorize→install flow should return to the page where OAuth started.
644
+ * @description Creates a GitHub App installation URL scoped to the workspace and caller. Body is optional; when omitted, defaults to `/onboarding/integrations` return path. Optional `pickerSession` (from user OAuth org picker) recovers `returnPath` from the server-side picker snapshot when the multi-hop authorize→install flow should return to the page where OAuth started.
645
645
  */
646
646
  post: operations["postGithubInstallUrl"];
647
647
  delete?: never;
@@ -1120,6 +1120,26 @@ export interface paths {
1120
1120
  patch?: never;
1121
1121
  trace?: never;
1122
1122
  };
1123
+ "/workspaces/{workspaceId}/readiness/repos/by-slug/{providerSlug}": {
1124
+ parameters: {
1125
+ query?: never;
1126
+ header?: never;
1127
+ path?: never;
1128
+ cookie?: never;
1129
+ };
1130
+ /**
1131
+ * Single repo readiness by provider slug
1132
+ * @description Returns one stored repository scorecard keyed by `providerSlug` (`owner/repo`). Same response as `GET .../readiness/repos/{repoId}`. Unknown slug returns `404`.
1133
+ */
1134
+ get: operations["getReadinessRepoBySlug"];
1135
+ put?: never;
1136
+ post?: never;
1137
+ delete?: never;
1138
+ options?: never;
1139
+ head?: never;
1140
+ patch?: never;
1141
+ trace?: never;
1142
+ };
1123
1143
  "/workspaces/{workspaceId}/readiness/repos/{repoId}": {
1124
1144
  parameters: {
1125
1145
  query?: never;
@@ -1194,7 +1214,7 @@ export interface paths {
1194
1214
  };
1195
1215
  /**
1196
1216
  * Workspace activity log (paginated)
1197
- * @description Paginated, chronological feed of workspace-scoped lifecycle events: repository add/remove/re-add and GitHub integration add/remove. Inactive repos remain visible in this log. Filter by `eventType`, `actorUserId`, or date range (`since`/`until`).
1217
+ * @description Paginated, chronological feed of workspace-scoped lifecycle events: repository add/remove/re-add and GitHub integration add/remove. Inactive repos remain visible in this log. Filter by a single `eventType`, a coarse `eventCategory`/`productArea`, an `eventSubcategory` (a dotted event-type prefix that matches a whole lifecycle subgroup in one call, e.g. `integrations.cursor.execution_key`), `actorUserId`, or date range (`since`/`until`).
1198
1218
  */
1199
1219
  get: operations["listWorkspaceActivity"];
1200
1220
  put?: never;
@@ -1205,6 +1225,26 @@ export interface paths {
1205
1225
  patch?: never;
1206
1226
  trace?: never;
1207
1227
  };
1228
+ "/workspaces/{workspaceId}/activity/export": {
1229
+ parameters: {
1230
+ query?: never;
1231
+ header?: never;
1232
+ path?: never;
1233
+ cookie?: never;
1234
+ };
1235
+ /**
1236
+ * Export workspace activity log as CSV
1237
+ * @description Export the workspace activity log as an RFC 4180 CSV file (one row per event). Accepts the same filters as `GET /workspaces/{workspaceId}/activity` (`eventType`, `eventCategory`, `eventSubcategory`, `productArea`, `actorUserId`, `since`, `until`, `search`, `sort`, `order`); `limit`/`offset` are ignored — the export returns up to 50000 matching rows within the sort. Columns: occurredAt, eventType, eventCategory, actorType, actorName, actorEmail, repoName, integrationType, metadata. Opaque internal identifiers (actorUserId, repoId, integrationId, fixRequestId, issueId, readinessRunId) are omitted — the human-readable equivalents are already present and the IDs carry no value in a user-facing export. The response sets `Content-Disposition: attachment` with a `.csv` filename.
1238
+ */
1239
+ get: operations["exportWorkspaceActivity"];
1240
+ put?: never;
1241
+ post?: never;
1242
+ delete?: never;
1243
+ options?: never;
1244
+ head?: never;
1245
+ patch?: never;
1246
+ trace?: never;
1247
+ };
1208
1248
  "/workspaces/{workspaceId}/readiness/score-history": {
1209
1249
  parameters: {
1210
1250
  query?: never;
@@ -1549,6 +1589,50 @@ export interface paths {
1549
1589
  patch?: never;
1550
1590
  trace?: never;
1551
1591
  };
1592
+ "/workspaces/{workspaceId}/repo-eligibility": {
1593
+ parameters: {
1594
+ query?: never;
1595
+ header?: never;
1596
+ path?: never;
1597
+ cookie?: never;
1598
+ };
1599
+ /**
1600
+ * Get repo-sync eligibility gate (defaults + per-workspace overrides)
1601
+ * @description Returns the effective repo-sync eligibility gate (archived / fork / size / count) for the workspace: the global `defaults`, any per-workspace `overrides`, the merged `effective` values, and whether the caller can edit without platform-admin (`canEditUnrestricted`). Member-level read access.
1602
+ */
1603
+ get: operations["getWorkspaceRepoEligibility"];
1604
+ /**
1605
+ * Set per-workspace repo-sync eligibility overrides
1606
+ * @description Set (or clear, with an empty `overrides`) the per-workspace repo-sync eligibility overrides. **Platform admins** may set any value (raise caps, `0` = unlimited, include archived/forks). **Workspace admins** may only make the gate *more restrictive* than the platform defaults (lower caps, exclude archived/forks) — exceeding a platform limit returns `403` (`repo_eligibility_bound_exceeded`). Requires workspace admin or platform admin.
1607
+ */
1608
+ put: operations["putWorkspaceRepoEligibility"];
1609
+ post?: never;
1610
+ delete?: never;
1611
+ options?: never;
1612
+ head?: never;
1613
+ patch?: never;
1614
+ trace?: never;
1615
+ };
1616
+ "/workspaces/{workspaceId}/repo-eligibility/refresh-languages": {
1617
+ parameters: {
1618
+ query?: never;
1619
+ header?: never;
1620
+ path?: never;
1621
+ cookie?: never;
1622
+ };
1623
+ get?: never;
1624
+ put?: never;
1625
+ /**
1626
+ * Force a language/stack re-detection on the next sync
1627
+ * @description Admin maintenance action: invalidate the cached language/stack freshness marker so the next GitHub repo sync re-fetches `GET /repos/{owner}/{repo}/languages` and recomputes the per-language breakdown and supported stacks. Use after adding a newly-supported language to a repo, or when a repo's stack detection looks stale. Optionally scope to a single repo via `repoSlug` (`owner/name`); omit it to reset every repo in the workspace. Requires workspace admin or platform admin. The refresh itself happens on the next sync (e.g. when the GitHub repo list is loaded with `refresh=true`); the readiness scan also refreshes the breakdown on each successful run.
1628
+ */
1629
+ post: operations["refreshWorkspaceRepoLanguages"];
1630
+ delete?: never;
1631
+ options?: never;
1632
+ head?: never;
1633
+ patch?: never;
1634
+ trace?: never;
1635
+ };
1552
1636
  "/workspaces/{workspaceId}/readiness/cursor-key-usage": {
1553
1637
  parameters: {
1554
1638
  query?: never;
@@ -1836,7 +1920,7 @@ export interface paths {
1836
1920
  };
1837
1921
  /**
1838
1922
  * Workspace journey step completion
1839
- * @description Returns the workspace-scoped journey progress state. Returns an empty `completedSteps` list with a synthetic `updatedAt` if no row exists yet. Covers issue #271.
1923
+ * @description Returns the workspace-scoped journey progress state. Returns an empty `completedStepIds` array when no row exists yet (updatedAt is synthetic in that case). Values are canonical step IDs (see `JourneyStepId`); legacy route strings are accepted on PUT and normalized. Covers issue #271.
1840
1924
  */
1841
1925
  get: operations["getYourAiJourneyProgress"];
1842
1926
  /**
@@ -2309,12 +2393,7 @@ export interface components {
2309
2393
  /** @description Short label for the week column (MM/DD), aligned with Measure charts. */
2310
2394
  weekLabel?: string;
2311
2395
  mergedPrCount: number;
2312
- /** @description DORA change failure rate (deployments/incidents), not CI build failures. */
2313
2396
  failRatePercent: number;
2314
- /** @description GitHub Actions / Checks CI build failure rate for the week bucket (failed runs / (failed + passed) * 100). Zero when GitHub Actions CI is disabled. */
2315
- ciFailRatePercent?: number;
2316
- /** @description Count of build.failed events in the week bucket when CI ingest is enabled. */
2317
- ciBuildFailuresCount?: number;
2318
2397
  /** @description Mean hours from PR creation to first review in this week bucket. */
2319
2398
  avgReviewWaitHours?: number;
2320
2399
  /** @description Mean hours from first review to first approval in this week bucket. */
@@ -2347,8 +2426,6 @@ export interface components {
2347
2426
  scope: components["schemas"]["ProductivityInsightsAggregatedTeamsScopeDto"];
2348
2427
  /** Format: date-time */
2349
2428
  generatedAt: string;
2350
- /** @description True when the workspace has opted in to GitHub Actions CI ingest. */
2351
- githubActionsCiEnabled?: boolean;
2352
2429
  teams: components["schemas"]["ProductivityInsightsAggregatedTeamRowDto"][];
2353
2430
  };
2354
2431
  ProductivityInsightsMergedPrTrendWeekDto: {
@@ -2393,16 +2470,11 @@ export interface components {
2393
2470
  periodAvgMergedPrs: number;
2394
2471
  /** @description Average change failure rate over the range when available. */
2395
2472
  avgFailRatePercent?: number;
2396
- /** @description Average GitHub Actions CI build failure rate over the range when CI ingest is enabled. */
2397
- avgCiFailRatePercent?: number;
2398
2473
  };
2399
2474
  ProductivityInsightsTeamSummaryDto: {
2400
2475
  totalMergedPrs: number;
2401
2476
  avgMergedPrsPerWeek: number;
2402
- /** @description Average DORA change failure rate over the range when available. */
2403
2477
  avgFailRatePercent: number;
2404
- /** @description Average GitHub Actions CI build failure rate over the range when CI ingest is enabled. */
2405
- avgCiFailRatePercent?: number;
2406
2478
  headcount: number;
2407
2479
  };
2408
2480
  ProductivityInsightsTeamDetailDto: {
@@ -2429,8 +2501,6 @@ export interface components {
2429
2501
  scope: components["schemas"]["ProductivityInsightsAggregatedTeamsScopeDto"];
2430
2502
  /** Format: date-time */
2431
2503
  generatedAt: string;
2432
- /** @description True when the workspace has opted in to GitHub Actions CI ingest. */
2433
- githubActionsCiEnabled?: boolean;
2434
2504
  /** @description Present when `teamId` query is omitted — top-ranked teams. */
2435
2505
  items?: components["schemas"]["ProductivityInsightsTeamLeaderItemDto"][];
2436
2506
  /** @description Present when `teamId` query is set — single-team drilldown. */
@@ -2478,16 +2548,11 @@ export interface components {
2478
2548
  totalMergedPrs: number;
2479
2549
  avgMergedPrsPerWeek: number;
2480
2550
  totalAbsenceDays: number;
2481
- /** @description Average DORA change failure rate over the range when available. */
2482
2551
  avgFailRate: number;
2483
- /** @description Average GitHub Actions CI build failure rate over the range when CI ingest is enabled. */
2484
- avgCiFailRate?: number;
2485
2552
  mergedPrDelta: number;
2486
2553
  avgMergedPrsPerWeekDelta: number;
2487
2554
  totalAbsenceDaysDelta: number;
2488
2555
  avgFailRateDelta: number;
2489
- /** @description Change in average CI build failure rate vs the prior comparison window. */
2490
- avgCiFailRateDelta?: number;
2491
2556
  };
2492
2557
  ProductivityInsightsContributorDetailDto: {
2493
2558
  /** Format: uuid */
@@ -2499,8 +2564,6 @@ export interface components {
2499
2564
  scope: components["schemas"]["ProductivityInsightsAggregatedTeamsScopeDto"];
2500
2565
  /** Format: date-time */
2501
2566
  generatedAt: string;
2502
- /** @description True when the workspace has opted in to GitHub Actions CI ingest. */
2503
- githubActionsCiEnabled?: boolean;
2504
2567
  contributor: components["schemas"]["ProductivityInsightsContributorProfileDto"];
2505
2568
  weeks: components["schemas"]["ProductivityInsightsContributorActivityWeekDto"][];
2506
2569
  summary: components["schemas"]["ProductivityInsightsContributorActivitySummaryDto"];
@@ -2519,8 +2582,6 @@ export interface components {
2519
2582
  periodAvgMergedPrs: number;
2520
2583
  /** @description Mean weekly change-failure rate when available. */
2521
2584
  avgFailRatePercent?: number;
2522
- /** @description Mean weekly GitHub Actions CI build failure rate when CI ingest is enabled. */
2523
- avgCiFailRatePercent?: number;
2524
2585
  };
2525
2586
  ProductivityInsightsNeedsAttentionDto: {
2526
2587
  /** Format: uuid */
@@ -2531,8 +2592,6 @@ export interface components {
2531
2592
  entityType: "teams" | "contributors";
2532
2593
  /** Format: date-time */
2533
2594
  generatedAt: string;
2534
- /** @description True when GitHub Actions CI ingest is enabled for this workspace. */
2535
- githubActionsCiEnabled?: boolean;
2536
2595
  items: components["schemas"]["ProductivityInsightsNeedsAttentionItemDto"][];
2537
2596
  };
2538
2597
  AiUsageSpendAggregatedTeamWeekDto: {
@@ -2801,6 +2860,83 @@ export interface components {
2801
2860
  * @description Last push or metadata update from GitHub when available.
2802
2861
  */
2803
2862
  updatedAt?: string | null;
2863
+ /** @description True when the repository is archived (read-only on GitHub). */
2864
+ archived?: boolean | null;
2865
+ /** @description True when the repository is a fork of another repository. */
2866
+ fork?: boolean | null;
2867
+ /** @description True when the repository is disabled on GitHub. */
2868
+ disabled?: boolean | null;
2869
+ /** @description Repository size in KB as reported by GitHub. */
2870
+ size?: number | null;
2871
+ /** @description Hard structural reasons this repo cannot be analyzed (archived, disabled, too-large, workspace repo cap). Each entry is a human-readable explanation (e.g. "This repo is archived"). Empty or absent means no hard block. Forks and unsupported-language repos are NOT listed here — they are advisory `warnings` (#729) and remain analyzable. */
2872
+ ineligibleReasons?: string[] | null;
2873
+ /** @description Non-blocking advisories shown alongside an otherwise-analyzable repo (#729). Includes forks ("results reflect the forked code") and repos with no v1-supported stack, where the message embeds the GitHub language mix in percent. Absent/empty when there are no warnings. Unlike `ineligibleReasons`, warnings do NOT disable analyze/score/fix actions. */
2874
+ warnings?: string[] | null;
2875
+ /**
2876
+ * @description Whether the repo can be analyzed (issue #44/#729). `ineligible` only for HARD structural gates (archived, disabled, too-large, workspace repo cap) — such repos render read-only in the AF list. A repo with no supported stack or that is a fork is `eligible` and carries a non-blocking `warnings` entry instead of being blocked.
2877
+ * @enum {string|null}
2878
+ */
2879
+ eligibilityStatus?: "eligible" | "ineligible" | null;
2880
+ /** @description Human-readable explanation when `eligibilityStatus` is `ineligible` (e.g. "This repo is archived"). For advisory language/fork notices see `warnings`, not this field. */
2881
+ eligibilityReason?: string | null;
2882
+ /** @description Dominant supported stack (by GitHub language bytes), one of backend_jvm | ios_app | web_spa | backend_go | backend_python. Null when no supported stack was detected. */
2883
+ primaryStack?: string | null;
2884
+ /** @description Second supported stack for a multi-stack repo, or null. */
2885
+ secondaryStack?: string | null;
2886
+ /** @description All supported stacks detected for the repo (ordered, primary first). Empty/null when no supported stack is present. Drives multi-stack scanning and the orange mixed-monorepo box in the AF UI. */
2887
+ supportedStacks?: string[] | null;
2888
+ /** @description Per-language share of the repo from GitHub's `GET /repos/{owner}/{repo}/languages` byte counts, ordered by share descending (#729). Powers the "language mix" shown in the unsupported-stack warning. Absent/null until the repo has been synced with a language resolver. */
2889
+ languageBreakdown?: {
2890
+ /** @description GitHub language name (e.g. "TypeScript", "Go"). */
2891
+ language: string;
2892
+ /**
2893
+ * Format: float
2894
+ * @description Share of total language bytes, rounded to four decimal places (e.g. 64.2153). The extra precision keeps small/near-tied languages distinguishable for a hover tag; render it rounded for compact labels. May not sum to exactly 100 due to rounding.
2895
+ */
2896
+ percent: number;
2897
+ /** @description True when this language maps to a v1-supported stack; false when the language is not supported. Lets the UI flag exactly which languages are not (fully) supported in a mixed/monorepo. */
2898
+ supported: boolean;
2899
+ /** @description The supported stack this language maps to (backend_jvm | ios_app | web_spa | backend_go | backend_python), or null when the language is unsupported. */
2900
+ stack?: string | null;
2901
+ }[] | null;
2902
+ };
2903
+ /** @description Resolved repo-sync eligibility gate (defaults or effective). All fields present. */
2904
+ RepoEligibilityConfigDto: {
2905
+ /** @description Skip archived repos during GitHub repo sync. */
2906
+ excludeArchived: boolean;
2907
+ /** @description Skip forked repos. Forks are included by default. */
2908
+ excludeForks: boolean;
2909
+ /** @description Max repo size in KB (GitHub-reported). 0 = no limit. */
2910
+ maxRepoSizeKb: number;
2911
+ /** @description Max repos materialized per workspace per sync. 0 = no limit. */
2912
+ maxReposPerWorkspace: number;
2913
+ };
2914
+ /** @description Per-workspace overrides for the repo-sync eligibility gate. Any field present wins over the global default; omit a field to inherit the default. An empty object clears all overrides. */
2915
+ RepoEligibilityOverridesDto: {
2916
+ excludeArchived?: boolean | null;
2917
+ excludeForks?: boolean | null;
2918
+ maxRepoSizeKb?: number | null;
2919
+ maxReposPerWorkspace?: number | null;
2920
+ };
2921
+ WorkspaceRepoEligibilityDto: {
2922
+ defaults: components["schemas"]["RepoEligibilityConfigDto"];
2923
+ overrides: components["schemas"]["RepoEligibilityOverridesDto"];
2924
+ effective: components["schemas"]["RepoEligibilityConfigDto"];
2925
+ /** @description True when the caller is a platform admin (may set any value, incl. raising caps). */
2926
+ canEditUnrestricted: boolean;
2927
+ };
2928
+ /** @description Effective repo-eligibility limits applied to the GitHub repo list, plus the current count of eligible repos. Lets the UI render per-repo "size / limit" (compare each repo's `size` in `GithubInstalledRepoDto` to `maxRepoSizeKb`) and workspace "N / cap" usage (`eligibleRepoCount` / `maxReposPerWorkspace`). */
2929
+ RepoEligibilityLimitsDto: {
2930
+ /** @description Per-repo size cap in KB (GitHub-reported). 0 = no limit. */
2931
+ maxRepoSizeKb: number;
2932
+ /** @description Max repos that can be eligible per workspace. 0 = no limit. */
2933
+ maxReposPerWorkspace: number;
2934
+ /** @description Whether archived repos are treated as a hard block. */
2935
+ excludeArchived: boolean;
2936
+ /** @description Whether forked repos are excluded by the sync gate (forks are a warning, not a block). */
2937
+ excludeForks: boolean;
2938
+ /** @description Repos currently counting as eligible (eligibilityStatus != "ineligible"), i.e. those that count toward `maxReposPerWorkspace`. */
2939
+ eligibleRepoCount: number;
2804
2940
  };
2805
2941
  GithubMissingPermissionDto: {
2806
2942
  /** @description GitHub App permission key (e.g. contents, pull_requests). */
@@ -2889,6 +3025,8 @@ export interface components {
2889
3025
  account?: components["schemas"]["GithubAccountDto"] | null;
2890
3026
  /** @description Paginated merged installation repositories when `installed` is true. */
2891
3027
  repos?: components["schemas"]["GithubInstalledRepoListDto"] | null;
3028
+ /** @description Effective size/count limits and current eligible-repo usage for the repo list. Present when `installed` is true. Pair with each repo's `size` and `eligibilityStatus` to show "size / limit" and "N / cap" in the UI. */
3029
+ eligibilityLimits?: components["schemas"]["RepoEligibilityLimitsDto"] | null;
2892
3030
  /**
2893
3031
  * Format: uri
2894
3032
  * @description User accounts: github.com/settings/installations/<id>. Organizations: github.com/organizations/<login>/settings/installations/<id>.
@@ -3199,7 +3337,7 @@ export interface components {
3199
3337
  scorePercent?: number;
3200
3338
  /** @description Per-criterion status counts from the latest successful scan */
3201
3339
  criteriaSummary?: components["schemas"]["ReadinessCriteriaSummaryDto"] | null;
3202
- /** @description Individual rubric criterion outcomes from the latest successful scan. Always present on the single-repo detail endpoint. When the repo has a succeeded scan but a dimension was not evaluated (e.g. Section I on older runs), the API returns full rubric placeholders with status `blocked`. Empty array only when the repo has no succeeded scan yet. */
3340
+ /** @description Individual rubric criterion outcomes from the latest successful scan. Always present on the single-repo detail endpoint; empty array when no scan has completed yet for this dimension. */
3203
3341
  criteriaDetails: components["schemas"]["CriterionDetailDto"][];
3204
3342
  issues: components["schemas"]["ReadinessIssueDto"][];
3205
3343
  };
@@ -3293,6 +3431,34 @@ export interface components {
3293
3431
  * @enum {string|null}
3294
3432
  */
3295
3433
  archivedReason?: "github_removed" | "installation_disconnected" | "installation_replaced" | "superseded" | null;
3434
+ /**
3435
+ * @description Whether the repo can be analyzed (#44/#729). Language support no longer makes a repo `ineligible` — a missing v1-supported stack is surfaced via `warnings` and the repo stays analyzable. It becomes `ineligible` when the most recent scan hit a hard size/file-count limit (e.g. code-size or file-count exceeded): the repo is then restricted here too so this surface matches the GitHub connect list's size gate after the scan. Null until the first sync/scan computes it.
3436
+ * @enum {string|null}
3437
+ */
3438
+ eligibilityStatus?: "eligible" | "ineligible" | null;
3439
+ /** @description Human-readable explanation when `eligibilityStatus` is `ineligible` (e.g. the size / file-count limit message from the last scan). For advisory language notices see `warnings`. */
3440
+ eligibilityReason?: string | null;
3441
+ /** @description Non-blocking advisories for an analyzable repo (#729): no v1-supported stack (with the language mix), and hard-limit run outcomes (code size / file count exceeded) carried from the last run. Absent/empty when there are no warnings. */
3442
+ warnings?: string[] | null;
3443
+ /** @description Dominant supported stack — backend_jvm | ios_app | web_spa | backend_go | backend_python. Null when no supported stack/uncomputed. */
3444
+ primaryStack?: string | null;
3445
+ /** @description Second supported stack for a multi-stack repo, or null. */
3446
+ secondaryStack?: string | null;
3447
+ /** @description All supported stacks detected (ordered, primary first). Empty/null when none. */
3448
+ supportedStacks?: string[] | null;
3449
+ /** @description Per-language share from GitHub languages (#729), ordered by share descending. Each entry has `supported`/`stack` so the UI can tag which languages are (not) supported. Absent until the repo has been synced with a language resolver. */
3450
+ languageBreakdown?: {
3451
+ language: string;
3452
+ /**
3453
+ * Format: float
3454
+ * @description Share of total language bytes, rounded to four decimal places (e.g. 64.2153).
3455
+ */
3456
+ percent: number;
3457
+ supported: boolean;
3458
+ stack?: string | null;
3459
+ }[] | null;
3460
+ /** @description GitHub-reported repository size in KB (includes git history), refreshed on each readiness scan (#729). Compare against `eligibilityLimits.maxRepoSizeKb` on the list response to show per-repo "size / limit". When the size exceeds the limit the latest scan is recorded as `partial_failed` with `lastRunErrorCode = exceeded_repo_size_limit` and the repo is marked `ineligible`. Null until a scan has populated it. */
3461
+ sizeKb?: number | null;
3296
3462
  };
3297
3463
  /** @description Single-repo detail response. Identical to RepoReadinessScoreDto except dimensions use DimensionScoreDetailDto (criteriaDetails required per dimension). */
3298
3464
  RepoReadinessScoreDetailDto: {
@@ -3320,6 +3486,30 @@ export interface components {
3320
3486
  archivedAt?: string | null;
3321
3487
  /** @enum {string|null} */
3322
3488
  archivedReason?: "github_removed" | "installation_disconnected" | "installation_replaced" | "superseded" | null;
3489
+ /**
3490
+ * @description See RepoReadinessScoreDto.eligibilityStatus. Language support is advisory (#729) and surfaced via `warnings`.
3491
+ * @enum {string|null}
3492
+ */
3493
+ eligibilityStatus?: "eligible" | "ineligible" | null;
3494
+ eligibilityReason?: string | null;
3495
+ /** @description Non-blocking advisories (no v1-supported stack, hard-limit run outcomes). See RepoReadinessScoreDto.warnings. */
3496
+ warnings?: string[] | null;
3497
+ primaryStack?: string | null;
3498
+ secondaryStack?: string | null;
3499
+ supportedStacks?: string[] | null;
3500
+ /** @description Per-language share with `supported`/`stack` tags. See RepoReadinessScoreDto.languageBreakdown. */
3501
+ languageBreakdown?: {
3502
+ language: string;
3503
+ /**
3504
+ * Format: float
3505
+ * @description Share of total language bytes, rounded to four decimal places (e.g. 64.2153).
3506
+ */
3507
+ percent: number;
3508
+ supported: boolean;
3509
+ stack?: string | null;
3510
+ }[] | null;
3511
+ /** @description GitHub-reported repository size in KB, refreshed on each scan. See RepoReadinessScoreDto.sizeKb. */
3512
+ sizeKb?: number | null;
3323
3513
  };
3324
3514
  AgenticFoundationDashboardSummaryDto: {
3325
3515
  repoCount: number;
@@ -3344,8 +3534,20 @@ export interface components {
3344
3534
  limit: number;
3345
3535
  offset: number;
3346
3536
  };
3537
+ /** @description Effective size/code limits enforced by readiness scans (#729). Lets the UI render per-repo "size / limit" (compare each repo's `sizeKb` to `maxRepoSizeKb`) and explain why a repo is `ineligible` due to a hard size/file-count limit. A repo over `maxRepoSizeKb` is skipped on the next scan (recorded `partial_failed` with `exceeded_repo_size_limit`); code-line/file counts are evaluated post-clone via `cloc`. */
3538
+ ReadinessEligibilityLimitsDto: {
3539
+ /** @description Per-repo GitHub size cap in KB (includes git history). 0 = no limit. */
3540
+ maxRepoSizeKb: number;
3541
+ /** @description Max total lines of code (cloc) before a scan is skipped. 0 = no limit. */
3542
+ maxLinesOfCode: number;
3543
+ /** @description Max source file count (cloc) before a scan is skipped. 0 = no limit. */
3544
+ maxFileCount: number;
3545
+ /** @description Max repos that can be eligible per workspace. 0 = no limit. */
3546
+ maxReposPerWorkspace: number;
3547
+ };
3347
3548
  ReadinessRepoListDto: components["schemas"]["PageMetaDto"] & {
3348
3549
  items: components["schemas"]["RepoReadinessScoreDto"][];
3550
+ eligibilityLimits?: components["schemas"]["ReadinessEligibilityLimitsDto"];
3349
3551
  };
3350
3552
  /** @description Paginated list of repo readiness scores where each dimension includes criteriaDetails. Used by dimension-slice endpoints (agentic-foundation pillars). */
3351
3553
  ReadinessRepoDetailListDto: components["schemas"]["PageMetaDto"] & {
@@ -3580,14 +3782,31 @@ export interface components {
3580
3782
  AiStrategyPlanDto: {
3581
3783
  phases: components["schemas"]["AiStrategyPhaseBlockDto"][];
3582
3784
  };
3785
+ /**
3786
+ * @description Canonical journey step identifier (stable across URL reshuffles).
3787
+ * @enum {string}
3788
+ */
3789
+ JourneyStepId: "onboarding.workspace" | "onboarding.ai_readiness" | "onboarding.integrations" | "readiness.dashboard" | "readiness.fix_queue" | "readiness.activity" | "insights.productivity" | "insights.productivity.by_user" | "insights.productivity.by_team" | "insights.ai_usage" | "insights.ai_usage.by_user" | "insights.ai_usage.by_team" | "insights.ai_usage.by_model";
3583
3790
  JourneyProgressDto: {
3584
- completedSteps: string[];
3791
+ /** @description Canonical completed journey step IDs. */
3792
+ completedStepIds: components["schemas"]["JourneyStepId"][];
3793
+ /**
3794
+ * @deprecated
3795
+ * @description Deprecated alias of completedStepIds (legacy clients). Omitted on new responses when empty.
3796
+ */
3797
+ completedSteps?: string[];
3585
3798
  /** Format: date-time */
3586
3799
  updatedAt: string;
3587
3800
  };
3588
3801
  JourneyProgressUpdateDto: {
3589
- completedSteps: string[];
3590
- };
3802
+ /** @description Idempotent replace-all of completed step IDs. */
3803
+ completedStepIds?: components["schemas"]["JourneyStepId"][];
3804
+ /**
3805
+ * @deprecated
3806
+ * @description Deprecated input alias — route strings and legacy `/phase-*` paths are normalized to step IDs.
3807
+ */
3808
+ completedSteps?: string[];
3809
+ } | unknown | unknown;
3591
3810
  /** @enum {string} */
3592
3811
  ThemePreference: "light" | "dark" | "system";
3593
3812
  NotificationPreferencesDto: {
@@ -3709,7 +3928,9 @@ export interface components {
3709
3928
  /** Format: date-time */
3710
3929
  windowEnd: string;
3711
3930
  journey: {
3712
- completedSteps: string[];
3931
+ completedStepIds: components["schemas"]["JourneyStepId"][];
3932
+ /** @deprecated */
3933
+ completedSteps?: string[];
3713
3934
  /** Format: date-time */
3714
3935
  updatedAt: string | null;
3715
3936
  };
@@ -3782,7 +4003,7 @@ export interface components {
3782
4003
  * @description Type of workspace lifecycle event.
3783
4004
  * @enum {string}
3784
4005
  */
3785
- ActivityLogEventTypeDto: "repo.added" | "repo.removed" | "repo.readded" | "integration.github.added" | "integration.github.updated" | "integration.github.removed" | "integration.github.permissions_changed" | "integration.github.repo_added" | "integration.github.repo_removed" | "fix.requested" | "fix.generating" | "fix.pr_created" | "fix.merged" | "fix.failed" | "readiness.scan_started" | "readiness.scan_completed" | "readiness.scan_failed" | "readiness.scan_partial" | "config.cursor.added" | "config.cursor.updated" | "config.cursor.removed" | "config.cursor.platform_key_enabled" | "config.cursor.platform_key_disabled" | "config.claude.added" | "config.claude.updated" | "config.claude.removed" | "config.agent_execution.provider_changed" | "member.invited" | "member.role_changed" | "member.removed";
4006
+ ActivityLogEventTypeDto: "repo.added" | "repo.removed" | "repo.readded" | "integration.github.added" | "integration.github.updated" | "integration.github.removed" | "integration.github.permissions_changed" | "integration.github.repo_added" | "integration.github.repo_removed" | "fix.requested" | "fix.generating" | "fix.pr_created" | "fix.merged" | "fix.failed" | "readiness.scan_started" | "readiness.scan_completed" | "readiness.scan_failed" | "readiness.scan_partial" | "integrations.agent_execution.provider_changed" | "integrations.repo_eligibility.overrides_changed" | "integrations.repo_eligibility.languages_refresh_requested" | "integrations.cursor.platform_key_enabled" | "integrations.cursor.platform_key_disabled" | "member.invited" | "member.role_changed" | "member.removed" | "hris.personio.sync_started" | "hris.personio.sync_completed" | "hris.personio.sync_failed" | "hris.sync_started" | "hris.sync_completed" | "hris.sync_failed" | "repo.sync_skipped" | "integrations.cursor.execution_key.added" | "integrations.cursor.execution_key.updated" | "integrations.cursor.execution_key.removed" | "integrations.cursor.execution_key.check_failed" | "integrations.cursor.admin_key.added" | "integrations.cursor.admin_key.updated" | "integrations.cursor.admin_key.removed" | "integrations.claude.execution_key.added" | "integrations.claude.execution_key.updated" | "integrations.claude.execution_key.removed" | "integrations.claude.execution_key.check_failed" | "integrations.claude.admin_key.added" | "integrations.claude.admin_key.updated" | "integrations.claude.admin_key.removed" | "readiness.scan_precheck_failed" | "productivity.ingest.completed" | "productivity.ingest.failed" | "productivity.ingest.skipped";
3786
4007
  ActivityLogActorDto: {
3787
4008
  /** Format: uuid */
3788
4009
  userId: string;
@@ -4032,6 +4253,8 @@ export interface components {
4032
4253
  parameters: {
4033
4254
  WorkspaceId: string;
4034
4255
  RepoId: string;
4256
+ /** @description Provider repository slug in `owner/repo` form (GitHub). Used for shareable public URLs; resolves to the same row as `repoId` UUID internally. */
4257
+ ProviderSlug: string;
4035
4258
  ProjectId: string;
4036
4259
  NotificationId: string;
4037
4260
  /** @description Workspace member user id (`tai_users.id`). */
@@ -4153,6 +4376,10 @@ export type CreateWorkspaceBodyDto = components['schemas']['CreateWorkspaceBodyD
4153
4376
  export type CompanyProfileDto = components['schemas']['CompanyProfileDto'];
4154
4377
  export type GithubAccountDto = components['schemas']['GithubAccountDto'];
4155
4378
  export type GithubInstalledRepoDto = components['schemas']['GithubInstalledRepoDto'];
4379
+ export type RepoEligibilityConfigDto = components['schemas']['RepoEligibilityConfigDto'];
4380
+ export type RepoEligibilityOverridesDto = components['schemas']['RepoEligibilityOverridesDto'];
4381
+ export type WorkspaceRepoEligibilityDto = components['schemas']['WorkspaceRepoEligibilityDto'];
4382
+ export type RepoEligibilityLimitsDto = components['schemas']['RepoEligibilityLimitsDto'];
4156
4383
  export type GithubMissingPermissionDto = components['schemas']['GithubMissingPermissionDto'];
4157
4384
  export type GithubInstallationSummaryDto = components['schemas']['GithubInstallationSummaryDto'];
4158
4385
  export type GithubPendingApprovalDto = components['schemas']['GithubPendingApprovalDto'];
@@ -4205,6 +4432,7 @@ export type RepoReadinessScoreDto = components['schemas']['RepoReadinessScoreDto
4205
4432
  export type RepoReadinessScoreDetailDto = components['schemas']['RepoReadinessScoreDetailDto'];
4206
4433
  export type AgenticFoundationDashboardSummaryDto = components['schemas']['AgenticFoundationDashboardSummaryDto'];
4207
4434
  export type PageMetaDto = components['schemas']['PageMetaDto'];
4435
+ export type ReadinessEligibilityLimitsDto = components['schemas']['ReadinessEligibilityLimitsDto'];
4208
4436
  export type ReadinessRepoListDto = components['schemas']['ReadinessRepoListDto'];
4209
4437
  export type ReadinessRepoDetailListDto = components['schemas']['ReadinessRepoDetailListDto'];
4210
4438
  export type ReadinessFixListDto = components['schemas']['ReadinessFixListDto'];
@@ -4236,6 +4464,7 @@ export type AiStrategyRecommendBodyDto = components['schemas']['AiStrategyRecomm
4236
4464
  export type AiStrategyTaskRecommendationDto = components['schemas']['AiStrategyTaskRecommendationDto'];
4237
4465
  export type AiStrategyPhaseBlockDto = components['schemas']['AiStrategyPhaseBlockDto'];
4238
4466
  export type AiStrategyPlanDto = components['schemas']['AiStrategyPlanDto'];
4467
+ export type JourneyStepId = components['schemas']['JourneyStepId'];
4239
4468
  export type JourneyProgressDto = components['schemas']['JourneyProgressDto'];
4240
4469
  export type JourneyProgressUpdateDto = components['schemas']['JourneyProgressUpdateDto'];
4241
4470
  export type ThemePreference = components['schemas']['ThemePreference'];
@@ -4273,6 +4502,7 @@ export type ResponseUnauthorized = components['responses']['Unauthorized'];
4273
4502
  export type ResponseForbidden = components['responses']['Forbidden'];
4274
4503
  export type ParameterWorkspaceId = components['parameters']['WorkspaceId'];
4275
4504
  export type ParameterRepoId = components['parameters']['RepoId'];
4505
+ export type ParameterProviderSlug = components['parameters']['ProviderSlug'];
4276
4506
  export type ParameterProjectId = components['parameters']['ProjectId'];
4277
4507
  export type ParameterNotificationId = components['parameters']['NotificationId'];
4278
4508
  export type ParameterWorkspaceMemberId = components['parameters']['WorkspaceMemberId'];
@@ -5322,7 +5552,7 @@ export interface operations {
5322
5552
  header?: never;
5323
5553
  path: {
5324
5554
  workspaceId: components["parameters"]["WorkspaceId"];
5325
- /** @description Org-chart person id or synthetic GitHub scope id (`__github:{login}`). */
5555
+ /** @description GitHub login slug, org-chart person id, or synthetic `__github:{login}` scope id. */
5326
5556
  contributorId: string;
5327
5557
  };
5328
5558
  cookie?: never;
@@ -7131,6 +7361,50 @@ export interface operations {
7131
7361
  };
7132
7362
  };
7133
7363
  };
7364
+ getReadinessRepoBySlug: {
7365
+ parameters: {
7366
+ query?: never;
7367
+ header?: never;
7368
+ path: {
7369
+ workspaceId: components["parameters"]["WorkspaceId"];
7370
+ /** @description Provider repository slug in `owner/repo` form (GitHub). Used for shareable public URLs; resolves to the same row as `repoId` UUID internally. */
7371
+ providerSlug: components["parameters"]["ProviderSlug"];
7372
+ };
7373
+ cookie?: never;
7374
+ };
7375
+ requestBody?: never;
7376
+ responses: {
7377
+ /** @description Repo score */
7378
+ 200: {
7379
+ headers: {
7380
+ [name: string]: unknown;
7381
+ };
7382
+ content: {
7383
+ "application/json": components["schemas"]["RepoReadinessScoreDetailDto"];
7384
+ };
7385
+ };
7386
+ /** @description Malformed providerSlug */
7387
+ 400: {
7388
+ headers: {
7389
+ [name: string]: unknown;
7390
+ };
7391
+ content: {
7392
+ "application/json": components["schemas"]["ErrorMessageDto"];
7393
+ };
7394
+ };
7395
+ 401: components["responses"]["Unauthorized"];
7396
+ 403: components["responses"]["Forbidden"];
7397
+ /** @description Workspace or repository not found */
7398
+ 404: {
7399
+ headers: {
7400
+ [name: string]: unknown;
7401
+ };
7402
+ content: {
7403
+ "application/json": components["schemas"]["ErrorMessageDto"];
7404
+ };
7405
+ };
7406
+ };
7407
+ };
7134
7408
  getReadinessRepo: {
7135
7409
  parameters: {
7136
7410
  query?: never;
@@ -7342,6 +7616,10 @@ export interface operations {
7342
7616
  offset?: components["parameters"]["PaginationOffset"];
7343
7617
  /** @description Sort direction. */
7344
7618
  order?: components["parameters"]["PaginationOrder"];
7619
+ /** @description Server-side sort column (the activity "5 W's"). Combined with `order` (asc/desc). Defaults to `when` (occurredAt). `occurredAt`/`id` is always the tiebreaker. */
7620
+ sort?: "when" | "who" | "what" | "why" | "where";
7621
+ /** @description Coarse product-area grouping filter (#156). `integration` = GitHub + AI-tool key events; `agentic_foundation` = repos, readiness scans, fixes; `workspace_team` = members + HRIS; `productivity` = productivity ingest lifecycle events. Omit (or pass `all`) for every area. */
7622
+ productArea?: "integration" | "agentic_foundation" | "workspace_team" | "productivity" | "all";
7345
7623
  /** @description Filter to a specific event type. */
7346
7624
  eventType?: components["schemas"]["ActivityLogEventTypeDto"];
7347
7625
  /** @description Filter to events performed by a specific user (UUID). */
@@ -7352,6 +7630,8 @@ export interface operations {
7352
7630
  until?: string;
7353
7631
  /** @description Filter by event namespace prefix (e.g. "fix", "repo", "integration", "readiness", "config", "member"). */
7354
7632
  eventCategory?: string;
7633
+ /** @description Filter by a dotted event-type *subgroup* (#156): a strict prefix of an event type with one or more segments (shorter than the full event type), matching every lifecycle event under it in a single call. Single-segment values (e.g. `fix`, `readiness`, `repo`, `productivity`) overlap with `eventCategory` so the same control can filter at any depth. Example: `integrations.cursor.execution_key` returns `integrations.cursor.execution_key.added`, `.updated`, `.removed`, and `.check_failed`; `integrations.cursor` returns all Cursor key events; `fix` returns all fix lifecycle events. Must be one of the known subcategories or the request is rejected (400). */
7634
+ eventSubcategory?: string;
7355
7635
  /** @description Case-insensitive substring filter applied across repo name, integration type, actor email, and actor display name. */
7356
7636
  search?: string;
7357
7637
  };
@@ -7394,6 +7674,61 @@ export interface operations {
7394
7674
  };
7395
7675
  };
7396
7676
  };
7677
+ exportWorkspaceActivity: {
7678
+ parameters: {
7679
+ query?: {
7680
+ sort?: "when" | "who" | "what" | "why" | "where";
7681
+ /** @description Sort direction. */
7682
+ order?: components["parameters"]["PaginationOrder"];
7683
+ productArea?: "integration" | "agentic_foundation" | "workspace_team" | "productivity" | "all";
7684
+ eventType?: components["schemas"]["ActivityLogEventTypeDto"];
7685
+ eventCategory?: string;
7686
+ /** @description Dotted event-type subgroup prefix (see the activity list endpoint). */
7687
+ eventSubcategory?: string;
7688
+ actorUserId?: string;
7689
+ since?: string;
7690
+ until?: string;
7691
+ search?: string;
7692
+ };
7693
+ header?: never;
7694
+ path: {
7695
+ workspaceId: components["parameters"]["WorkspaceId"];
7696
+ };
7697
+ cookie?: never;
7698
+ };
7699
+ requestBody?: never;
7700
+ responses: {
7701
+ /** @description CSV file of activity log entries */
7702
+ 200: {
7703
+ headers: {
7704
+ [name: string]: unknown;
7705
+ };
7706
+ content: {
7707
+ "text/csv": string;
7708
+ };
7709
+ };
7710
+ /** @description Invalid query parameters */
7711
+ 400: {
7712
+ headers: {
7713
+ [name: string]: unknown;
7714
+ };
7715
+ content: {
7716
+ "application/json": components["schemas"]["ErrorMessageDto"];
7717
+ };
7718
+ };
7719
+ 401: components["responses"]["Unauthorized"];
7720
+ 403: components["responses"]["Forbidden"];
7721
+ /** @description Workspace does not exist */
7722
+ 404: {
7723
+ headers: {
7724
+ [name: string]: unknown;
7725
+ };
7726
+ content: {
7727
+ "application/json": components["schemas"]["ErrorMessageDto"];
7728
+ };
7729
+ };
7730
+ };
7731
+ };
7397
7732
  getReadinessScoreHistory: {
7398
7733
  parameters: {
7399
7734
  query?: {
@@ -8285,6 +8620,124 @@ export interface operations {
8285
8620
  403: components["responses"]["Forbidden"];
8286
8621
  };
8287
8622
  };
8623
+ getWorkspaceRepoEligibility: {
8624
+ parameters: {
8625
+ query?: never;
8626
+ header?: never;
8627
+ path: {
8628
+ workspaceId: components["parameters"]["WorkspaceId"];
8629
+ };
8630
+ cookie?: never;
8631
+ };
8632
+ requestBody?: never;
8633
+ responses: {
8634
+ /** @description Effective repo-eligibility configuration */
8635
+ 200: {
8636
+ headers: {
8637
+ [name: string]: unknown;
8638
+ };
8639
+ content: {
8640
+ "application/json": components["schemas"]["WorkspaceRepoEligibilityDto"];
8641
+ };
8642
+ };
8643
+ 401: components["responses"]["Unauthorized"];
8644
+ 403: components["responses"]["Forbidden"];
8645
+ };
8646
+ };
8647
+ putWorkspaceRepoEligibility: {
8648
+ parameters: {
8649
+ query?: never;
8650
+ header?: never;
8651
+ path: {
8652
+ workspaceId: components["parameters"]["WorkspaceId"];
8653
+ };
8654
+ cookie?: never;
8655
+ };
8656
+ requestBody: {
8657
+ content: {
8658
+ "application/json": {
8659
+ overrides: components["schemas"]["RepoEligibilityOverridesDto"];
8660
+ };
8661
+ };
8662
+ };
8663
+ responses: {
8664
+ /** @description Overrides saved */
8665
+ 200: {
8666
+ headers: {
8667
+ [name: string]: unknown;
8668
+ };
8669
+ content: {
8670
+ "application/json": {
8671
+ overrides: components["schemas"]["RepoEligibilityOverridesDto"];
8672
+ effective: components["schemas"]["RepoEligibilityConfigDto"];
8673
+ };
8674
+ };
8675
+ };
8676
+ /** @description Invalid request body */
8677
+ 400: {
8678
+ headers: {
8679
+ [name: string]: unknown;
8680
+ };
8681
+ content: {
8682
+ "application/json": components["schemas"]["ErrorMessageDto"];
8683
+ };
8684
+ };
8685
+ 401: components["responses"]["Unauthorized"];
8686
+ /** @description Forbidden, or a workspace-admin value exceeds a platform limit (`repo_eligibility_bound_exceeded`) */
8687
+ 403: {
8688
+ headers: {
8689
+ [name: string]: unknown;
8690
+ };
8691
+ content: {
8692
+ "application/json": components["schemas"]["ErrorMessageDto"];
8693
+ };
8694
+ };
8695
+ };
8696
+ };
8697
+ refreshWorkspaceRepoLanguages: {
8698
+ parameters: {
8699
+ query?: never;
8700
+ header?: never;
8701
+ path: {
8702
+ workspaceId: components["parameters"]["WorkspaceId"];
8703
+ };
8704
+ cookie?: never;
8705
+ };
8706
+ requestBody?: {
8707
+ content: {
8708
+ "application/json": {
8709
+ /** @description Optional `owner/name` to scope the refresh to a single repo. Omit to reset all repos. */
8710
+ repoSlug?: string;
8711
+ };
8712
+ };
8713
+ };
8714
+ responses: {
8715
+ /** @description Freshness invalidated; languages will be re-detected on the next sync. */
8716
+ 200: {
8717
+ headers: {
8718
+ [name: string]: unknown;
8719
+ };
8720
+ content: {
8721
+ "application/json": {
8722
+ ok: boolean;
8723
+ /** @description Number of repo rows whose language/stack cache was invalidated. */
8724
+ reposReset: number;
8725
+ };
8726
+ };
8727
+ };
8728
+ /** @description Invalid request body */
8729
+ 400: {
8730
+ headers: {
8731
+ [name: string]: unknown;
8732
+ };
8733
+ content: {
8734
+ "application/json": components["schemas"]["ErrorMessageDto"];
8735
+ };
8736
+ };
8737
+ 401: components["responses"]["Unauthorized"];
8738
+ 403: components["responses"]["Forbidden"];
8739
+ };
8740
+ };
8288
8741
  getCursorKeyUsage: {
8289
8742
  parameters: {
8290
8743
  query?: never;
@@ -8542,7 +8995,7 @@ export interface operations {
8542
8995
  };
8543
8996
  requestBody?: never;
8544
8997
  responses: {
8545
- /** @description Progress (empty completedSteps when no row exists yet; updatedAt is synthetic in that case) */
8998
+ /** @description Progress (empty completedStepIds when no row exists yet; updatedAt is synthetic in that case) */
8546
8999
  200: {
8547
9000
  headers: {
8548
9001
  [name: string]: unknown;