@thinkai/tai-api-contract 2.172.0 → 2.174.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.172.0
4
+ version: 2.173.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}/...`.
@@ -8835,7 +8835,8 @@ paths:
8835
8835
  `status` is `indexing`, `generating_agent_md`, `failed`, or `ready`. Chat stays closed
8836
8836
  until `ready`: create thread and post message return `409 chat_not_ready` with
8837
8837
  `progressMessage` when status is not ready. An open index wave reports `indexing` until
8838
- every job in that wave is terminal.
8838
+ every job in that wave is terminal. When ready, includes `activeProvider` and
8839
+ `attachmentLimits` for Conversations file uploads.
8839
8840
  operationId: getCodeChatReadiness
8840
8841
  x-test-coverage-skip: thin HTTP over deriveCodeChatReadiness; covered by code-chat-readiness unit tests
8841
8842
  parameters:
@@ -8859,6 +8860,58 @@ paths:
8859
8860
  error: Code Intelligence is disabled for this workspace
8860
8861
  code: code_intelligence_disabled
8861
8862
 
8863
+ /workspaces/{workspaceId}/code-chat/attachments:
8864
+ post:
8865
+ tags: [CodeChat]
8866
+ summary: Upload a Conversations attachment
8867
+ description: >
8868
+ Any workspace member when chat is ready. Validates size/type against the active
8869
+ provider profile (`attachmentLimits` from readiness). Returns metadata; pass `id`
8870
+ as `attachmentIds` on the next POST message. Max 5 MB per file.
8871
+ operationId: postCodeChatAttachment
8872
+ x-test-coverage-skip: thin HTTP over validateAttachment + store insert
8873
+ parameters:
8874
+ - $ref: "#/components/parameters/WorkspaceId"
8875
+ requestBody:
8876
+ required: true
8877
+ content:
8878
+ application/json:
8879
+ schema:
8880
+ $ref: "#/components/schemas/CodeChatUploadAttachmentBodyDto"
8881
+ responses:
8882
+ "201":
8883
+ description: Attachment stored
8884
+ content:
8885
+ application/json:
8886
+ schema:
8887
+ $ref: "#/components/schemas/CodeChatAttachmentMetaDto"
8888
+ "400":
8889
+ description: Validation failed (size, type, totals)
8890
+ content:
8891
+ application/json:
8892
+ schema:
8893
+ $ref: "#/components/schemas/ErrorMessageDto"
8894
+ "401":
8895
+ $ref: "#/components/responses/Unauthorized"
8896
+ "403":
8897
+ description: Engineering Context Graph is off
8898
+ content:
8899
+ application/json:
8900
+ schema:
8901
+ $ref: "#/components/schemas/ErrorMessageDto"
8902
+ "409":
8903
+ description: Chat not ready
8904
+ content:
8905
+ application/json:
8906
+ schema:
8907
+ $ref: "#/components/schemas/ErrorMessageDto"
8908
+ "422":
8909
+ description: Could not process the file
8910
+ content:
8911
+ application/json:
8912
+ schema:
8913
+ $ref: "#/components/schemas/ErrorMessageDto"
8914
+
8862
8915
  /workspaces/{workspaceId}/code-chat/indexes/{indexId}:
8863
8916
  get:
8864
8917
  tags: [CodeChat]
@@ -11954,7 +12007,6 @@ paths:
11954
12007
  Requires workspace membership (`requireWorkspaceMember`). Empty workspace →
11955
12008
  `{ "suites": [] }`.
11956
12009
  operationId: listEvalSuites
11957
- x-test-coverage-skip: contract-only; HTTP/store coverage lands with evals-storage-api
11958
12010
  parameters:
11959
12011
  - $ref: "#/components/parameters/WorkspaceId"
11960
12012
  responses:
@@ -11986,7 +12038,6 @@ paths:
11986
12038
  `eval_suite_cases_required`); or when the workspace already has 50 suites.
11987
12039
  Each case must include at least one expected signal.
11988
12040
  operationId: createEvalSuite
11989
- x-test-coverage-skip: contract-only; HTTP/store coverage lands with evals-storage-api
11990
12041
  parameters:
11991
12042
  - $ref: "#/components/parameters/WorkspaceId"
11992
12043
  requestBody:
@@ -12076,7 +12127,6 @@ paths:
12076
12127
  runs via `suiteVersion` + snapshot on each run; this endpoint does not expose
12077
12128
  prior versions. Requires workspace membership.
12078
12129
  operationId: getEvalSuite
12079
- x-test-coverage-skip: contract-only; HTTP/store coverage lands with evals-storage-api
12080
12130
  parameters:
12081
12131
  - $ref: "#/components/parameters/WorkspaceId"
12082
12132
  - $ref: "#/components/parameters/EvalSuiteId"
@@ -12107,7 +12157,6 @@ paths:
12107
12157
  name/description-only updates do not bump `version`. Same validation rules
12108
12158
  as create (cases required, target required, bounds).
12109
12159
  operationId: updateEvalSuite
12110
- x-test-coverage-skip: contract-only; HTTP/store coverage lands with evals-storage-api
12111
12160
  parameters:
12112
12161
  - $ref: "#/components/parameters/WorkspaceId"
12113
12162
  - $ref: "#/components/parameters/EvalSuiteId"
@@ -12156,7 +12205,6 @@ paths:
12156
12205
  Returns the last 50 runs for the suite (newest first). Empty → `{ "runs": [] }`.
12157
12206
  Requires workspace membership. Does not trigger scoring.
12158
12207
  operationId: listEvalRuns
12159
- x-test-coverage-skip: contract-only; HTTP/store coverage lands with evals-storage-api
12160
12208
  parameters:
12161
12209
  - $ref: "#/components/parameters/WorkspaceId"
12162
12210
  - $ref: "#/components/parameters/EvalSuiteId"
@@ -12190,7 +12238,6 @@ paths:
12190
12238
  Requires workspace editor or admin. At most one active (`queued`|`running`)
12191
12239
  run per suite; a second POST returns `409` `eval_run_in_progress`.
12192
12240
  operationId: enqueueEvalRun
12193
- x-test-coverage-skip: contract-only; HTTP/store coverage lands with evals-storage-api
12194
12241
  parameters:
12195
12242
  - $ref: "#/components/parameters/WorkspaceId"
12196
12243
  - $ref: "#/components/parameters/EvalSuiteId"
@@ -12240,7 +12287,6 @@ paths:
12240
12287
  `caseResults` may be empty and `score` null. Requires workspace membership.
12241
12288
  Does not trigger scoring.
12242
12289
  operationId: getEvalRun
12243
- x-test-coverage-skip: contract-only; HTTP/store coverage lands with evals-storage-api
12244
12290
  parameters:
12245
12291
  - $ref: "#/components/parameters/WorkspaceId"
12246
12292
  - $ref: "#/components/parameters/EvalSuiteId"
@@ -12276,7 +12322,6 @@ paths:
12276
12322
  and null `tokenEfficiency`. Requires workspace membership. Distinct from
12277
12323
  `/insights-recommendations` and AI Usage & Spend.
12278
12324
  operationId: getEvalInsights
12279
- x-test-coverage-skip: contract-only; HTTP/store coverage lands with evals-storage-api
12280
12325
  parameters:
12281
12326
  - $ref: "#/components/parameters/WorkspaceId"
12282
12327
  responses:
@@ -14040,6 +14085,43 @@ components:
14040
14085
  format: date-time
14041
14086
  nullable: true
14042
14087
 
14088
+ CodeChatAttachmentLimitsDto:
14089
+ type: object
14090
+ required:
14091
+ - maxFiles
14092
+ - maxBytesPerFile
14093
+ - maxTotalBytes
14094
+ - maxTextChars
14095
+ - maxPdfPages
14096
+ - allowedMimeTypes
14097
+ - allowedExtensions
14098
+ - supportsImages
14099
+ - supportsPdf
14100
+ properties:
14101
+ maxFiles: { type: integer, minimum: 1 }
14102
+ maxBytesPerFile: { type: integer, minimum: 1 }
14103
+ maxTotalBytes: { type: integer, minimum: 1 }
14104
+ maxTextChars: { type: integer, minimum: 1 }
14105
+ maxPdfPages: { type: integer, minimum: 1 }
14106
+ allowedMimeTypes:
14107
+ type: array
14108
+ items: { type: string }
14109
+ allowedExtensions:
14110
+ type: array
14111
+ items: { type: string }
14112
+ supportsImages: { type: boolean }
14113
+ supportsPdf: { type: boolean }
14114
+
14115
+ CodeChatAttachmentMetaDto:
14116
+ type: object
14117
+ required: [id, filename, mimeType, sizeBytes, createdAt]
14118
+ properties:
14119
+ id: { type: string, format: uuid }
14120
+ filename: { type: string }
14121
+ mimeType: { type: string }
14122
+ sizeBytes: { type: integer, minimum: 1 }
14123
+ createdAt: { type: string, format: date-time }
14124
+
14043
14125
  CodeChatReadinessDto:
14044
14126
  type: object
14045
14127
  required:
@@ -14079,6 +14161,13 @@ components:
14079
14161
  type: string
14080
14162
  nullable: true
14081
14163
  enum: [generated, admin]
14164
+ activeProvider:
14165
+ type: string
14166
+ nullable: true
14167
+ enum: [claude, cursor]
14168
+ description: Active Ask synthesizer for attachment limit profiles
14169
+ attachmentLimits:
14170
+ $ref: "#/components/schemas/CodeChatAttachmentLimitsDto"
14082
14171
 
14083
14172
  CodeWikiGuidanceDto:
14084
14173
  type: object
@@ -23889,6 +23978,10 @@ components:
23889
23978
  type: array
23890
23979
  items: { $ref: "#/components/schemas/CodeChatCitationDto" }
23891
23980
  createdAt: { type: string, format: date-time }
23981
+ attachments:
23982
+ type: array
23983
+ items: { $ref: "#/components/schemas/CodeChatAttachmentMetaDto" }
23984
+ description: Present on user turns that included uploaded files
23892
23985
 
23893
23986
  CodeChatThreadDetailDto:
23894
23987
  allOf:
@@ -23915,6 +24008,24 @@ components:
23915
24008
  description: >
23916
24009
  Optional force deterministic inventory catalog instead of LLM synthesis.
23917
24010
  When omitted, the server classifies listing-style API/module questions automatically.
24011
+ attachmentIds:
24012
+ type: array
24013
+ maxItems: 5
24014
+ items: { type: string, format: uuid }
24015
+ description: Previously uploaded attachment ids to bind to this user turn
24016
+
24017
+ CodeChatUploadAttachmentBodyDto:
24018
+ type: object
24019
+ required: [filename, mimeType, contentBase64]
24020
+ properties:
24021
+ filename: { type: string, minLength: 1, maxLength: 255 }
24022
+ mimeType: { type: string, minLength: 1, maxLength: 255 }
24023
+ contentBase64:
24024
+ type: string
24025
+ minLength: 1
24026
+ description: Base64-encoded file bytes (no data-URL prefix required)
24027
+ threadId: { type: string, format: uuid, nullable: true }
24028
+ pdfPageCount: { type: integer, minimum: 1, nullable: true }
23918
24029
 
23919
24030
  CodeChatMessageReplyDto:
23920
24031
  allOf:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thinkai/tai-api-contract",
3
- "version": "2.172.0",
3
+ "version": "2.174.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3279,7 +3279,7 @@ export interface paths {
3279
3279
  };
3280
3280
  /**
3281
3281
  * Workspace chat readiness
3282
- * @description Any workspace member. 403 `code_intelligence_disabled` when Engineering Context Graph is off. `status` is `indexing`, `generating_agent_md`, `failed`, or `ready`. Chat stays closed until `ready`: create thread and post message return `409 chat_not_ready` with `progressMessage` when status is not ready. An open index wave reports `indexing` until every job in that wave is terminal.
3282
+ * @description Any workspace member. 403 `code_intelligence_disabled` when Engineering Context Graph is off. `status` is `indexing`, `generating_agent_md`, `failed`, or `ready`. Chat stays closed until `ready`: create thread and post message return `409 chat_not_ready` with `progressMessage` when status is not ready. An open index wave reports `indexing` until every job in that wave is terminal. When ready, includes `activeProvider` and `attachmentLimits` for Conversations file uploads.
3283
3283
  */
3284
3284
  get: operations["getCodeChatReadiness"];
3285
3285
  put?: never;
@@ -3290,6 +3290,26 @@ export interface paths {
3290
3290
  patch?: never;
3291
3291
  trace?: never;
3292
3292
  };
3293
+ "/workspaces/{workspaceId}/code-chat/attachments": {
3294
+ parameters: {
3295
+ query?: never;
3296
+ header?: never;
3297
+ path?: never;
3298
+ cookie?: never;
3299
+ };
3300
+ get?: never;
3301
+ put?: never;
3302
+ /**
3303
+ * Upload a Conversations attachment
3304
+ * @description Any workspace member when chat is ready. Validates size/type against the active provider profile (`attachmentLimits` from readiness). Returns metadata; pass `id` as `attachmentIds` on the next POST message. Max 5 MB per file.
3305
+ */
3306
+ post: operations["postCodeChatAttachment"];
3307
+ delete?: never;
3308
+ options?: never;
3309
+ head?: never;
3310
+ patch?: never;
3311
+ trace?: never;
3312
+ };
3293
3313
  "/workspaces/{workspaceId}/code-chat/indexes/{indexId}": {
3294
3314
  parameters: {
3295
3315
  query?: never;
@@ -5505,6 +5525,26 @@ export interface components {
5505
5525
  /** Format: date-time */
5506
5526
  updatedAt: string | null;
5507
5527
  };
5528
+ CodeChatAttachmentLimitsDto: {
5529
+ maxFiles: number;
5530
+ maxBytesPerFile: number;
5531
+ maxTotalBytes: number;
5532
+ maxTextChars: number;
5533
+ maxPdfPages: number;
5534
+ allowedMimeTypes: string[];
5535
+ allowedExtensions: string[];
5536
+ supportsImages: boolean;
5537
+ supportsPdf: boolean;
5538
+ };
5539
+ CodeChatAttachmentMetaDto: {
5540
+ /** Format: uuid */
5541
+ id: string;
5542
+ filename: string;
5543
+ mimeType: string;
5544
+ sizeBytes: number;
5545
+ /** Format: date-time */
5546
+ createdAt: string;
5547
+ };
5508
5548
  CodeChatReadinessDto: {
5509
5549
  /** @enum {string} */
5510
5550
  status: "indexing" | "generating_agent_md" | "failed" | "ready";
@@ -5518,6 +5558,12 @@ export interface components {
5518
5558
  indexingCadence: "daily" | "weekly" | "manual";
5519
5559
  /** @enum {string|null} */
5520
5560
  agentMdSource: "generated" | "admin" | null;
5561
+ /**
5562
+ * @description Active Ask synthesizer for attachment limit profiles
5563
+ * @enum {string|null}
5564
+ */
5565
+ activeProvider?: "claude" | "cursor" | null;
5566
+ attachmentLimits?: components["schemas"]["CodeChatAttachmentLimitsDto"];
5521
5567
  };
5522
5568
  CodeWikiGuidanceDto: {
5523
5569
  /**
@@ -10048,6 +10094,8 @@ export interface components {
10048
10094
  citations: components["schemas"]["CodeChatCitationDto"][];
10049
10095
  /** Format: date-time */
10050
10096
  createdAt: string;
10097
+ /** @description Present on user turns that included uploaded files */
10098
+ attachments?: components["schemas"]["CodeChatAttachmentMetaDto"][];
10051
10099
  };
10052
10100
  CodeChatThreadDetailDto: components["schemas"]["CodeChatThreadDto"] & {
10053
10101
  messages: components["schemas"]["CodeChatMessageDto"][];
@@ -10064,6 +10112,17 @@ export interface components {
10064
10112
  * @enum {string}
10065
10113
  */
10066
10114
  intent?: "inventory_apis" | "inventory_modules";
10115
+ /** @description Previously uploaded attachment ids to bind to this user turn */
10116
+ attachmentIds?: string[];
10117
+ };
10118
+ CodeChatUploadAttachmentBodyDto: {
10119
+ filename: string;
10120
+ mimeType: string;
10121
+ /** @description Base64-encoded file bytes (no data-URL prefix required) */
10122
+ contentBase64: string;
10123
+ /** Format: uuid */
10124
+ threadId?: string | null;
10125
+ pdfPageCount?: number | null;
10067
10126
  };
10068
10127
  CodeChatMessageReplyDto: components["schemas"]["CodeChatMessageDto"] & {
10069
10128
  /**
@@ -11515,6 +11574,8 @@ export type PutCodeIntelligenceSettingsDto = components['schemas']['PutCodeIntel
11515
11574
  export type CodeWikiGuidanceTopicDto = components['schemas']['CodeWikiGuidanceTopicDto'];
11516
11575
  export type PutCodeIntelligenceAgentMdDto = components['schemas']['PutCodeIntelligenceAgentMdDto'];
11517
11576
  export type CodeIntelligenceAgentMdDto = components['schemas']['CodeIntelligenceAgentMdDto'];
11577
+ export type CodeChatAttachmentLimitsDto = components['schemas']['CodeChatAttachmentLimitsDto'];
11578
+ export type CodeChatAttachmentMetaDto = components['schemas']['CodeChatAttachmentMetaDto'];
11518
11579
  export type CodeChatReadinessDto = components['schemas']['CodeChatReadinessDto'];
11519
11580
  export type CodeWikiGuidanceDto = components['schemas']['CodeWikiGuidanceDto'];
11520
11581
  export type WorkspaceConfigDto = components['schemas']['WorkspaceConfigDto'];
@@ -11931,6 +11992,7 @@ export type CodeChatCitationDto = components['schemas']['CodeChatCitationDto'];
11931
11992
  export type CodeChatMessageDto = components['schemas']['CodeChatMessageDto'];
11932
11993
  export type CodeChatThreadDetailDto = components['schemas']['CodeChatThreadDetailDto'];
11933
11994
  export type CodeChatPostMessageBodyDto = components['schemas']['CodeChatPostMessageBodyDto'];
11995
+ export type CodeChatUploadAttachmentBodyDto = components['schemas']['CodeChatUploadAttachmentBodyDto'];
11934
11996
  export type CodeChatMessageReplyDto = components['schemas']['CodeChatMessageReplyDto'];
11935
11997
  export type CodeChatApiRouteRowDto = components['schemas']['CodeChatApiRouteRowDto'];
11936
11998
  export type CodeChatModuleInventoryRowDto = components['schemas']['CodeChatModuleInventoryRowDto'];
@@ -20941,6 +21003,69 @@ export interface operations {
20941
21003
  };
20942
21004
  };
20943
21005
  };
21006
+ postCodeChatAttachment: {
21007
+ parameters: {
21008
+ query?: never;
21009
+ header?: never;
21010
+ path: {
21011
+ workspaceId: components["parameters"]["WorkspaceId"];
21012
+ };
21013
+ cookie?: never;
21014
+ };
21015
+ requestBody: {
21016
+ content: {
21017
+ "application/json": components["schemas"]["CodeChatUploadAttachmentBodyDto"];
21018
+ };
21019
+ };
21020
+ responses: {
21021
+ /** @description Attachment stored */
21022
+ 201: {
21023
+ headers: {
21024
+ [name: string]: unknown;
21025
+ };
21026
+ content: {
21027
+ "application/json": components["schemas"]["CodeChatAttachmentMetaDto"];
21028
+ };
21029
+ };
21030
+ /** @description Validation failed (size, type, totals) */
21031
+ 400: {
21032
+ headers: {
21033
+ [name: string]: unknown;
21034
+ };
21035
+ content: {
21036
+ "application/json": components["schemas"]["ErrorMessageDto"];
21037
+ };
21038
+ };
21039
+ 401: components["responses"]["Unauthorized"];
21040
+ /** @description Engineering Context Graph is off */
21041
+ 403: {
21042
+ headers: {
21043
+ [name: string]: unknown;
21044
+ };
21045
+ content: {
21046
+ "application/json": components["schemas"]["ErrorMessageDto"];
21047
+ };
21048
+ };
21049
+ /** @description Chat not ready */
21050
+ 409: {
21051
+ headers: {
21052
+ [name: string]: unknown;
21053
+ };
21054
+ content: {
21055
+ "application/json": components["schemas"]["ErrorMessageDto"];
21056
+ };
21057
+ };
21058
+ /** @description Could not process the file */
21059
+ 422: {
21060
+ headers: {
21061
+ [name: string]: unknown;
21062
+ };
21063
+ content: {
21064
+ "application/json": components["schemas"]["ErrorMessageDto"];
21065
+ };
21066
+ };
21067
+ };
21068
+ };
20944
21069
  getCodeChatIndex: {
20945
21070
  parameters: {
20946
21071
  query?: never;