@thinkai/tai-api-contract 2.5.17 → 2.7.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.
@@ -1,7 +1,7 @@
1
1
  openapi: 3.0.3
2
2
  info:
3
3
  title: ThinkAI API
4
- version: 2.5.17
4
+ version: 2.7.0
5
5
  description: >
6
6
  Contract surface for the AI Driven SDLC backend used by ThinkAI.
7
7
  Workspace-scoped routes use `/workspaces/{workspaceId}/...`.
@@ -50,6 +50,8 @@ tags:
50
50
  description: Org chart import via storage path (§14)
51
51
  - name: AgenticFoundation
52
52
  description: Agentic Foundation pillars (epic #278); reads stored repository readiness snapshots
53
+ - name: YourAiJourney
54
+ description: Your AI Journey dashboard aggregators (epic #267); composes readiness, metrics, and AI-spend data for the /dashboard page
53
55
 
54
56
  paths:
55
57
  /me:
@@ -1503,6 +1505,10 @@ paths:
1503
1505
  schema:
1504
1506
  type: boolean
1505
1507
  default: false
1508
+ - $ref: "#/components/parameters/GithubRepoLimit"
1509
+ - $ref: "#/components/parameters/GithubRepoOffset"
1510
+ - $ref: "#/components/parameters/GithubRepoSort"
1511
+ - $ref: "#/components/parameters/GithubRepoOrder"
1506
1512
  responses:
1507
1513
  "200":
1508
1514
  description: Installation status
@@ -2120,19 +2126,33 @@ paths:
2120
2126
  /workspaces/{workspaceId}/readiness/repos:
2121
2127
  get:
2122
2128
  tags: [RepositoryReadiness]
2123
- summary: List repo readiness scores
2129
+ summary: List repo readiness scores (paginated)
2124
2130
  operationId: listReadinessRepos
2131
+ description: >
2132
+ Returns a page of repository readiness scorecards. Use `GET .../readiness/repos/{repoId}`
2133
+ for a single repo. Summary aggregates on the Agentic Foundation dashboard use separate
2134
+ aggregate queries over the full workspace (#403).
2125
2135
  parameters:
2126
2136
  - $ref: "#/components/parameters/WorkspaceId"
2137
+ - $ref: "#/components/parameters/PaginationLimit"
2138
+ - $ref: "#/components/parameters/PaginationOffset"
2139
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2140
+ - $ref: "#/components/parameters/PaginationOrder"
2141
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2142
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2127
2143
  responses:
2128
2144
  "200":
2129
- description: Repositories analyzed
2145
+ description: Paginated repositories analyzed
2130
2146
  content:
2131
2147
  application/json:
2132
2148
  schema:
2133
- type: array
2134
- items:
2135
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2149
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2150
+ "400":
2151
+ description: Invalid pagination or sort query
2152
+ content:
2153
+ application/json:
2154
+ schema:
2155
+ $ref: "#/components/schemas/ErrorMessageDto"
2136
2156
  "401":
2137
2157
  $ref: "#/components/responses/Unauthorized"
2138
2158
  "403":
@@ -2267,18 +2287,19 @@ paths:
2267
2287
  /workspaces/{workspaceId}/agentic-foundation/dashboard:
2268
2288
  get:
2269
2289
  tags: [AgenticFoundation]
2270
- summary: Agentic Foundation dashboard
2290
+ summary: Agentic Foundation dashboard summary
2271
2291
  description: >
2272
- Returns stored repository readiness scorecards plus a flattened issue queue for the
2273
- Agentic Foundation dashboard surfaces. This is read-only and does not run scoring on
2274
- the request path (issue #279). Field `generatedAt` is the server timestamp when this JSON
2275
- payload was assembled; it is not the same as per-repo `lastAnalyzed` on `RepoReadinessScoreDto`.
2292
+ Returns workspace-level readiness summary, per-dimension aggregate bars, and fix status
2293
+ counts for Agentic Foundation dashboard surfaces. Repository and issue lists are paginated
2294
+ on `GET .../readiness/repos` and related segment routes (#403). Read-only; does not run
2295
+ scoring on the request path (issue #279). Field `generatedAt` is the server timestamp when
2296
+ this JSON payload was assembled.
2276
2297
  operationId: getAgenticFoundationDashboard
2277
2298
  parameters:
2278
2299
  - $ref: "#/components/parameters/WorkspaceId"
2279
2300
  responses:
2280
2301
  "200":
2281
- description: Dashboard scorecards and issue queue
2302
+ description: Dashboard summary and aggregates
2282
2303
  content:
2283
2304
  application/json:
2284
2305
  schema:
@@ -2294,8 +2315,14 @@ paths:
2294
2315
  averageOverallScore: 0
2295
2316
  issueCount: 0
2296
2317
  criticalIssueCount: 0
2297
- repos: []
2298
- issueQueue: []
2318
+ dimensionAggregates: []
2319
+ fixStatusSummary:
2320
+ queued: 0
2321
+ generating: 0
2322
+ prCreated: 0
2323
+ merged: 0
2324
+ failed: 0
2325
+ total: 0
2299
2326
  "401":
2300
2327
  $ref: "#/components/responses/Unauthorized"
2301
2328
  "403":
@@ -2317,39 +2344,53 @@ paths:
2317
2344
  operationId: getAgenticFoundationAgenticReadiness
2318
2345
  parameters:
2319
2346
  - $ref: "#/components/parameters/WorkspaceId"
2347
+ - $ref: "#/components/parameters/PaginationLimit"
2348
+ - $ref: "#/components/parameters/PaginationOffset"
2349
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2350
+ - $ref: "#/components/parameters/PaginationOrder"
2351
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2352
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2320
2353
  responses:
2321
2354
  "200":
2322
- description: Repositories with ai-agent-readiness slice
2355
+ description: Paginated repositories with ai-agent-readiness slice
2323
2356
  content:
2324
2357
  application/json:
2325
2358
  schema:
2326
- type: array
2327
- items:
2328
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2359
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2329
2360
  examples:
2330
2361
  singleRepoSlice:
2331
2362
  summary: One repo, single pillar dimension
2332
2363
  value:
2333
- - repoId: 00000000-0000-0000-0000-000000000002
2334
- repoName: api-gateway
2335
- language: typescript
2336
- overallScore: 67
2337
- dimensions:
2338
- - dimensionId: ai-agent-readiness
2339
- score: 2
2340
- maxScore: 3
2341
- issues: []
2342
- lastAnalyzed: "2026-05-12T12:00:00.000Z"
2343
- teamId: null
2344
- provider:
2345
- kind: github
2346
- slug: acme/api-gateway
2347
- webUrl: https://github.com/acme/api-gateway
2348
- defaultBranch: main
2349
- externalId: null
2350
- hostBaseUrl: null
2351
- analysisStatus: idle
2352
- activeRunId: null
2364
+ total: 1
2365
+ limit: 25
2366
+ offset: 0
2367
+ items:
2368
+ - repoId: 00000000-0000-0000-0000-000000000002
2369
+ repoName: api-gateway
2370
+ language: typescript
2371
+ overallScore: 67
2372
+ dimensions:
2373
+ - dimensionId: ai-agent-readiness
2374
+ score: 2
2375
+ maxScore: 3
2376
+ issues: []
2377
+ lastAnalyzed: "2026-05-12T12:00:00.000Z"
2378
+ teamId: null
2379
+ provider:
2380
+ kind: github
2381
+ slug: acme/api-gateway
2382
+ webUrl: https://github.com/acme/api-gateway
2383
+ defaultBranch: main
2384
+ externalId: null
2385
+ hostBaseUrl: null
2386
+ analysisStatus: idle
2387
+ activeRunId: null
2388
+ "400":
2389
+ description: Invalid pagination or sort query
2390
+ content:
2391
+ application/json:
2392
+ schema:
2393
+ $ref: "#/components/schemas/ErrorMessageDto"
2353
2394
  "401":
2354
2395
  $ref: "#/components/responses/Unauthorized"
2355
2396
  "403":
@@ -2369,15 +2410,25 @@ paths:
2369
2410
  operationId: getAgenticFoundationRepositoryHealth
2370
2411
  parameters:
2371
2412
  - $ref: "#/components/parameters/WorkspaceId"
2413
+ - $ref: "#/components/parameters/PaginationLimit"
2414
+ - $ref: "#/components/parameters/PaginationOffset"
2415
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2416
+ - $ref: "#/components/parameters/PaginationOrder"
2417
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2418
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2372
2419
  responses:
2373
2420
  "200":
2374
- description: Repositories with repo-hygiene slice
2421
+ description: Paginated repositories with repo-hygiene slice
2375
2422
  content:
2376
2423
  application/json:
2377
2424
  schema:
2378
- type: array
2379
- items:
2380
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2425
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2426
+ "400":
2427
+ description: Invalid pagination or sort query
2428
+ content:
2429
+ application/json:
2430
+ schema:
2431
+ $ref: "#/components/schemas/ErrorMessageDto"
2381
2432
  "401":
2382
2433
  $ref: "#/components/responses/Unauthorized"
2383
2434
  "403":
@@ -2397,15 +2448,25 @@ paths:
2397
2448
  operationId: getAgenticFoundationCodebaseQuality
2398
2449
  parameters:
2399
2450
  - $ref: "#/components/parameters/WorkspaceId"
2451
+ - $ref: "#/components/parameters/PaginationLimit"
2452
+ - $ref: "#/components/parameters/PaginationOffset"
2453
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2454
+ - $ref: "#/components/parameters/PaginationOrder"
2455
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2456
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2400
2457
  responses:
2401
2458
  "200":
2402
- description: Repositories with stack-quality slice
2459
+ description: Paginated repositories with stack-quality slice
2403
2460
  content:
2404
2461
  application/json:
2405
2462
  schema:
2406
- type: array
2407
- items:
2408
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2463
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2464
+ "400":
2465
+ description: Invalid pagination or sort query
2466
+ content:
2467
+ application/json:
2468
+ schema:
2469
+ $ref: "#/components/schemas/ErrorMessageDto"
2409
2470
  "401":
2410
2471
  $ref: "#/components/responses/Unauthorized"
2411
2472
  "403":
@@ -2425,15 +2486,25 @@ paths:
2425
2486
  operationId: getAgenticFoundationTestQa
2426
2487
  parameters:
2427
2488
  - $ref: "#/components/parameters/WorkspaceId"
2489
+ - $ref: "#/components/parameters/PaginationLimit"
2490
+ - $ref: "#/components/parameters/PaginationOffset"
2491
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2492
+ - $ref: "#/components/parameters/PaginationOrder"
2493
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2494
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2428
2495
  responses:
2429
2496
  "200":
2430
- description: Repositories with tests-qa slice
2497
+ description: Paginated repositories with tests-qa slice
2431
2498
  content:
2432
2499
  application/json:
2433
2500
  schema:
2434
- type: array
2435
- items:
2436
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2501
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2502
+ "400":
2503
+ description: Invalid pagination or sort query
2504
+ content:
2505
+ application/json:
2506
+ schema:
2507
+ $ref: "#/components/schemas/ErrorMessageDto"
2437
2508
  "401":
2438
2509
  $ref: "#/components/responses/Unauthorized"
2439
2510
  "403":
@@ -2453,15 +2524,25 @@ paths:
2453
2524
  operationId: getAgenticFoundationObservability
2454
2525
  parameters:
2455
2526
  - $ref: "#/components/parameters/WorkspaceId"
2527
+ - $ref: "#/components/parameters/PaginationLimit"
2528
+ - $ref: "#/components/parameters/PaginationOffset"
2529
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2530
+ - $ref: "#/components/parameters/PaginationOrder"
2531
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2532
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2456
2533
  responses:
2457
2534
  "200":
2458
- description: Repositories with observability slice
2535
+ description: Paginated repositories with observability slice
2459
2536
  content:
2460
2537
  application/json:
2461
2538
  schema:
2462
- type: array
2463
- items:
2464
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2539
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2540
+ "400":
2541
+ description: Invalid pagination or sort query
2542
+ content:
2543
+ application/json:
2544
+ schema:
2545
+ $ref: "#/components/schemas/ErrorMessageDto"
2465
2546
  "401":
2466
2547
  $ref: "#/components/responses/Unauthorized"
2467
2548
  "403":
@@ -2481,15 +2562,25 @@ paths:
2481
2562
  operationId: getAgenticFoundationApiContract
2482
2563
  parameters:
2483
2564
  - $ref: "#/components/parameters/WorkspaceId"
2565
+ - $ref: "#/components/parameters/PaginationLimit"
2566
+ - $ref: "#/components/parameters/PaginationOffset"
2567
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2568
+ - $ref: "#/components/parameters/PaginationOrder"
2569
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2570
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2484
2571
  responses:
2485
2572
  "200":
2486
- description: Repositories with api-contracts slice
2573
+ description: Paginated repositories with api-contracts slice
2487
2574
  content:
2488
2575
  application/json:
2489
2576
  schema:
2490
- type: array
2491
- items:
2492
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2577
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2578
+ "400":
2579
+ description: Invalid pagination or sort query
2580
+ content:
2581
+ application/json:
2582
+ schema:
2583
+ $ref: "#/components/schemas/ErrorMessageDto"
2493
2584
  "401":
2494
2585
  $ref: "#/components/responses/Unauthorized"
2495
2586
  "403":
@@ -2509,15 +2600,25 @@ paths:
2509
2600
  operationId: getAgenticFoundationPlatformGovernance
2510
2601
  parameters:
2511
2602
  - $ref: "#/components/parameters/WorkspaceId"
2603
+ - $ref: "#/components/parameters/PaginationLimit"
2604
+ - $ref: "#/components/parameters/PaginationOffset"
2605
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2606
+ - $ref: "#/components/parameters/PaginationOrder"
2607
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2608
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2512
2609
  responses:
2513
2610
  "200":
2514
- description: Repositories with platform-governance slice
2611
+ description: Paginated repositories with platform-governance slice
2515
2612
  content:
2516
2613
  application/json:
2517
2614
  schema:
2518
- type: array
2519
- items:
2520
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2615
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2616
+ "400":
2617
+ description: Invalid pagination or sort query
2618
+ content:
2619
+ application/json:
2620
+ schema:
2621
+ $ref: "#/components/schemas/ErrorMessageDto"
2521
2622
  "401":
2522
2623
  $ref: "#/components/responses/Unauthorized"
2523
2624
  "403":
@@ -2537,15 +2638,25 @@ paths:
2537
2638
  operationId: getAgenticFoundationDeliveryGovernance
2538
2639
  parameters:
2539
2640
  - $ref: "#/components/parameters/WorkspaceId"
2641
+ - $ref: "#/components/parameters/PaginationLimit"
2642
+ - $ref: "#/components/parameters/PaginationOffset"
2643
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2644
+ - $ref: "#/components/parameters/PaginationOrder"
2645
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2646
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2540
2647
  responses:
2541
2648
  "200":
2542
- description: Repositories with delivery slice
2649
+ description: Paginated repositories with delivery slice
2543
2650
  content:
2544
2651
  application/json:
2545
2652
  schema:
2546
- type: array
2547
- items:
2548
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2653
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2654
+ "400":
2655
+ description: Invalid pagination or sort query
2656
+ content:
2657
+ application/json:
2658
+ schema:
2659
+ $ref: "#/components/schemas/ErrorMessageDto"
2549
2660
  "401":
2550
2661
  $ref: "#/components/responses/Unauthorized"
2551
2662
  "403":
@@ -2567,15 +2678,25 @@ paths:
2567
2678
  operationId: getAgenticFoundationAiResolutionHub
2568
2679
  parameters:
2569
2680
  - $ref: "#/components/parameters/WorkspaceId"
2681
+ - $ref: "#/components/parameters/PaginationLimit"
2682
+ - $ref: "#/components/parameters/PaginationOffset"
2683
+ - $ref: "#/components/parameters/ReadinessRepoSort"
2684
+ - $ref: "#/components/parameters/PaginationOrder"
2685
+ - $ref: "#/components/parameters/ReadinessRepoSearch"
2686
+ - $ref: "#/components/parameters/ReadinessRepoLanguage"
2570
2687
  responses:
2571
2688
  "200":
2572
2689
  description: Full repository readiness scorecards
2573
2690
  content:
2574
2691
  application/json:
2575
2692
  schema:
2576
- type: array
2577
- items:
2578
- $ref: "#/components/schemas/RepoReadinessScoreDto"
2693
+ $ref: "#/components/schemas/ReadinessRepoListDto"
2694
+ "400":
2695
+ description: Invalid pagination or sort query
2696
+ content:
2697
+ application/json:
2698
+ schema:
2699
+ $ref: "#/components/schemas/ErrorMessageDto"
2579
2700
  "401":
2580
2701
  $ref: "#/components/responses/Unauthorized"
2581
2702
  "403":
@@ -2620,21 +2741,32 @@ paths:
2620
2741
  /workspaces/{workspaceId}/readiness/fixes:
2621
2742
  get:
2622
2743
  tags: [RepositoryReadiness]
2623
- summary: List fix requests
2744
+ summary: List fix requests (paginated)
2624
2745
  description: >
2625
- Returns persisted fix-queue rows for the workspace (newest first). Empty array when none exist.
2746
+ Returns a page of persisted fix-queue rows for the workspace (default newest first).
2626
2747
  operationId: listReadinessFixes
2627
2748
  parameters:
2628
2749
  - $ref: "#/components/parameters/WorkspaceId"
2750
+ - $ref: "#/components/parameters/PaginationLimit"
2751
+ - $ref: "#/components/parameters/PaginationOffset"
2752
+ - $ref: "#/components/parameters/ReadinessFixSort"
2753
+ - $ref: "#/components/parameters/PaginationOrder"
2754
+ - $ref: "#/components/parameters/ReadinessFixSearch"
2755
+ - $ref: "#/components/parameters/ReadinessFixStatusFilter"
2756
+ - $ref: "#/components/parameters/ReadinessFixRepoIdFilter"
2629
2757
  responses:
2630
2758
  "200":
2631
- description: Fix queue
2759
+ description: Paginated fix queue
2632
2760
  content:
2633
2761
  application/json:
2634
2762
  schema:
2635
- type: array
2636
- items:
2637
- $ref: "#/components/schemas/FixRequestDto"
2763
+ $ref: "#/components/schemas/ReadinessFixListDto"
2764
+ "400":
2765
+ description: Invalid pagination or sort query
2766
+ content:
2767
+ application/json:
2768
+ schema:
2769
+ $ref: "#/components/schemas/ErrorMessageDto"
2638
2770
  "401":
2639
2771
  $ref: "#/components/responses/Unauthorized"
2640
2772
  "403":
@@ -3054,9 +3186,275 @@ paths:
3054
3186
  content:
3055
3187
  application/json:
3056
3188
  schema:
3057
- $ref: "#/components/schemas/ErrorMessageDto"
3058
- "503":
3059
- description: Storage import not configured or service unavailable
3189
+ $ref: "#/components/schemas/ErrorMessageDto"
3190
+ "503":
3191
+ description: Storage import not configured or service unavailable
3192
+ content:
3193
+ application/json:
3194
+ schema:
3195
+ $ref: "#/components/schemas/ErrorMessageDto"
3196
+
3197
+ # ── Your AI Journey (/dashboard) — epic #267 ─────────────────────────────
3198
+
3199
+ /workspaces/{workspaceId}/your-ai-journey/analytics:
3200
+ get:
3201
+ tags: [YourAiJourney]
3202
+ summary: Combined analytics summary for the /dashboard page
3203
+ description: >
3204
+ Returns a single aggregated payload combining journey step progress, readiness summary,
3205
+ and PR-signal headline metrics. Covers issue #268. Results are cached for 60 seconds.
3206
+ operationId: getYourAiJourneyAnalytics
3207
+ parameters:
3208
+ - $ref: "#/components/parameters/WorkspaceId"
3209
+ responses:
3210
+ "200":
3211
+ description: Analytics summary
3212
+ content:
3213
+ application/json:
3214
+ schema:
3215
+ $ref: "#/components/schemas/YourAiJourneyAnalyticsDto"
3216
+ "401":
3217
+ $ref: "#/components/responses/Unauthorized"
3218
+ "403":
3219
+ $ref: "#/components/responses/Forbidden"
3220
+ "404":
3221
+ description: Workspace does not exist
3222
+ content:
3223
+ application/json:
3224
+ schema:
3225
+ $ref: "#/components/schemas/ErrorMessageDto"
3226
+
3227
+ /workspaces/{workspaceId}/your-ai-journey/pr-signals:
3228
+ get:
3229
+ tags: [YourAiJourney]
3230
+ summary: Weekly PR velocity and change-failure-rate time series
3231
+ description: >
3232
+ Returns a per-week time series of PR throughput and DORA change-failure-rate metrics,
3233
+ sourced from stored dashboard metrics. Covers issue #269. Results are cached for 60 seconds.
3234
+ operationId: getYourAiJourneyPrSignals
3235
+ parameters:
3236
+ - $ref: "#/components/parameters/WorkspaceId"
3237
+ - name: limit
3238
+ in: query
3239
+ schema:
3240
+ type: integer
3241
+ minimum: 1
3242
+ maximum: 52
3243
+ default: 8
3244
+ description: Number of weekly buckets to return (1–52; default 8).
3245
+ responses:
3246
+ "200":
3247
+ description: Weekly PR signals
3248
+ content:
3249
+ application/json:
3250
+ schema:
3251
+ $ref: "#/components/schemas/YourAiJourneyPrSignalsDto"
3252
+ "400":
3253
+ description: Invalid query parameter (limit out of range)
3254
+ content:
3255
+ application/json:
3256
+ schema:
3257
+ $ref: "#/components/schemas/ErrorMessageDto"
3258
+ "401":
3259
+ $ref: "#/components/responses/Unauthorized"
3260
+ "403":
3261
+ $ref: "#/components/responses/Forbidden"
3262
+ "404":
3263
+ description: Workspace does not exist
3264
+ content:
3265
+ application/json:
3266
+ schema:
3267
+ $ref: "#/components/schemas/ErrorMessageDto"
3268
+
3269
+ /workspaces/{workspaceId}/your-ai-journey/readiness/aggregate:
3270
+ get:
3271
+ tags: [YourAiJourney]
3272
+ summary: Per-dimension readiness aggregate across all repos
3273
+ description: >
3274
+ Aggregates stored readiness scores across all workspace repos by dimension.
3275
+ Covers issue #270. Results are cached for 60 seconds.
3276
+ operationId: getYourAiJourneyReadinessAggregate
3277
+ parameters:
3278
+ - $ref: "#/components/parameters/WorkspaceId"
3279
+ responses:
3280
+ "200":
3281
+ description: Readiness aggregate
3282
+ content:
3283
+ application/json:
3284
+ schema:
3285
+ $ref: "#/components/schemas/YourAiJourneyReadinessAggregateDto"
3286
+ "401":
3287
+ $ref: "#/components/responses/Unauthorized"
3288
+ "403":
3289
+ $ref: "#/components/responses/Forbidden"
3290
+ "404":
3291
+ description: Workspace does not exist
3292
+ content:
3293
+ application/json:
3294
+ schema:
3295
+ $ref: "#/components/schemas/ErrorMessageDto"
3296
+
3297
+ /workspaces/{workspaceId}/your-ai-journey/journey/progress:
3298
+ get:
3299
+ tags: [YourAiJourney]
3300
+ summary: Workspace journey step completion
3301
+ description: >
3302
+ Returns the workspace-scoped journey progress state. Returns an empty `completedSteps`
3303
+ list with a synthetic `updatedAt` if no row exists yet. Covers issue #271.
3304
+ operationId: getYourAiJourneyProgress
3305
+ parameters:
3306
+ - $ref: "#/components/parameters/WorkspaceId"
3307
+ responses:
3308
+ "200":
3309
+ description: Journey progress
3310
+ content:
3311
+ application/json:
3312
+ schema:
3313
+ $ref: "#/components/schemas/JourneyProgressDto"
3314
+ "401":
3315
+ $ref: "#/components/responses/Unauthorized"
3316
+ "403":
3317
+ $ref: "#/components/responses/Forbidden"
3318
+ "404":
3319
+ description: Workspace does not exist
3320
+ content:
3321
+ application/json:
3322
+ schema:
3323
+ $ref: "#/components/schemas/ErrorMessageDto"
3324
+ put:
3325
+ tags: [YourAiJourney]
3326
+ summary: Replace workspace journey completed steps
3327
+ description: >
3328
+ Idempotent replace-all of completed route strings for the workspace journey.
3329
+ Requires editor role. Covers issue #271.
3330
+ operationId: putYourAiJourneyProgress
3331
+ parameters:
3332
+ - $ref: "#/components/parameters/WorkspaceId"
3333
+ requestBody:
3334
+ required: true
3335
+ content:
3336
+ application/json:
3337
+ schema:
3338
+ $ref: "#/components/schemas/JourneyProgressUpdateDto"
3339
+ responses:
3340
+ "200":
3341
+ description: Saved progress
3342
+ content:
3343
+ application/json:
3344
+ schema:
3345
+ $ref: "#/components/schemas/JourneyProgressDto"
3346
+ "400":
3347
+ description: Body fails validation (non-array, invalid entries, too many steps)
3348
+ content:
3349
+ application/json:
3350
+ schema:
3351
+ $ref: "#/components/schemas/ErrorMessageDto"
3352
+ "401":
3353
+ $ref: "#/components/responses/Unauthorized"
3354
+ "403":
3355
+ $ref: "#/components/responses/Forbidden"
3356
+ "404":
3357
+ description: Workspace does not exist
3358
+ content:
3359
+ application/json:
3360
+ schema:
3361
+ $ref: "#/components/schemas/ErrorMessageDto"
3362
+
3363
+ /workspaces/{workspaceId}/your-ai-journey/agentic-foundation:
3364
+ get:
3365
+ tags: [YourAiJourney]
3366
+ summary: Agentic foundation dashboard slice for /dashboard
3367
+ description: >
3368
+ Returns the same `AgenticFoundationDashboardDto` payload as
3369
+ `GET /agentic-foundation/dashboard`, scoped to the /dashboard page context.
3370
+ Covers issue #272. Results are cached for 60 seconds.
3371
+ operationId: getYourAiJourneyAgenticFoundation
3372
+ parameters:
3373
+ - $ref: "#/components/parameters/WorkspaceId"
3374
+ responses:
3375
+ "200":
3376
+ description: Agentic foundation dashboard
3377
+ content:
3378
+ application/json:
3379
+ schema:
3380
+ $ref: "#/components/schemas/AgenticFoundationDashboardDto"
3381
+ "401":
3382
+ $ref: "#/components/responses/Unauthorized"
3383
+ "403":
3384
+ $ref: "#/components/responses/Forbidden"
3385
+ "404":
3386
+ description: Workspace does not exist
3387
+ content:
3388
+ application/json:
3389
+ schema:
3390
+ $ref: "#/components/schemas/ErrorMessageDto"
3391
+
3392
+ /workspaces/{workspaceId}/your-ai-journey/productivity:
3393
+ get:
3394
+ tags: [YourAiJourney]
3395
+ summary: Workspace productivity metrics for /dashboard
3396
+ description: >
3397
+ Returns the most recent stored dashboard productivity metrics snapshot that overlaps the
3398
+ requested window (defaults to the trailing 7 days). Same schema as
3399
+ `GET /dashboard/productivity`. Covers issue #273. Results are cached for 60 seconds.
3400
+ operationId: getYourAiJourneyProductivity
3401
+ parameters:
3402
+ - $ref: "#/components/parameters/WorkspaceId"
3403
+ - name: windowEnd
3404
+ in: query
3405
+ schema:
3406
+ type: string
3407
+ format: date-time
3408
+ description: Upper bound of the requested window (ISO 8601; defaults to now).
3409
+ responses:
3410
+ "200":
3411
+ description: Productivity metrics snapshot
3412
+ content:
3413
+ application/json:
3414
+ schema:
3415
+ $ref: "#/components/schemas/DashboardProductivityDto"
3416
+ "401":
3417
+ $ref: "#/components/responses/Unauthorized"
3418
+ "403":
3419
+ $ref: "#/components/responses/Forbidden"
3420
+ "404":
3421
+ description: Workspace does not exist
3422
+ content:
3423
+ application/json:
3424
+ schema:
3425
+ $ref: "#/components/schemas/ErrorMessageDto"
3426
+
3427
+ /workspaces/{workspaceId}/your-ai-journey/ai-spend:
3428
+ get:
3429
+ tags: [YourAiJourney]
3430
+ summary: AI tool spend and usage aggregated by week and provider
3431
+ description: >
3432
+ Returns token usage and spend aggregated from connected AI tool sources (e.g. Cursor)
3433
+ over the requested range, broken down by week and provider. Covers issue #274.
3434
+ Results are cached for 60 seconds.
3435
+ operationId: getYourAiJourneyAiSpend
3436
+ parameters:
3437
+ - $ref: "#/components/parameters/WorkspaceId"
3438
+ - name: rangeId
3439
+ in: query
3440
+ schema:
3441
+ type: string
3442
+ enum: [4w, 8w, q]
3443
+ default: 4w
3444
+ description: Time range — `4w` (4 weeks), `8w` (8 weeks), or `q` (quarter, 12 weeks).
3445
+ responses:
3446
+ "200":
3447
+ description: AI spend aggregation
3448
+ content:
3449
+ application/json:
3450
+ schema:
3451
+ $ref: "#/components/schemas/YourAiJourneyAiSpendDto"
3452
+ "401":
3453
+ $ref: "#/components/responses/Unauthorized"
3454
+ "403":
3455
+ $ref: "#/components/responses/Forbidden"
3456
+ "404":
3457
+ description: Workspace does not exist
3060
3458
  content:
3061
3459
  application/json:
3062
3460
  schema:
@@ -3123,6 +3521,129 @@ components:
3123
3521
  schema:
3124
3522
  type: string
3125
3523
  default: All departments
3524
+ PaginationLimit:
3525
+ name: limit
3526
+ in: query
3527
+ required: false
3528
+ description: Page size (default 25, max 100).
3529
+ schema:
3530
+ type: integer
3531
+ minimum: 1
3532
+ maximum: 100
3533
+ default: 25
3534
+ PaginationOffset:
3535
+ name: offset
3536
+ in: query
3537
+ required: false
3538
+ description: Zero-based row offset into the filtered, sorted result set.
3539
+ schema:
3540
+ type: integer
3541
+ minimum: 0
3542
+ default: 0
3543
+ PaginationOrder:
3544
+ name: order
3545
+ in: query
3546
+ required: false
3547
+ description: Sort direction.
3548
+ schema:
3549
+ type: string
3550
+ enum: [asc, desc]
3551
+ default: desc
3552
+ ReadinessRepoSort:
3553
+ name: sort
3554
+ in: query
3555
+ required: false
3556
+ description: Allowlisted repository sort field.
3557
+ schema:
3558
+ type: string
3559
+ enum: [repoName, overallScore, lastAnalyzed, language]
3560
+ default: overallScore
3561
+ ReadinessRepoSearch:
3562
+ name: search
3563
+ in: query
3564
+ required: false
3565
+ description: Case-insensitive filter on repository name, language, or provider slug.
3566
+ schema:
3567
+ type: string
3568
+ maxLength: 256
3569
+ ReadinessRepoLanguage:
3570
+ name: language
3571
+ in: query
3572
+ required: false
3573
+ description: Exact language filter (e.g. `typescript`).
3574
+ schema:
3575
+ type: string
3576
+ maxLength: 64
3577
+ ReadinessFixSort:
3578
+ name: sort
3579
+ in: query
3580
+ required: false
3581
+ description: Allowlisted fix-queue sort field.
3582
+ schema:
3583
+ type: string
3584
+ enum: [createdAt, repoName, severity, status]
3585
+ default: createdAt
3586
+ ReadinessFixStatusFilter:
3587
+ name: status
3588
+ in: query
3589
+ required: false
3590
+ description: Filter fixes by workflow status.
3591
+ schema:
3592
+ type: string
3593
+ enum: [queued, generating, pr-created, merged, failed]
3594
+ ReadinessFixRepoIdFilter:
3595
+ name: repoId
3596
+ in: query
3597
+ required: false
3598
+ description: Filter fixes to a single workspace repository id.
3599
+ schema:
3600
+ type: string
3601
+ format: uuid
3602
+ ReadinessFixSearch:
3603
+ name: search
3604
+ in: query
3605
+ required: false
3606
+ description: Case-insensitive filter on repo name, issue title, label, or description.
3607
+ schema:
3608
+ type: string
3609
+ maxLength: 256
3610
+ GithubRepoLimit:
3611
+ name: repoLimit
3612
+ in: query
3613
+ required: false
3614
+ description: Page size for the nested installation repo list (default 25, max 100).
3615
+ schema:
3616
+ type: integer
3617
+ minimum: 1
3618
+ maximum: 100
3619
+ default: 25
3620
+ GithubRepoOffset:
3621
+ name: repoOffset
3622
+ in: query
3623
+ required: false
3624
+ description: Zero-based offset into the merged installation repo list.
3625
+ schema:
3626
+ type: integer
3627
+ minimum: 0
3628
+ default: 0
3629
+ GithubRepoSort:
3630
+ name: repoSort
3631
+ in: query
3632
+ required: false
3633
+ description: Allowlisted GitHub repo sort field.
3634
+ schema:
3635
+ type: string
3636
+ enum: [name, updatedAt]
3637
+ default: name
3638
+ GithubRepoOrder:
3639
+ name: repoOrder
3640
+ in: query
3641
+ required: false
3642
+ description: Sort direction for the nested installation repo list.
3643
+ schema:
3644
+ type: string
3645
+ enum: [asc, desc]
3646
+ default: asc
3126
3647
 
3127
3648
  responses:
3128
3649
  Unauthorized:
@@ -3624,6 +4145,12 @@ components:
3624
4145
  type: string
3625
4146
  teamName:
3626
4147
  type: string
4148
+ notInOrgChart:
4149
+ type: boolean
4150
+ description: True when the contributor GitHub login is not mapped in the org chart.
4151
+ githubLogin:
4152
+ type: string
4153
+ description: GitHub login for unattributed contributors (when notInOrgChart is true).
3627
4154
  weeks:
3628
4155
  type: array
3629
4156
  items:
@@ -3647,7 +4174,7 @@ components:
3647
4174
  format: date-time
3648
4175
  weeks:
3649
4176
  type: array
3650
- description: Portfolio aggregate merged PR counts (sum of filtered contributors per week).
4177
+ description: Portfolio aggregate merged PR counts from org-scope metrics (all merged PRs in window).
3651
4178
  items:
3652
4179
  $ref: "#/components/schemas/ProductivityInsightsMergedPrTrendWeekDto"
3653
4180
  contributors:
@@ -4532,6 +5059,11 @@ components:
4532
5059
  private:
4533
5060
  type: boolean
4534
5061
  nullable: true
5062
+ updatedAt:
5063
+ type: string
5064
+ format: date-time
5065
+ nullable: true
5066
+ description: Last push or metadata update from GitHub when available.
4535
5067
 
4536
5068
  GithubMissingPermissionDto:
4537
5069
  type: object
@@ -4560,9 +5092,9 @@ components:
4560
5092
  allOf:
4561
5093
  - $ref: "#/components/schemas/GithubAccountDto"
4562
5094
  repos:
4563
- type: array
4564
- items:
4565
- $ref: "#/components/schemas/GithubInstalledRepoDto"
5095
+ allOf:
5096
+ - $ref: "#/components/schemas/GithubInstalledRepoListDto"
5097
+ description: Paginated repositories granted on this installation (same repoLimit/repoOffset as top-level repos).
4566
5098
  manageUrl:
4567
5099
  type: string
4568
5100
  format: uri
@@ -4606,10 +5138,10 @@ components:
4606
5138
  allOf:
4607
5139
  - $ref: "#/components/schemas/GithubAccountDto"
4608
5140
  repos:
4609
- type: array
4610
- items:
4611
- $ref: "#/components/schemas/GithubInstalledRepoDto"
4612
5141
  nullable: true
5142
+ allOf:
5143
+ - $ref: "#/components/schemas/GithubInstalledRepoListDto"
5144
+ description: Paginated merged installation repositories when `installed` is true.
4613
5145
  manageUrl:
4614
5146
  type: string
4615
5147
  format: uri
@@ -5157,9 +5689,98 @@ components:
5157
5689
  type: string
5158
5690
  enum: [open, pr-pending, fixed]
5159
5691
 
5692
+ PageMetaDto:
5693
+ type: object
5694
+ required: [total, limit, offset]
5695
+ properties:
5696
+ total:
5697
+ type: integer
5698
+ minimum: 0
5699
+ description: Total rows matching filters (full workspace, not just this page).
5700
+ limit:
5701
+ type: integer
5702
+ minimum: 1
5703
+ maximum: 100
5704
+ offset:
5705
+ type: integer
5706
+ minimum: 0
5707
+
5708
+ ReadinessRepoListDto:
5709
+ allOf:
5710
+ - $ref: "#/components/schemas/PageMetaDto"
5711
+ - type: object
5712
+ required: [items]
5713
+ properties:
5714
+ items:
5715
+ type: array
5716
+ items:
5717
+ $ref: "#/components/schemas/RepoReadinessScoreDto"
5718
+
5719
+ ReadinessFixListDto:
5720
+ allOf:
5721
+ - $ref: "#/components/schemas/PageMetaDto"
5722
+ - type: object
5723
+ required: [items]
5724
+ properties:
5725
+ items:
5726
+ type: array
5727
+ items:
5728
+ $ref: "#/components/schemas/FixRequestDto"
5729
+
5730
+ AgenticFoundationDimensionAggregateDto:
5731
+ type: object
5732
+ required: [dimensionId, averageScorePercent, repoCount]
5733
+ properties:
5734
+ dimensionId:
5735
+ $ref: "#/components/schemas/ReadinessDimensionId"
5736
+ averageScorePercent:
5737
+ type: integer
5738
+ minimum: 0
5739
+ maximum: 100
5740
+ description: Mean dimension score percent across repos with maxScore > 0.
5741
+ repoCount:
5742
+ type: integer
5743
+ minimum: 0
5744
+ description: Repositories with a scored row for this dimension.
5745
+
5746
+ ReadinessFixStatusSummaryDto:
5747
+ type: object
5748
+ required: [queued, generating, prCreated, merged, failed, total]
5749
+ properties:
5750
+ queued:
5751
+ type: integer
5752
+ minimum: 0
5753
+ generating:
5754
+ type: integer
5755
+ minimum: 0
5756
+ prCreated:
5757
+ type: integer
5758
+ minimum: 0
5759
+ description: Count of fixes with status `pr-created`.
5760
+ merged:
5761
+ type: integer
5762
+ minimum: 0
5763
+ failed:
5764
+ type: integer
5765
+ minimum: 0
5766
+ total:
5767
+ type: integer
5768
+ minimum: 0
5769
+
5770
+ GithubInstalledRepoListDto:
5771
+ allOf:
5772
+ - $ref: "#/components/schemas/PageMetaDto"
5773
+ - type: object
5774
+ required: [items]
5775
+ properties:
5776
+ items:
5777
+ type: array
5778
+ items:
5779
+ $ref: "#/components/schemas/GithubInstalledRepoDto"
5780
+
5160
5781
  AgenticFoundationDashboardDto:
5161
5782
  type: object
5162
- required: [workspaceId, generatedAt, summary, repos, issueQueue]
5783
+ required: [workspaceId, generatedAt, summary, dimensionAggregates, fixStatusSummary]
5163
5784
  properties:
5164
5785
  workspaceId:
5165
5786
  type: string
@@ -5169,14 +5790,13 @@ components:
5169
5790
  format: date-time
5170
5791
  summary:
5171
5792
  $ref: "#/components/schemas/AgenticFoundationDashboardSummaryDto"
5172
- repos:
5173
- type: array
5174
- items:
5175
- $ref: "#/components/schemas/RepoReadinessScoreDto"
5176
- issueQueue:
5793
+ dimensionAggregates:
5177
5794
  type: array
5178
5795
  items:
5179
- $ref: "#/components/schemas/AgenticFoundationDashboardIssueDto"
5796
+ $ref: "#/components/schemas/AgenticFoundationDimensionAggregateDto"
5797
+ description: Per-dimension average score bars for overview UI (full workspace aggregates).
5798
+ fixStatusSummary:
5799
+ $ref: "#/components/schemas/ReadinessFixStatusSummaryDto"
5180
5800
 
5181
5801
  FixRequestDto:
5182
5802
  type: object
@@ -5613,3 +6233,219 @@ components:
5613
6233
  storagePath:
5614
6234
  type: string
5615
6235
  description: Path in `org-charts` bucket after Supabase upload
6236
+
6237
+ # ── Your AI Journey schemas ─────────────────────────────────────────────
6238
+
6239
+ YourAiJourneyPrSignalsWeekDto:
6240
+ type: object
6241
+ required: [bucketStart, bucketEnd, weekLabel, prsPerDeveloperPerWeek, changeFailureRatePercent]
6242
+ properties:
6243
+ bucketStart:
6244
+ type: string
6245
+ format: date-time
6246
+ bucketEnd:
6247
+ type: string
6248
+ format: date-time
6249
+ weekLabel:
6250
+ type: string
6251
+ description: Display label in MM/DD format.
6252
+ prsPerDeveloperPerWeek:
6253
+ type: number
6254
+ changeFailureRatePercent:
6255
+ type: number
6256
+
6257
+ YourAiJourneyPrSignalsDto:
6258
+ type: object
6259
+ required: [workspaceId, generatedAt, windowStart, windowEnd, weeks, summary]
6260
+ properties:
6261
+ workspaceId:
6262
+ type: string
6263
+ format: uuid
6264
+ generatedAt:
6265
+ type: string
6266
+ format: date-time
6267
+ windowStart:
6268
+ type: string
6269
+ format: date-time
6270
+ windowEnd:
6271
+ type: string
6272
+ format: date-time
6273
+ weeks:
6274
+ type: array
6275
+ items:
6276
+ $ref: "#/components/schemas/YourAiJourneyPrSignalsWeekDto"
6277
+ summary:
6278
+ type: object
6279
+ required: [avgPrsPerDeveloperPerWeek, avgFailureRatePercent, prVelocityDeltaPercent]
6280
+ properties:
6281
+ avgPrsPerDeveloperPerWeek:
6282
+ type: number
6283
+ avgFailureRatePercent:
6284
+ type: number
6285
+ prVelocityDeltaPercent:
6286
+ type: number
6287
+
6288
+ YourAiJourneyReadinessDimensionDto:
6289
+ type: object
6290
+ required: [dimensionId, name, totalScore, maxScore, percent]
6291
+ properties:
6292
+ dimensionId:
6293
+ type: string
6294
+ name:
6295
+ type: string
6296
+ totalScore:
6297
+ type: number
6298
+ maxScore:
6299
+ type: number
6300
+ percent:
6301
+ type: number
6302
+ description: Rounded percentage 0–100.
6303
+
6304
+ YourAiJourneyReadinessAggregateDto:
6305
+ type: object
6306
+ required: [workspaceId, generatedAt, dimensions, summary]
6307
+ properties:
6308
+ workspaceId:
6309
+ type: string
6310
+ format: uuid
6311
+ generatedAt:
6312
+ type: string
6313
+ format: date-time
6314
+ dimensions:
6315
+ type: array
6316
+ items:
6317
+ $ref: "#/components/schemas/YourAiJourneyReadinessDimensionDto"
6318
+ summary:
6319
+ type: object
6320
+ required: [avgScore, repoCount, fixRate, totalOpenIssues, totalFixedIssues]
6321
+ properties:
6322
+ avgScore:
6323
+ type: number
6324
+ repoCount:
6325
+ type: integer
6326
+ fixRate:
6327
+ type: number
6328
+ totalOpenIssues:
6329
+ type: integer
6330
+ totalFixedIssues:
6331
+ type: integer
6332
+
6333
+ YourAiJourneyAnalyticsDto:
6334
+ type: object
6335
+ required: [workspaceId, generatedAt, windowStart, windowEnd, journey, readiness, prSignals]
6336
+ properties:
6337
+ workspaceId:
6338
+ type: string
6339
+ format: uuid
6340
+ generatedAt:
6341
+ type: string
6342
+ format: date-time
6343
+ windowStart:
6344
+ type: string
6345
+ format: date-time
6346
+ windowEnd:
6347
+ type: string
6348
+ format: date-time
6349
+ journey:
6350
+ type: object
6351
+ required: [completedSteps, updatedAt]
6352
+ properties:
6353
+ completedSteps:
6354
+ type: array
6355
+ items:
6356
+ type: string
6357
+ updatedAt:
6358
+ type: string
6359
+ format: date-time
6360
+ nullable: true
6361
+ readiness:
6362
+ type: object
6363
+ required: [avgScore, repoCount, fixRate, totalOpenIssues, totalFixedIssues]
6364
+ properties:
6365
+ avgScore:
6366
+ type: number
6367
+ repoCount:
6368
+ type: integer
6369
+ fixRate:
6370
+ type: number
6371
+ totalOpenIssues:
6372
+ type: integer
6373
+ totalFixedIssues:
6374
+ type: integer
6375
+ prSignals:
6376
+ type: object
6377
+ required: [avgPrsPerDeveloperPerWeek, prVelocityDeltaPercent, avgFailureRatePercent]
6378
+ properties:
6379
+ avgPrsPerDeveloperPerWeek:
6380
+ type: number
6381
+ prVelocityDeltaPercent:
6382
+ type: number
6383
+ avgFailureRatePercent:
6384
+ type: number
6385
+
6386
+ YourAiJourneyAiSpendWeekDto:
6387
+ type: object
6388
+ required: [bucketStart, bucketEnd, weekLabel, mergedPrCount, tokenCount]
6389
+ properties:
6390
+ bucketStart:
6391
+ type: string
6392
+ format: date-time
6393
+ bucketEnd:
6394
+ type: string
6395
+ format: date-time
6396
+ weekLabel:
6397
+ type: string
6398
+ mergedPrCount:
6399
+ type: integer
6400
+ tokenCount:
6401
+ type: integer
6402
+
6403
+ YourAiJourneyAiSpendDto:
6404
+ type: object
6405
+ required: [workspaceId, generatedAt, windowStart, windowEnd, totalSpendCents, totalTokenCount, activeUsers, aiAssistedPrRatio, prThroughputDeltaPercent, usageDeltaPercent, weeks, providers]
6406
+ properties:
6407
+ workspaceId:
6408
+ type: string
6409
+ format: uuid
6410
+ generatedAt:
6411
+ type: string
6412
+ format: date-time
6413
+ windowStart:
6414
+ type: string
6415
+ format: date-time
6416
+ windowEnd:
6417
+ type: string
6418
+ format: date-time
6419
+ totalSpendCents:
6420
+ type: integer
6421
+ totalTokenCount:
6422
+ type: integer
6423
+ activeUsers:
6424
+ type: integer
6425
+ aiAssistedPrRatio:
6426
+ type: number
6427
+ description: Fraction 0–1 of PRs that are AI-assisted.
6428
+ prThroughputDeltaPercent:
6429
+ type: number
6430
+ usageDeltaPercent:
6431
+ type: number
6432
+ weeks:
6433
+ type: array
6434
+ items:
6435
+ $ref: "#/components/schemas/YourAiJourneyAiSpendWeekDto"
6436
+ providers:
6437
+ type: array
6438
+ items:
6439
+ type: object
6440
+ required: [providerId, providerName, tokenCount, spendCents, activeUsers]
6441
+ properties:
6442
+ providerId:
6443
+ type: string
6444
+ providerName:
6445
+ type: string
6446
+ tokenCount:
6447
+ type: integer
6448
+ spendCents:
6449
+ type: integer
6450
+ activeUsers:
6451
+ type: integer