@thinkai/tai-api-contract 2.95.0 → 2.97.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.95.0
4
+ version: 2.97.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}/...`.
@@ -1492,6 +1492,51 @@ paths:
1492
1492
  schema:
1493
1493
  $ref: "#/components/schemas/ErrorMessageDto"
1494
1494
 
1495
+ /workspaces/{workspaceId}/delivery-topology:
1496
+ put:
1497
+ tags: [Workspace]
1498
+ summary: Set workspace delivery topology
1499
+ description: >
1500
+ Persist the workspace delivery topology used by federated readiness assessment:
1501
+ which connected repos hold terraform / gitops / ci_templates / api_contracts
1502
+ artifacts, plus optional per-service overrides. Role and override `providerSlug`
1503
+ values must reference repos connected to this workspace, otherwise the request is
1504
+ rejected with `400 invalid_delivery_topology`. Send `null` (or
1505
+ `{ "deliveryTopology": null }`) to clear the topology.
1506
+
1507
+ Requires editor or admin workspace role.
1508
+ operationId: putWorkspaceDeliveryTopology
1509
+ parameters:
1510
+ - $ref: "#/components/parameters/WorkspaceId"
1511
+ requestBody:
1512
+ required: true
1513
+ content:
1514
+ application/json:
1515
+ schema:
1516
+ type: object
1517
+ nullable: true
1518
+ allOf:
1519
+ - $ref: "#/components/schemas/DeliveryTopologyDto"
1520
+ responses:
1521
+ "204":
1522
+ description: Topology persisted (or cleared).
1523
+ "400":
1524
+ description: Invalid topology payload or unconnected repo referenced.
1525
+ content:
1526
+ application/json:
1527
+ schema:
1528
+ $ref: "#/components/schemas/ErrorMessageDto"
1529
+ "401":
1530
+ $ref: "#/components/responses/Unauthorized"
1531
+ "403":
1532
+ $ref: "#/components/responses/Forbidden"
1533
+ "404":
1534
+ description: Workspace does not exist or malformed workspaceId
1535
+ content:
1536
+ application/json:
1537
+ schema:
1538
+ $ref: "#/components/schemas/ErrorMessageDto"
1539
+
1495
1540
  /workspaces/{workspaceId}/sources:
1496
1541
  put:
1497
1542
  tags: [Workspace]
@@ -1550,6 +1595,7 @@ paths:
1550
1595
  - $ref: "#/components/schemas/GrafanaSourceDto"
1551
1596
  - $ref: "#/components/schemas/SonarQubeSourceDto"
1552
1597
  - $ref: "#/components/schemas/PagerDutySourceDto"
1598
+ - $ref: "#/components/schemas/JiraSourceDto"
1553
1599
  - $ref: "#/components/schemas/TenantSourceEntryDto"
1554
1600
  examples:
1555
1601
  cursorAndJira:
@@ -1645,6 +1691,8 @@ paths:
1645
1691
  required; optional `branch`) calls `GET {baseUrl}/api/measures/component` with a Bearer
1646
1692
  token. Other types report `{ success: false, error: "unsupported_type" }`. Documented
1647
1693
  `error` codes for AI tool verifiers: `invalid_token`, `rate_limited`, `network_error`.
1694
+ `jira` (`baseUrl`, `email`, `apiToken` or legacy `api_key`) calls
1695
+ `GET {baseUrl}/rest/api/3/myself` with Basic auth.
1648
1696
 
1649
1697
  **Typical outcomes:** Malformed body, missing `type`, invalid `type`, or missing required fields for the
1650
1698
  declared type → `400` with `{ error: "..." }`. Well-formed body with bad credentials or unreachable
@@ -1668,6 +1716,7 @@ paths:
1668
1716
  - $ref: "#/components/schemas/GrafanaSourceDto"
1669
1717
  - $ref: "#/components/schemas/SonarQubeSourceDto"
1670
1718
  - $ref: "#/components/schemas/PagerDutySourceDto"
1719
+ - $ref: "#/components/schemas/JiraSourceDto"
1671
1720
  - $ref: "#/components/schemas/TenantSourceEntryDto"
1672
1721
  examples:
1673
1722
  cursorValid:
@@ -10201,6 +10250,73 @@ components:
10201
10250
  type: string
10202
10251
  description: PagerDuty user email when known from the last successful verify.
10203
10252
 
10253
+ JiraSourceDto:
10254
+ type: object
10255
+ description: >
10256
+ Jira Cloud source for `PUT /workspaces/{workspaceId}/sources` and
10257
+ `POST /workspaces/{workspaceId}/sources/test`. Uses Atlassian Cloud email + API token
10258
+ (Basic auth). Provide `apiToken` (preferred) or legacy write-only `api_key`; the server
10259
+ normalizes `api_key` to `apiToken` on write.
10260
+ required: [type, baseUrl, email]
10261
+ additionalProperties: false
10262
+ properties:
10263
+ type:
10264
+ type: string
10265
+ enum: [jira]
10266
+ baseUrl:
10267
+ type: string
10268
+ minLength: 1
10269
+ description: Jira Cloud site URL (e.g. `https://your-domain.atlassian.net`).
10270
+ email:
10271
+ type: string
10272
+ minLength: 1
10273
+ description: Atlassian account email used with the API token.
10274
+ apiToken:
10275
+ type: string
10276
+ minLength: 1
10277
+ maxLength: 512
10278
+ description: Atlassian API token (write-only on PUT; preferred).
10279
+ api_key:
10280
+ type: string
10281
+ minLength: 1
10282
+ maxLength: 512
10283
+ description: >
10284
+ Deprecated write-only alias for `apiToken`. Accepted for backward compatibility;
10285
+ normalized to `apiToken` and never returned on GET `/config`.
10286
+ userName:
10287
+ type: string
10288
+ description: Optional display name from a successful connection test (echo-after-test).
10289
+ accountId:
10290
+ type: string
10291
+ description: Optional Atlassian account id from a successful connection test.
10292
+
10293
+ JiraSourceConfigDto:
10294
+ type: object
10295
+ description: >
10296
+ Redacted Jira source returned by `GET /workspaces/{workspaceId}/config`.
10297
+ Raw API token is never returned.
10298
+ required: [type, hasToken, baseUrl, email]
10299
+ additionalProperties: false
10300
+ properties:
10301
+ type:
10302
+ type: string
10303
+ enum: [jira]
10304
+ hasToken:
10305
+ type: boolean
10306
+ description: Whether an API token is stored for this workspace.
10307
+ baseUrl:
10308
+ type: string
10309
+ description: Configured Jira Cloud site URL.
10310
+ email:
10311
+ type: string
10312
+ description: Atlassian account email associated with the stored token.
10313
+ userName:
10314
+ type: string
10315
+ description: Display name when known from the last successful verify.
10316
+ accountId:
10317
+ type: string
10318
+ description: Atlassian account id when known from the last successful verify.
10319
+
10204
10320
  AgentExecutionProviderDto:
