@thinkai/tai-api-contract 2.37.0 → 2.39.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.
@@ -291,6 +291,26 @@ export interface paths {
291
291
  patch?: never;
292
292
  trace?: never;
293
293
  };
294
+ "/workspaces/{workspaceId}/sources/{type}/insights": {
295
+ parameters: {
296
+ query?: never;
297
+ header?: never;
298
+ path?: never;
299
+ cookie?: never;
300
+ };
301
+ get?: never;
302
+ put?: never;
303
+ post?: never;
304
+ /**
305
+ * Disconnect AI tool usage insights credentials
306
+ * @description Remove usage-insights credentials (admin/analytics API keys) for `cursor` or `claude` while preserving execution keys used by the readiness agent. Purges cached AI-tool usage data for that provider. Requires admin workspace role.
307
+ */
308
+ delete: operations["deleteSourceInsightsByType"];
309
+ options?: never;
310
+ head?: never;
311
+ patch?: never;
312
+ trace?: never;
313
+ };
294
314
  "/workspaces/{workspaceId}/dashboard/productivity": {
295
315
  parameters: {
296
316
  query?: never;
@@ -585,6 +605,26 @@ export interface paths {
585
605
  patch?: never;
586
606
  trace?: never;
587
607
  };
608
+ "/workspaces/{workspaceId}/insights/ai-usage-spend/usage-trends": {
609
+ parameters: {
610
+ query?: never;
611
+ header?: never;
612
+ path?: never;
613
+ cookie?: never;
614
+ };
615
+ /**
616
+ * AI usage & spend insights — per-provider weekly spend/token trends
617
+ * @description Per-provider weekly spend and token series for the **Usage Trends** stacked area chart on `/insights/ai-usage`. Returns one week entry per calendar bucket, each containing an array of provider rows with spend, token count, and active user count for that week. Weeks with zero activity for a provider are omitted from the providers array. Same filter params as other Measure insights routes.
618
+ */
619
+ get: operations["getAiUsageSpendUsageTrends"];
620
+ put?: never;
621
+ post?: never;
622
+ delete?: never;
623
+ options?: never;
624
+ head?: never;
625
+ patch?: never;
626
+ trace?: never;
627
+ };
588
628
  "/workspaces/{workspaceId}/company-profile": {
589
629
  parameters: {
590
630
  query?: never;
@@ -2015,6 +2055,26 @@ export interface paths {
2015
2055
  patch?: never;
2016
2056
  trace?: never;
2017
2057
  };
2058
+ "/workspaces/{workspaceId}/integrations/zenhr/reconnect": {
2059
+ parameters: {
2060
+ query?: never;
2061
+ header?: never;
2062
+ path?: never;
2063
+ cookie?: never;
2064
+ };
2065
+ get?: never;
2066
+ put?: never;
2067
+ /**
2068
+ * Attempt silent ZenHR reconnect
2069
+ * @description Attempts a silent token refresh and branch ping using stored ZenHR OAuth credentials. Returns `{ ok: true }` when the connection is restored without user interaction. Returns `{ ok: false, oauthRequired: true }` when stored credentials exist but refresh failed with an OAuth re-authorization error (e.g. `invalid_grant`); the SPA should start ZenHR OAuth next. Returns `502` for other upstream failures (same semantics as `GET .../integrations/zenhr/branches`).
2070
+ */
2071
+ post: operations["reconnectWorkspaceZenHr"];
2072
+ delete?: never;
2073
+ options?: never;
2074
+ head?: never;
2075
+ patch?: never;
2076
+ trace?: never;
2077
+ };
2018
2078
  "/workspaces/{workspaceId}/hris/status": {
2019
2079
  parameters: {
2020
2080
  query?: never;
@@ -2839,6 +2899,31 @@ export interface components {
2839
2899
  usageDeltaPercent: number;
2840
2900
  weeks: components["schemas"]["AiUsageSpendRoiProductivitySignalWeekDto"][];
2841
2901
  };
2902
+ AiUsageSpendUsageTrendsProviderWeekDto: {
2903
+ providerId: string;
2904
+ providerName: string;
2905
+ spendCents: number;
2906
+ tokenCount: number;
2907
+ activeUsers: number;
2908
+ };
2909
+ AiUsageSpendUsageTrendsWeekDto: {
2910
+ /** Format: date-time */
2911
+ bucketStart: string;
2912
+ /** Format: date-time */
2913
+ bucketEnd: string;
2914
+ weekLabel?: string;
2915
+ providers: components["schemas"]["AiUsageSpendUsageTrendsProviderWeekDto"][];
2916
+ };
2917
+ AiUsageSpendUsageTrendsDto: {
2918
+ /** Format: uuid */
2919
+ workspaceId: string;
2920
+ /** @enum {string} */
2921
+ range: "4w" | "8w" | "q";
2922
+ scope: components["schemas"]["ProductivityInsightsAggregatedTeamsScopeDto"];
2923
+ /** Format: date-time */
2924
+ generatedAt: string;
2925
+ weeks: components["schemas"]["AiUsageSpendUsageTrendsWeekDto"][];
2926
+ };
2842
2927
  MeProfileDto: {
2843
2928
  id: string;
2844
2929
  email: string;
@@ -4041,7 +4126,7 @@ export interface components {
4041
4126
  * @description Type of workspace lifecycle event.
4042
4127
  * @enum {string}
4043
4128
  */
4044
- ActivityLogEventTypeDto: "repo.added" | "repo.removed" | "repo.readded" | "integration.github.added" | "integration.github.updated" | "integration.github.removed" | "integration.github.permissions_changed" | "integration.github.repo_added" | "integration.github.repo_removed" | "fix.requested" | "fix.generating" | "fix.pr_created" | "fix.merged" | "fix.failed" | "readiness.scan_started" | "readiness.scan_completed" | "readiness.scan_failed" | "readiness.scan_partial" | "integrations.agent_execution.provider_changed" | "integrations.repo_eligibility.overrides_changed" | "integrations.repo_eligibility.languages_refresh_requested" | "integrations.cursor.platform_key_enabled" | "integrations.cursor.platform_key_disabled" | "member.invited" | "member.role_changed" | "member.removed" | "hris.personio.sync_started" | "hris.personio.sync_completed" | "hris.personio.sync_failed" | "hris.sync_started" | "hris.sync_completed" | "hris.sync_failed" | "repo.sync_skipped" | "integrations.cursor.execution_key.added" | "integrations.cursor.execution_key.updated" | "integrations.cursor.execution_key.removed" | "integrations.cursor.execution_key.check_failed" | "integrations.cursor.admin_key.added" | "integrations.cursor.admin_key.updated" | "integrations.cursor.admin_key.removed" | "integrations.claude.execution_key.added" | "integrations.claude.execution_key.updated" | "integrations.claude.execution_key.removed" | "integrations.claude.execution_key.check_failed" | "integrations.claude.admin_key.added" | "integrations.claude.admin_key.updated" | "integrations.claude.admin_key.removed" | "readiness.scan_precheck_failed" | "productivity.ingest.completed" | "productivity.ingest.failed" | "productivity.ingest.skipped";
4129
+ ActivityLogEventTypeDto: "repo.added" | "repo.removed" | "repo.readded" | "integration.github.added" | "integration.github.updated" | "integration.github.removed" | "integration.github.permissions_changed" | "integration.github.repo_added" | "integration.github.repo_removed" | "fix.requested" | "fix.generating" | "fix.pr_created" | "fix.merged" | "fix.failed" | "readiness.scan_started" | "readiness.scan_completed" | "readiness.scan_failed" | "readiness.scan_partial" | "integrations.agent_execution.provider_changed" | "integrations.repo_eligibility.overrides_changed" | "integrations.repo_eligibility.languages_refresh_requested" | "integrations.cursor.platform_key_enabled" | "integrations.cursor.platform_key_disabled" | "member.invited" | "member.role_changed" | "member.removed" | "hris.personio.sync_started" | "hris.personio.sync_completed" | "hris.personio.sync_failed" | "hris.sync_started" | "hris.sync_completed" | "hris.sync_failed" | "repo.sync_skipped" | "integrations.cursor.execution_key.added" | "integrations.cursor.execution_key.updated" | "integrations.cursor.execution_key.removed" | "integrations.cursor.execution_key.check_failed" | "integrations.cursor.admin_key.added" | "integrations.cursor.admin_key.updated" | "integrations.cursor.admin_key.removed" | "integrations.claude.execution_key.added" | "integrations.claude.execution_key.updated" | "integrations.claude.execution_key.removed" | "integrations.claude.execution_key.check_failed" | "integrations.claude.admin_key.added" | "integrations.claude.admin_key.updated" | "integrations.claude.admin_key.removed" | "integrations.claude.analytics_key.added" | "integrations.claude.analytics_key.updated" | "integrations.claude.analytics_key.removed" | "readiness.scan_precheck_failed" | "productivity.ingest.completed" | "productivity.ingest.failed" | "productivity.ingest.skipped";
4045
4130
  ActivityLogActorDto: {
4046
4131
  /** Format: uuid */
4047
4132
  userId: string;
@@ -4124,6 +4209,16 @@ export interface components {
4124
4209
  HrisSyncStatusListDto: {
4125
4210
  statuses: components["schemas"]["HrisSyncStatusDto"][];
4126
4211
  };
4212
+ ZenHrReconnectResultDto: {
4213
+ ok: boolean;
4214
+ /** @description When true with ok=false, stored credentials exist but refresh failed with an OAuth re-authorization error; the SPA should start ZenHR OAuth next. */
4215
+ oauthRequired?: boolean;
4216
+ /**
4217
+ * @description Machine-readable code when ok=false and oauthRequired=true.
4218
+ * @enum {string}
4219
+ */
4220
+ error?: "zenhr_oauth_required";
4221
+ };
4127
4222
  HrisTriggerSyncResultDto: {
4128
4223
  /** @enum {string} */
4129
4224
  status: "ok" | "skipped" | "error" | "partial";
@@ -4407,6 +4502,9 @@ export type AiUsageSpendAiToolUsageSpendDto = components['schemas']['AiUsageSpen
4407
4502
  export type AiUsageSpendTeamToolHeatmapDto = components['schemas']['AiUsageSpendTeamToolHeatmapDto'];
4408
4503
  export type AiUsageSpendRoiProductivitySignalWeekDto = components['schemas']['AiUsageSpendRoiProductivitySignalWeekDto'];
4409
4504
  export type AiUsageSpendRoiProductivitySignalDto = components['schemas']['AiUsageSpendRoiProductivitySignalDto'];
4505
+ export type AiUsageSpendUsageTrendsProviderWeekDto = components['schemas']['AiUsageSpendUsageTrendsProviderWeekDto'];
4506
+ export type AiUsageSpendUsageTrendsWeekDto = components['schemas']['AiUsageSpendUsageTrendsWeekDto'];
4507
+ export type AiUsageSpendUsageTrendsDto = components['schemas']['AiUsageSpendUsageTrendsDto'];
4410
4508
  export type MeProfileDto = components['schemas']['MeProfileDto'];
4411
4509
  export type UpdateMeBodyDto = components['schemas']['UpdateMeBodyDto'];
4412
4510
  export type WorkspaceSummaryDto = components['schemas']['WorkspaceSummaryDto'];
@@ -4532,6 +4630,7 @@ export type WorkspaceAbsenceDto = components['schemas']['WorkspaceAbsenceDto'];
4532
4630
  export type WorkspaceAbsenceListDto = components['schemas']['WorkspaceAbsenceListDto'];
4533
4631
  export type HrisSyncStatusDto = components['schemas']['HrisSyncStatusDto'];
4534
4632
  export type HrisSyncStatusListDto = components['schemas']['HrisSyncStatusListDto'];
4633
+ export type ZenHrReconnectResultDto = components['schemas']['ZenHrReconnectResultDto'];
4535
4634
  export type HrisTriggerSyncResultDto = components['schemas']['HrisTriggerSyncResultDto'];
4536
4635
  export type HrisProviderSyncResultDto = components['schemas']['HrisProviderSyncResultDto'];
4537
4636
  export type ActivityLogPageDto = components['schemas']['ActivityLogPageDto'];
@@ -5330,6 +5429,63 @@ export interface operations {
5330
5429
  };
5331
5430
  };
5332
5431
  };
5432
+ deleteSourceInsightsByType: {
5433
+ parameters: {
5434
+ query?: never;
5435
+ header?: never;
5436
+ path: {
5437
+ workspaceId: components["parameters"]["WorkspaceId"];
5438
+ /** @description AI tool source type (`cursor` or `claude`). */
5439
+ type: "cursor" | "claude";
5440
+ };
5441
+ cookie?: never;
5442
+ };
5443
+ requestBody?: never;
5444
+ responses: {
5445
+ /** @description Insights credentials removed */
5446
+ 200: {
5447
+ headers: {
5448
+ [name: string]: unknown;
5449
+ };
5450
+ content: {
5451
+ /**
5452
+ * @example {
5453
+ * "ok": true
5454
+ * }
5455
+ */
5456
+ "application/json": {
5457
+ ok: boolean;
5458
+ };
5459
+ };
5460
+ };
5461
+ /** @description Invalid or unsupported source type */
5462
+ 400: {
5463
+ headers: {
5464
+ [name: string]: unknown;
5465
+ };
5466
+ content: {
5467
+ /**
5468
+ * @example {
5469
+ * "error": "Invalid or unsupported source type for insights disconnect",
5470
+ * "code": "invalid_source_type"
5471
+ * }
5472
+ */
5473
+ "application/json": components["schemas"]["ErrorMessageDto"];
5474
+ };
5475
+ };
5476
+ 401: components["responses"]["Unauthorized"];
5477
+ 403: components["responses"]["Forbidden"];
5478
+ /** @description Source missing or no insights credentials configured */
5479
+ 404: {
5480
+ headers: {
5481
+ [name: string]: unknown;
5482
+ };
5483
+ content: {
5484
+ "application/json": components["schemas"]["ErrorMessageDto"];
5485
+ };
5486
+ };
5487
+ };
5488
+ };
5333
5489
  getDashboardProductivity: {
5334
5490
  parameters: {
5335
5491
  query?: {
@@ -6102,6 +6258,58 @@ export interface operations {
6102
6258
  };
6103
6259
  };
6104
6260
  };
6261
+ getAiUsageSpendUsageTrends: {
6262
+ parameters: {
6263
+ query?: {
6264
+ /** @description Measure time range (maps to weekly bucket count). */
6265
+ rangeId?: "4w" | "8w" | "q";
6266
+ /** @description Department filter; send `All departments` to include every department. Scoped using imported `thinkai_org_structure` members when present, otherwise SPA org chart `department` nodes and their descendant teams. When neither source defines the requested department, insights return no scoped teams or contributors (not org-wide data). */
6267
+ department?: components["parameters"]["InsightsDepartmentFilter"];
6268
+ /** @description Team name filter; send `All teams` to include every team. */
6269
+ team?: string;
6270
+ /** @description ISO timestamp for the end of the last weekly bucket; omit for current week. */
6271
+ windowEnd?: string;
6272
+ };
6273
+ header?: never;
6274
+ path: {
6275
+ workspaceId: components["parameters"]["WorkspaceId"];
6276
+ };
6277
+ cookie?: never;
6278
+ };
6279
+ requestBody?: never;
6280
+ responses: {
6281
+ /** @description Per-provider weekly spend and token trend series */
6282
+ 200: {
6283
+ headers: {
6284
+ [name: string]: unknown;
6285
+ };
6286
+ content: {
6287
+ "application/json": components["schemas"]["AiUsageSpendUsageTrendsDto"];
6288
+ };
6289
+ };
6290
+ /** @description Invalid query parameters */
6291
+ 400: {
6292
+ headers: {
6293
+ [name: string]: unknown;
6294
+ };
6295
+ content: {
6296
+ "application/json": {
6297
+ /** @example invalid_query */
6298
+ error: string;
6299
+ };
6300
+ };
6301
+ };
6302
+ 401: components["responses"]["Unauthorized"];
6303
+ 403: components["responses"]["Forbidden"];
6304
+ /** @description Workspace does not exist or malformed workspaceId */
6305
+ 404: {
6306
+ headers: {
6307
+ [name: string]: unknown;
6308
+ };
6309
+ content?: never;
6310
+ };
6311
+ };
6312
+ };
6105
6313
  getCompanyProfile: {
6106
6314
  parameters: {
6107
6315
  query?: never;
@@ -9635,6 +9843,58 @@ export interface operations {
9635
9843
  403: components["responses"]["Forbidden"];
9636
9844
  };
9637
9845
  };
9846
+ reconnectWorkspaceZenHr: {
9847
+ parameters: {
9848
+ query?: never;
9849
+ header?: never;
9850
+ path: {
9851
+ workspaceId: components["parameters"]["WorkspaceId"];
9852
+ };
9853
+ cookie?: never;
9854
+ };
9855
+ requestBody?: never;
9856
+ responses: {
9857
+ /** @description Silent reconnect succeeded or OAuth is required */
9858
+ 200: {
9859
+ headers: {
9860
+ [name: string]: unknown;
9861
+ };
9862
+ content: {
9863
+ "application/json": components["schemas"]["ZenHrReconnectResultDto"];
9864
+ };
9865
+ };
9866
+ 401: components["responses"]["Unauthorized"];
9867
+ 403: components["responses"]["Forbidden"];
9868
+ /** @description ZenHR is not connected for this workspace */
9869
+ 404: {
9870
+ headers: {
9871
+ [name: string]: unknown;
9872
+ };
9873
+ content: {
9874
+ /**
9875
+ * @example {
9876
+ * "error": "zenhr_not_connected"
9877
+ * }
9878
+ */
9879
+ "application/json": components["schemas"]["ErrorMessageDto"];
9880
+ };
9881
+ };
9882
+ /** @description ZenHR refresh or branch ping failed for a non-OAuth reason */
9883
+ 502: {
9884
+ headers: {
9885
+ [name: string]: unknown;
9886
+ };
9887
+ content: {
9888
+ /**
9889
+ * @example {
9890
+ * "error": "zenhr_reconnect_failed"
9891
+ * }
9892
+ */
9893
+ "application/json": components["schemas"]["ErrorMessageDto"];
9894
+ };
9895
+ };
9896
+ };
9897
+ };
9638
9898
  getHrisSyncStatus: {
9639
9899
  parameters: {
9640
9900
  query?: never;