@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.
- package/dist/generated/openapi.d.ts +261 -1
- package/dist/generated/openapi.d.ts.map +1 -1
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/openapi/openapi.yaml +245 -1
- package/package.json +1 -1
- package/src/generated/openapi.ts +261 -1
- package/src/index.ts +31 -0
package/src/generated/openapi.ts
CHANGED
|
@@ -292,6 +292,26 @@ export interface paths {
|
|
|
292
292
|
patch?: never;
|
|
293
293
|
trace?: never;
|
|
294
294
|
};
|
|
295
|
+
"/workspaces/{workspaceId}/sources/{type}/insights": {
|
|
296
|
+
parameters: {
|
|
297
|
+
query?: never;
|
|
298
|
+
header?: never;
|
|
299
|
+
path?: never;
|
|
300
|
+
cookie?: never;
|
|
301
|
+
};
|
|
302
|
+
get?: never;
|
|
303
|
+
put?: never;
|
|
304
|
+
post?: never;
|
|
305
|
+
/**
|
|
306
|
+
* Disconnect AI tool usage insights credentials
|
|
307
|
+
* @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.
|
|
308
|
+
*/
|
|
309
|
+
delete: operations["deleteSourceInsightsByType"];
|
|
310
|
+
options?: never;
|
|
311
|
+
head?: never;
|
|
312
|
+
patch?: never;
|
|
313
|
+
trace?: never;
|
|
314
|
+
};
|
|
295
315
|
"/workspaces/{workspaceId}/dashboard/productivity": {
|
|
296
316
|
parameters: {
|
|
297
317
|
query?: never;
|
|
@@ -586,6 +606,26 @@ export interface paths {
|
|
|
586
606
|
patch?: never;
|
|
587
607
|
trace?: never;
|
|
588
608
|
};
|
|
609
|
+
"/workspaces/{workspaceId}/insights/ai-usage-spend/usage-trends": {
|
|
610
|
+
parameters: {
|
|
611
|
+
query?: never;
|
|
612
|
+
header?: never;
|
|
613
|
+
path?: never;
|
|
614
|
+
cookie?: never;
|
|
615
|
+
};
|
|
616
|
+
/**
|
|
617
|
+
* AI usage & spend insights — per-provider weekly spend/token trends
|
|
618
|
+
* @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.
|
|
619
|
+
*/
|
|
620
|
+
get: operations["getAiUsageSpendUsageTrends"];
|
|
621
|
+
put?: never;
|
|
622
|
+
post?: never;
|
|
623
|
+
delete?: never;
|
|
624
|
+
options?: never;
|
|
625
|
+
head?: never;
|
|
626
|
+
patch?: never;
|
|
627
|
+
trace?: never;
|
|
628
|
+
};
|
|
589
629
|
"/workspaces/{workspaceId}/company-profile": {
|
|
590
630
|
parameters: {
|
|
591
631
|
query?: never;
|
|
@@ -2016,6 +2056,26 @@ export interface paths {
|
|
|
2016
2056
|
patch?: never;
|
|
2017
2057
|
trace?: never;
|
|
2018
2058
|
};
|
|
2059
|
+
"/workspaces/{workspaceId}/integrations/zenhr/reconnect": {
|
|
2060
|
+
parameters: {
|
|
2061
|
+
query?: never;
|
|
2062
|
+
header?: never;
|
|
2063
|
+
path?: never;
|
|
2064
|
+
cookie?: never;
|
|
2065
|
+
};
|
|
2066
|
+
get?: never;
|
|
2067
|
+
put?: never;
|
|
2068
|
+
/**
|
|
2069
|
+
* Attempt silent ZenHR reconnect
|
|
2070
|
+
* @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`).
|
|
2071
|
+
*/
|
|
2072
|
+
post: operations["reconnectWorkspaceZenHr"];
|
|
2073
|
+
delete?: never;
|
|
2074
|
+
options?: never;
|
|
2075
|
+
head?: never;
|
|
2076
|
+
patch?: never;
|
|
2077
|
+
trace?: never;
|
|
2078
|
+
};
|
|
2019
2079
|
"/workspaces/{workspaceId}/hris/status": {
|
|
2020
2080
|
parameters: {
|
|
2021
2081
|
query?: never;
|
|
@@ -2840,6 +2900,31 @@ export interface components {
|
|
|
2840
2900
|
usageDeltaPercent: number;
|
|
2841
2901
|
weeks: components["schemas"]["AiUsageSpendRoiProductivitySignalWeekDto"][];
|
|
2842
2902
|
};
|
|
2903
|
+
AiUsageSpendUsageTrendsProviderWeekDto: {
|
|
2904
|
+
providerId: string;
|
|
2905
|
+
providerName: string;
|
|
2906
|
+
spendCents: number;
|
|
2907
|
+
tokenCount: number;
|
|
2908
|
+
activeUsers: number;
|
|
2909
|
+
};
|
|
2910
|
+
AiUsageSpendUsageTrendsWeekDto: {
|
|
2911
|
+
/** Format: date-time */
|
|
2912
|
+
bucketStart: string;
|
|
2913
|
+
/** Format: date-time */
|
|
2914
|
+
bucketEnd: string;
|
|
2915
|
+
weekLabel?: string;
|
|
2916
|
+
providers: components["schemas"]["AiUsageSpendUsageTrendsProviderWeekDto"][];
|
|
2917
|
+
};
|
|
2918
|
+
AiUsageSpendUsageTrendsDto: {
|
|
2919
|
+
/** Format: uuid */
|
|
2920
|
+
workspaceId: string;
|
|
2921
|
+
/** @enum {string} */
|
|
2922
|
+
range: "4w" | "8w" | "q";
|
|
2923
|
+
scope: components["schemas"]["ProductivityInsightsAggregatedTeamsScopeDto"];
|
|
2924
|
+
/** Format: date-time */
|
|
2925
|
+
generatedAt: string;
|
|
2926
|
+
weeks: components["schemas"]["AiUsageSpendUsageTrendsWeekDto"][];
|
|
2927
|
+
};
|
|
2843
2928
|
MeProfileDto: {
|
|
2844
2929
|
id: string;
|
|
2845
2930
|
email: string;
|
|
@@ -4042,7 +4127,7 @@ export interface components {
|
|
|
4042
4127
|
* @description Type of workspace lifecycle event.
|
|
4043
4128
|
* @enum {string}
|
|
4044
4129
|
*/
|
|
4045
|
-
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";
|
|
4130
|
+
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";
|
|
4046
4131
|
ActivityLogActorDto: {
|
|
4047
4132
|
/** Format: uuid */
|
|
4048
4133
|
userId: string;
|
|
@@ -4125,6 +4210,16 @@ export interface components {
|
|
|
4125
4210
|
HrisSyncStatusListDto: {
|
|
4126
4211
|
statuses: components["schemas"]["HrisSyncStatusDto"][];
|
|
4127
4212
|
};
|
|
4213
|
+
ZenHrReconnectResultDto: {
|
|
4214
|
+
ok: boolean;
|
|
4215
|
+
/** @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. */
|
|
4216
|
+
oauthRequired?: boolean;
|
|
4217
|
+
/**
|
|
4218
|
+
* @description Machine-readable code when ok=false and oauthRequired=true.
|
|
4219
|
+
* @enum {string}
|
|
4220
|
+
*/
|
|
4221
|
+
error?: "zenhr_oauth_required";
|
|
4222
|
+
};
|
|
4128
4223
|
HrisTriggerSyncResultDto: {
|
|
4129
4224
|
/** @enum {string} */
|
|
4130
4225
|
status: "ok" | "skipped" | "error" | "partial";
|
|
@@ -4408,6 +4503,9 @@ export type AiUsageSpendAiToolUsageSpendDto = components['schemas']['AiUsageSpen
|
|
|
4408
4503
|
export type AiUsageSpendTeamToolHeatmapDto = components['schemas']['AiUsageSpendTeamToolHeatmapDto'];
|
|
4409
4504
|
export type AiUsageSpendRoiProductivitySignalWeekDto = components['schemas']['AiUsageSpendRoiProductivitySignalWeekDto'];
|
|
4410
4505
|
export type AiUsageSpendRoiProductivitySignalDto = components['schemas']['AiUsageSpendRoiProductivitySignalDto'];
|
|
4506
|
+
export type AiUsageSpendUsageTrendsProviderWeekDto = components['schemas']['AiUsageSpendUsageTrendsProviderWeekDto'];
|
|
4507
|
+
export type AiUsageSpendUsageTrendsWeekDto = components['schemas']['AiUsageSpendUsageTrendsWeekDto'];
|
|
4508
|
+
export type AiUsageSpendUsageTrendsDto = components['schemas']['AiUsageSpendUsageTrendsDto'];
|
|
4411
4509
|
export type MeProfileDto = components['schemas']['MeProfileDto'];
|
|
4412
4510
|
export type UpdateMeBodyDto = components['schemas']['UpdateMeBodyDto'];
|
|
4413
4511
|
export type WorkspaceSummaryDto = components['schemas']['WorkspaceSummaryDto'];
|
|
@@ -4533,6 +4631,7 @@ export type WorkspaceAbsenceDto = components['schemas']['WorkspaceAbsenceDto'];
|
|
|
4533
4631
|
export type WorkspaceAbsenceListDto = components['schemas']['WorkspaceAbsenceListDto'];
|
|
4534
4632
|
export type HrisSyncStatusDto = components['schemas']['HrisSyncStatusDto'];
|
|
4535
4633
|
export type HrisSyncStatusListDto = components['schemas']['HrisSyncStatusListDto'];
|
|
4634
|
+
export type ZenHrReconnectResultDto = components['schemas']['ZenHrReconnectResultDto'];
|
|
4536
4635
|
export type HrisTriggerSyncResultDto = components['schemas']['HrisTriggerSyncResultDto'];
|
|
4537
4636
|
export type HrisProviderSyncResultDto = components['schemas']['HrisProviderSyncResultDto'];
|
|
4538
4637
|
export type ActivityLogPageDto = components['schemas']['ActivityLogPageDto'];
|
|
@@ -5331,6 +5430,63 @@ export interface operations {
|
|
|
5331
5430
|
};
|
|
5332
5431
|
};
|
|
5333
5432
|
};
|
|
5433
|
+
deleteSourceInsightsByType: {
|
|
5434
|
+
parameters: {
|
|
5435
|
+
query?: never;
|
|
5436
|
+
header?: never;
|
|
5437
|
+
path: {
|
|
5438
|
+
workspaceId: components["parameters"]["WorkspaceId"];
|
|
5439
|
+
/** @description AI tool source type (`cursor` or `claude`). */
|
|
5440
|
+
type: "cursor" | "claude";
|
|
5441
|
+
};
|
|
5442
|
+
cookie?: never;
|
|
5443
|
+
};
|
|
5444
|
+
requestBody?: never;
|
|
5445
|
+
responses: {
|
|
5446
|
+
/** @description Insights credentials removed */
|
|
5447
|
+
200: {
|
|
5448
|
+
headers: {
|
|
5449
|
+
[name: string]: unknown;
|
|
5450
|
+
};
|
|
5451
|
+
content: {
|
|
5452
|
+
/**
|
|
5453
|
+
* @example {
|
|
5454
|
+
* "ok": true
|
|
5455
|
+
* }
|
|
5456
|
+
*/
|
|
5457
|
+
"application/json": {
|
|
5458
|
+
ok: boolean;
|
|
5459
|
+
};
|
|
5460
|
+
};
|
|
5461
|
+
};
|
|
5462
|
+
/** @description Invalid or unsupported source type */
|
|
5463
|
+
400: {
|
|
5464
|
+
headers: {
|
|
5465
|
+
[name: string]: unknown;
|
|
5466
|
+
};
|
|
5467
|
+
content: {
|
|
5468
|
+
/**
|
|
5469
|
+
* @example {
|
|
5470
|
+
* "error": "Invalid or unsupported source type for insights disconnect",
|
|
5471
|
+
* "code": "invalid_source_type"
|
|
5472
|
+
* }
|
|
5473
|
+
*/
|
|
5474
|
+
"application/json": components["schemas"]["ErrorMessageDto"];
|
|
5475
|
+
};
|
|
5476
|
+
};
|
|
5477
|
+
401: components["responses"]["Unauthorized"];
|
|
5478
|
+
403: components["responses"]["Forbidden"];
|
|
5479
|
+
/** @description Source missing or no insights credentials configured */
|
|
5480
|
+
404: {
|
|
5481
|
+
headers: {
|
|
5482
|
+
[name: string]: unknown;
|
|
5483
|
+
};
|
|
5484
|
+
content: {
|
|
5485
|
+
"application/json": components["schemas"]["ErrorMessageDto"];
|
|
5486
|
+
};
|
|
5487
|
+
};
|
|
5488
|
+
};
|
|
5489
|
+
};
|
|
5334
5490
|
getDashboardProductivity: {
|
|
5335
5491
|
parameters: {
|
|
5336
5492
|
query?: {
|
|
@@ -6103,6 +6259,58 @@ export interface operations {
|
|
|
6103
6259
|
};
|
|
6104
6260
|
};
|
|
6105
6261
|
};
|
|
6262
|
+
getAiUsageSpendUsageTrends: {
|
|
6263
|
+
parameters: {
|
|
6264
|
+
query?: {
|
|
6265
|
+
/** @description Measure time range (maps to weekly bucket count). */
|
|
6266
|
+
rangeId?: "4w" | "8w" | "q";
|
|
6267
|
+
/** @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). */
|
|
6268
|
+
department?: components["parameters"]["InsightsDepartmentFilter"];
|
|
6269
|
+
/** @description Team name filter; send `All teams` to include every team. */
|
|
6270
|
+
team?: string;
|
|
6271
|
+
/** @description ISO timestamp for the end of the last weekly bucket; omit for current week. */
|
|
6272
|
+
windowEnd?: string;
|
|
6273
|
+
};
|
|
6274
|
+
header?: never;
|
|
6275
|
+
path: {
|
|
6276
|
+
workspaceId: components["parameters"]["WorkspaceId"];
|
|
6277
|
+
};
|
|
6278
|
+
cookie?: never;
|
|
6279
|
+
};
|
|
6280
|
+
requestBody?: never;
|
|
6281
|
+
responses: {
|
|
6282
|
+
/** @description Per-provider weekly spend and token trend series */
|
|
6283
|
+
200: {
|
|
6284
|
+
headers: {
|
|
6285
|
+
[name: string]: unknown;
|
|
6286
|
+
};
|
|
6287
|
+
content: {
|
|
6288
|
+
"application/json": components["schemas"]["AiUsageSpendUsageTrendsDto"];
|
|
6289
|
+
};
|
|
6290
|
+
};
|
|
6291
|
+
/** @description Invalid query parameters */
|
|
6292
|
+
400: {
|
|
6293
|
+
headers: {
|
|
6294
|
+
[name: string]: unknown;
|
|
6295
|
+
};
|
|
6296
|
+
content: {
|
|
6297
|
+
"application/json": {
|
|
6298
|
+
/** @example invalid_query */
|
|
6299
|
+
error: string;
|
|
6300
|
+
};
|
|
6301
|
+
};
|
|
6302
|
+
};
|
|
6303
|
+
401: components["responses"]["Unauthorized"];
|
|
6304
|
+
403: components["responses"]["Forbidden"];
|
|
6305
|
+
/** @description Workspace does not exist or malformed workspaceId */
|
|
6306
|
+
404: {
|
|
6307
|
+
headers: {
|
|
6308
|
+
[name: string]: unknown;
|
|
6309
|
+
};
|
|
6310
|
+
content?: never;
|
|
6311
|
+
};
|
|
6312
|
+
};
|
|
6313
|
+
};
|
|
6106
6314
|
getCompanyProfile: {
|
|
6107
6315
|
parameters: {
|
|
6108
6316
|
query?: never;
|
|
@@ -9636,6 +9844,58 @@ export interface operations {
|
|
|
9636
9844
|
403: components["responses"]["Forbidden"];
|
|
9637
9845
|
};
|
|
9638
9846
|
};
|
|
9847
|
+
reconnectWorkspaceZenHr: {
|
|
9848
|
+
parameters: {
|
|
9849
|
+
query?: never;
|
|
9850
|
+
header?: never;
|
|
9851
|
+
path: {
|
|
9852
|
+
workspaceId: components["parameters"]["WorkspaceId"];
|
|
9853
|
+
};
|
|
9854
|
+
cookie?: never;
|
|
9855
|
+
};
|
|
9856
|
+
requestBody?: never;
|
|
9857
|
+
responses: {
|
|
9858
|
+
/** @description Silent reconnect succeeded or OAuth is required */
|
|
9859
|
+
200: {
|
|
9860
|
+
headers: {
|
|
9861
|
+
[name: string]: unknown;
|
|
9862
|
+
};
|
|
9863
|
+
content: {
|
|
9864
|
+
"application/json": components["schemas"]["ZenHrReconnectResultDto"];
|
|
9865
|
+
};
|
|
9866
|
+
};
|
|
9867
|
+
401: components["responses"]["Unauthorized"];
|
|
9868
|
+
403: components["responses"]["Forbidden"];
|
|
9869
|
+
/** @description ZenHR is not connected for this workspace */
|
|
9870
|
+
404: {
|
|
9871
|
+
headers: {
|
|
9872
|
+
[name: string]: unknown;
|
|
9873
|
+
};
|
|
9874
|
+
content: {
|
|
9875
|
+
/**
|
|
9876
|
+
* @example {
|
|
9877
|
+
* "error": "zenhr_not_connected"
|
|
9878
|
+
* }
|
|
9879
|
+
*/
|
|
9880
|
+
"application/json": components["schemas"]["ErrorMessageDto"];
|
|
9881
|
+
};
|
|
9882
|
+
};
|
|
9883
|
+
/** @description ZenHR refresh or branch ping failed for a non-OAuth reason */
|
|
9884
|
+
502: {
|
|
9885
|
+
headers: {
|
|
9886
|
+
[name: string]: unknown;
|
|
9887
|
+
};
|
|
9888
|
+
content: {
|
|
9889
|
+
/**
|
|
9890
|
+
* @example {
|
|
9891
|
+
* "error": "zenhr_reconnect_failed"
|
|
9892
|
+
* }
|
|
9893
|
+
*/
|
|
9894
|
+
"application/json": components["schemas"]["ErrorMessageDto"];
|
|
9895
|
+
};
|
|
9896
|
+
};
|
|
9897
|
+
};
|
|
9898
|
+
};
|
|
9639
9899
|
getHrisSyncStatus: {
|
|
9640
9900
|
parameters: {
|
|
9641
9901
|
query?: never;
|
package/src/index.ts
CHANGED
|
@@ -900,6 +900,29 @@ export interface AiUsageSpendRoiProductivitySignalDto {
|
|
|
900
900
|
weeks: AiUsageSpendRoiProductivitySignalWeekDto[];
|
|
901
901
|
}
|
|
902
902
|
|
|
903
|
+
export interface AiUsageSpendUsageTrendsProviderWeekDto {
|
|
904
|
+
providerId: string;
|
|
905
|
+
providerName: string;
|
|
906
|
+
spendCents: number;
|
|
907
|
+
tokenCount: number;
|
|
908
|
+
activeUsers: number;
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
export interface AiUsageSpendUsageTrendsWeekDto {
|
|
912
|
+
bucketStart: string;
|
|
913
|
+
bucketEnd: string;
|
|
914
|
+
weekLabel?: string;
|
|
915
|
+
providers: AiUsageSpendUsageTrendsProviderWeekDto[];
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
export interface AiUsageSpendUsageTrendsDto {
|
|
919
|
+
workspaceId: string;
|
|
920
|
+
range: string;
|
|
921
|
+
scope: { department: string; team: string };
|
|
922
|
+
generatedAt: string;
|
|
923
|
+
weeks: AiUsageSpendUsageTrendsWeekDto[];
|
|
924
|
+
}
|
|
925
|
+
|
|
903
926
|
/** Appeal: user contests a misattributed event. Lifecycle: pending → approved | rejected. */
|
|
904
927
|
export interface AppealDto {
|
|
905
928
|
id: string;
|
|
@@ -1120,6 +1143,14 @@ export interface HrisProviderSyncResultDto {
|
|
|
1120
1143
|
error?: string;
|
|
1121
1144
|
}
|
|
1122
1145
|
|
|
1146
|
+
/** Response body for POST /workspaces/:id/integrations/zenhr/reconnect. */
|
|
1147
|
+
export interface ZenHrReconnectResultDto {
|
|
1148
|
+
ok: boolean;
|
|
1149
|
+
/** When true with ok=false, the SPA should start ZenHR OAuth next. */
|
|
1150
|
+
oauthRequired?: boolean;
|
|
1151
|
+
error?: "zenhr_oauth_required";
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1123
1154
|
/** Response body for POST /workspaces/:id/hris/sync (manual trigger). */
|
|
1124
1155
|
export interface HrisTriggerSyncResultDto {
|
|
1125
1156
|
status: "ok" | "skipped" | "error" | "partial";
|