@thinkai/tai-api-contract 2.126.0 → 2.127.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.126.0
4
+ version: 2.127.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}/...`.
@@ -86,6 +86,12 @@ tags:
86
86
  (LOC, cyclomatic complexity, duplication), hotspots, and playbook-threshold
87
87
  findings collected during readiness scans. Every metric carries
88
88
  `measured | derived | estimated | unavailable` provenance.
89
+ - name: TestPyramidInsights
90
+ description: >
91
+ Test pyramid assessment (`/insights/test-pyramid`) — workspace and per-repo
92
+ classified test-file inventory (unit, integration, acceptance/BDD, contract, E2E)
93
+ with count-based presence and advisory 70/20/10 shape. Distinct from Agentic
94
+ Foundation readiness `/readiness/test-pyramid*` (signal-inclusive presence).
89
95
 
90
96
  paths:
91
97
  /admin/users/{userId}:
@@ -3831,6 +3837,84 @@ paths:
3831
3837
  schema:
3832
3838
  $ref: "#/components/schemas/ErrorMessageDto"
3833
3839
 
3840
+ /workspaces/{workspaceId}/insights/test-pyramid/summary:
3841
+ get:
3842
+ tags: [TestPyramidInsights]
3843
+ summary: Test pyramid assessment — workspace summary
3844
+ operationId: getInsightsTestPyramidSummary
3845
+ description: >
3846
+ Org-level Test pyramid assessment for `/insights/test-pyramid`. Aggregates each
3847
+ active repo's **latest** readiness-scan test-pyramid snapshot. Layer **presence
3848
+ is count-based** (`fileCount > 0`); CI/dependency-only AF `present` flags are
3849
+ ignored. Shape uses fixed advisory targets (base ~70% unit, middle ~20%
3850
+ integration+contract+acceptance/BDD, top ~10% E2E) and returns
3851
+ `insufficient_data` when total classified test files < 10. Does not change
3852
+ Agentic Foundation `/readiness/test-pyramid*` responses.
3853
+ parameters:
3854
+ - $ref: "#/components/parameters/WorkspaceId"
3855
+ responses:
3856
+ "200":
3857
+ description: Test pyramid assessment workspace summary
3858
+ content:
3859
+ application/json:
3860
+ schema:
3861
+ $ref: "#/components/schemas/InsightsTestPyramidSummaryDto"
3862
+ "401":
3863
+ $ref: "#/components/responses/Unauthorized"
3864
+ "403":
3865
+ $ref: "#/components/responses/Forbidden"
3866
+ "404":
3867
+ description: Workspace does not exist or malformed workspaceId
3868
+ "501":
3869
+ description: Test pyramid history not supported by store
3870
+ content:
3871
+ application/json:
3872
+ schema:
3873
+ $ref: "#/components/schemas/ErrorMessageDto"
3874
+
3875
+ /workspaces/{workspaceId}/insights/test-pyramid/repos:
3876
+ get:
3877
+ tags: [TestPyramidInsights]
3878
+ summary: Test pyramid assessment — per-repo list (paginated)
3879
+ operationId: listInsightsTestPyramidRepos
3880
+ description: >
3881
+ Page of repos with latest classified test-file counts, count-based presence,
3882
+ presence maturity, and shape assessment. Use `gapsByLayer` on the summary
3883
+ endpoint (or filter this list via layerPresent) to answer “who lacks layer X?”.
3884
+ No v1 repo-detail Insights route — link repo names to AF readiness inventory.
3885
+ parameters:
3886
+ - $ref: "#/components/parameters/WorkspaceId"
3887
+ - $ref: "#/components/parameters/PaginationLimit"
3888
+ - $ref: "#/components/parameters/PaginationOffset"
3889
+ - $ref: "#/components/parameters/InsightsTestPyramidRepoSort"
3890
+ - $ref: "#/components/parameters/PaginationOrder"
3891
+ - $ref: "#/components/parameters/InsightsTestPyramidRepoSearch"
3892
+ responses:
3893
+ "200":
3894
+ description: Paginated test pyramid assessment repo rows
3895
+ content:
3896
+ application/json:
3897
+ schema:
3898
+ $ref: "#/components/schemas/InsightsTestPyramidRepoListDto"
3899
+ "400":
3900
+ description: Invalid pagination or sort query
3901
+ content:
3902
+ application/json:
3903
+ schema:
3904
+ $ref: "#/components/schemas/ErrorMessageDto"
3905
+ "401":
3906
+ $ref: "#/components/responses/Unauthorized"
3907
+ "403":
3908
+ $ref: "#/components/responses/Forbidden"
3909
+ "404":
3910
+ description: Workspace does not exist or malformed workspaceId
3911
+ "501":
3912
+ description: Test pyramid history not supported by store
3913
+ content:
3914
+ application/json:
3915
+ schema:
3916
+ $ref: "#/components/schemas/ErrorMessageDto"
3917
+
3834
3918
  /workspaces/{workspaceId}/integrations/ai-tool/{provider}/members:
3835
3919
  get:
3836
3920
  tags: [Workspace]
@@ -10051,6 +10135,23 @@ components:
10051
10135
  description: Case-insensitive substring filter on repo name / provider slug.
10052
10136
  schema:
10053
10137
  type: string
10138
+ InsightsTestPyramidRepoSort:
10139
+ name: sort
10140
+ in: query
10141
+ required: false
10142
+ description: Allowlisted Test pyramid assessment repo sort field.
10143
+ schema:
10144
+ type: string
10145
+ enum: [repoName, totalClassifiedFiles, scannedAt, maturity]
10146
+ default: repoName
10147
+ InsightsTestPyramidRepoSearch:
10148
+ name: search
10149
+ in: query
10150
+ required: false
10151
+ description: Case-insensitive substring filter on repository name.
10152
+ schema:
10153
+ type: string
10154
+ maxLength: 256
10054
10155
  ReadinessRepoSearch:
10055
10156
  name: search
10056
10157
  in: query
@@ -21508,3 +21609,206 @@ components:
21508
21609
  description: Org top-10 complexity hotspots by `ccMax` (current per-repo snapshots).
21509
21610
  sonar:
21510
21611
  $ref: "#/components/schemas/CodeInsightsSonarDto"
21612
+
21613
+ InsightsTestPyramidMaturityDto:
21614
+ type: string
21615
+ enum: [missing, emerging, established, mature]
21616
+ description: >
21617
+ Presence maturity (model A) using count-based layer presence
21618
+ (`fileCount > 0`), not AF signal-inclusive `present`.
21619
+
21620
+ InsightsTestPyramidShapeLabelDto:
21621
+ type: string
21622
+ enum: [insufficient_data, base_heavy, balanced, top_heavy, middle_heavy]
21623
+ description: >
21624
+ Advisory shape label vs fixed 70/20/10. `insufficient_data` when total
21625
+ classified test files < 10 (band percents are null).
21626
+
21627
+ InsightsTestPyramidShapeDto:
21628
+ type: object
21629
+ required: [label, totalClassifiedFiles, basePercent, middlePercent, topPercent, targets]
21630
+ properties:
21631
+ label:
21632
+ $ref: "#/components/schemas/InsightsTestPyramidShapeLabelDto"
21633
+ totalClassifiedFiles:
21634
+ type: integer
21635
+ minimum: 0
21636
+ description: Sum of classified test **files** across the five layers (not test cases).
21637
+ basePercent:
21638
+ type: number
21639
+ nullable: true
21640
+ description: Share of classified files in unit (base). Null when insufficient_data.
21641
+ middlePercent:
21642
+ type: number
21643
+ nullable: true
21644
+ description: >
21645
+ Share in integration + contract + acceptance_bdd (middle). Null when
21646
+ insufficient_data.
21647
+ topPercent:
21648
+ type: number
21649
+ nullable: true
21650
+ description: Share in e2e (top). Null when insufficient_data.
21651
+ targets:
21652
+ type: object
21653
+ required: [basePercent, middlePercent, topPercent]
21654
+ properties:
21655
+ basePercent: { type: number, enum: [70] }
21656
+ middlePercent: { type: number, enum: [20] }
21657
+ topPercent: { type: number, enum: [10] }
21658
+
21659
+ InsightsTestPyramidLayerCountsDto:
21660
+ type: object
21661
+ required: [unit, integration, acceptance_bdd, contract, e2e]
21662
+ properties:
21663
+ unit: { type: integer, minimum: 0 }
21664
+ integration: { type: integer, minimum: 0 }
21665
+ acceptance_bdd: { type: integer, minimum: 0 }
21666
+ contract: { type: integer, minimum: 0 }
21667
+ e2e: { type: integer, minimum: 0 }
21668
+
21669
+ InsightsTestPyramidLayerPresentDto:
21670
+ type: object
21671
+ required: [unit, integration, acceptance_bdd, contract, e2e]
21672
+ properties:
21673
+ unit: { type: boolean }
21674
+ integration: { type: boolean }
21675
+ acceptance_bdd: { type: boolean }
21676
+ contract: { type: boolean }
21677
+ e2e: { type: boolean }
21678
+
21679
+ InsightsTestPyramidLayerPresenceDto:
21680
+ type: object
21681
+ required: [presentRepos, applicableRepos, percent, missingRepoIds, missingRepoNames]
21682
+ properties:
21683
+ presentRepos: { type: integer, minimum: 0 }
21684
+ applicableRepos: { type: integer, minimum: 0 }
21685
+ percent:
21686
+ type: integer
21687
+ nullable: true
21688
+ minimum: 0
21689
+ maximum: 100
21690
+ missingRepoIds:
21691
+ type: array
21692
+ items: { type: string, format: uuid }
21693
+ missingRepoNames:
21694
+ type: array
21695
+ items: { type: string }
21696
+
21697
+ InsightsTestPyramidGapRepoDto:
21698
+ type: object
21699
+ required: [repoId, repoName]
21700
+ properties:
21701
+ repoId: { type: string, format: uuid }
21702
+ repoName: { type: string }
21703
+
21704
+ InsightsTestPyramidGapsByLayerDto:
21705
+ type: object
21706
+ required: [unit, integration, acceptance_bdd, contract, e2e]
21707
+ properties:
21708
+ unit:
21709
+ type: array
21710
+ items: { $ref: "#/components/schemas/InsightsTestPyramidGapRepoDto" }
21711
+ integration:
21712
+ type: array
21713
+ items: { $ref: "#/components/schemas/InsightsTestPyramidGapRepoDto" }
21714
+ acceptance_bdd:
21715
+ type: array
21716
+ items: { $ref: "#/components/schemas/InsightsTestPyramidGapRepoDto" }
21717
+ contract:
21718
+ type: array
21719
+ items: { $ref: "#/components/schemas/InsightsTestPyramidGapRepoDto" }
21720
+ e2e:
21721
+ type: array
21722
+ items: { $ref: "#/components/schemas/InsightsTestPyramidGapRepoDto" }
21723
+
21724
+ InsightsTestPyramidMaturityCountsDto:
21725
+ type: object
21726
+ required: [missing, emerging, established, mature]
21727
+ properties:
21728
+ missing: { type: integer, minimum: 0 }
21729
+ emerging: { type: integer, minimum: 0 }
21730
+ established: { type: integer, minimum: 0 }
21731
+ mature: { type: integer, minimum: 0 }
21732
+
21733
+ InsightsTestPyramidLayerPresenceMapDto:
21734
+ type: object
21735
+ required: [unit, integration, acceptance_bdd, contract, e2e]
21736
+ properties:
21737
+ unit: { $ref: "#/components/schemas/InsightsTestPyramidLayerPresenceDto" }
21738
+ integration: { $ref: "#/components/schemas/InsightsTestPyramidLayerPresenceDto" }
21739
+ acceptance_bdd: { $ref: "#/components/schemas/InsightsTestPyramidLayerPresenceDto" }
21740
+ contract: { $ref: "#/components/schemas/InsightsTestPyramidLayerPresenceDto" }
21741
+ e2e: { $ref: "#/components/schemas/InsightsTestPyramidLayerPresenceDto" }
21742
+
21743
+ InsightsTestPyramidSummaryDto:
21744
+ type: object
21745
+ required:
21746
+ - workspaceId
21747
+ - generatedAt
21748
+ - reposWithPyramid
21749
+ - reposFromDegradedRuns
21750
+ - totalClassifiedFiles
21751
+ - shape
21752
+ - layerPresence
21753
+ - maturityCounts
21754
+ - gapsByLayer
21755
+ properties:
21756
+ workspaceId: { type: string, format: uuid }
21757
+ generatedAt: { type: string, format: date-time }
21758
+ reposWithPyramid: { type: integer, minimum: 0 }
21759
+ reposFromDegradedRuns:
21760
+ type: array
21761
+ items: { type: string, format: uuid }
21762
+ description: Repos whose newest pyramid came from a non-succeeded readiness run.
21763
+ totalClassifiedFiles:
21764
+ type: integer
21765
+ minimum: 0
21766
+ description: Workspace sum of classified test files (not cases).
21767
+ shape:
21768
+ $ref: "#/components/schemas/InsightsTestPyramidShapeDto"
21769
+ layerPresence:
21770
+ $ref: "#/components/schemas/InsightsTestPyramidLayerPresenceMapDto"
21771
+ maturityCounts:
21772
+ $ref: "#/components/schemas/InsightsTestPyramidMaturityCountsDto"
21773
+ gapsByLayer:
21774
+ $ref: "#/components/schemas/InsightsTestPyramidGapsByLayerDto"
21775
+
21776
+ InsightsTestPyramidRepoItemDto:
21777
+ type: object
21778
+ required:
21779
+ - repoId
21780
+ - repoName
21781
+ - scannedAt
21782
+ - currentRunStatus
21783
+ - maturity
21784
+ - layerFileCounts
21785
+ - layerPresent
21786
+ - totalClassifiedFiles
21787
+ - shape
21788
+ properties:
21789
+ repoId: { type: string, format: uuid }
21790
+ repoName: { type: string }
21791
+ scannedAt: { type: string, format: date-time }
21792
+ currentRunStatus:
21793
+ $ref: "#/components/schemas/TestPyramidRunStatusDto"
21794
+ maturity:
21795
+ $ref: "#/components/schemas/InsightsTestPyramidMaturityDto"
21796
+ layerFileCounts:
21797
+ $ref: "#/components/schemas/InsightsTestPyramidLayerCountsDto"
21798
+ layerPresent:
21799
+ $ref: "#/components/schemas/InsightsTestPyramidLayerPresentDto"
21800
+ totalClassifiedFiles: { type: integer, minimum: 0 }
21801
+ shape:
21802
+ $ref: "#/components/schemas/InsightsTestPyramidShapeDto"
21803
+
21804
+ InsightsTestPyramidRepoListDto:
21805
+ type: object
21806
+ required: [items, total, limit, offset]
21807
+ properties:
21808
+ items:
21809
+ type: array
21810
+ items:
21811
+ $ref: "#/components/schemas/InsightsTestPyramidRepoItemDto"
21812
+ total: { type: integer, minimum: 0 }
21813
+ limit: { type: integer, minimum: 1 }
21814
+ offset: { type: integer, minimum: 0 }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thinkai/tai-api-contract",
3
- "version": "2.126.0",
3
+ "version": "2.127.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -20,7 +20,7 @@
20
20
  },
21
21
  "devDependencies": {
22
22
  "@stoplight/spectral-cli": "^6.16.3",
23
- "@types/node": "^26.4.0",
23
+ "@types/node": "^26.4.1",
24
24
  "jsonpath-plus": "^10.3.0",
25
25
  "openapi-typescript": "^7.13.0",
26
26
  "typescript": "~6.0.3"
@@ -1394,6 +1394,46 @@ export interface paths {
1394
1394
  patch?: never;
1395
1395
  trace?: never;
1396
1396
  };
1397
+ "/workspaces/{workspaceId}/insights/test-pyramid/summary": {
1398
+ parameters: {
1399
+ query?: never;
1400
+ header?: never;
1401
+ path?: never;
1402
+ cookie?: never;
1403
+ };
1404
+ /**
1405
+ * Test pyramid assessment — workspace summary
1406
+ * @description Org-level Test pyramid assessment for `/insights/test-pyramid`. Aggregates each active repo's **latest** readiness-scan test-pyramid snapshot. Layer **presence is count-based** (`fileCount > 0`); CI/dependency-only AF `present` flags are ignored. Shape uses fixed advisory targets (base ~70% unit, middle ~20% integration+contract+acceptance/BDD, top ~10% E2E) and returns `insufficient_data` when total classified test files < 10. Does not change Agentic Foundation `/readiness/test-pyramid*` responses.
1407
+ */
1408
+ get: operations["getInsightsTestPyramidSummary"];
1409
+ put?: never;
1410
+ post?: never;
1411
+ delete?: never;
1412
+ options?: never;
1413
+ head?: never;
1414
+ patch?: never;
1415
+ trace?: never;
1416
+ };
1417
+ "/workspaces/{workspaceId}/insights/test-pyramid/repos": {
1418
+ parameters: {
1419
+ query?: never;
1420
+ header?: never;
1421
+ path?: never;
1422
+ cookie?: never;
1423
+ };
1424
+ /**
1425
+ * Test pyramid assessment — per-repo list (paginated)
1426
+ * @description Page of repos with latest classified test-file counts, count-based presence, presence maturity, and shape assessment. Use `gapsByLayer` on the summary endpoint (or filter this list via layerPresent) to answer “who lacks layer X?”. No v1 repo-detail Insights route — link repo names to AF readiness inventory.
1427
+ */
1428
+ get: operations["listInsightsTestPyramidRepos"];
1429
+ put?: never;
1430
+ post?: never;
1431
+ delete?: never;
1432
+ options?: never;
1433
+ head?: never;
1434
+ patch?: never;
1435
+ trace?: never;
1436
+ };
1397
1437
  "/workspaces/{workspaceId}/integrations/ai-tool/{provider}/members": {
1398
1438
  parameters: {
1399
1439
  query?: never;
@@ -9544,6 +9584,115 @@ export interface components {
9544
9584
  topHotspots: components["schemas"]["CodeInsightsOrgHotspotDto"][];
9545
9585
  sonar: components["schemas"]["CodeInsightsSonarDto"];
9546
9586
  };
9587
+ /**
9588
+ * @description Presence maturity (model A) using count-based layer presence (`fileCount > 0`), not AF signal-inclusive `present`.
9589
+ * @enum {string}
9590
+ */
9591
+ InsightsTestPyramidMaturityDto: "missing" | "emerging" | "established" | "mature";
9592
+ /**
9593
+ * @description Advisory shape label vs fixed 70/20/10. `insufficient_data` when total classified test files < 10 (band percents are null).
9594
+ * @enum {string}
9595
+ */
9596
+ InsightsTestPyramidShapeLabelDto: "insufficient_data" | "base_heavy" | "balanced" | "top_heavy" | "middle_heavy";
9597
+ InsightsTestPyramidShapeDto: {
9598
+ label: components["schemas"]["InsightsTestPyramidShapeLabelDto"];
9599
+ /** @description Sum of classified test **files** across the five layers (not test cases). */
9600
+ totalClassifiedFiles: number;
9601
+ /** @description Share of classified files in unit (base). Null when insufficient_data. */
9602
+ basePercent: number | null;
9603
+ /** @description Share in integration + contract + acceptance_bdd (middle). Null when insufficient_data. */
9604
+ middlePercent: number | null;
9605
+ /** @description Share in e2e (top). Null when insufficient_data. */
9606
+ topPercent: number | null;
9607
+ targets: {
9608
+ /** @enum {number} */
9609
+ basePercent: 70;
9610
+ /** @enum {number} */
9611
+ middlePercent: 20;
9612
+ /** @enum {number} */
9613
+ topPercent: 10;
9614
+ };
9615
+ };
9616
+ InsightsTestPyramidLayerCountsDto: {
9617
+ unit: number;
9618
+ integration: number;
9619
+ acceptance_bdd: number;
9620
+ contract: number;
9621
+ e2e: number;
9622
+ };
9623
+ InsightsTestPyramidLayerPresentDto: {
9624
+ unit: boolean;
9625
+ integration: boolean;
9626
+ acceptance_bdd: boolean;
9627
+ contract: boolean;
9628
+ e2e: boolean;
9629
+ };
9630
+ InsightsTestPyramidLayerPresenceDto: {
9631
+ presentRepos: number;
9632
+ applicableRepos: number;
9633
+ percent: number | null;
9634
+ missingRepoIds: string[];
9635
+ missingRepoNames: string[];
9636
+ };
9637
+ InsightsTestPyramidGapRepoDto: {
9638
+ /** Format: uuid */
9639
+ repoId: string;
9640
+ repoName: string;
9641
+ };
9642
+ InsightsTestPyramidGapsByLayerDto: {
9643
+ unit: components["schemas"]["InsightsTestPyramidGapRepoDto"][];
9644
+ integration: components["schemas"]["InsightsTestPyramidGapRepoDto"][];
9645
+ acceptance_bdd: components["schemas"]["InsightsTestPyramidGapRepoDto"][];
9646
+ contract: components["schemas"]["InsightsTestPyramidGapRepoDto"][];
9647
+ e2e: components["schemas"]["InsightsTestPyramidGapRepoDto"][];
9648
+ };
9649
+ InsightsTestPyramidMaturityCountsDto: {
9650
+ missing: number;
9651
+ emerging: number;
9652
+ established: number;
9653
+ mature: number;
9654
+ };
9655
+ InsightsTestPyramidLayerPresenceMapDto: {
9656
+ unit: components["schemas"]["InsightsTestPyramidLayerPresenceDto"];
9657
+ integration: components["schemas"]["InsightsTestPyramidLayerPresenceDto"];
9658
+ acceptance_bdd: components["schemas"]["InsightsTestPyramidLayerPresenceDto"];
9659
+ contract: components["schemas"]["InsightsTestPyramidLayerPresenceDto"];
9660
+ e2e: components["schemas"]["InsightsTestPyramidLayerPresenceDto"];
9661
+ };
9662
+ InsightsTestPyramidSummaryDto: {
9663
+ /** Format: uuid */
9664
+ workspaceId: string;
9665
+ /** Format: date-time */
9666
+ generatedAt: string;
9667
+ reposWithPyramid: number;
9668
+ /** @description Repos whose newest pyramid came from a non-succeeded readiness run. */
9669
+ reposFromDegradedRuns: string[];
9670
+ /** @description Workspace sum of classified test files (not cases). */
9671
+ totalClassifiedFiles: number;
9672
+ shape: components["schemas"]["InsightsTestPyramidShapeDto"];
9673
+ layerPresence: components["schemas"]["InsightsTestPyramidLayerPresenceMapDto"];
9674
+ maturityCounts: components["schemas"]["InsightsTestPyramidMaturityCountsDto"];
9675
+ gapsByLayer: components["schemas"]["InsightsTestPyramidGapsByLayerDto"];
9676
+ };
9677
+ InsightsTestPyramidRepoItemDto: {
9678
+ /** Format: uuid */
9679
+ repoId: string;
9680
+ repoName: string;
9681
+ /** Format: date-time */
9682
+ scannedAt: string;
9683
+ currentRunStatus: components["schemas"]["TestPyramidRunStatusDto"];
9684
+ maturity: components["schemas"]["InsightsTestPyramidMaturityDto"];
9685
+ layerFileCounts: components["schemas"]["InsightsTestPyramidLayerCountsDto"];
9686
+ layerPresent: components["schemas"]["InsightsTestPyramidLayerPresentDto"];
9687
+ totalClassifiedFiles: number;
9688
+ shape: components["schemas"]["InsightsTestPyramidShapeDto"];
9689
+ };
9690
+ InsightsTestPyramidRepoListDto: {
9691
+ items: components["schemas"]["InsightsTestPyramidRepoItemDto"][];
9692
+ total: number;
9693
+ limit: number;
9694
+ offset: number;
9695
+ };
9547
9696
  };
9548
9697
  responses: {
9549
9698
  /** @description Missing or invalid bearer token */
@@ -9631,6 +9780,10 @@ export interface components {
9631
9780
  CodeInsightsRepoSort: "repoName" | "locTotal" | "ccAvg" | "dupPct" | "lastMeasuredAt";
9632
9781
  /** @description Case-insensitive substring filter on repo name / provider slug. */
9633
9782
  CodeInsightsRepoSearch: string;
9783
+ /** @description Allowlisted Test pyramid assessment repo sort field. */
9784
+ InsightsTestPyramidRepoSort: "repoName" | "totalClassifiedFiles" | "scannedAt" | "maturity";
9785
+ /** @description Case-insensitive substring filter on repository name. */
9786
+ InsightsTestPyramidRepoSearch: string;
9634
9787
  /** @description Case-insensitive filter on repository name, language, or provider slug. */
9635
9788
  ReadinessRepoSearch: string;
9636
9789
  /** @description Exact language filter (e.g. `typescript`). */
@@ -10154,6 +10307,19 @@ export type CodeInsightsDesignAnalyzeResponseDto = components['schemas']['CodeIn
10154
10307
  export type CodeInsightsOrgHotspotDto = components['schemas']['CodeInsightsOrgHotspotDto'];
10155
10308
  export type CodeInsightsSonarDto = components['schemas']['CodeInsightsSonarDto'];
10156
10309
  export type CodeInsightsSummaryDto = components['schemas']['CodeInsightsSummaryDto'];
10310
+ export type InsightsTestPyramidMaturityDto = components['schemas']['InsightsTestPyramidMaturityDto'];
10311
+ export type InsightsTestPyramidShapeLabelDto = components['schemas']['InsightsTestPyramidShapeLabelDto'];
10312
+ export type InsightsTestPyramidShapeDto = components['schemas']['InsightsTestPyramidShapeDto'];
10313
+ export type InsightsTestPyramidLayerCountsDto = components['schemas']['InsightsTestPyramidLayerCountsDto'];
10314
+ export type InsightsTestPyramidLayerPresentDto = components['schemas']['InsightsTestPyramidLayerPresentDto'];
10315
+ export type InsightsTestPyramidLayerPresenceDto = components['schemas']['InsightsTestPyramidLayerPresenceDto'];
10316
+ export type InsightsTestPyramidGapRepoDto = components['schemas']['InsightsTestPyramidGapRepoDto'];
10317
+ export type InsightsTestPyramidGapsByLayerDto = components['schemas']['InsightsTestPyramidGapsByLayerDto'];
10318
+ export type InsightsTestPyramidMaturityCountsDto = components['schemas']['InsightsTestPyramidMaturityCountsDto'];
10319
+ export type InsightsTestPyramidLayerPresenceMapDto = components['schemas']['InsightsTestPyramidLayerPresenceMapDto'];
10320
+ export type InsightsTestPyramidSummaryDto = components['schemas']['InsightsTestPyramidSummaryDto'];
10321
+ export type InsightsTestPyramidRepoItemDto = components['schemas']['InsightsTestPyramidRepoItemDto'];
10322
+ export type InsightsTestPyramidRepoListDto = components['schemas']['InsightsTestPyramidRepoListDto'];
10157
10323
  export type ResponseUnauthorized = components['responses']['Unauthorized'];
10158
10324
  export type ResponseForbidden = components['responses']['Forbidden'];
10159
10325
  export type ResponseZenHrSyncInProgress = components['responses']['ZenHrSyncInProgress'];
@@ -10185,6 +10351,8 @@ export type ParameterPaginationOrder = components['parameters']['PaginationOrder
10185
10351
  export type ParameterReadinessRepoSort = components['parameters']['ReadinessRepoSort'];
10186
10352
  export type ParameterCodeInsightsRepoSort = components['parameters']['CodeInsightsRepoSort'];
10187
10353
  export type ParameterCodeInsightsRepoSearch = components['parameters']['CodeInsightsRepoSearch'];
10354
+ export type ParameterInsightsTestPyramidRepoSort = components['parameters']['InsightsTestPyramidRepoSort'];
10355
+ export type ParameterInsightsTestPyramidRepoSearch = components['parameters']['InsightsTestPyramidRepoSearch'];
10188
10356
  export type ParameterReadinessRepoSearch = components['parameters']['ReadinessRepoSearch'];
10189
10357
  export type ParameterReadinessRepoLanguage = components['parameters']['ReadinessRepoLanguage'];
10190
10358
  export type ParameterReadinessFixSort = components['parameters']['ReadinessFixSort'];
@@ -14108,6 +14276,106 @@ export interface operations {
14108
14276
  };
14109
14277
  };
14110
14278
  };
14279
+ getInsightsTestPyramidSummary: {
14280
+ parameters: {
14281
+ query?: never;
14282
+ header?: never;
14283
+ path: {
14284
+ workspaceId: components["parameters"]["WorkspaceId"];
14285
+ };
14286
+ cookie?: never;
14287
+ };
14288
+ requestBody?: never;
14289
+ responses: {
14290
+ /** @description Test pyramid assessment workspace summary */
14291
+ 200: {
14292
+ headers: {
14293
+ [name: string]: unknown;
14294
+ };
14295
+ content: {
14296
+ "application/json": components["schemas"]["InsightsTestPyramidSummaryDto"];
14297
+ };
14298
+ };
14299
+ 401: components["responses"]["Unauthorized"];
14300
+ 403: components["responses"]["Forbidden"];
14301
+ /** @description Workspace does not exist or malformed workspaceId */
14302
+ 404: {
14303
+ headers: {
14304
+ [name: string]: unknown;
14305
+ };
14306
+ content?: never;
14307
+ };
14308
+ /** @description Test pyramid history not supported by store */
14309
+ 501: {
14310
+ headers: {
14311
+ [name: string]: unknown;
14312
+ };
14313
+ content: {
14314
+ "application/json": components["schemas"]["ErrorMessageDto"];
14315
+ };
14316
+ };
14317
+ };
14318
+ };
14319
+ listInsightsTestPyramidRepos: {
14320
+ parameters: {
14321
+ query?: {
14322
+ /** @description Page size (default 25, max 100). */
14323
+ limit?: components["parameters"]["PaginationLimit"];
14324
+ /** @description Zero-based row offset into the filtered, sorted result set. */
14325
+ offset?: components["parameters"]["PaginationOffset"];
14326
+ /** @description Allowlisted Test pyramid assessment repo sort field. */
14327
+ sort?: components["parameters"]["InsightsTestPyramidRepoSort"];
14328
+ /** @description Sort direction. */
14329
+ order?: components["parameters"]["PaginationOrder"];
14330
+ /** @description Case-insensitive substring filter on repository name. */
14331
+ search?: components["parameters"]["InsightsTestPyramidRepoSearch"];
14332
+ };
14333
+ header?: never;
14334
+ path: {
14335
+ workspaceId: components["parameters"]["WorkspaceId"];
14336
+ };
14337
+ cookie?: never;
14338
+ };
14339
+ requestBody?: never;
14340
+ responses: {
14341
+ /** @description Paginated test pyramid assessment repo rows */
14342
+ 200: {
14343
+ headers: {
14344
+ [name: string]: unknown;
14345
+ };
14346
+ content: {
14347
+ "application/json": components["schemas"]["InsightsTestPyramidRepoListDto"];
14348
+ };
14349
+ };
14350
+ /** @description Invalid pagination or sort query */
14351
+ 400: {
14352
+ headers: {
14353
+ [name: string]: unknown;
14354
+ };
14355
+ content: {
14356
+ "application/json": components["schemas"]["ErrorMessageDto"];
14357
+ };
14358
+ };
14359
+ 401: components["responses"]["Unauthorized"];
14360
+ 403: components["responses"]["Forbidden"];
14361
+ /** @description Workspace does not exist or malformed workspaceId */
14362
+ 404: {
14363
+ headers: {
14364
+ [name: string]: unknown;
14365
+ };
14366
+ content?: never;
14367
+ };
14368
+ /** @description Test pyramid history not supported by store */
14369
+ 501: {
14370
+ headers: {
14371
+ [name: string]: unknown;
14372
+ };
14373
+ content: {
14374
+ "application/json": components["schemas"]["ErrorMessageDto"];
14375
+ };
14376
+ };
14377
+ };
14378
+ };
14111
14379
  getAiToolMembers: {
14112
14380
  parameters: {
14113
14381
  query?: {