@thinkai/tai-api-contract 2.175.0 → 2.177.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.
@@ -4894,6 +4894,50 @@ export interface paths {
4894
4894
  patch?: never;
4895
4895
  trace?: never;
4896
4896
  };
4897
+ "/workspaces/{workspaceId}/evals/suites/{suiteId}/compare": {
4898
+ parameters: {
4899
+ query?: never;
4900
+ header?: never;
4901
+ path?: never;
4902
+ cookie?: never;
4903
+ };
4904
+ /**
4905
+ * Compare two succeeded eval runs on a suite
4906
+ * @description Side-by-side compare of a baseline run vs a candidate run on the same suite. Both runs must be `succeeded`. Aligns cases by `caseId` and reports suite- and case-level score/token/cost deltas when present. Requires workspace membership. Does not trigger scoring.
4907
+ */
4908
+ get: operations["compareEvalRuns"];
4909
+ put?: never;
4910
+ post?: never;
4911
+ delete?: never;
4912
+ options?: never;
4913
+ head?: never;
4914
+ patch?: never;
4915
+ trace?: never;
4916
+ };
4917
+ "/workspaces/{workspaceId}/evals/suites/{suiteId}/decisions": {
4918
+ parameters: {
4919
+ query?: never;
4920
+ header?: never;
4921
+ path?: never;
4922
+ cookie?: never;
4923
+ };
4924
+ /**
4925
+ * List eval promote/keep/reject decisions for a suite
4926
+ * @description Returns the last 50 decisions for the suite (newest first). Empty → `{ "decisions": [] }`. Requires workspace membership.
4927
+ */
4928
+ get: operations["listEvalDecisions"];
4929
+ put?: never;
4930
+ /**
4931
+ * Record a promote, keep, or reject decision
4932
+ * @description Persists an audit decision for a baseline vs candidate run pair. Requires workspace editor or admin. Both runs must be `succeeded` on this suite. `promote` also applies the candidate run's `suiteSnapshot.target` to the live suite (version may bump). Promotion gate attach is deferred (`gateApplied: false`, `gateDetail.reason: deferred`) until thinkai-platform-workspace#492.
4933
+ */
4934
+ post: operations["createEvalDecision"];
4935
+ delete?: never;
4936
+ options?: never;
4937
+ head?: never;
4938
+ patch?: never;
4939
+ trace?: never;
4940
+ };
4897
4941
  "/workspaces/{workspaceId}/evals/suites/{suiteId}/runs": {
4898
4942
  parameters: {
4899
4943
  query?: never;
@@ -9101,7 +9145,7 @@ export interface components {
9101
9145
  };
9102
9146
  AssessmentDictionaryDto: {
9103
9147
  /** @enum {string} */
9104
- version: "2026-10-18.1";
9148
+ version: "2026-10-20.1";
9105
9149
  /** @enum {integer} */
9106
9150
  periodDays: 90;
9107
9151
  /** @enum {integer} */
@@ -9113,6 +9157,8 @@ export interface components {
9113
9157
  /** @enum {integer} */
9114
9158
  accessDaysAfterDelivery: 30;
9115
9159
  /** @enum {integer} */
9160
+ deliveryBusinessDays: 5;
9161
+ /** @enum {integer} */
9116
9162
  maxRepositories: 50;
9117
9163
  /** @enum {integer} */
9118
9164
  maxActiveEngineers: 500;
@@ -9142,15 +9188,90 @@ export interface components {
9142
9188
  status: "supported";
9143
9189
  providers: ("gitlab_self_managed" | "bitbucket_data_center")[];
9144
9190
  };
9191
+ rules: {
9192
+ /** @enum {number} */
9193
+ windowCoverageRatio: 1;
9194
+ /** @enum {integer} */
9195
+ repositoryMergedPullRequestsInBothWindows: 1;
9196
+ freshness: {
9197
+ /** @enum {integer} */
9198
+ gitHours: 24;
9199
+ /** @enum {integer} */
9200
+ jiraHours: 24;
9201
+ /** @enum {integer} */
9202
+ incidentHours: 24;
9203
+ /** @enum {integer} */
9204
+ aiUsageDays: 7;
9205
+ /** @enum {integer} */
9206
+ readinessScanDays: 30;
9207
+ };
9208
+ tolerances: {
9209
+ /** @enum {number} */
9210
+ moneyUsd: 0.01;
9211
+ /** @enum {number} */
9212
+ ratioPercentagePoints: 0.01;
9213
+ /** @enum {integer} */
9214
+ durationSeconds: 1;
9215
+ };
9216
+ /** @enum {string} */
9217
+ outputUnit: "normalized_ship_weight";
9218
+ /** @enum {string} */
9219
+ rolloutTimezone: "America/New_York";
9220
+ /** @enum {string} */
9221
+ rolloutBoundary: "midnight";
9222
+ /** @enum {string} */
9223
+ costAssessableCurrency: "USD";
9224
+ };
9145
9225
  unresolved: {
9146
9226
  baselinePrice: components["schemas"]["UnsetAssessmentDecisionDto"];
9147
9227
  premiumPrice: components["schemas"]["UnsetAssessmentDecisionDto"];
9148
- currency: components["schemas"]["UnsetAssessmentDecisionDto"];
9149
- creditWindowDays: components["schemas"]["UnsetAssessmentDecisionDto"];
9150
- jiraLinkageMinimum: components["schemas"]["UnsetAssessmentDecisionDto"];
9151
- confounderRules: components["schemas"]["UnsetAssessmentDecisionDto"];
9152
- activeEngineerRule: components["schemas"]["UnsetAssessmentDecisionDto"];
9153
- workingDayCalendar: components["schemas"]["UnsetAssessmentDecisionDto"];
9228
+ currency: {
9229
+ /** @enum {string} */
9230
+ status: "set";
9231
+ /** @enum {string} */
9232
+ code: "USD";
9233
+ };
9234
+ creditWindowDays: {
9235
+ /** @enum {string} */
9236
+ status: "set";
9237
+ /** @enum {integer} */
9238
+ days: 90;
9239
+ /** @enum {string} */
9240
+ eligibleSubscription: "annual";
9241
+ };
9242
+ jiraLinkageMinimum: {
9243
+ /** @enum {string} */
9244
+ status: "set";
9245
+ /** @enum {number} */
9246
+ ratio: 0.8;
9247
+ };
9248
+ confounderRules: {
9249
+ /** @enum {string} */
9250
+ status: "set";
9251
+ /** @enum {number} */
9252
+ headcountChangeRatio: 0.1;
9253
+ /** @enum {number} */
9254
+ repositoryScopeChangeRatio: 0.1;
9255
+ namedEvents: ("major_release" | "migration" | "acquisition" | "policy_change")[];
9256
+ };
9257
+ activeEngineerRule: {
9258
+ /** @enum {string} */
9259
+ status: "set";
9260
+ /** @enum {string} */
9261
+ activity: "authored_commit_or_merged_pr";
9262
+ /** @enum {string} */
9263
+ window: "measured_period";
9264
+ exclude: ("bot" | "service_account" | "unmapped" | "read_only")[];
9265
+ };
9266
+ workingDayCalendar: {
9267
+ /** @enum {string} */
9268
+ status: "set";
9269
+ /** @enum {string} */
9270
+ timezone: "America/New_York";
9271
+ weekdays: ("monday" | "tuesday" | "wednesday" | "thursday" | "friday")[];
9272
+ /** @enum {string} */
9273
+ holidays: "none";
9274
+ };
9154
9275
  countryAllowList: components["schemas"]["UnsetAssessmentDecisionDto"];
9155
9276
  };
9156
9277
  };
@@ -11292,6 +11413,8 @@ export interface components {
11292
11413
  createdByUserId: string;
11293
11414
  target: components["schemas"]["EvalSuiteTargetDto"];
11294
11415
  cases: components["schemas"]["EvalCaseDto"][];
11416
+ /** @description Most recent promote/keep/reject decision for this suite, when any exist. Omitted or null when none recorded. */
11417
+ latestDecision?: components["schemas"]["EvalDecisionDto"] | null;
11295
11418
  };
11296
11419
  EvalSuiteListDto: {
11297
11420
  suites: components["schemas"]["EvalSuiteDto"][];
@@ -11442,6 +11565,89 @@ export interface components {
11442
11565
  EvalPackListDto: {
11443
11566
  packs: components["schemas"]["EvalPackSummaryDto"][];
11444
11567
  };
11568
+ EvalCompareRunSummaryDto: {
11569
+ /** Format: uuid */
11570
+ id: string;
11571
+ suiteVersion: number;
11572
+ score: number | null;
11573
+ /** Format: date-time */
11574
+ finishedAt: string | null;
11575
+ target: components["schemas"]["EvalSuiteTargetDto"];
11576
+ passCount: number;
11577
+ failCount: number;
11578
+ errorCount: number;
11579
+ };
11580
+ EvalCompareCaseDto: {
11581
+ caseId: string;
11582
+ name: string;
11583
+ baselineStatus: (string & components["schemas"]["EvalCaseResultStatusDto"]) | null;
11584
+ candidateStatus: (string & components["schemas"]["EvalCaseResultStatusDto"]) | null;
11585
+ baselinePass: boolean | null;
11586
+ candidatePass: boolean | null;
11587
+ baselineFailedSignalIds: string[];
11588
+ candidateFailedSignalIds: string[];
11589
+ baselineInputTokens?: number | null;
11590
+ candidateInputTokens?: number | null;
11591
+ baselineOutputTokens?: number | null;
11592
+ candidateOutputTokens?: number | null;
11593
+ baselineCostCents?: number | null;
11594
+ candidateCostCents?: number | null;
11595
+ /** @description Candidate pass (1/0) minus baseline pass when both scored. */
11596
+ scoreDelta?: number | null;
11597
+ inputTokensDelta?: number | null;
11598
+ outputTokensDelta?: number | null;
11599
+ costCentsDelta?: number | null;
11600
+ };
11601
+ EvalCompareDto: {
11602
+ /** Format: uuid */
11603
+ suiteId: string;
11604
+ baseline: components["schemas"]["EvalCompareRunSummaryDto"];
11605
+ candidate: components["schemas"]["EvalCompareRunSummaryDto"];
11606
+ /** @description candidate.score − baseline.score when both present. */
11607
+ scoreDelta: number | null;
11608
+ avgInputTokensDelta?: number | null;
11609
+ avgOutputTokensDelta?: number | null;
11610
+ avgCostCentsDelta?: number | null;
11611
+ cases: components["schemas"]["EvalCompareCaseDto"][];
11612
+ /** @description Case ids present on only one run's results/snapshot. */
11613
+ unpairedCaseIds: string[];
11614
+ };
11615
+ /** @enum {string} */
11616
+ EvalDecisionKindDto: "promote" | "keep" | "reject";
11617
+ EvalGateDetailDto: {
11618
+ /** @description Machine-readable gate outcome. `deferred` until promotion-gate attach (thinkai-platform-workspace#492) ships. */
11619
+ reason: string;
11620
+ };
11621
+ EvalDecisionDto: {
11622
+ /** Format: uuid */
11623
+ id: string;
11624
+ /** Format: uuid */
11625
+ suiteId: string;
11626
+ decision: components["schemas"]["EvalDecisionKindDto"];
11627
+ /** Format: uuid */
11628
+ baselineRunId: string;
11629
+ /** Format: uuid */
11630
+ candidateRunId: string;
11631
+ /** Format: uuid */
11632
+ decidedByUserId: string;
11633
+ /** Format: date-time */
11634
+ decidedAt: string;
11635
+ note?: string | null;
11636
+ /** @description True when a promotion gate attach point enforced this decision. */
11637
+ gateApplied: boolean;
11638
+ gateDetail?: components["schemas"]["EvalGateDetailDto"] | null;
11639
+ };
11640
+ EvalDecisionListDto: {
11641
+ decisions: components["schemas"]["EvalDecisionDto"][];
11642
+ };
11643
+ CreateEvalDecisionBodyDto: {
11644
+ decision: components["schemas"]["EvalDecisionKindDto"];
11645
+ /** Format: uuid */
11646
+ baselineRunId: string;
11647
+ /** Format: uuid */
11648
+ candidateRunId: string;
11649
+ note?: string;
11650
+ };
11445
11651
  };
11446
11652
  responses: {
11447
11653
  /** @description Missing or invalid bearer token */
@@ -12160,6 +12366,14 @@ export type EvalModelComparisonDto = components['schemas']['EvalModelComparisonD
12160
12366
  export type EvalInsightsDto = components['schemas']['EvalInsightsDto'];
12161
12367
  export type EvalPackSummaryDto = components['schemas']['EvalPackSummaryDto'];
12162
12368
  export type EvalPackListDto = components['schemas']['EvalPackListDto'];
12369
+ export type EvalCompareRunSummaryDto = components['schemas']['EvalCompareRunSummaryDto'];
12370
+ export type EvalCompareCaseDto = components['schemas']['EvalCompareCaseDto'];
12371
+ export type EvalCompareDto = components['schemas']['EvalCompareDto'];
12372
+ export type EvalDecisionKindDto = components['schemas']['EvalDecisionKindDto'];
12373
+ export type EvalGateDetailDto = components['schemas']['EvalGateDetailDto'];
12374
+ export type EvalDecisionDto = components['schemas']['EvalDecisionDto'];
12375
+ export type EvalDecisionListDto = components['schemas']['EvalDecisionListDto'];
12376
+ export type CreateEvalDecisionBodyDto = components['schemas']['CreateEvalDecisionBodyDto'];
12163
12377
  export type ResponseUnauthorized = components['responses']['Unauthorized'];
12164
12378
  export type ResponseForbidden = components['responses']['Forbidden'];
12165
12379
  export type ResponseZenHrSyncInProgress = components['responses']['ZenHrSyncInProgress'];
@@ -12512,11 +12726,44 @@ export interface operations {
12512
12726
  shareMode: "internal" | "external";
12513
12727
  /** @enum {string|null} */
12514
12728
  watermark: "NOT VALIDATED" | "SAMPLE · SYNTHETIC DATA" | null;
12515
- scope: Record<string, never>;
12516
- windows: Record<string, never>;
12517
- sources: Record<string, never>[];
12518
- consent: Record<string, never>;
12519
- sections: Record<string, never>[];
12729
+ scope: {
12730
+ repositories: {
12731
+ id: string;
12732
+ name: string;
12733
+ }[];
12734
+ excluded: {
12735
+ id: string;
12736
+ name: string;
12737
+ reason: string;
12738
+ }[];
12739
+ };
12740
+ windows: {
12741
+ pre: {
12742
+ start: string;
12743
+ end: string;
12744
+ } | null;
12745
+ post: {
12746
+ start: string;
12747
+ end: string;
12748
+ } | null;
12749
+ transitionDays: number;
12750
+ };
12751
+ sources: {
12752
+ provider: string;
12753
+ status: string;
12754
+ freshAt: string | null;
12755
+ }[];
12756
+ consent: {
12757
+ /** @enum {string} */
12758
+ aggregateUse: "opt_in" | "opt_out" | "unset";
12759
+ recordedAt: string | null;
12760
+ };
12761
+ sections: {
12762
+ id: string;
12763
+ /** @enum {string} */
12764
+ status: "ok" | "failed" | "omitted";
12765
+ reason?: string;
12766
+ }[];
12520
12767
  };
12521
12768
  workspaceId: string;
12522
12769
  expectedWorkspaceId: string;
@@ -25095,6 +25342,155 @@ export interface operations {
25095
25342
  };
25096
25343
  };
25097
25344
  };
25345
+ compareEvalRuns: {
25346
+ parameters: {
25347
+ query: {
25348
+ baselineRunId: string;
25349
+ candidateRunId: string;
25350
+ };
25351
+ header?: never;
25352
+ path: {
25353
+ workspaceId: components["parameters"]["WorkspaceId"];
25354
+ /** @description Eval suite id (`tai_workspace_eval_suites.id`). */
25355
+ suiteId: components["parameters"]["EvalSuiteId"];
25356
+ };
25357
+ cookie?: never;
25358
+ };
25359
+ requestBody?: never;
25360
+ responses: {
25361
+ /** @description Compare result */
25362
+ 200: {
25363
+ headers: {
25364
+ [name: string]: unknown;
25365
+ };
25366
+ content: {
25367
+ "application/json": components["schemas"]["EvalCompareDto"];
25368
+ };
25369
+ };
25370
+ /** @description Runs not comparable (e.g. not succeeded, same id, or invalid query). Codes: `eval_compare_runs_required`, `eval_compare_runs_not_succeeded`, `eval_compare_same_run`. */
25371
+ 400: {
25372
+ headers: {
25373
+ [name: string]: unknown;
25374
+ };
25375
+ content: {
25376
+ "application/json": components["schemas"]["ErrorMessageDto"];
25377
+ };
25378
+ };
25379
+ 401: components["responses"]["Unauthorized"];
25380
+ 403: components["responses"]["Forbidden"];
25381
+ /** @description Workspace, suite, or run not found */
25382
+ 404: {
25383
+ headers: {
25384
+ [name: string]: unknown;
25385
+ };
25386
+ content: {
25387
+ "application/json": components["schemas"]["ErrorMessageDto"];
25388
+ };
25389
+ };
25390
+ };
25391
+ };
25392
+ listEvalDecisions: {
25393
+ parameters: {
25394
+ query?: never;
25395
+ header?: never;
25396
+ path: {
25397
+ workspaceId: components["parameters"]["WorkspaceId"];
25398
+ /** @description Eval suite id (`tai_workspace_eval_suites.id`). */
25399
+ suiteId: components["parameters"]["EvalSuiteId"];
25400
+ };
25401
+ cookie?: never;
25402
+ };
25403
+ requestBody?: never;
25404
+ responses: {
25405
+ /** @description Decision history */
25406
+ 200: {
25407
+ headers: {
25408
+ [name: string]: unknown;
25409
+ };
25410
+ content: {
25411
+ /**
25412
+ * @example {
25413
+ * "decisions": []
25414
+ * }
25415
+ */
25416
+ "application/json": components["schemas"]["EvalDecisionListDto"];
25417
+ };
25418
+ };
25419
+ 401: components["responses"]["Unauthorized"];
25420
+ 403: components["responses"]["Forbidden"];
25421
+ /** @description Workspace or suite not found */
25422
+ 404: {
25423
+ headers: {
25424
+ [name: string]: unknown;
25425
+ };
25426
+ content: {
25427
+ "application/json": components["schemas"]["ErrorMessageDto"];
25428
+ };
25429
+ };
25430
+ };
25431
+ };
25432
+ createEvalDecision: {
25433
+ parameters: {
25434
+ query?: never;
25435
+ header?: never;
25436
+ path: {
25437
+ workspaceId: components["parameters"]["WorkspaceId"];
25438
+ /** @description Eval suite id (`tai_workspace_eval_suites.id`). */
25439
+ suiteId: components["parameters"]["EvalSuiteId"];
25440
+ };
25441
+ cookie?: never;
25442
+ };
25443
+ requestBody: {
25444
+ content: {
25445
+ "application/json": components["schemas"]["CreateEvalDecisionBodyDto"];
25446
+ };
25447
+ };
25448
+ responses: {
25449
+ /** @description Decision recorded */
25450
+ 201: {
25451
+ headers: {
25452
+ [name: string]: unknown;
25453
+ };
25454
+ content: {
25455
+ "application/json": components["schemas"]["EvalDecisionDto"];
25456
+ };
25457
+ };
25458
+ /** @description Validation failed. Codes: `eval_decision_invalid`, `eval_compare_runs_not_succeeded`, `eval_compare_same_run`, `eval_promote_snapshot_missing`. */
25459
+ 400: {
25460
+ headers: {
25461
+ [name: string]: unknown;
25462
+ };
25463
+ content: {
25464
+ "application/json": components["schemas"]["ErrorMessageDto"];
25465
+ };
25466
+ };
25467
+ 401: components["responses"]["Unauthorized"];
25468
+ /** @description Authenticated but not a workspace editor/admin */
25469
+ 403: {
25470
+ headers: {
25471
+ [name: string]: unknown;
25472
+ };
25473
+ content: {
25474
+ /**
25475
+ * @example {
25476
+ * "error": "Workspace editor role required",
25477
+ * "code": "workspace_editor_required"
25478
+ * }
25479
+ */
25480
+ "application/json": components["schemas"]["ErrorMessageDto"];
25481
+ };
25482
+ };
25483
+ /** @description Workspace, suite, or run not found */
25484
+ 404: {
25485
+ headers: {
25486
+ [name: string]: unknown;
25487
+ };
25488
+ content: {
25489
+ "application/json": components["schemas"]["ErrorMessageDto"];
25490
+ };
25491
+ };
25492
+ };
25493
+ };
25098
25494
  listEvalRuns: {
25099
25495
  parameters: {
25100
25496
  query?: never;