10205
10321
  type: string
10206
10322
  description: >
@@ -10252,6 +10368,7 @@ components:
10252
10368
  - $ref: "#/components/schemas/GrafanaSourceConfigDto"
10253
10369
  - $ref: "#/components/schemas/SonarQubeSourceConfigDto"
10254
10370
  - $ref: "#/components/schemas/PagerDutySourceConfigDto"
10371
+ - $ref: "#/components/schemas/JiraSourceConfigDto"
10255
10372
  - $ref: "#/components/schemas/TenantSourceEntryDto"
10256
10373
  orgChart:
10257
10374
  nullable: true
@@ -10303,6 +10420,79 @@ components:
10303
10420
  hasCodeIntelligenceExecutionToken:
10304
10421
  type: boolean
10305
10422
  description: True when a dedicated `code_intelligence` source has a stored executionToken.
10423
+ deliveryTopology:
10424
+ type: object
10425
+ nullable: true
10426
+ allOf:
10427
+ - $ref: "#/components/schemas/DeliveryTopologyDto"
10428
+ description: >
10429
+ Federated-readiness delivery topology: which connected repos hold terraform /
10430
+ gitops / ci_templates / api_contracts truth for this workspace. Null when not
10431
+ configured. Change via `PUT /workspaces/{workspaceId}/delivery-topology`.
10432
+
10433
+ DeliveryRoleConfigDto:
10434
+ type: object
10435
+ required: [providerSlug]
10436
+ properties:
10437
+ providerSlug:
10438
+ type: string
10439
+ description: Connected workspace repo (`owner/repo`) that holds this role's artifacts.
10440
+ engine:
10441
+ type: string
10442
+ enum: [terraform, pulumi, cdk]
10443
+ description: IaC engine hint (terraform role only).
10444
+ type:
10445
+ type: string
10446
+ enum: [reusable_workflows]
10447
+ description: CI templates flavor (ci_templates role only).
10448
+ custom:
10449
+ type: boolean
10450
+ description: Set true for extension roles outside the known role keys.
10451
+ RepoDeliveryOverrideDto:
10452
+ type: object
10453
+ properties:
10454
+ deliveryModel:
10455
+ type: string
10456
+ enum: [auto, k8s_microservices, mobile_store, web_hosting, data_pipelines, monorepo, library, hybrid]
10457
+ roles:
10458
+ type: object
10459
+ additionalProperties:
10460
+ type: string
10461
+ description: Per-service role → providerSlug overrides (merged over workspace roles).
10462
+ targetPathHint:
10463
+ type: string
10464
+ description: Path prefix inside platform repos where this service's artifacts live.
10465
+ DeliveryTopologyDto:
10466
+ type: object
10467
+ required: [deliveryModel, ciProvider, splitInfra, roles, repoOverrides]
10468
+ properties:
10469
+ deliveryModel:
10470
+ type: string
10471
+ enum: [auto, k8s_microservices, mobile_store, web_hosting, data_pipelines, monorepo, library, hybrid]
10472
+ ciProvider:
10473
+ type: string
10474
+ enum: [github_actions, jenkins, gitlab, bitbucket, hybrid, external_documented]
10475
+ splitInfra:
10476
+ type: boolean
10477
+ description: True when infra/delivery artifacts live outside service repos.
10478
+ roles:
10479
+ type: object
10480
+ additionalProperties:
10481
+ $ref: "#/components/schemas/DeliveryRoleConfigDto"
10482
+ description: >
10483
+ Role → platform repo mapping. Known keys: terraform, gitops, ci_templates,
10484
+ jenkins_shared, mobile_release, hosting, data_platform, api_contracts, sonar_config.
10485
+ servicePathConvention:
10486
+ type: string
10487
+ nullable: true
10488
+ description: >
10489
+ Optional path template inside platform repos, e.g. `services/{repo_name}/`
10490
+ (`{repo_name}` and `{provider_slug}` placeholders supported).
10491
+ repoOverrides:
10492
+ type: object
10493
+ additionalProperties:
10494
+ $ref: "#/components/schemas/RepoDeliveryOverrideDto"
10495
+ description: Per-service-repo overrides keyed by provider slug.
10306
10496
 
