@thinkai/tai-api-contract 2.6.0 → 2.7.1

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.
@@ -1,7 +1,7 @@
1
1
  openapi: 3.0.3
2
2
  info:
3
3
  title: ThinkAI API
4
- version: 2.6.0
4
+ version: 2.7.1
5
5
  description: >
6
6
  Contract surface for the AI Driven SDLC backend used by ThinkAI.
7
7
  Workspace-scoped routes use `/workspaces/{workspaceId}/...`.
@@ -52,8 +52,69 @@ tags:
52
52
  description: Agentic Foundation pillars (epic #278); reads stored repository readiness snapshots
53
53
  - name: YourAiJourney
54
54
  description: Your AI Journey dashboard aggregators (epic #267); composes readiness, metrics, and AI-spend data for the /dashboard page
55
+ - name: PlatformAdmin
56
+ description: Platform-admin operations restricted to PLATFORM_ADMIN_EMAILS. Callers must present a valid JWT from an email on that allowlist; all other callers receive 403.
55
57
 
56
58
  paths:
59
+ /admin/users/{userId}:
60
+ delete:
61
+ tags: [PlatformAdmin]
62
+ summary: Delete user and all workspace data
63
+ operationId: adminDeleteUser
64
+ description: >
65
+ Hard-deletes a user account and all data they own in a single atomic transaction:
66
+ owned workspaces (and all workspace-level child tables via CASCADE), membership rows in
67
+ other workspaces, invitations where the user is `invited_by`, and the user row itself.
68
+ After the DB commit, removes the corresponding Supabase Auth user via the service-role key;
69
+ Auth deletion failure is logged but does not roll back the DB changes.
70
+
71
+ **Authorization:** Bearer JWT required. Caller email must appear in `PLATFORM_ADMIN_EMAILS`
72
+ (comma-separated env var). All other callers receive `403 Forbidden`.
73
+ parameters:
74
+ - name: userId
75
+ in: path
76
+ required: true
77
+ schema:
78
+ type: string
79
+ format: uuid
80
+ description: "`tai_users.id` of the account to delete."
81
+ responses:
82
+ "204":
83
+ description: User and all workspace data deleted.
84
+ "400":
85
+ description: Invalid UUID format.
86
+ content:
87
+ application/json:
88
+ schema:
89
+ $ref: "#/components/schemas/ErrorMessageDto"
90
+ example:
91
+ error: Invalid user ID format
92
+ code: invalid_user_id
93
+ "401":
94
+ description: Missing or invalid JWT.
95
+ content:
96
+ application/json:
97
+ schema:
98
+ $ref: "#/components/schemas/ErrorMessageDto"
99
+ "403":
100
+ description: Caller is not a platform admin.
101
+ content:
102
+ application/json:
103
+ schema:
104
+ $ref: "#/components/schemas/ErrorMessageDto"
105
+ example:
106
+ error: Forbidden
107
+ code: forbidden
108
+ "404":
109
+ description: User not found.
110
+ content:
111
+ application/json:
112
+ schema:
113
+ $ref: "#/components/schemas/ErrorMessageDto"
114
+ example:
115
+ error: User not found
116
+ code: user_not_found
117
+
57
118
  /me:
58
119
  get:
59
120
  tags: [Me]
@@ -1505,6 +1566,10 @@ paths:
1505
1566
  schema:
1506
1567
  type: boolean
1507
1568
  default: false
1569
+ - $ref: "#/components/parameters/GithubRepoLimit"
1570
+ - $ref: "#/components/parameters/GithubRepoOffset"
1571
+ - $ref: "#/components/parameters/GithubRepoSort"
1572
+ - $ref: "#/components/parameters/GithubRepoOrder"
1508
1573
  responses:
1509
1574
  "200":
1510
1575
  description: Installation status
@@ -2122,19 +2187,33 @@ paths:
2122
2187
  /workspaces/{workspaceId}/readiness/repos:
2123
2188
  get:
2124
2189
  tags: [RepositoryReadiness]
2125
- summary: List repo readiness scores
2190
+ summary: List repo readiness scores (paginated)
2126
2191
  operationId: listReadinessRepos
2192
+ description: >
2193
+ Returns a page of repository readiness scorecards. Use `GET .../readiness/repos/{repoId}`
2194
+ for a single repo. Summary aggregates on the Agentic Foundation dashboard use separate
2195
+ aggregate queries over the full workspace (#403).
2127
2196
  parameters:
2128
2197
  - $ref: "#/components/parameters/WorkspaceId"
2198
+ - $ref: "#/components/parameters/PaginationLimit"
2199
+ - $ref: "#/components/parameters/PaginationOffset"
2200
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2201
+ - $ref: "#/components/parameters/PaginationOrder"
2202
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2203
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2129
2204
  responses:
2130
2205
  "200":
2131
- description: Repositories analyzed
2206
+ description: Paginated repositories analyzed
2132
2207
  content:
2133
2208
  application/json:
2134
2209
  schema:
2135
- type: array
2136
- items:
2137
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2210
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2211
+ "400":
2212
+ description: Invalid pagination or sort query
2213
+ content:
2214
+ application/json:
2215
+ schema:
2216
+ $ref: "#/components/schemas/ErrorMessageDto"
2138
2217
  "401":
2139
2218
  $ref: "#/components/responses/Unauthorized"
2140
2219
  "403":
@@ -2269,18 +2348,19 @@ paths:
2269
2348
  /workspaces/{workspaceId}/agentic-foundation/dashboard:
2270
2349
  get:
2271
2350
  tags: [AgenticFoundation]
2272
- summary: Agentic Foundation dashboard
2351
+ summary: Agentic Foundation dashboard summary
2273
2352
  description: >
2274
- Returns stored repository readiness scorecards plus a flattened issue queue for the
2275
- Agentic Foundation dashboard surfaces. This is read-only and does not run scoring on
2276
- the request path (issue #279). Field `generatedAt` is the server timestamp when this JSON
2277
- payload was assembled; it is not the same as per-repo `lastAnalyzed` on `RepoReadinessScoreDto`.
2353
+ Returns workspace-level readiness summary, per-dimension aggregate bars, and fix status
2354
+ counts for Agentic Foundation dashboard surfaces. Repository and issue lists are paginated
2355
+ on `GET .../readiness/repos` and related segment routes (#403). Read-only; does not run
2356
+ scoring on the request path (issue #279). Field `generatedAt` is the server timestamp when
2357
+ this JSON payload was assembled.
2278
2358
  operationId: getAgenticFoundationDashboard
2279
2359
  parameters:
2280
2360
  - $ref: "#/components/parameters/WorkspaceId"
2281
2361
  responses:
2282
2362
  "200":
2283
- description: Dashboard scorecards and issue queue
2363
+ description: Dashboard summary and aggregates
2284
2364
  content:
2285
2365
  application/json:
2286
2366
  schema:
@@ -2296,8 +2376,14 @@ paths:
2296
2376
  averageOverallScore: 0
2297
2377
  issueCount: 0
2298
2378
  criticalIssueCount: 0
2299
- repos: []
2300
- issueQueue: []
2379
+ dimensionAggregates: []
2380
+ fixStatusSummary:
2381
+ queued: 0
2382
+ generating: 0
2383
+ prCreated: 0
2384
+ merged: 0
2385
+ failed: 0
2386
+ total: 0
2301
2387
  "401":
2302
2388
  $ref: "#/components/responses/Unauthorized"
2303
2389
  "403":
@@ -2319,39 +2405,53 @@ paths:
2319
2405
  operationId: getAgenticFoundationAgenticReadiness
2320
2406
  parameters:
2321
2407
  - $ref: "#/components/parameters/WorkspaceId"
2408
+ - $ref: "#/components/parameters/PaginationLimit"
2409
+ - $ref: "#/components/parameters/PaginationOffset"
2410
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2411
+ - $ref: "#/components/parameters/PaginationOrder"
2412
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2413
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2322
2414
  responses:
2323
2415
  "200":
2324
- description: Repositories with ai-agent-readiness slice
2416
+ description: Paginated repositories with ai-agent-readiness slice
2325
2417
  content:
2326
2418
  application/json:
2327
2419
  schema:
2328
- type: array
2329
- items:
2330
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2420
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2331
2421
  examples:
2332
2422
  singleRepoSlice:
2333
2423
  summary: One repo, single pillar dimension
2334
2424
  value:
2335
- - repoId: 00000000-0000-0000-0000-000000000002
2336
- repoName: api-gateway
2337
- language: typescript
2338
- overallScore: 67
2339
- dimensions:
2340
- - dimensionId: ai-agent-readiness
2341
- score: 2
2342
- maxScore: 3
2343
- issues: []
2344
- lastAnalyzed: "2026-05-12T12:00:00.000Z"
2345
- teamId: null
2346
- provider:
2347
- kind: github
2348
- slug: acme/api-gateway
2349
- webUrl: https://github.com/acme/api-gateway
2350
- defaultBranch: main
2351
- externalId: null
2352
- hostBaseUrl: null
2353
- analysisStatus: idle
2354
- activeRunId: null
2425
+ total: 1
2426
+ limit: 25
2427
+ offset: 0
2428
+ items:
2429
+ - repoId: 00000000-0000-0000-0000-000000000002
2430
+ repoName: api-gateway
2431
+ language: typescript
2432
+ overallScore: 67
2433
+ dimensions:
2434
+ - dimensionId: ai-agent-readiness
2435
+ score: 2
2436
+ maxScore: 3
2437
+ issues: []
2438
+ lastAnalyzed: "2026-05-12T12:00:00.000Z"
2439
+ teamId: null
2440
+ provider:
2441
+ kind: github
2442
+ slug: acme/api-gateway
2443
+ webUrl: https://github.com/acme/api-gateway
2444
+ defaultBranch: main
2445
+ externalId: null
2446
+ hostBaseUrl: null
2447
+ analysisStatus: idle
2448
+ activeRunId: null
2449
+ "400":
2450
+ description: Invalid pagination or sort query
2451
+ content:
2452
+ application/json:
2453
+ schema:
2454
+ $ref: "#/components/schemas/ErrorMessageDto"
2355
2455
  "401":
2356
2456
  $ref: "#/components/responses/Unauthorized"
2357
2457
  "403":
@@ -2371,15 +2471,25 @@ paths:
2371
2471
  operationId: getAgenticFoundationRepositoryHealth
2372
2472
  parameters:
2373
2473
  - $ref: "#/components/parameters/WorkspaceId"
2474
+ - $ref: "#/components/parameters/PaginationLimit"
2475
+ - $ref: "#/components/parameters/PaginationOffset"
2476
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2477
+ - $ref: "#/components/parameters/PaginationOrder"
2478
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2479
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2374
2480
  responses:
2375
2481
  "200":
2376
- description: Repositories with repo-hygiene slice
2482
+ description: Paginated repositories with repo-hygiene slice
2377
2483
  content:
2378
2484
  application/json:
2379
2485
  schema:
2380
- type: array
2381
- items:
2382
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2486
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2487
+ "400":
2488
+ description: Invalid pagination or sort query
2489
+ content:
2490
+ application/json:
2491
+ schema:
2492
+ $ref: "#/components/schemas/ErrorMessageDto"
2383
2493
  "401":
2384
2494
  $ref: "#/components/responses/Unauthorized"
2385
2495
  "403":
@@ -2399,15 +2509,25 @@ paths:
2399
2509
  operationId: getAgenticFoundationCodebaseQuality
2400
2510
  parameters:
2401
2511
  - $ref: "#/components/parameters/WorkspaceId"
2512
+ - $ref: "#/components/parameters/PaginationLimit"
2513
+ - $ref: "#/components/parameters/PaginationOffset"
2514
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2515
+ - $ref: "#/components/parameters/PaginationOrder"
2516
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2517
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2402
2518
  responses:
2403
2519
  "200":
2404
- description: Repositories with stack-quality slice
2520
+ description: Paginated repositories with stack-quality slice
2405
2521
  content:
2406
2522
  application/json:
2407
2523
  schema:
2408
- type: array
2409
- items:
2410
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2524
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2525
+ "400":
2526
+ description: Invalid pagination or sort query
2527
+ content:
2528
+ application/json:
2529
+ schema:
2530
+ $ref: "#/components/schemas/ErrorMessageDto"
2411
2531
  "401":
2412
2532
  $ref: "#/components/responses/Unauthorized"
2413
2533
  "403":
@@ -2427,15 +2547,25 @@ paths:
2427
2547
  operationId: getAgenticFoundationTestQa
2428
2548
  parameters:
2429
2549
  - $ref: "#/components/parameters/WorkspaceId"
2550
+ - $ref: "#/components/parameters/PaginationLimit"
2551
+ - $ref: "#/components/parameters/PaginationOffset"
2552
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2553
+ - $ref: "#/components/parameters/PaginationOrder"
2554
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2555
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2430
2556
  responses:
2431
2557
  "200":
2432
- description: Repositories with tests-qa slice
2558
+ description: Paginated repositories with tests-qa slice
2433
2559
  content:
2434
2560
  application/json:
2435
2561
  schema:
2436
- type: array
2437
- items:
2438
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2562
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2563
+ "400":
2564
+ description: Invalid pagination or sort query
2565
+ content:
2566
+ application/json:
2567
+ schema:
2568
+ $ref: "#/components/schemas/ErrorMessageDto"
2439
2569
  "401":
2440
2570
  $ref: "#/components/responses/Unauthorized"
2441
2571
  "403":
@@ -2455,15 +2585,25 @@ paths:
2455
2585
  operationId: getAgenticFoundationObservability
2456
2586
  parameters:
2457
2587
  - $ref: "#/components/parameters/WorkspaceId"
2588
+ - $ref: "#/components/parameters/PaginationLimit"
2589
+ - $ref: "#/components/parameters/PaginationOffset"
2590
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2591
+ - $ref: "#/components/parameters/PaginationOrder"
2592
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2593
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2458
2594
  responses:
2459
2595
  "200":
2460
- description: Repositories with observability slice
2596
+ description: Paginated repositories with observability slice
2461
2597
  content:
2462
2598
  application/json:
2463
2599
  schema:
2464
- type: array
2465
- items:
2466
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2600
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2601
+ "400":
2602
+ description: Invalid pagination or sort query
2603
+ content:
2604
+ application/json:
2605
+ schema:
2606
+ $ref: "#/components/schemas/ErrorMessageDto"
2467
2607
  "401":
2468
2608
  $ref: "#/components/responses/Unauthorized"
2469
2609
  "403":
@@ -2483,15 +2623,25 @@ paths:
2483
2623
  operationId: getAgenticFoundationApiContract
2484
2624
  parameters:
2485
2625
  - $ref: "#/components/parameters/WorkspaceId"
2626
+ - $ref: "#/components/parameters/PaginationLimit"
2627
+ - $ref: "#/components/parameters/PaginationOffset"
2628
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2629
+ - $ref: "#/components/parameters/PaginationOrder"
2630
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2631
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2486
2632
  responses:
2487
2633
  "200":
2488
- description: Repositories with api-contracts slice
2634
+ description: Paginated repositories with api-contracts slice
2489
2635
  content:
2490
2636
  application/json:
2491
2637
  schema:
2492
- type: array
2493
- items:
2494
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2638
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2639
+ "400":
2640
+ description: Invalid pagination or sort query
2641
+ content:
2642
+ application/json:
2643
+ schema:
2644
+ $ref: "#/components/schemas/ErrorMessageDto"
2495
2645
  "401":
2496
2646
  $ref: "#/components/responses/Unauthorized"
2497
2647
  "403":
@@ -2511,15 +2661,25 @@ paths:
2511
2661
  operationId: getAgenticFoundationPlatformGovernance
2512
2662
  parameters:
2513
2663
  - $ref: "#/components/parameters/WorkspaceId"
2664
+ - $ref: "#/components/parameters/PaginationLimit"
2665
+ - $ref: "#/components/parameters/PaginationOffset"
2666
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2667
+ - $ref: "#/components/parameters/PaginationOrder"
2668
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2669
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2514
2670
  responses:
2515
2671
  "200":
2516
- description: Repositories with platform-governance slice
2672
+ description: Paginated repositories with platform-governance slice
2517
2673
  content:
2518
2674
  application/json:
2519
2675
  schema:
2520
- type: array
2521
- items:
2522
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2676
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2677
+ "400":
2678
+ description: Invalid pagination or sort query
2679
+ content:
2680
+ application/json:
2681
+ schema:
2682
+ $ref: "#/components/schemas/ErrorMessageDto"
2523
2683
  "401":
2524
2684
  $ref: "#/components/responses/Unauthorized"
2525
2685
  "403":
@@ -2539,15 +2699,25 @@ paths:
2539
2699
  operationId: getAgenticFoundationDeliveryGovernance
2540
2700
  parameters:
2541
2701
  - $ref: "#/components/parameters/WorkspaceId"
2702
+ - $ref: "#/components/parameters/PaginationLimit"
2703
+ - $ref: "#/components/parameters/PaginationOffset"
2704
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2705
+ - $ref: "#/components/parameters/PaginationOrder"
2706
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2707
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2542
2708
  responses:
2543
2709
  "200":
2544
- description: Repositories with delivery slice
2710
+ description: Paginated repositories with delivery slice
2545
2711
  content:
2546
2712
  application/json:
2547
2713
  schema:
2548
- type: array
2549
- items:
2550
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2714
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2715
+ "400":
2716
+ description: Invalid pagination or sort query
2717
+ content:
2718
+ application/json:
2719
+ schema:
2720
+ $ref: "#/components/schemas/ErrorMessageDto"
2551
2721
  "401":
2552
2722
  $ref: "#/components/responses/Unauthorized"
2553
2723
  "403":
@@ -2569,15 +2739,25 @@ paths:
2569
2739
  operationId: getAgenticFoundationAiResolutionHub
2570
2740
  parameters:
2571
2741
  - $ref: "#/components/parameters/WorkspaceId"
2742
+ - $ref: "#/components/parameters/PaginationLimit"
2743
+ - $ref: "#/components/parameters/PaginationOffset"
2744
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2745
+ - $ref: "#/components/parameters/PaginationOrder"
2746
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2747
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2572
2748
  responses:
2573
2749
  "200":
2574
2750
  description: Full repository readiness scorecards
2575
2751
  content:
2576
2752
  application/json:
2577
2753
  schema:
2578
- type: array
2579
- items:
2580
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2754
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2755
+ "400":
2756
+ description: Invalid pagination or sort query
2757
+ content:
2758
+ application/json:
2759
+ schema:
2760
+ $ref: "#/components/schemas/ErrorMessageDto"
2581
2761
  "401":
2582
2762
  $ref: "#/components/responses/Unauthorized"
2583
2763
  "403":
@@ -2622,21 +2802,32 @@ paths:
2622
2802
  /workspaces/{workspaceId}/readiness/fixes:
2623
2803
  get:
2624
2804
  tags: [RepositoryReadiness]
2625
- summary: List fix requests
2805
+ summary: List fix requests (paginated)
2626
2806
  description: >
2627
- Returns persisted fix-queue rows for the workspace (newest first). Empty array when none exist.
2807
+ Returns a page of persisted fix-queue rows for the workspace (default newest first).
2628
2808
  operationId: listReadinessFixes
2629
2809
  parameters:
2630
2810
  - $ref: "#/components/parameters/WorkspaceId"
2811
+ - $ref: "#/components/parameters/PaginationLimit"
2812
+ - $ref: "#/components/parameters/PaginationOffset"
2813
+ - $ref: "#/components/parameters/ReadinessFixSort"
2814
+ - $ref: "#/components/parameters/PaginationOrder"
2815
+ - $ref: "#/components/parameters/ReadinessFixSearch"
2816
+ - $ref: "#/components/parameters/ReadinessFixStatusFilter"
2817
+ - $ref: "#/components/parameters/ReadinessFixRepoIdFilter"
2631
2818
  responses:
2632
2819
  "200":
2633
- description: Fix queue
2820
+ description: Paginated fix queue
2634
2821
  content:
2635
2822
  application/json:
2636
2823
  schema:
2637
- type: array
2638
- items:
2639
- $ref: "#/components/schemas/FixRequestDto"
2824
+ $ref: "#/components/schemas/ReadinessFixListDto"
2825
+ "400":
2826
+ description: Invalid pagination or sort query
2827
+ content:
2828
+ application/json:
2829
+ schema:
2830
+ $ref: "#/components/schemas/ErrorMessageDto"
2640
2831
  "401":
2641
2832
  $ref: "#/components/responses/Unauthorized"
2642
2833
  "403":
@@ -3391,6 +3582,129 @@ components:
3391
3582
  schema:
3392
3583
  type: string
3393
3584
  default: All departments
3585
+ PaginationLimit:
3586
+ name: limit
3587
+ in: query
3588
+ required: false
3589
+ description: Page size (default 25, max 100).
3590
+ schema:
3591
+ type: integer
3592
+ minimum: 1
3593
+ maximum: 100
3594
+ default: 25
3595
+ PaginationOffset:
3596
+ name: offset
3597
+ in: query
3598
+ required: false
3599
+ description: Zero-based row offset into the filtered, sorted result set.
3600
+ schema:
3601
+ type: integer
3602
+ minimum: 0
3603
+ default: 0
3604
+ PaginationOrder:
3605
+ name: order
3606
+ in: query
3607
+ required: false
3608
+ description: Sort direction.
3609
+ schema:
3610
+ type: string
3611
+ enum: [asc, desc]
3612
+ default: desc
3613
+ ReadinessRepoSort:
3614
+ name: sort
3615
+ in: query
3616
+ required: false
3617
+ description: Allowlisted repository sort field.
3618
+ schema:
3619
+ type: string
3620
+ enum: [repoName, overallScore, lastAnalyzed, language]
3621
+ default: overallScore
3622
+ ReadinessRepoSearch:
3623
+ name: search
3624
+ in: query
3625
+ required: false
3626
+ description: Case-insensitive filter on repository name, language, or provider slug.
3627
+ schema:
3628
+ type: string
3629
+ maxLength: 256
3630
+ ReadinessRepoLanguage:
3631
+ name: language
3632
+ in: query
3633
+ required: false
3634
+ description: Exact language filter (e.g. `typescript`).
3635
+ schema:
3636
+ type: string
3637
+ maxLength: 64
3638
+ ReadinessFixSort:
3639
+ name: sort
3640
+ in: query
3641
+ required: false
3642
+ description: Allowlisted fix-queue sort field.
3643
+ schema:
3644
+ type: string
3645
+ enum: [createdAt, repoName, severity, status]
3646
+ default: createdAt
3647
+ ReadinessFixStatusFilter:
3648
+ name: status
3649
+ in: query
3650
+ required: false
3651
+ description: Filter fixes by workflow status.
3652
+ schema:
3653
+ type: string
3654
+ enum: [queued, generating, pr-created, merged, failed]
3655
+ ReadinessFixRepoIdFilter:
3656
+ name: repoId
3657
+ in: query
3658
+ required: false
3659
+ description: Filter fixes to a single workspace repository id.
3660
+ schema:
3661
+ type: string
3662
+ format: uuid
3663
+ ReadinessFixSearch:
3664
+ name: search
3665
+ in: query
3666
+ required: false
3667
+ description: Case-insensitive filter on repo name, issue title, label, or description.
3668
+ schema:
3669
+ type: string
3670
+ maxLength: 256
3671
+ GithubRepoLimit:
3672
+ name: repoLimit
3673
+ in: query
3674
+ required: false
3675
+ description: Page size for the nested installation repo list (default 25, max 100).
3676
+ schema:
3677
+ type: integer
3678
+ minimum: 1
3679
+ maximum: 100
3680
+ default: 25
3681
+ GithubRepoOffset:
3682
+ name: repoOffset
3683
+ in: query
3684
+ required: false
3685
+ description: Zero-based offset into the merged installation repo list.
3686
+ schema:
3687
+ type: integer
3688
+ minimum: 0
3689
+ default: 0
3690
+ GithubRepoSort:
3691
+ name: repoSort
3692
+ in: query
3693
+ required: false
3694
+ description: Allowlisted GitHub repo sort field.
3695
+ schema:
3696
+ type: string
3697
+ enum: [name, updatedAt]
3698
+ default: name
3699
+ GithubRepoOrder:
3700
+ name: repoOrder
3701
+ in: query
3702
+ required: false
3703
+ description: Sort direction for the nested installation repo list.
3704
+ schema:
3705
+ type: string
3706
+ enum: [asc, desc]
3707
+ default: asc
3394
3708
 
3395
3709
  responses:
3396
3710
  Unauthorized:
@@ -4806,6 +5120,11 @@ components:
4806
5120
  private:
4807
5121
  type: boolean
4808
5122
  nullable: true
5123
+ updatedAt:
5124
+ type: string
5125
+ format: date-time
5126
+ nullable: true
5127
+ description: Last push or metadata update from GitHub when available.
4809
5128
 
4810
5129
  GithubMissingPermissionDto:
4811
5130
  type: object
@@ -4834,9 +5153,9 @@ components:
4834
5153
  allOf:
4835
5154
  - $ref: "#/components/schemas/GithubAccountDto"
4836
5155
  repos:
4837
- type: array
4838
- items:
4839
- $ref: "#/components/schemas/GithubInstalledRepoDto"
5156
+ allOf:
5157
+ - $ref: "#/components/schemas/GithubInstalledRepoListDto"
5158
+ description: Paginated repositories granted on this installation (same repoLimit/repoOffset as top-level repos).
4840
5159
  manageUrl:
4841
5160
  type: string
4842
5161
  format: uri
@@ -4880,10 +5199,10 @@ components:
4880
5199
  allOf:
4881
5200
  - $ref: "#/components/schemas/GithubAccountDto"
4882
5201
  repos:
4883
- type: array
4884
- items:
4885
- $ref: "#/components/schemas/GithubInstalledRepoDto"
4886
5202
  nullable: true
5203
+ allOf:
5204
+ - $ref: "#/components/schemas/GithubInstalledRepoListDto"
5205
+ description: Paginated merged installation repositories when `installed` is true.
4887
5206
  manageUrl:
4888
5207
  type: string
4889
5208
  format: uri
@@ -5392,48 +5711,98 @@ components:
5392
5711
  type: integer
5393
5712
  minimum: 0
5394
5713
 
5395
- AgenticFoundationDashboardIssueDto:
5714
+ PageMetaDto:
5396
5715
  type: object
5397
- required:
5398
- [id, repoId, repoName, provider, dimensionId, severity, title, description, filePath, fixStatus]
5716
+ required: [total, limit, offset]
5717
+ properties:
5718
+ total:
5719
+ type: integer
5720
+ minimum: 0
5721
+ description: Total rows matching filters (full workspace, not just this page).
5722
+ limit:
5723
+ type: integer
5724
+ minimum: 1
5725
+ maximum: 100
5726
+ offset:
5727
+ type: integer
5728
+ minimum: 0
5729
+
5730
+ ReadinessRepoListDto:
5731
+ allOf:
5732
+ - $ref: "#/components/schemas/PageMetaDto"
5733
+ - type: object
5734
+ required: [items]
5735
+ properties:
5736
+ items:
5737
+ type: array
5738
+ items:
5739
+ $ref: "#/components/schemas/RepoReadinessScoreDto"
5740
+
5741
+ ReadinessFixListDto:
5742
+ allOf:
5743
+ - $ref: "#/components/schemas/PageMetaDto"
5744
+ - type: object
5745
+ required: [items]
5746
+ properties:
5747
+ items:
5748
+ type: array
5749
+ items:
5750
+ $ref: "#/components/schemas/FixRequestDto"
5751
+
5752
+ AgenticFoundationDimensionAggregateDto:
5753
+ type: object
5754
+ required: [dimensionId, averageScorePercent, repoCount]
5399
5755
  properties:
5400
- id:
5401
- type: string
5402
- format: uuid
5403
- repoId:
5404
- type: string
5405
- format: uuid
5406
- repoName:
5407
- type: string
5408
- maxLength: 256
5409
- provider:
5410
- $ref: "#/components/schemas/RepoProviderDto"
5411
5756
  dimensionId:
5412
5757
  $ref: "#/components/schemas/ReadinessDimensionId"
5413
- severity:
5414
- type: string
5415
- enum: [critical, high, medium, low]
5416
- title:
5417
- type: string
5418
- maxLength: 256
5419
- description:
5420
- type: string
5421
- maxLength: 2048
5422
- rubricId:
5423
- type: string
5424
- maxLength: 16
5425
- nullable: true
5426
- filePath:
5427
- type: string
5428
- maxLength: 512
5429
- nullable: true
5430
- fixStatus:
5431
- type: string
5432
- enum: [open, pr-pending, fixed]
5758
+ averageScorePercent:
5759
+ type: integer
5760
+ minimum: 0
5761
+ maximum: 100
5762
+ description: Mean dimension score percent across repos with maxScore > 0.
5763
+ repoCount:
5764
+ type: integer
5765
+ minimum: 0
5766
+ description: Repositories with a scored row for this dimension.
5767
+
5768
+ ReadinessFixStatusSummaryDto:
5769
+ type: object
5770
+ required: [queued, generating, prCreated, merged, failed, total]
5771
+ properties:
5772
+ queued:
5773
+ type: integer
5774
+ minimum: 0
5775
+ generating:
5776
+ type: integer
5777
+ minimum: 0
5778
+ prCreated:
5779
+ type: integer
5780
+ minimum: 0
5781
+ description: Count of fixes with status `pr-created`.
5782
+ merged:
5783
+ type: integer
5784
+ minimum: 0
5785
+ failed:
5786
+ type: integer
5787
+ minimum: 0
5788
+ total:
5789
+ type: integer
5790
+ minimum: 0
5791
+
5792
+ GithubInstalledRepoListDto:
5793
+ allOf:
5794
+ - $ref: "#/components/schemas/PageMetaDto"
5795
+ - type: object
5796
+ required: [items]
5797
+ properties:
5798
+ items:
5799
+ type: array
5800
+ items:
5801
+ $ref: "#/components/schemas/GithubInstalledRepoDto"
5433
5802
 
5434
5803
  AgenticFoundationDashboardDto:
5435
5804
  type: object
5436
- required: [workspaceId, generatedAt, summary, repos, issueQueue]
5805
+ required: [workspaceId, generatedAt, summary, dimensionAggregates, fixStatusSummary]
5437
5806
  properties:
5438
5807
  workspaceId:
5439
5808
  type: string
@@ -5443,14 +5812,13 @@ components:
5443
5812
  format: date-time
5444
5813
  summary:
5445
5814
  $ref: "#/components/schemas/AgenticFoundationDashboardSummaryDto"
5446
- repos:
5447
- type: array
5448
- items:
5449
- $ref: "#/components/schemas/RepoReadinessScoreDto"
5450
- issueQueue:
5815
+ dimensionAggregates:
5451
5816
  type: array
5452
5817
  items:
5453
- $ref: "#/components/schemas/AgenticFoundationDashboardIssueDto"
5818
+ $ref: "#/components/schemas/AgenticFoundationDimensionAggregateDto"
5819
+ description: Per-dimension average score bars for overview UI (full workspace aggregates).
5820
+ fixStatusSummary:
5821
+ $ref: "#/components/schemas/ReadinessFixStatusSummaryDto"
5454
5822
 
5455
5823
  FixRequestDto:
5456
5824
  type: object