@thinkai/tai-api-contract 2.154.0 → 2.157.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.154.0
4
+ version: 2.157.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}/...`.
@@ -6957,6 +6957,8 @@ paths:
6957
6957
  open: 0
6958
6958
  prPending: 0
6959
6959
  fixed: 0
6960
+ verificationGapCount: 0
6961
+ verificationGaps: []
6960
6962
  dimensionAggregates: []
6961
6963
  fixStatusSummary:
6962
6964
  queued: 0
@@ -7492,7 +7494,9 @@ paths:
7492
7494
  schema:
7493
7495
  $ref: "#/components/schemas/FixRequestDto"
7494
7496
  "400":
7495
- description: Invalid body or malformed `repoId` (not a UUID)
7497
+ description: >
7498
+ Invalid body, malformed `repoId`, or a missing/unknown `patternChoice` when the issue
7499
+ has `unresolvedChoices` (`pattern_choice_required`, `pattern_choice_invalid`).
7496
7500
  content:
7497
7501
  application/json:
7498
7502
  schema:
@@ -9339,10 +9343,11 @@ paths:
9339
9343
  summary: Slack install URL for Message Center
9340
9344
  operationId: getSlackInstallUrl
9341
9345
  description: >
9342
- Workspace admin only. Returns the Slack OAuth authorize URL. State is stored
9343
- server-side and names this workspace and the signed-in admin. Editor or viewer
9344
- is `403` with `code` `workspace_admin_required`. Missing Slack app settings are
9345
- `503` with `code` `slack_not_configured`.
9346
+ Workspace admin only. Returns the Slack OAuth authorize URL with
9347
+ `incoming-webhook` scope. State is stored server-side and names this workspace
9348
+ and the signed-in admin. Editor or viewer is `403` with `code`
9349
+ `workspace_admin_required`. Missing Slack app settings are `503` with `code`
9350
+ `slack_not_configured`.
9346
9351
  security:
9347
9352
  - bearerAuth: []
9348
9353
  parameters:
@@ -9389,10 +9394,11 @@ paths:
9389
9394
  description: >
9390
9395
  Browser return from Slack. The provider redirect does not include the API
9391
9396
  bearer token. `state` was issued by `getSlackInstallUrl` to a signed-in admin
9392
- and is single-use. The bot token is stored encrypted only when that user is
9393
- still a workspace admin. Success redirects to
9397
+ and is single-use. Install requests `incoming-webhook` only. The encrypted
9398
+ incoming-webhook URL and the channel Slack returns are stored only when that
9399
+ user is still a workspace admin. Success redirects to
9394
9400
  `{spa}/workspace/preferences?chat=slack`. Failures redirect to the same
9395
- page with `slack=error`. The token is never in the redirect.
9401
+ page with `slack=error`. The webhook URL is never in the redirect.
9396
9402
  parameters:
9397
9403
  - name: code
9398
9404
  in: query
@@ -9427,8 +9433,10 @@ paths:
9427
9433
  summary: Slack connection status
9428
9434
  operationId: getSlackIntegration
9429
9435
  description: >
9430
- Any workspace member. `{ connected, channelName }`. `channelName` is null
9431
- until an admin saves a channel. The bot token is never returned.
9436
+ Any workspace member. `{ connected, channelName }`. `connected` is true only
9437
+ when a decryptable install webhook is stored. `channelName` is the channel
9438
+ chosen on Slack's install screen (null when not connected). Secrets are
9439
+ never returned.
9432
9440
  security:
9433
9441
  - bearerAuth: []
9434
9442
  parameters:
@@ -9455,8 +9463,8 @@ paths:
9455
9463
  summary: Disconnect Slack
9456
9464
  operationId: deleteSlackIntegration
9457
9465
  description: >
9458
- Workspace admin only. Removes the bot token and saved channel. Later
9459
- Message Center delivery does not post to Slack.
9466
+ Workspace admin only. Removes the install webhook, optional bot token, and
9467
+ saved channel. Later Message Center delivery does not post to Slack.
9460
9468
  security:
9461
9469
  - bearerAuth: []
9462
9470
  parameters:
@@ -9485,13 +9493,15 @@ paths:
9485
9493
  /workspaces/{workspaceId}/integrations/slack/channel:
9486
9494
  put:
9487
9495
  tags: [Integrations]
9488
- summary: Save the Slack channel for Message Center
9496
+ summary: Change Slack channel (requires reinstall)
9489
9497
  operationId: putSlackChannel
9490
9498
  description: >
9491
- Workspace admin only. Body `{ channelId }`. Slack must already be connected.
9492
- The response is the same status object as `getSlackIntegration`, with the
9493
- channel name Slack returned. Unknown or malformed `channelId` is `400`
9494
- `invalid_slack_channel`. Not connected is `409` `slack_not_connected`.
9499
+ Workspace admin only. Body `{ channelId }`. The notification channel is
9500
+ chosen on Slack's install screen with the incoming webhook; this route does
9501
+ not rewrite channel metadata. When Slack is connected, the API returns `409`
9502
+ with `code` `slack_channel_reinstall_required` — reconnect via
9503
+ `getSlackInstallUrl` to pick a different channel. Malformed `channelId` is
9504
+ `400` `invalid_slack_channel`. Not connected is `409` `slack_not_connected`.
9495
9505
  security:
9496
9506
  - bearerAuth: []
9497
9507
  parameters:
@@ -9504,19 +9514,21 @@ paths:
9504
9514
  $ref: "#/components/schemas/SlackChannelBodyDto"
9505
9515
  responses:
9506
9516
  "200":
9507
- description: Channel saved
9517
+ description: >
9518
+ Not returned. The channel is chosen on Slack's install screen; when
9519
+ connected the API responds with `409` `slack_channel_reinstall_required`.
9508
9520
  content:
9509
9521
  application/json:
9510
9522
  schema:
9511
9523
  $ref: "#/components/schemas/SlackIntegrationStatusDto"
9512
9524
  "400":
9513
- description: channelId is missing, malformed, or unknown to Slack
9525
+ description: channelId is missing or malformed
9514
9526
  content:
9515
9527
  application/json:
9516
9528
  schema:
9517
9529
  $ref: "#/components/schemas/ErrorMessageDto"
9518
9530
  example:
9519
- error: Slack channel was not found
9531
+ error: channelId is required
9520
9532
  code: invalid_slack_channel
9521
9533
  "401":
9522
9534
  $ref: "#/components/responses/Unauthorized"
@@ -9536,23 +9548,22 @@ paths:
9536
9548
  schema:
9537
9549
  $ref: "#/components/schemas/ErrorMessageDto"
9538
9550
  "409":
9539
- description: Slack is not connected
9540
- content:
9541
- application/json:
9542
- schema:
9543
- $ref: "#/components/schemas/ErrorMessageDto"
9544
- example:
9545
- error: Slack is not connected
9546
- code: slack_not_connected
9547
- "502":
9548
- description: Slack rejected the lookup
9551
+ description: >
9552
+ Slack is not connected (`slack_not_connected`), or the channel cannot be
9553
+ changed without a new install (`slack_channel_reinstall_required`).
9549
9554
  content:
9550
9555
  application/json:
9551
9556
  schema:
9552
9557
  $ref: "#/components/schemas/ErrorMessageDto"
9553
- example:
9554
- error: Slack did not accept the channel
9555
- code: slack_request_failed
9558
+ examples:
9559
+ notConnected:
9560
+ value:
9561
+ error: Slack is not connected
9562
+ code: slack_not_connected
9563
+ reinstallRequired:
9564
+ value:
9565
+ error: Reconnect Slack to change the notification channel
9566
+ code: slack_channel_reinstall_required
9556
9567
 
9557
9568
  /workspaces/{workspaceId}/notification-preferences:
9558
9569
  get:
@@ -17638,6 +17649,15 @@ components:
17638
17649
  True when the platform does not yet have an auto-fix skill for this
17639
17650
  issue's dimension. The UI should render these items as disabled with
17640
17651
  a "Coming Soon" tooltip.
17652
+ unresolvedChoices:
17653
+ type: array
17654
+ maxItems: 2
17655
+ description: >
17656
+ Short labels when the instruction file names two alternatives and does not pick one.
17657
+ Fix it stays disabled until the request includes one of these as patternChoice.
17658
+ items:
17659
+ type: string
17660
+ maxLength: 64
17641
17661
  fixTier:
17642
17662
  type: string
17643
17663
  enum: [auto, decisions-first, guidance]
@@ -18668,6 +18688,33 @@ components:
18668
18688
  type: integer
18669
18689
  minimum: 0
18670
18690
  description: Issues whose fix has been applied (fix_status = fixed).
18691
+ verificationGapCount:
18692
+ type: integer
18693
+ minimum: 0
18694
+ description: >-
18695
+ Distinct non-archived repos whose latest succeeded scan has an A1 gap
18696
+ (no instruction file) or a B5 gap (CI never runs tests). A gap whose
18697
+ matching issue is already fixed is excluded. Omitted when the server
18698
+ cannot see per-criterion status.
18699
+ verificationGaps:
18700
+ type: array
18701
+ maxItems: 12
18702
+ description: >-
18703
+ Up to 12 repo and reason pairs for verificationGapCount. A repo with
18704
+ both gaps appears twice. Does not change averageOverallScore.
18705
+ items:
18706
+ $ref: "#/components/schemas/AgenticFoundationVerificationGapDto"
18707
+
18708
+ AgenticFoundationVerificationGapDto:
18709
+ type: object
18710
+ additionalProperties: false
18711
+ required: [repoName, reason]
18712
+ properties:
18713
+ repoName:
18714
+ type: string
18715
+ reason:
18716
+ type: string
18717
+ enum: ["no instruction file", "CI never runs tests"]
18671
18718
 
18672
18719
  PageMetaDto:
18673
18720
  type: object
@@ -19075,6 +19122,12 @@ components:
19075
19122
  type: string
19076
19123
  format: uuid
19077
19124
  description: Workspace repository id that owns the issue
19125
+ patternChoice:
19126
+ type: string
19127
+ maxLength: 64
19128
+ description: >
19129
+ Required when the issue has unresolvedChoices. Must be one of those labels.
19130
+ Stored on the fix row and stated in the worker prompt.
19078
19131
 
19079
19132
  PhaseRoleDto:
19080
19133
  type: object
@@ -19600,7 +19653,8 @@ components:
19600
19653
  properties:
19601
19654
  url:
19602
19655
  type: string
19603
- description: Slack OAuth authorize URL. The bot token is not included.
19656
+ description: >
19657
+ Slack OAuth authorize URL (`incoming-webhook` scope). Secrets are not included.
19604
19658
 
19605
19659
  SlackIntegrationStatusDto:
19606
19660
  type: object
@@ -19609,10 +19663,13 @@ components:
19609
19663
  properties:
19610
19664
  connected:
19611
19665
  type: boolean
19666
+ description: >
19667
+ True only when a decryptable install webhook URL is stored for this workspace.
19612
19668
  channelName:
19613
19669
  type: string
19614
19670
  nullable: true
19615
- description: Saved channel name. Null until an admin saves a channel, and when disconnected.
19671
+ description: >
19672
+ Channel name returned by Slack at install time. Null when not connected.
19616
19673
 
19617
19674
  SlackChannelBodyDto:
19618
19675
  type: object
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thinkai/tai-api-contract",
3
- "version": "2.154.0",
3
+ "version": "2.157.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3774,7 +3774,7 @@ export interface paths {
3774
3774
  };
3775
3775
  /**
3776
3776
  * Slack install URL for Message Center
3777
- * @description Workspace admin only. Returns the Slack OAuth authorize URL. State is stored server-side and names this workspace and the signed-in admin. Editor or viewer is `403` with `code` `workspace_admin_required`. Missing Slack app settings are `503` with `code` `slack_not_configured`.
3777
+ * @description Workspace admin only. Returns the Slack OAuth authorize URL with `incoming-webhook` scope. State is stored server-side and names this workspace and the signed-in admin. Editor or viewer is `403` with `code` `workspace_admin_required`. Missing Slack app settings are `503` with `code` `slack_not_configured`.
3778
3778
  */
3779
3779
  get: operations["getSlackInstallUrl"];
3780
3780
  put?: never;
@@ -3794,7 +3794,7 @@ export interface paths {
3794
3794
  };
3795
3795
  /**
3796
3796
  * Slack OAuth callback
3797
- * @description Browser return from Slack. The provider redirect does not include the API bearer token. `state` was issued by `getSlackInstallUrl` to a signed-in admin and is single-use. The bot token is stored encrypted only when that user is still a workspace admin. Success redirects to `{spa}/workspace/preferences?chat=slack`. Failures redirect to the same page with `slack=error`. The token is never in the redirect.
3797
+ * @description Browser return from Slack. The provider redirect does not include the API bearer token. `state` was issued by `getSlackInstallUrl` to a signed-in admin and is single-use. Install requests `incoming-webhook` only. The encrypted incoming-webhook URL and the channel Slack returns are stored only when that user is still a workspace admin. Success redirects to `{spa}/workspace/preferences?chat=slack`. Failures redirect to the same page with `slack=error`. The webhook URL is never in the redirect.
3798
3798
  */
3799
3799
  get: operations["getSlackOauthCallback"];
3800
3800
  put?: never;
@@ -3814,14 +3814,14 @@ export interface paths {
3814
3814
  };
3815
3815
  /**
3816
3816
  * Slack connection status
3817
- * @description Any workspace member. `{ connected, channelName }`. `channelName` is null until an admin saves a channel. The bot token is never returned.
3817
+ * @description Any workspace member. `{ connected, channelName }`. `connected` is true only when a decryptable install webhook is stored. `channelName` is the channel chosen on Slack's install screen (null when not connected). Secrets are never returned.
3818
3818
  */
3819
3819
  get: operations["getSlackIntegration"];
3820
3820
  put?: never;
3821
3821
  post?: never;
3822
3822
  /**
3823
3823
  * Disconnect Slack
3824
- * @description Workspace admin only. Removes the bot token and saved channel. Later Message Center delivery does not post to Slack.
3824
+ * @description Workspace admin only. Removes the install webhook, optional bot token, and saved channel. Later Message Center delivery does not post to Slack.
3825
3825
  */
3826
3826
  delete: operations["deleteSlackIntegration"];
3827
3827
  options?: never;
@@ -3838,8 +3838,8 @@ export interface paths {
3838
3838
  };
3839
3839
  get?: never;
3840
3840
  /**
3841
- * Save the Slack channel for Message Center
3842
- * @description Workspace admin only. Body `{ channelId }`. Slack must already be connected. The response is the same status object as `getSlackIntegration`, with the channel name Slack returned. Unknown or malformed `channelId` is `400` `invalid_slack_channel`. Not connected is `409` `slack_not_connected`.
3841
+ * Change Slack channel (requires reinstall)
3842
+ * @description Workspace admin only. Body `{ channelId }`. The notification channel is chosen on Slack's install screen with the incoming webhook; this route does not rewrite channel metadata. When Slack is connected, the API returns `409` with `code` `slack_channel_reinstall_required` — reconnect via `getSlackInstallUrl` to pick a different channel. Malformed `channelId` is `400` `invalid_slack_channel`. Not connected is `409` `slack_not_connected`.
3843
3843
  */
3844
3844
  put: operations["putSlackChannel"];
3845
3845
  post?: never;
@@ -7490,6 +7490,8 @@ export interface components {
7490
7490
  fixStatus: "open" | "pr-pending" | "fixed";
7491
7491
  /** @description True when the platform does not yet have an auto-fix skill for this issue's dimension. The UI should render these items as disabled with a "Coming Soon" tooltip. */
7492
7492
  comingSoon?: boolean;
7493
+ /** @description Short labels when the instruction file names two alternatives and does not pick one. Fix it stays disabled until the request includes one of these as patternChoice. */
7494
+ unresolvedChoices?: string[];
7493
7495
  /**
7494
7496
  * @description How automated fixing is supported for this criterion. `auto` — agent edits files directly; no human input needed. `decisions-first` — agent requires docs/ai-readiness-decisions.md to be filled first. `guidance` — admin-level action; agent creates an instructions doc PR.
7495
7497
  * @enum {string}
@@ -7930,6 +7932,15 @@ export interface components {
7930
7932
  /** @description Issues whose fix has been applied (fix_status = fixed). */
7931
7933
  fixed: number;
7932
7934
  };
7935
+ /** @description Distinct non-archived repos whose latest succeeded scan has an A1 gap (no instruction file) or a B5 gap (CI never runs tests). A gap whose matching issue is already fixed is excluded. Omitted when the server cannot see per-criterion status. */
7936
+ verificationGapCount?: number;
7937
+ /** @description Up to 12 repo and reason pairs for verificationGapCount. A repo with both gaps appears twice. Does not change averageOverallScore. */
7938
+ verificationGaps?: components["schemas"]["AgenticFoundationVerificationGapDto"][];
7939
+ };
7940
+ AgenticFoundationVerificationGapDto: {
7941
+ repoName: string;
7942
+ /** @enum {string} */
7943
+ reason: "no instruction file" | "CI never runs tests";
7933
7944
  };
7934
7945
  PageMetaDto: {
7935
7946
  /** @description Total rows matching filters (full workspace, not just this page). */
@@ -8098,6 +8109,8 @@ export interface components {
8098
8109
  * @description Workspace repository id that owns the issue
8099
8110
  */
8100
8111
  repoId: string;
8112
+ /** @description Required when the issue has unresolvedChoices. Must be one of those labels. Stored on the fix row and stated in the worker prompt. */
8113
+ patternChoice?: string;
8101
8114
  };
8102
8115
  PhaseRoleDto: {
8103
8116
  phase: string;
@@ -8341,12 +8354,13 @@ export interface components {
8341
8354
  teams: components["schemas"]["NotificationChatChannelsDto"];
8342
8355
  };
8343
8356
  SlackInstallUrlDto: {
8344
- /** @description Slack OAuth authorize URL. The bot token is not included. */
8357
+ /** @description Slack OAuth authorize URL (`incoming-webhook` scope). Secrets are not included. */
8345
8358
  url: string;
8346
8359
  };
8347
8360
  SlackIntegrationStatusDto: {
8361
+ /** @description True only when a decryptable install webhook URL is stored for this workspace. */
8348
8362
  connected: boolean;
8349
- /** @description Saved channel name. Null until an admin saves a channel, and when disconnected. */
8363
+ /** @description Channel name returned by Slack at install time. Null when not connected. */
8350
8364
  channelName: string | null;
8351
8365
  };
8352
8366
  SlackChannelBodyDto: {
@@ -11098,6 +11112,7 @@ export type LinkedRolePendingDto = components['schemas']['LinkedRolePendingDto']
11098
11112
  export type LinkedRoleAssessmentDto = components['schemas']['LinkedRoleAssessmentDto'];
11099
11113
  export type RepoReadinessScoreDetailDto = components['schemas']['RepoReadinessScoreDetailDto'];
11100
11114
  export type AgenticFoundationDashboardSummaryDto = components['schemas']['AgenticFoundationDashboardSummaryDto'];
11115
+ export type AgenticFoundationVerificationGapDto = components['schemas']['AgenticFoundationVerificationGapDto'];
11101
11116
  export type PageMetaDto = components['schemas']['PageMetaDto'];
11102
11117
  export type ReadinessEligibilityLimitsDto = components['schemas']['ReadinessEligibilityLimitsDto'];
11103
11118
  export type ReadinessRepoListDto = components['schemas']['ReadinessRepoListDto'];
@@ -18982,7 +18997,7 @@ export interface operations {
18982
18997
  "application/json": components["schemas"]["FixRequestDto"];
18983
18998
  };
18984
18999
  };
18985
- /** @description Invalid body or malformed `repoId` (not a UUID) */
19000
+ /** @description Invalid body, malformed `repoId`, or a missing/unknown `patternChoice` when the issue has `unresolvedChoices` (`pattern_choice_required`, `pattern_choice_invalid`). */
18986
19001
  400: {
18987
19002
  headers: {
18988
19003
  [name: string]: unknown;
@@ -21383,7 +21398,7 @@ export interface operations {
21383
21398
  };
21384
21399
  };
21385
21400
  responses: {
21386
- /** @description Channel saved */
21401
+ /** @description Not returned. The channel is chosen on Slack's install screen; when connected the API responds with `409` `slack_channel_reinstall_required`. */
21387
21402
  200: {
21388
21403
  headers: {
21389
21404
  [name: string]: unknown;
@@ -21392,7 +21407,7 @@ export interface operations {
21392
21407
  "application/json": components["schemas"]["SlackIntegrationStatusDto"];
21393
21408
  };
21394
21409
  };
21395
- /** @description channelId is missing, malformed, or unknown to Slack */
21410
+ /** @description channelId is missing or malformed */
21396
21411
  400: {
21397
21412
  headers: {
21398
21413
  [name: string]: unknown;
@@ -21400,7 +21415,7 @@ export interface operations {
21400
21415
  content: {
21401
21416
  /**
21402
21417
  * @example {
21403
- * "error": "Slack channel was not found",
21418
+ * "error": "channelId is required",
21404
21419
  * "code": "invalid_slack_channel"
21405
21420
  * }
21406
21421
  */
@@ -21432,33 +21447,12 @@ export interface operations {
21432
21447
  "application/json": components["schemas"]["ErrorMessageDto"];
21433
21448
  };
21434
21449
  };
21435
- /** @description Slack is not connected */
21450
+ /** @description Slack is not connected (`slack_not_connected`), or the channel cannot be changed without a new install (`slack_channel_reinstall_required`). */
21436
21451
  409: {
21437
21452
  headers: {
21438
21453
  [name: string]: unknown;
21439
21454
  };
21440
21455
  content: {
21441
- /**
21442
- * @example {
21443
- * "error": "Slack is not connected",
21444
- * "code": "slack_not_connected"
21445
- * }
21446
- */
21447
- "application/json": components["schemas"]["ErrorMessageDto"];
21448
- };
21449
- };
21450
- /** @description Slack rejected the lookup */
21451
- 502: {
21452
- headers: {
21453
- [name: string]: unknown;
21454
- };
21455
- content: {
21456
- /**
21457
- * @example {
21458
- * "error": "Slack did not accept the channel",
21459
- * "code": "slack_request_failed"
21460
- * }
21461
- */
21462
21456
  "application/json": components["schemas"]["ErrorMessageDto"];
21463
21457
  };
21464
21458
  };