10307
10497
  TestConnectionResponseDto:
10308
10498
  type: object
@@ -10329,13 +10519,13 @@ components:
10329
10519
  description: Error detail when `executionKeyValid` is false.
10330
10520
  userName:
10331
10521
  type: string
10332
- description: Present for New Relic or Grafana verify success — authenticated user name.
10522
+ description: Present for New Relic, Grafana, PagerDuty, or Jira verify success — authenticated user name.
10333
10523
  accountName:
10334
10524
  type: string
10335
10525
  description: Present for New Relic verify success — resolved account display name.
10336
10526
  accountId:
10337
10527
  type: string
10338
- description: Present for New Relic verify success — resolved account ID.
10528
+ description: Present for New Relic or Jira verify success — resolved account ID.
10339
10529
  orgName:
10340
10530
  type: string
10341
10531
  description: Present for Grafana verify success — resolved organization name.
@@ -14829,6 +15019,58 @@ components:
14829
15019
  per-repo "size / limit". When the size exceeds the limit the latest scan is recorded as
14830
15020
  `partial_failed` with `lastRunErrorCode = exceeded_repo_size_limit` and the repo is marked
14831
15021
  `ineligible`. Null until a scan has populated it.
15022
+ platformArchetype:
15023
+ type: string
15024
+ nullable: true
15025
+ enum: [terraform_platform, gitops_platform, ci_templates, api_contracts_platform]
15026
+ description: >
15027
+ Federated readiness: set when the repo was classified as a platform repository and
15028
+ scored with the reduced platform rubric profile. Null for service repos. The UI shows
15029
+ a "Platform repository" badge instead of comparing its score against service repos.
15030
+ linkedRoleAssessment:
15031
+ type: object
15032
+ nullable: true
15033
+ allOf:
15034
+ - $ref: "#/components/schemas/LinkedRoleAssessmentDto"
15035
+ description: >
15036
+ Federated readiness completeness for service repos: which linked platform roles
15037
+ (terraform/gitops/ci_templates/api_contracts, from the workspace delivery topology)
15038
+ are still missing scan evidence. Absent/null when no topology is configured or every
15039
+ declared role has fresh metadata (`complete: true`).
15040
+
15041
+ LinkedRolePendingDto:
15042
+ type: object
15043
+ required: [role, providerSlug, reason]
15044
+ properties:
15045
+ role:
15046
+ type: string
15047
+ description: Topology role key, e.g. terraform | gitops | ci_templates | api_contracts.
15048
+ providerSlug:
15049
+ type: string
15050
+ description: Platform repo (`owner/repo`) that must be scanned to satisfy this role.
15051
+ reason:
15052
+ type: string
15053
+ enum: [no_scan, no_metadata_emitted, stale]
15054
+ description: >
15055
+ `no_scan` — the platform repo has no successful readiness run yet;
15056
+ `no_metadata_emitted` — it was scanned but emitted no linkage for this service
15057
+ (wrong archetype or scan predates federated readiness); `stale` — metadata is older
15058
+ than the hard TTL (30 days) and must be refreshed by re-scanning the platform repo.
15059
+ lastRunAt:
15060
+ type: string
15061
+ format: date-time
15062
+ nullable: true
15063
+ description: Latest succeeded scan of the platform repo, when one exists.
15064
+ LinkedRoleAssessmentDto:
15065
+ type: object
15066
+ required: [complete, pending]
15067
+ properties:
15068
+ complete:
15069
+ type: boolean
15070
+ pending:
15071
+ type: array
15072
+ items:
15073
+ $ref: "#/components/schemas/LinkedRolePendingDto"
14832
15074
 
