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

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.
@@ -1194,7 +1194,7 @@ export interface paths {
1194
1194
  };
1195
1195
  /**
1196
1196
  * 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`).
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 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
1198
  */
1199
1199
  get: operations["listWorkspaceActivity"];
1200
1200
  put?: never;
@@ -1205,6 +1205,26 @@ export interface paths {
1205
1205
  patch?: never;
1206
1206
  trace?: never;
1207
1207
  };
1208
+ "/workspaces/{workspaceId}/activity/export": {
1209
+ parameters: {
1210
+ query?: never;
1211
+ header?: never;
1212
+ path?: never;
1213
+ cookie?: never;
1214
+ };
1215
+ /**
1216
+ * Export workspace activity log as CSV
1217
+ * @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.
1218
+ */
1219
+ get: operations["exportWorkspaceActivity"];
1220
+ put?: never;
1221
+ post?: never;
1222
+ delete?: never;
1223
+ options?: never;
1224
+ head?: never;
1225
+ patch?: never;
1226
+ trace?: never;
1227
+ };
1208
1228
  "/workspaces/{workspaceId}/readiness/score-history": {
1209
1229
  parameters: {
1210
1230
  query?: never;
@@ -1549,6 +1569,50 @@ export interface paths {
1549
1569
  patch?: never;
1550
1570
  trace?: never;
1551
1571
  };
1572
+ "/workspaces/{workspaceId}/repo-eligibility": {
1573
+ parameters: {
1574
+ query?: never;
1575
+ header?: never;
1576
+ path?: never;
1577
+ cookie?: never;
1578
+ };
1579
+ /**
1580
+ * Get repo-sync eligibility gate (defaults + per-workspace overrides)
1581
+ * @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.
1582
+ */
1583
+ get: operations["getWorkspaceRepoEligibility"];
1584
+ /**
1585
+ * Set per-workspace repo-sync eligibility overrides
1586
+ * @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.
1587
+ */
1588
+ put: operations["putWorkspaceRepoEligibility"];
1589
+ post?: never;
1590
+ delete?: never;
1591
+ options?: never;
1592
+ head?: never;
1593
+ patch?: never;
1594
+ trace?: never;
1595
+ };
1596
+ "/workspaces/{workspaceId}/repo-eligibility/refresh-languages": {
1597
+ parameters: {
1598
+ query?: never;
1599
+ header?: never;
1600
+ path?: never;
1601
+ cookie?: never;
1602
+ };
1603
+ get?: never;
1604
+ put?: never;
1605
+ /**
1606
+ * Force a language/stack re-detection on the next sync
1607
+ * @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.
1608
+ */
1609
+ post: operations["refreshWorkspaceRepoLanguages"];
1610
+ delete?: never;
1611
+ options?: never;
1612
+ head?: never;
1613
+ patch?: never;
1614
+ trace?: never;
1615
+ };
1552
1616
  "/workspaces/{workspaceId}/readiness/cursor-key-usage": {
1553
1617
  parameters: {
1554
1618
  query?: never;
@@ -2309,12 +2373,7 @@ export interface components {
2309
2373
  /** @description Short label for the week column (MM/DD), aligned with Measure charts. */
2310
2374
  weekLabel?: string;
2311
2375
  mergedPrCount: number;
2312
- /** @description DORA change failure rate (deployments/incidents), not CI build failures. */
2313
2376
  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
2377
  /** @description Mean hours from PR creation to first review in this week bucket. */
2319
2378
  avgReviewWaitHours?: number;
2320
2379
  /** @description Mean hours from first review to first approval in this week bucket. */
@@ -2347,8 +2406,6 @@ export interface components {
2347
2406
  scope: components["schemas"]["ProductivityInsightsAggregatedTeamsScopeDto"];
2348
2407
  /** Format: date-time */
2349
2408
  generatedAt: string;
2350
- /** @description True when the workspace has opted in to GitHub Actions CI ingest. */
2351
- githubActionsCiEnabled?: boolean;
2352
2409
  teams: components["schemas"]["ProductivityInsightsAggregatedTeamRowDto"][];
2353
2410
  };
2354
2411
  ProductivityInsightsMergedPrTrendWeekDto: {
@@ -2393,16 +2450,11 @@ export interface components {
2393
2450
  periodAvgMergedPrs: number;
2394
2451
  /** @description Average change failure rate over the range when available. */
2395
2452
  avgFailRatePercent?: number;
2396
- /** @description Average GitHub Actions CI build failure rate over the range when CI ingest is enabled. */
2397
- avgCiFailRatePercent?: number;
2398
2453
  };
2399
2454
  ProductivityInsightsTeamSummaryDto: {
2400
2455
  totalMergedPrs: number;
2401
2456
  avgMergedPrsPerWeek: number;
2402
- /** @description Average DORA change failure rate over the range when available. */
2403
2457
  avgFailRatePercent: number;
2404
- /** @description Average GitHub Actions CI build failure rate over the range when CI ingest is enabled. */
2405
- avgCiFailRatePercent?: number;
2406
2458
  headcount: number;
2407
2459
  };
2408
2460
  ProductivityInsightsTeamDetailDto: {
@@ -2429,8 +2481,6 @@ export interface components {
2429
2481
  scope: components["schemas"]["ProductivityInsightsAggregatedTeamsScopeDto"];
2430
2482
  /** Format: date-time */
2431
2483
  generatedAt: string;
2432
- /** @description True when the workspace has opted in to GitHub Actions CI ingest. */
2433
- githubActionsCiEnabled?: boolean;
2434
2484
  /** @description Present when `teamId` query is omitted — top-ranked teams. */
2435
2485
  items?: components["schemas"]["ProductivityInsightsTeamLeaderItemDto"][];
2436
2486
  /** @description Present when `teamId` query is set — single-team drilldown. */
@@ -2478,16 +2528,11 @@ export interface components {
2478
2528
  totalMergedPrs: number;
2479
2529
  avgMergedPrsPerWeek: number;
2480
2530
  totalAbsenceDays: number;
2481
- /** @description Average DORA change failure rate over the range when available. */
2482
2531
  avgFailRate: number;
2483
- /** @description Average GitHub Actions CI build failure rate over the range when CI ingest is enabled. */
2484
- avgCiFailRate?: number;
2485
2532
  mergedPrDelta: number;
2486
2533
  avgMergedPrsPerWeekDelta: number;
2487
2534
  totalAbsenceDaysDelta: number;
2488
2535
  avgFailRateDelta: number;
2489
- /** @description Change in average CI build failure rate vs the prior comparison window. */
2490
- avgCiFailRateDelta?: number;
2491
2536
  };
2492
2537
  ProductivityInsightsContributorDetailDto: {
2493
2538
  /** Format: uuid */
@@ -2499,8 +2544,6 @@ export interface components {
2499
2544
  scope: components["schemas"]["ProductivityInsightsAggregatedTeamsScopeDto"];
2500
2545
  /** Format: date-time */
2501
2546
  generatedAt: string;
2502
- /** @description True when the workspace has opted in to GitHub Actions CI ingest. */
2503
- githubActionsCiEnabled?: boolean;
2504
2547
  contributor: components["schemas"]["ProductivityInsightsContributorProfileDto"];
2505
2548
  weeks: components["schemas"]["ProductivityInsightsContributorActivityWeekDto"][];
2506
2549
  summary: components["schemas"]["ProductivityInsightsContributorActivitySummaryDto"];
@@ -2519,8 +2562,6 @@ export interface components {
2519
2562
  periodAvgMergedPrs: number;
2520
2563
  /** @description Mean weekly change-failure rate when available. */
2521
2564
  avgFailRatePercent?: number;
2522
- /** @description Mean weekly GitHub Actions CI build failure rate when CI ingest is enabled. */
2523
- avgCiFailRatePercent?: number;
2524
2565
  };
2525
2566
  ProductivityInsightsNeedsAttentionDto: {
2526
2567
  /** Format: uuid */
@@ -2531,8 +2572,6 @@ export interface components {
2531
2572
  entityType: "teams" | "contributors";
2532
2573
  /** Format: date-time */
2533
2574
  generatedAt: string;
2534
- /** @description True when GitHub Actions CI ingest is enabled for this workspace. */
2535
- githubActionsCiEnabled?: boolean;
2536
2575
  items: components["schemas"]["ProductivityInsightsNeedsAttentionItemDto"][];
2537
2576
  };
2538
2577
  AiUsageSpendAggregatedTeamWeekDto: {
@@ -2801,6 +2840,83 @@ export interface components {
2801
2840
  * @description Last push or metadata update from GitHub when available.
2802
2841
  */
2803
2842
  updatedAt?: string | null;
2843
+ /** @description True when the repository is archived (read-only on GitHub). */
2844
+ archived?: boolean | null;
2845
+ /** @description True when the repository is a fork of another repository. */
2846
+ fork?: boolean | null;
2847
+ /** @description True when the repository is disabled on GitHub. */
2848
+ disabled?: boolean | null;
2849
+ /** @description Repository size in KB as reported by GitHub. */
2850
+ size?: number | null;
2851
+ /** @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. */
2852
+ ineligibleReasons?: string[] | null;
2853
+ /** @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. */
2854
+ warnings?: string[] | null;
2855
+ /**
2856
+ * @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.
2857
+ * @enum {string|null}
2858
+ */
2859
+ eligibilityStatus?: "eligible" | "ineligible" | null;
2860
+ /** @description Human-readable explanation when `eligibilityStatus` is `ineligible` (e.g. "This repo is archived"). For advisory language/fork notices see `warnings`, not this field. */
2861
+ eligibilityReason?: string | null;
2862
+ /** @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. */
2863
+ primaryStack?: string | null;
2864
+ /** @description Second supported stack for a multi-stack repo, or null. */
2865
+ secondaryStack?: string | null;
2866
+ /** @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. */
2867
+ supportedStacks?: string[] | null;
2868
+ /** @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. */
2869
+ languageBreakdown?: {
2870
+ /** @description GitHub language name (e.g. "TypeScript", "Go"). */
2871
+ language: string;
2872
+ /**
2873
+ * Format: float
2874
+ * @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.
2875
+ */
2876
+ percent: number;
2877
+ /** @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. */
2878
+ supported: boolean;
2879
+ /** @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. */
2880
+ stack?: string | null;
2881
+ }[] | null;
2882
+ };
2883
+ /** @description Resolved repo-sync eligibility gate (defaults or effective). All fields present. */
2884
+ RepoEligibilityConfigDto: {
2885
+ /** @description Skip archived repos during GitHub repo sync. */
2886
+ excludeArchived: boolean;
2887
+ /** @description Skip forked repos. Forks are included by default. */
2888
+ excludeForks: boolean;
2889
+ /** @description Max repo size in KB (GitHub-reported). 0 = no limit. */
2890
+ maxRepoSizeKb: number;
2891
+ /** @description Max repos materialized per workspace per sync. 0 = no limit. */
2892
+ maxReposPerWorkspace: number;
2893
+ };
2894
+ /** @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. */
2895
+ RepoEligibilityOverridesDto: {
2896
+ excludeArchived?: boolean | null;
2897
+ excludeForks?: boolean | null;
2898
+ maxRepoSizeKb?: number | null;
2899
+ maxReposPerWorkspace?: number | null;
2900
+ };
2901
+ WorkspaceRepoEligibilityDto: {
2902
+ defaults: components["schemas"]["RepoEligibilityConfigDto"];
2903
+ overrides: components["schemas"]["RepoEligibilityOverridesDto"];
2904
+ effective: components["schemas"]["RepoEligibilityConfigDto"];
2905
+ /** @description True when the caller is a platform admin (may set any value, incl. raising caps). */
2906
+ canEditUnrestricted: boolean;
2907
+ };
2908
+ /** @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`). */
2909
+ RepoEligibilityLimitsDto: {
2910
+ /** @description Per-repo size cap in KB (GitHub-reported). 0 = no limit. */
2911
+ maxRepoSizeKb: number;
2912
+ /** @description Max repos that can be eligible per workspace. 0 = no limit. */
2913
+ maxReposPerWorkspace: number;
2914
+ /** @description Whether archived repos are treated as a hard block. */
2915
+ excludeArchived: boolean;
2916
+ /** @description Whether forked repos are excluded by the sync gate (forks are a warning, not a block). */
2917
+ excludeForks: boolean;
2918
+ /** @description Repos currently counting as eligible (eligibilityStatus != "ineligible"), i.e. those that count toward `maxReposPerWorkspace`. */
2919
+ eligibleRepoCount: number;
2804
2920
  };
2805
2921
  GithubMissingPermissionDto: {
2806
2922
  /** @description GitHub App permission key (e.g. contents, pull_requests). */
@@ -2889,6 +3005,8 @@ export interface components {
2889
3005
  account?: components["schemas"]["GithubAccountDto"] | null;
2890
3006
  /** @description Paginated merged installation repositories when `installed` is true. */
2891
3007
  repos?: components["schemas"]["GithubInstalledRepoListDto"] | null;
3008
+ /** @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. */
3009
+ eligibilityLimits?: components["schemas"]["RepoEligibilityLimitsDto"] | null;
2892
3010
  /**
2893
3011
  * Format: uri
2894
3012
  * @description User accounts: github.com/settings/installations/<id>. Organizations: github.com/organizations/<login>/settings/installations/<id>.
@@ -3199,7 +3317,7 @@ export interface components {
3199
3317
  scorePercent?: number;
3200
3318
  /** @description Per-criterion status counts from the latest successful scan */
3201
3319
  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. */
3320
+ /** @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
3321
  criteriaDetails: components["schemas"]["CriterionDetailDto"][];
3204
3322
  issues: components["schemas"]["ReadinessIssueDto"][];
3205
3323
  };
@@ -3293,6 +3411,34 @@ export interface components {
3293
3411
  * @enum {string|null}
3294
3412
  */
3295
3413
  archivedReason?: "github_removed" | "installation_disconnected" | "installation_replaced" | "superseded" | null;
3414
+ /**
3415
+ * @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.
3416
+ * @enum {string|null}
3417
+ */
3418
+ eligibilityStatus?: "eligible" | "ineligible" | null;
3419
+ /** @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`. */
3420
+ eligibilityReason?: string | null;
3421
+ /** @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. */
3422
+ warnings?: string[] | null;
3423
+ /** @description Dominant supported stack — backend_jvm | ios_app | web_spa | backend_go | backend_python. Null when no supported stack/uncomputed. */
3424
+ primaryStack?: string | null;
3425
+ /** @description Second supported stack for a multi-stack repo, or null. */
3426
+ secondaryStack?: string | null;
3427
+ /** @description All supported stacks detected (ordered, primary first). Empty/null when none. */
3428
+ supportedStacks?: string[] | null;
3429
+ /** @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. */
3430
+ languageBreakdown?: {
3431
+ language: string;
3432
+ /**
3433
+ * Format: float
3434
+ * @description Share of total language bytes, rounded to four decimal places (e.g. 64.2153).
3435
+ */
3436
+ percent: number;
3437
+ supported: boolean;
3438
+ stack?: string | null;
3439
+ }[] | null;
3440
+ /** @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. */
3441
+ sizeKb?: number | null;
3296
3442
  };
3297
3443
  /** @description Single-repo detail response. Identical to RepoReadinessScoreDto except dimensions use DimensionScoreDetailDto (criteriaDetails required per dimension). */
3298
3444
  RepoReadinessScoreDetailDto: {
@@ -3320,6 +3466,30 @@ export interface components {
3320
3466
  archivedAt?: string | null;
3321
3467
  /** @enum {string|null} */
3322
3468
  archivedReason?: "github_removed" | "installation_disconnected" | "installation_replaced" | "superseded" | null;
3469
+ /**
3470
+ * @description See RepoReadinessScoreDto.eligibilityStatus. Language support is advisory (#729) and surfaced via `warnings`.
3471
+ * @enum {string|null}
3472
+ */
3473
+ eligibilityStatus?: "eligible" | "ineligible" | null;
3474
+ eligibilityReason?: string | null;
3475
+ /** @description Non-blocking advisories (no v1-supported stack, hard-limit run outcomes). See RepoReadinessScoreDto.warnings. */
3476
+ warnings?: string[] | null;
3477
+ primaryStack?: string | null;
3478
+ secondaryStack?: string | null;
3479
+ supportedStacks?: string[] | null;
3480
+ /** @description Per-language share with `supported`/`stack` tags. See RepoReadinessScoreDto.languageBreakdown. */
3481
+ languageBreakdown?: {
3482
+ language: string;
3483
+ /**
3484
+ * Format: float
3485
+ * @description Share of total language bytes, rounded to four decimal places (e.g. 64.2153).
3486
+ */
3487
+ percent: number;
3488
+ supported: boolean;
3489
+ stack?: string | null;
3490
+ }[] | null;
3491
+ /** @description GitHub-reported repository size in KB, refreshed on each scan. See RepoReadinessScoreDto.sizeKb. */
3492
+ sizeKb?: number | null;
3323
3493
  };
3324
3494
  AgenticFoundationDashboardSummaryDto: {
3325
3495
  repoCount: number;
@@ -3344,8 +3514,20 @@ export interface components {
3344
3514
  limit: number;
3345
3515
  offset: number;
3346
3516
  };
3517
+ /** @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`. */
3518
+ ReadinessEligibilityLimitsDto: {
3519
+ /** @description Per-repo GitHub size cap in KB (includes git history). 0 = no limit. */
3520
+ maxRepoSizeKb: number;
3521
+ /** @description Max total lines of code (cloc) before a scan is skipped. 0 = no limit. */
3522
+ maxLinesOfCode: number;
3523
+ /** @description Max source file count (cloc) before a scan is skipped. 0 = no limit. */
3524
+ maxFileCount: number;
3525
+ /** @description Max repos that can be eligible per workspace. 0 = no limit. */
3526
+ maxReposPerWorkspace: number;
3527
+ };
3347
3528
  ReadinessRepoListDto: components["schemas"]["PageMetaDto"] & {
3348
3529
  items: components["schemas"]["RepoReadinessScoreDto"][];
3530
+ eligibilityLimits?: components["schemas"]["ReadinessEligibilityLimitsDto"];
3349
3531
  };
3350
3532
  /** @description Paginated list of repo readiness scores where each dimension includes criteriaDetails. Used by dimension-slice endpoints (agentic-foundation pillars). */
3351
3533
  ReadinessRepoDetailListDto: components["schemas"]["PageMetaDto"] & {
@@ -3782,7 +3964,7 @@ export interface components {
3782
3964
  * @description Type of workspace lifecycle event.
3783
3965
  * @enum {string}
3784
3966
  */
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";
3967
+ 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
3968
  ActivityLogActorDto: {
3787
3969
  /** Format: uuid */
3788
3970
  userId: string;
@@ -4153,6 +4335,10 @@ export type CreateWorkspaceBodyDto = components['schemas']['CreateWorkspaceBodyD
4153
4335
  export type CompanyProfileDto = components['schemas']['CompanyProfileDto'];
4154
4336
  export type GithubAccountDto = components['schemas']['GithubAccountDto'];
4155
4337
  export type GithubInstalledRepoDto = components['schemas']['GithubInstalledRepoDto'];
4338
+ export type RepoEligibilityConfigDto = components['schemas']['RepoEligibilityConfigDto'];
4339
+ export type RepoEligibilityOverridesDto = components['schemas']['RepoEligibilityOverridesDto'];
4340
+ export type WorkspaceRepoEligibilityDto = components['schemas']['WorkspaceRepoEligibilityDto'];
4341
+ export type RepoEligibilityLimitsDto = components['schemas']['RepoEligibilityLimitsDto'];
4156
4342
  export type GithubMissingPermissionDto = components['schemas']['GithubMissingPermissionDto'];
4157
4343
  export type GithubInstallationSummaryDto = components['schemas']['GithubInstallationSummaryDto'];
4158
4344
  export type GithubPendingApprovalDto = components['schemas']['GithubPendingApprovalDto'];
@@ -4205,6 +4391,7 @@ export type RepoReadinessScoreDto = components['schemas']['RepoReadinessScoreDto
4205
4391
  export type RepoReadinessScoreDetailDto = components['schemas']['RepoReadinessScoreDetailDto'];
4206
4392
  export type AgenticFoundationDashboardSummaryDto = components['schemas']['AgenticFoundationDashboardSummaryDto'];
4207
4393
  export type PageMetaDto = components['schemas']['PageMetaDto'];
4394
+ export type ReadinessEligibilityLimitsDto = components['schemas']['ReadinessEligibilityLimitsDto'];
4208
4395
  export type ReadinessRepoListDto = components['schemas']['ReadinessRepoListDto'];
4209
4396
  export type ReadinessRepoDetailListDto = components['schemas']['ReadinessRepoDetailListDto'];
4210
4397
  export type ReadinessFixListDto = components['schemas']['ReadinessFixListDto'];
@@ -7342,6 +7529,10 @@ export interface operations {
7342
7529
  offset?: components["parameters"]["PaginationOffset"];
7343
7530
  /** @description Sort direction. */
7344
7531
  order?: components["parameters"]["PaginationOrder"];
7532
+ /** @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. */
7533
+ sort?: "when" | "who" | "what" | "why" | "where";
7534
+ /** @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. */
7535
+ productArea?: "integration" | "agentic_foundation" | "workspace_team" | "productivity" | "all";
7345
7536
  /** @description Filter to a specific event type. */
7346
7537
  eventType?: components["schemas"]["ActivityLogEventTypeDto"];
7347
7538
  /** @description Filter to events performed by a specific user (UUID). */
@@ -7352,6 +7543,8 @@ export interface operations {
7352
7543
  until?: string;
7353
7544
  /** @description Filter by event namespace prefix (e.g. "fix", "repo", "integration", "readiness", "config", "member"). */
7354
7545
  eventCategory?: string;
7546
+ /** @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). */
7547
+ eventSubcategory?: string;
7355
7548
  /** @description Case-insensitive substring filter applied across repo name, integration type, actor email, and actor display name. */
7356
7549
  search?: string;
7357
7550
  };
@@ -7394,6 +7587,61 @@ export interface operations {
7394
7587
  };
7395
7588
  };
7396
7589
  };
7590
+ exportWorkspaceActivity: {
7591
+ parameters: {
7592
+ query?: {
7593
+ sort?: "when" | "who" | "what" | "why" | "where";
7594
+ /** @description Sort direction. */
7595
+ order?: components["parameters"]["PaginationOrder"];
7596
+ productArea?: "integration" | "agentic_foundation" | "workspace_team" | "productivity" | "all";
7597
+ eventType?: components["schemas"]["ActivityLogEventTypeDto"];
7598
+ eventCategory?: string;
7599
+ /** @description Dotted event-type subgroup prefix (see the activity list endpoint). */
7600
+ eventSubcategory?: string;
7601
+ actorUserId?: string;
7602
+ since?: string;
7603
+ until?: string;
7604
+ search?: string;
7605
+ };
7606
+ header?: never;
7607
+ path: {
7608
+ workspaceId: components["parameters"]["WorkspaceId"];
7609
+ };
7610
+ cookie?: never;
7611
+ };
7612
+ requestBody?: never;
7613
+ responses: {
7614
+ /** @description CSV file of activity log entries */
7615
+ 200: {
7616
+ headers: {
7617
+ [name: string]: unknown;
7618
+ };
7619
+ content: {
7620
+ "text/csv": string;
7621
+ };
7622
+ };
7623
+ /** @description Invalid query parameters */
7624
+ 400: {
7625
+ headers: {
7626
+ [name: string]: unknown;
7627
+ };
7628
+ content: {
7629
+ "application/json": components["schemas"]["ErrorMessageDto"];
7630
+ };
7631
+ };
7632
+ 401: components["responses"]["Unauthorized"];
7633
+ 403: components["responses"]["Forbidden"];
7634
+ /** @description Workspace does not exist */
7635
+ 404: {
7636
+ headers: {
7637
+ [name: string]: unknown;
7638
+ };
7639
+ content: {
7640
+ "application/json": components["schemas"]["ErrorMessageDto"];
7641
+ };
7642
+ };
7643
+ };
7644
+ };
7397
7645
  getReadinessScoreHistory: {
7398
7646
  parameters: {
7399
7647
  query?: {
@@ -8285,6 +8533,124 @@ export interface operations {
8285
8533
  403: components["responses"]["Forbidden"];
8286
8534
  };
8287
8535
  };
8536
+ getWorkspaceRepoEligibility: {
8537
+ parameters: {
8538
+ query?: never;
8539
+ header?: never;
8540
+ path: {
8541
+ workspaceId: components["parameters"]["WorkspaceId"];
8542
+ };
8543
+ cookie?: never;
8544
+ };
8545
+ requestBody?: never;
8546
+ responses: {
8547
+ /** @description Effective repo-eligibility configuration */
8548
+ 200: {
8549
+ headers: {
8550
+ [name: string]: unknown;
8551
+ };
8552
+ content: {
8553
+ "application/json": components["schemas"]["WorkspaceRepoEligibilityDto"];
8554
+ };
8555
+ };
8556
+ 401: components["responses"]["Unauthorized"];
8557
+ 403: components["responses"]["Forbidden"];
8558
+ };
8559
+ };
8560
+ putWorkspaceRepoEligibility: {
8561
+ parameters: {
8562
+ query?: never;
8563
+ header?: never;
8564
+ path: {
8565
+ workspaceId: components["parameters"]["WorkspaceId"];
8566
+ };
8567
+ cookie?: never;
8568
+ };
8569
+ requestBody: {
8570
+ content: {
8571
+ "application/json": {
8572
+ overrides: components["schemas"]["RepoEligibilityOverridesDto"];
8573
+ };
8574
+ };
8575
+ };
8576
+ responses: {
8577
+ /** @description Overrides saved */
8578
+ 200: {
8579
+ headers: {
8580
+ [name: string]: unknown;
8581
+ };
8582
+ content: {
8583
+ "application/json": {
8584
+ overrides: components["schemas"]["RepoEligibilityOverridesDto"];
8585
+ effective: components["schemas"]["RepoEligibilityConfigDto"];
8586
+ };
8587
+ };
8588
+ };
8589
+ /** @description Invalid request body */
8590
+ 400: {
8591
+ headers: {
8592
+ [name: string]: unknown;
8593
+ };
8594
+ content: {
8595
+ "application/json": components["schemas"]["ErrorMessageDto"];
8596
+ };
8597
+ };
8598
+ 401: components["responses"]["Unauthorized"];
8599
+ /** @description Forbidden, or a workspace-admin value exceeds a platform limit (`repo_eligibility_bound_exceeded`) */
8600
+ 403: {
8601
+ headers: {
8602
+ [name: string]: unknown;
8603
+ };
8604
+ content: {
8605
+ "application/json": components["schemas"]["ErrorMessageDto"];
8606
+ };
8607
+ };
8608
+ };
8609
+ };
8610
+ refreshWorkspaceRepoLanguages: {
8611
+ parameters: {
8612
+ query?: never;
8613
+ header?: never;
8614
+ path: {
8615
+ workspaceId: components["parameters"]["WorkspaceId"];
8616
+ };
8617
+ cookie?: never;
8618
+ };
8619
+ requestBody?: {
8620
+ content: {
8621
+ "application/json": {
8622
+ /** @description Optional `owner/name` to scope the refresh to a single repo. Omit to reset all repos. */
8623
+ repoSlug?: string;
8624
+ };
8625
+ };
8626
+ };
8627
+ responses: {
8628
+ /** @description Freshness invalidated; languages will be re-detected on the next sync. */
8629
+ 200: {
8630
+ headers: {
8631
+ [name: string]: unknown;
8632
+ };
8633
+ content: {
8634
+ "application/json": {
8635
+ ok: boolean;
8636
+ /** @description Number of repo rows whose language/stack cache was invalidated. */
8637
+ reposReset: number;
8638
+ };
8639
+ };
8640
+ };
8641
+ /** @description Invalid request body */
8642
+ 400: {
8643
+ headers: {
8644
+ [name: string]: unknown;
8645
+ };
8646
+ content: {
8647
+ "application/json": components["schemas"]["ErrorMessageDto"];
8648
+ };
8649
+ };
8650
+ 401: components["responses"]["Unauthorized"];
8651
+ 403: components["responses"]["Forbidden"];
8652
+ };
8653
+ };
8288
8654
  getCursorKeyUsage: {
8289
8655
  parameters: {
8290
8656
  query?: never;