14833
15075
  RepoReadinessScoreDetailDto:
14834
15076
  type: object
@@ -14948,6 +15190,17 @@ components:
14948
15190
  nullable: true
14949
15191
  minimum: 0
14950
15192
  description: GitHub-reported repository size in KB, refreshed on each scan. See RepoReadinessScoreDto.sizeKb.
15193
+ platformArchetype:
15194
+ type: string
15195
+ nullable: true
15196
+ enum: [terraform_platform, gitops_platform, ci_templates, api_contracts_platform]
15197
+ description: See RepoReadinessScoreDto.platformArchetype.
15198
+ linkedRoleAssessment:
15199
+ type: object
15200
+ nullable: true
15201
+ allOf:
15202
+ - $ref: "#/components/schemas/LinkedRoleAssessmentDto"
15203
+ description: See RepoReadinessScoreDto.linkedRoleAssessment.
14951
15204
 
14952
15205
  AgenticFoundationDashboardSummaryDto:
14953
15206
  type: object
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thinkai/tai-api-contract",
3
- "version": "2.95.0",
3
+ "version": "2.97.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -561,6 +561,27 @@ export interface paths {
561
561
  patch?: never;
562
562
  trace?: never;
563
563
  };
564
+ "/workspaces/{workspaceId}/delivery-topology": {
565
+ parameters: {
566
+ query?: never;
567
+ header?: never;
568
+ path?: never;
569
+ cookie?: never;
570
+ };
571
+ get?: never;
572
+ /**
573
+ * Set workspace delivery topology
574
+ * @description Persist the workspace delivery topology used by federated readiness assessment: which connected repos hold terraform / gitops / ci_templates / api_contracts artifacts, plus optional per-service overrides. Role and override `providerSlug` values must reference repos connected to this workspace, otherwise the request is rejected with `400 invalid_delivery_topology`. Send `null` (or `{ "deliveryTopology": null }`) to clear the topology.
575
+ * Requires editor or admin workspace role.
576
+ */
577
+ put: operations["putWorkspaceDeliveryTopology"];
578
+ post?: never;
579
+ delete?: never;
580
+ options?: never;
581
+ head?: never;
582
+ patch?: never;
583
+ trace?: never;
584
+ };
564
585
  "/workspaces/{workspaceId}/sources": {
565
586
  parameters: {
566
587
  query?: never;
@@ -596,7 +617,7 @@ export interface paths {
596
617
  /**
597
618
  * Test one source connection (does not persist)
598
619
  * @description Verify a source's credentials without persisting them. Always returns 200 — upstream auth, rate-limit, and network failures surface as `{ success: false, error }` so the SPA can render an inline error.
599
- * Registered AI tools are verified end-to-end: `cursor` (Admin API key in `token` and/or execution key in `executionToken`; at least one must be present). Execution-only tests validate the key against the Cloud Agents API (`GET /v1/me`, with `GET /v1/models` fallback for service accounts) and return `executionKeyValid` / `executionKeyError` without calling the Admin API on `token`. Malformed cursor entries return `400` with `code: invalid_source_entry`. `claude` (Anthropic Admin API at `https://api.anthropic.com`, `X-Api-Key` with an organization Admin API key `sk-ant-admin...`). `sonarqube` (`baseUrl`, `token`, `projectKey` required; optional `branch`) calls `GET {baseUrl}/api/measures/component` with a Bearer token. Other types report `{ success: false, error: "unsupported_type" }`. Documented `error` codes for AI tool verifiers: `invalid_token`, `rate_limited`, `network_error`.
620
+ * Registered AI tools are verified end-to-end: `cursor` (Admin API key in `token` and/or execution key in `executionToken`; at least one must be present). Execution-only tests validate the key against the Cloud Agents API (`GET /v1/me`, with `GET /v1/models` fallback for service accounts) and return `executionKeyValid` / `executionKeyError` without calling the Admin API on `token`. Malformed cursor entries return `400` with `code: invalid_source_entry`. `claude` (Anthropic Admin API at `https://api.anthropic.com`, `X-Api-Key` with an organization Admin API key `sk-ant-admin...`). `sonarqube` (`baseUrl`, `token`, `projectKey` required; optional `branch`) calls `GET {baseUrl}/api/measures/component` with a Bearer token. Other types report `{ success: false, error: "unsupported_type" }`. Documented `error` codes for AI tool verifiers: `invalid_token`, `rate_limited`, `network_error`. `jira` (`baseUrl`, `email`, `apiToken` or legacy `api_key`) calls `GET {baseUrl}/rest/api/3/myself` with Basic auth.
600
621
  * **Typical outcomes:** Malformed body, missing `type`, invalid `type`, or missing required fields for the declared type → `400` with `{ error: "..." }`. Well-formed body with bad credentials or unreachable service → `200` with `{ success: false, error: "..." }`.
601
622
  */
602
623
  post: operations["postTenantSourceTest"];
@@ -4106,6 +4127,38 @@ export interface components {
4106
4127
  /** @description PagerDuty user email when known from the last successful verify. */
4107
4128
  userEmail?: string;
4108
4129
  };
4130
+ /** @description Jira Cloud source for `PUT /workspaces/{workspaceId}/sources` and `POST /workspaces/{workspaceId}/sources/test`. Uses Atlassian Cloud email + API token (Basic auth). Provide `apiToken` (preferred) or legacy write-only `api_key`; the server normalizes `api_key` to `apiToken` on write. */
4131
+ JiraSourceDto: {
4132
+ /** @enum {string} */
4133
+ type: "jira";
4134
+ /** @description Jira Cloud site URL (e.g. `https://your-domain.atlassian.net`). */
4135
+ baseUrl: string;
4136
+ /** @description Atlassian account email used with the API token. */
4137
+ email: string;
4138
+ /** @description Atlassian API token (write-only on PUT; preferred). */
4139
+ apiToken?: string;
4140
+ /** @description Deprecated write-only alias for `apiToken`. Accepted for backward compatibility; normalized to `apiToken` and never returned on GET `/config`. */
4141
+ api_key?: string;
4142
+ /** @description Optional display name from a successful connection test (echo-after-test). */
4143
+ userName?: string;
4144
+ /** @description Optional Atlassian account id from a successful connection test. */
4145
+ accountId?: string;
4146
+ };
4147
+ /** @description Redacted Jira source returned by `GET /workspaces/{workspaceId}/config`. Raw API token is never returned. */
4148
+ JiraSourceConfigDto: {
4149
+ /** @enum {string} */
4150
+ type: "jira";
4151
+ /** @description Whether an API token is stored for this workspace. */
4152
+ hasToken: boolean;
4153
+ /** @description Configured Jira Cloud site URL. */
4154
+ baseUrl: string;
4155
+ /** @description Atlassian account email associated with the stored token. */
4156
+ email: string;
4157
+ /** @description Display name when known from the last successful verify. */
4158
+ userName?: string;
4159
+ /** @description Atlassian account id when known from the last successful verify. */
4160
+ accountId?: string;
4161
+ };
4109
4162
  /**
4110
4163
  * @description The agent execution account used for Agentic Foundation runs (readiness scanner + fix queue). Exactly one is active per workspace.
4111
4164
  * - `thinkai_platform_cursor`: ThinkAI platform Cursor key (Cursor Agent CLI) — opt-in, never default.
@@ -4124,7 +4177,7 @@ export interface components {
4124
4177
  claudeModel?: string | null;
4125
4178
  };
4126
4179
  WorkspaceConfigDto: {
4127
- sources: (components["schemas"]["CursorSourceConfigDto"] | components["schemas"]["ClaudeSourceConfigDto"] | components["schemas"]["CodeIntelligenceSourceConfigDto"] | components["schemas"]["NewRelicSourceConfigDto"] | components["schemas"]["PrometheusSourceConfigDto"] | components["schemas"]["GrafanaSourceConfigDto"] | components["schemas"]["SonarQubeSourceConfigDto"] | components["schemas"]["PagerDutySourceConfigDto"] | components["schemas"]["TenantSourceEntryDto"])[];
4180
+ sources: (components["schemas"]["CursorSourceConfigDto"] | components["schemas"]["ClaudeSourceConfigDto"] | components["schemas"]["CodeIntelligenceSourceConfigDto"] | components["schemas"]["NewRelicSourceConfigDto"] | components["schemas"]["PrometheusSourceConfigDto"] | components["schemas"]["GrafanaSourceConfigDto"] | components["schemas"]["SonarQubeSourceConfigDto"] | components["schemas"]["PagerDutySourceConfigDto"] | components["schemas"]["JiraSourceConfigDto"] | components["schemas"]["TenantSourceEntryDto"])[];
4128
4181
  orgChart?: components["schemas"]["ScoringOrgChartDto"] | null;
4129
4182
  /** @enum {string|null} */
4130
4183
  region?: "us" | "eu" | "me" | null;
@@ -4150,6 +4203,52 @@ export interface components {
4150
4203
  codeIntelligenceClaudeModel?: string | null;
4151
4204
  /** @description True when a dedicated `code_intelligence` source has a stored executionToken. */
4152
4205
  hasCodeIntelligenceExecutionToken?: boolean;
4206
+ /** @description Federated-readiness delivery topology: which connected repos hold terraform / gitops / ci_templates / api_contracts truth for this workspace. Null when not configured. Change via `PUT /workspaces/{workspaceId}/delivery-topology`. */
4207
+ deliveryTopology?: components["schemas"]["DeliveryTopologyDto"] | null;
4208
+ };
4209
+ DeliveryRoleConfigDto: {
4210
+ /** @description Connected workspace repo (`owner/repo`) that holds this role's artifacts. */
4211
+ providerSlug: string;
4212
+ /**
4213
+ * @description IaC engine hint (terraform role only).
4214
+ * @enum {string}
4215
+ */
4216
+ engine?: "terraform" | "pulumi" | "cdk";
4217
+ /**
4218
+ * @description CI templates flavor (ci_templates role only).
4219
+ * @enum {string}
4220
+ */
4221
+ type?: "reusable_workflows";
4222
+ /** @description Set true for extension roles outside the known role keys. */
4223
+ custom?: boolean;
4224
+ };
4225
+ RepoDeliveryOverrideDto: {
4226
+ /** @enum {string} */
4227
+ deliveryModel?: "auto" | "k8s_microservices" | "mobile_store" | "web_hosting" | "data_pipelines" | "monorepo" | "library" | "hybrid";
4228
+ /** @description Per-service role → providerSlug overrides (merged over workspace roles). */
4229
+ roles?: {
4230
+ [key: string]: string;
4231
+ };
4232
+ /** @description Path prefix inside platform repos where this service's artifacts live. */
4233
+ targetPathHint?: string;
4234
+ };
4235
+ DeliveryTopologyDto: {
4236
+ /** @enum {string} */
4237
+ deliveryModel: "auto" | "k8s_microservices" | "mobile_store" | "web_hosting" | "data_pipelines" | "monorepo" | "library" | "hybrid";
4238
+ /** @enum {string} */
4239
+ ciProvider: "github_actions" | "jenkins" | "gitlab" | "bitbucket" | "hybrid" | "external_documented";
4240
+ /** @description True when infra/delivery artifacts live outside service repos. */
4241
+ splitInfra: boolean;
4242
+ /** @description Role → platform repo mapping. Known keys: terraform, gitops, ci_templates, jenkins_shared, mobile_release, hosting, data_platform, api_contracts, sonar_config. */
4243
+ roles: {
4244
+ [key: string]: components["schemas"]["DeliveryRoleConfigDto"];
4245
+ };
4246
+ /** @description Optional path template inside platform repos, e.g. `services/{repo_name}/` (`{repo_name}` and `{provider_slug}` placeholders supported). */
4247
+ servicePathConvention?: string | null;
4248
+ /** @description Per-service-repo overrides keyed by provider slug. */
4249
+ repoOverrides: {
4250
+ [key: string]: components["schemas"]["RepoDeliveryOverrideDto"];
4251
+ };
4153
4252
  };
4154
4253
  TestConnectionResponseDto: {
4155
4254
  success: boolean;
@@ -4159,11 +4258,11 @@ export interface components {
4159
4258
  executionKeyValid?: boolean | null;
4160
4259
  /** @description Error detail when `executionKeyValid` is false. */
4161
4260
  executionKeyError?: string | null;
4162
- /** @description Present for New Relic or Grafana verify success — authenticated user name. */
4261
+ /** @description Present for New Relic, Grafana, PagerDuty, or Jira verify success — authenticated user name. */
4163
4262
  userName?: string;
4164
4263
  /** @description Present for New Relic verify success — resolved account display name. */
4165
4264
  accountName?: string;
4166
- /** @description Present for New Relic verify success — resolved account ID. */
4265
+ /** @description Present for New Relic or Jira verify success — resolved account ID. */
4167
4266
  accountId?: string;
4168
4267
  /** @description Present for Grafana verify success — resolved organization name. */
4169
4268
  orgName?: string;
@@ -6337,6 +6436,33 @@ export interface components {
6337
6436
  }[] | null;
6338
6437
  /** @description GitHub-reported repository size in KB (includes git history), refreshed on each readiness scan (#729). Compare against `eligibilityLimits.maxRepoSizeKb` on the list response to show per-repo "size / limit". When the size exceeds the limit the latest scan is recorded as `partial_failed` with `lastRunErrorCode = exceeded_repo_size_limit` and the repo is marked `ineligible`. Null until a scan has populated it. */
6339
6438
  sizeKb?: number | null;
6439
+ /**
6440
+ * @description Federated readiness: set when the repo was classified as a platform repository and scored with the reduced platform rubric profile. Null for service repos. The UI shows a "Platform repository" badge instead of comparing its score against service repos.
6441
+ * @enum {string|null}
6442
+ */
6443
+ platformArchetype?: "terraform_platform" | "gitops_platform" | "ci_templates" | "api_contracts_platform" | null;
6444
+ /** @description Federated readiness completeness for service repos: which linked platform roles (terraform/gitops/ci_templates/api_contracts, from the workspace delivery topology) are still missing scan evidence. Absent/null when no topology is configured or every declared role has fresh metadata (`complete: true`). */
6445
+ linkedRoleAssessment?: components["schemas"]["LinkedRoleAssessmentDto"] | null;
6446
+ };
6447
+ LinkedRolePendingDto: {
6448
+ /** @description Topology role key, e.g. terraform | gitops | ci_templates | api_contracts. */
6449
+ role: string;
6450
+ /** @description Platform repo (`owner/repo`) that must be scanned to satisfy this role. */
6451
+ providerSlug: string;
6452
+ /**
6453
+ * @description `no_scan` — the platform repo has no successful readiness run yet; `no_metadata_emitted` — it was scanned but emitted no linkage for this service (wrong archetype or scan predates federated readiness); `stale` — metadata is older than the hard TTL (30 days) and must be refreshed by re-scanning the platform repo.
6454
+ * @enum {string}
6455
+ */
6456
+ reason: "no_scan" | "no_metadata_emitted" | "stale";
6457
+ /**
6458
+ * Format: date-time
6459
+ * @description Latest succeeded scan of the platform repo, when one exists.
6460
+ */
6461
+ lastRunAt?: string | null;
6462
+ };
6463
+ LinkedRoleAssessmentDto: {
6464
+ complete: boolean;
6465
+ pending: components["schemas"]["LinkedRolePendingDto"][];
6340
6466
  };
6341
6467
  /** @description Single-repo detail response. Identical to RepoReadinessScoreDto except dimensions use DimensionScoreDetailDto (criteriaDetails required per dimension). */
6342
6468
  RepoReadinessScoreDetailDto: {
@@ -6388,6 +6514,13 @@ export interface components {
6388
6514
  }[] | null;
6389
6515
  /** @description GitHub-reported repository size in KB, refreshed on each scan. See RepoReadinessScoreDto.sizeKb. */
6390
6516
  sizeKb?: number | null;
6517
+ /**
6518
+ * @description See RepoReadinessScoreDto.platformArchetype.
6519
+ * @enum {string|null}
6520
+ */
6521
+ platformArchetype?: "terraform_platform" | "gitops_platform" | "ci_templates" | "api_contracts_platform" | null;
6522
+ /** @description See RepoReadinessScoreDto.linkedRoleAssessment. */
6523
+ linkedRoleAssessment?: components["schemas"]["LinkedRoleAssessmentDto"] | null;
6391
6524
  };
6392
6525
  AgenticFoundationDashboardSummaryDto: {
6393
6526
  repoCount: number;
@@ -8254,9 +8387,14 @@ export type SonarQubeRepoMappingValidateRowDto = components['schemas']['SonarQub
8254
8387
  export type SonarQubeRepoMappingsValidateResponseDto = components['schemas']['SonarQubeRepoMappingsValidateResponseDto'];
8255
8388
  export type PagerDutySourceDto = components['schemas']['PagerDutySourceDto'];
8256
8389
  export type PagerDutySourceConfigDto = components['schemas']['PagerDutySourceConfigDto'];
8390
+ export type JiraSourceDto = components['schemas']['JiraSourceDto'];
8391
+ export type JiraSourceConfigDto = components['schemas']['JiraSourceConfigDto'];
8257
8392
  export type AgentExecutionProviderDto = components['schemas']['AgentExecutionProviderDto'];
8258
8393
  export type PutCodeIntelligenceSettingsDto = components['schemas']['PutCodeIntelligenceSettingsDto'];
8259
8394
  export type WorkspaceConfigDto = components['schemas']['WorkspaceConfigDto'];
8395
+ export type DeliveryRoleConfigDto = components['schemas']['DeliveryRoleConfigDto'];
8396
+ export type RepoDeliveryOverrideDto = components['schemas']['RepoDeliveryOverrideDto'];
8397
+ export type DeliveryTopologyDto = components['schemas']['DeliveryTopologyDto'];
8260
8398
  export type TestConnectionResponseDto = components['schemas']['TestConnectionResponseDto'];
8261
8399
  export type CursorKeyUsageDto = components['schemas']['CursorKeyUsageDto'];
8262
8400
  export type AiToolSeatDto = components['schemas']['AiToolSeatDto'];
@@ -8430,6 +8568,8 @@ export type ReadinessScoreHistoryPointDto = components['schemas']['ReadinessScor
8430
8568
  export type ReadinessRepoScoreHistoryDto = components['schemas']['ReadinessRepoScoreHistoryDto'];
8431
8569
  export type WorkspaceReadinessScoreHistoryDto = components['schemas']['WorkspaceReadinessScoreHistoryDto'];
8432
8570
  export type RepoReadinessScoreDto = components['schemas']['RepoReadinessScoreDto'];
8571
+ export type LinkedRolePendingDto = components['schemas']['LinkedRolePendingDto'];
8572
+ export type LinkedRoleAssessmentDto = components['schemas']['LinkedRoleAssessmentDto'];
8433
8573
  export type RepoReadinessScoreDetailDto = components['schemas']['RepoReadinessScoreDetailDto'];
8434
8574
  export type AgenticFoundationDashboardSummaryDto = components['schemas']['AgenticFoundationDashboardSummaryDto'];
8435
8575
  export type PageMetaDto = components['schemas']['PageMetaDto'];
@@ -10208,6 +10348,50 @@ export interface operations {
10208
10348
  };
10209
10349
  };
10210
10350
  };
10351
+ putWorkspaceDeliveryTopology: {
10352
+ parameters: {
10353
+ query?: never;
10354
+ header?: never;
10355
+ path: {
10356
+ workspaceId: components["parameters"]["WorkspaceId"];
10357
+ };
10358
+ cookie?: never;
10359
+ };
10360
+ requestBody: {
10361
+ content: {
10362
+ "application/json": components["schemas"]["DeliveryTopologyDto"] | null;
10363
+ };
10364
+ };
10365
+ responses: {
10366
+ /** @description Topology persisted (or cleared). */
10367
+ 204: {
10368
+ headers: {
10369
+ [name: string]: unknown;
10370
+ };
10371
+ content?: never;
10372
+ };
10373
+ /** @description Invalid topology payload or unconnected repo referenced. */
10374
+ 400: {
10375
+ headers: {
10376
+ [name: string]: unknown;
10377
+ };
10378
+ content: {
10379
+ "application/json": components["schemas"]["ErrorMessageDto"];
10380
+ };
10381
+ };
10382
+ 401: components["responses"]["Unauthorized"];
10383
+ 403: components["responses"]["Forbidden"];
10384
+ /** @description Workspace does not exist or malformed workspaceId */
10385
+ 404: {
10386
+ headers: {
10387
+ [name: string]: unknown;
10388
+ };
10389
+ content: {
10390
+ "application/json": components["schemas"]["ErrorMessageDto"];
10391
+ };
10392
+ };
10393
+ };
10394
+ };
10211
10395
  putTenantSources: {
10212
10396
  parameters: {
10213
10397
  query?: never;
@@ -10220,7 +10404,7 @@ export interface operations {
10220
10404
  requestBody: {
10221
10405
  content: {
10222
10406
  "application/json": {
10223
- sources: (components["schemas"]["CursorSourcePatchDto"] | components["schemas"]["CursorSourceDto"] | components["schemas"]["ClaudeSourcePatchDto"] | components["schemas"]["ClaudeSourceDto"] | components["schemas"]["CodeIntelligenceSourcePatchDto"] | components["schemas"]["NewRelicSourceDto"] | components["schemas"]["PrometheusSourceDto"] | components["schemas"]["GrafanaSourceDto"] | components["schemas"]["SonarQubeSourceDto"] | components["schemas"]["PagerDutySourceDto"] | components["schemas"]["TenantSourceEntryDto"])[];
10407
+ sources: (components["schemas"]["CursorSourcePatchDto"] | components["schemas"]["CursorSourceDto"] | components["schemas"]["ClaudeSourcePatchDto"] | components["schemas"]["ClaudeSourceDto"] | components["schemas"]["CodeIntelligenceSourcePatchDto"] | components["schemas"]["NewRelicSourceDto"] | components["schemas"]["PrometheusSourceDto"] | components["schemas"]["GrafanaSourceDto"] | components["schemas"]["SonarQubeSourceDto"] | components["schemas"]["PagerDutySourceDto"] | components["schemas"]["JiraSourceDto"] | components["schemas"]["TenantSourceEntryDto"])[];
10224
10408
  };
10225
10409
  };
10226
10410
  };
@@ -10274,7 +10458,7 @@ export interface operations {
10274
10458
  };
10275
10459
  requestBody: {
10276
10460
  content: {
10277
- "application/json": components["schemas"]["CursorSourcePatchDto"] | components["schemas"]["CursorSourceDto"] | components["schemas"]["ClaudeSourcePatchDto"] | components["schemas"]["ClaudeSourceDto"] | components["schemas"]["CodeIntelligenceSourcePatchDto"] | components["schemas"]["NewRelicSourceDto"] | components["schemas"]["PrometheusSourceDto"] | components["schemas"]["GrafanaSourceDto"] | components["schemas"]["SonarQubeSourceDto"] | components["schemas"]["PagerDutySourceDto"] | components["schemas"]["TenantSourceEntryDto"];
10461
+ "application/json": components["schemas"]["CursorSourcePatchDto"] | components["schemas"]["CursorSourceDto"] | components["schemas"]["ClaudeSourcePatchDto"] | components["schemas"]["ClaudeSourceDto"] | components["schemas"]["CodeIntelligenceSourcePatchDto"] | components["schemas"]["NewRelicSourceDto"] | components["schemas"]["PrometheusSourceDto"] | components["schemas"]["GrafanaSourceDto"] | components["schemas"]["SonarQubeSourceDto"] | components["schemas"]["PagerDutySourceDto"] | components["schemas"]["JiraSourceDto"] | components["schemas"]["TenantSourceEntryDto"];
10278
10462
  };
10279
10463
  };
10280
10464
  responses: {