@miradorlabs/web-grpc 2.57.0 → 2.59.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.
@@ -432,6 +432,63 @@ export function aITokenActivityDimensionToJSON(object: AITokenActivityDimension)
432
432
  }
433
433
  }
434
434
 
435
+ export enum AIResourceDimension {
436
+ AI_RESOURCE_DIMENSION_UNSPECIFIED = 0,
437
+ AI_RESOURCE_DIMENSION_SKILL = 1,
438
+ AI_RESOURCE_DIMENSION_TOOL = 2,
439
+ AI_RESOURCE_DIMENSION_FILE = 3,
440
+ AI_RESOURCE_DIMENSION_URL = 4,
441
+ AI_RESOURCE_DIMENSION_COMMAND = 5,
442
+ UNRECOGNIZED = -1,
443
+ }
444
+
445
+ export function aIResourceDimensionFromJSON(object: any): AIResourceDimension {
446
+ switch (object) {
447
+ case 0:
448
+ case "AI_RESOURCE_DIMENSION_UNSPECIFIED":
449
+ return AIResourceDimension.AI_RESOURCE_DIMENSION_UNSPECIFIED;
450
+ case 1:
451
+ case "AI_RESOURCE_DIMENSION_SKILL":
452
+ return AIResourceDimension.AI_RESOURCE_DIMENSION_SKILL;
453
+ case 2:
454
+ case "AI_RESOURCE_DIMENSION_TOOL":
455
+ return AIResourceDimension.AI_RESOURCE_DIMENSION_TOOL;
456
+ case 3:
457
+ case "AI_RESOURCE_DIMENSION_FILE":
458
+ return AIResourceDimension.AI_RESOURCE_DIMENSION_FILE;
459
+ case 4:
460
+ case "AI_RESOURCE_DIMENSION_URL":
461
+ return AIResourceDimension.AI_RESOURCE_DIMENSION_URL;
462
+ case 5:
463
+ case "AI_RESOURCE_DIMENSION_COMMAND":
464
+ return AIResourceDimension.AI_RESOURCE_DIMENSION_COMMAND;
465
+ case -1:
466
+ case "UNRECOGNIZED":
467
+ default:
468
+ return AIResourceDimension.UNRECOGNIZED;
469
+ }
470
+ }
471
+
472
+ export function aIResourceDimensionToJSON(object: AIResourceDimension): string {
473
+ switch (object) {
474
+ case AIResourceDimension.AI_RESOURCE_DIMENSION_UNSPECIFIED:
475
+ return "AI_RESOURCE_DIMENSION_UNSPECIFIED";
476
+ case AIResourceDimension.AI_RESOURCE_DIMENSION_SKILL:
477
+ return "AI_RESOURCE_DIMENSION_SKILL";
478
+ case AIResourceDimension.AI_RESOURCE_DIMENSION_TOOL:
479
+ return "AI_RESOURCE_DIMENSION_TOOL";
480
+ case AIResourceDimension.AI_RESOURCE_DIMENSION_FILE:
481
+ return "AI_RESOURCE_DIMENSION_FILE";
482
+ case AIResourceDimension.AI_RESOURCE_DIMENSION_URL:
483
+ return "AI_RESOURCE_DIMENSION_URL";
484
+ case AIResourceDimension.AI_RESOURCE_DIMENSION_COMMAND:
485
+ return "AI_RESOURCE_DIMENSION_COMMAND";
486
+ case AIResourceDimension.UNRECOGNIZED:
487
+ default:
488
+ return "UNRECOGNIZED";
489
+ }
490
+ }
491
+
435
492
  export enum AIFileLifecycle {
436
493
  AI_FILE_LIFECYCLE_UNSPECIFIED = 0,
437
494
  AI_FILE_LIFECYCLE_UNLANDED = 1,
@@ -1201,6 +1258,46 @@ export interface DailyActivityMeasures {
1201
1258
  branchesCreated: number;
1202
1259
  }
1203
1260
 
1261
+ export interface ActivityRhythmRequest {
1262
+ organizationId: string;
1263
+ projectId: string;
1264
+ /** the range; UNSPECIFIED is rejected, capped at 30 days */
1265
+ timeWindow: AnalyticsTimeWindow;
1266
+ /** IANA zone (e.g. "America/New_York"); empty defaults to "UTC". Echoed on the response. */
1267
+ timeZone: string;
1268
+ }
1269
+
1270
+ /**
1271
+ * ActivityRhythm mirrors telemetry.api.v1.ActivityRhythm: a sparse weekday/hour heatmap replaced wholesale
1272
+ * each tick (streams carry no ResponseStatus). Only slots with at least one event are present.
1273
+ */
1274
+ export interface ActivityRhythm {
1275
+ buckets: ActivityRhythmBucket[];
1276
+ windowStart: Date | undefined;
1277
+ windowEnd: Date | undefined;
1278
+ asOf:
1279
+ | Date
1280
+ | undefined;
1281
+ /** resolved IANA zone */
1282
+ timeZone: string;
1283
+ }
1284
+
1285
+ export interface ActivityRhythmBucket {
1286
+ /** 1 = Monday .. 7 = Sunday */
1287
+ dayOfWeek: number;
1288
+ /** 0 .. 23 */
1289
+ hourOfDay: number;
1290
+ eventCount: number;
1291
+ modelUsage: TokenActivityMeasures | undefined;
1292
+ usageUnavailableCount: number;
1293
+ costUnavailableCount: number;
1294
+ toolCalls: number;
1295
+ userMessages: number;
1296
+ sessions: number;
1297
+ activeUsers: number;
1298
+ topTool: string;
1299
+ }
1300
+
1204
1301
  export interface ProjectOverviewRequest {
1205
1302
  organizationId: string;
1206
1303
  projectId: string;
@@ -1249,6 +1346,31 @@ export interface ProjectSessionRef {
1249
1346
  lastActivityAt: Date | undefined;
1250
1347
  }
1251
1348
 
1349
+ export interface ResourceRankingsRequest {
1350
+ organizationId: string;
1351
+ projectId: string;
1352
+ filter: AISessionFilter | undefined;
1353
+ dimension: AIResourceDimension;
1354
+ timeWindow: AnalyticsTimeWindow;
1355
+ topN: number;
1356
+ }
1357
+
1358
+ export interface ResourceRankingsResponse {
1359
+ status: ResponseStatus | undefined;
1360
+ rankings: ResourceRanking[];
1361
+ dimension: AIResourceDimension;
1362
+ windowStart: Date | undefined;
1363
+ windowEnd: Date | undefined;
1364
+ asOf: Date | undefined;
1365
+ }
1366
+
1367
+ export interface ResourceRanking {
1368
+ key: string;
1369
+ count: number;
1370
+ priorCount: number;
1371
+ sessionCount: number;
1372
+ }
1373
+
1252
1374
  export interface AIFileFilter {
1253
1375
  repositoryKey: string[];
1254
1376
  ref: string[];
@@ -9518,28 +9640,28 @@ export const DailyActivityMeasures: MessageFns<DailyActivityMeasures> = {
9518
9640
  },
9519
9641
  };
9520
9642
 
9521
- function createBaseProjectOverviewRequest(): ProjectOverviewRequest {
9522
- return { organizationId: "", projectId: "", activeAfter: undefined, topSessions: 0 };
9643
+ function createBaseActivityRhythmRequest(): ActivityRhythmRequest {
9644
+ return { organizationId: "", projectId: "", timeWindow: 0, timeZone: "" };
9523
9645
  }
9524
9646
 
9525
- export const ProjectOverviewRequest: MessageFns<ProjectOverviewRequest> = {
9526
- encode(message: ProjectOverviewRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
9647
+ export const ActivityRhythmRequest: MessageFns<ActivityRhythmRequest> = {
9648
+ encode(message: ActivityRhythmRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
9527
9649
  if (message.organizationId !== "") {
9528
9650
  writer.uint32(10).string(message.organizationId);
9529
9651
  }
9530
9652
  if (message.projectId !== "") {
9531
9653
  writer.uint32(18).string(message.projectId);
9532
9654
  }
9533
- if (message.activeAfter !== undefined) {
9534
- Timestamp.encode(toTimestamp(message.activeAfter), writer.uint32(26).fork()).join();
9655
+ if (message.timeWindow !== 0) {
9656
+ writer.uint32(24).int32(message.timeWindow);
9535
9657
  }
9536
- if (message.topSessions !== 0) {
9537
- writer.uint32(32).int32(message.topSessions);
9658
+ if (message.timeZone !== "") {
9659
+ writer.uint32(34).string(message.timeZone);
9538
9660
  }
9539
9661
  return writer;
9540
9662
  },
9541
9663
 
9542
- decode(input: BinaryReader | Uint8Array, length?: number): ProjectOverviewRequest {
9664
+ decode(input: BinaryReader | Uint8Array, length?: number): ActivityRhythmRequest {
9543
9665
  const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
9544
9666
  const previousRecursionDepth = (reader as any).__tsProtoDecodeDepth ?? 0;
9545
9667
  if (previousRecursionDepth >= 100) {
@@ -9548,7 +9670,7 @@ export const ProjectOverviewRequest: MessageFns<ProjectOverviewRequest> = {
9548
9670
  (reader as any).__tsProtoDecodeDepth = previousRecursionDepth + 1;
9549
9671
  try {
9550
9672
  const end = length === undefined ? reader.len : reader.pos + length;
9551
- const message = createBaseProjectOverviewRequest();
9673
+ const message = createBaseActivityRhythmRequest();
9552
9674
  while (reader.pos < end) {
9553
9675
  const tag = reader.uint32();
9554
9676
  switch (tag >>> 3) {
@@ -9569,19 +9691,19 @@ export const ProjectOverviewRequest: MessageFns<ProjectOverviewRequest> = {
9569
9691
  continue;
9570
9692
  }
9571
9693
  case 3: {
9572
- if (tag !== 26) {
9694
+ if (tag !== 24) {
9573
9695
  break;
9574
9696
  }
9575
9697
 
9576
- message.activeAfter = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
9698
+ message.timeWindow = reader.int32() as any;
9577
9699
  continue;
9578
9700
  }
9579
9701
  case 4: {
9580
- if (tag !== 32) {
9702
+ if (tag !== 34) {
9581
9703
  break;
9582
9704
  }
9583
9705
 
9584
- message.topSessions = reader.int32();
9706
+ message.timeZone = reader.string();
9585
9707
  continue;
9586
9708
  }
9587
9709
  }
@@ -9596,7 +9718,7 @@ export const ProjectOverviewRequest: MessageFns<ProjectOverviewRequest> = {
9596
9718
  }
9597
9719
  },
9598
9720
 
9599
- fromJSON(object: any): ProjectOverviewRequest {
9721
+ fromJSON(object: any): ActivityRhythmRequest {
9600
9722
  return {
9601
9723
  organizationId: isSet(object.organizationId)
9602
9724
  ? globalThis.String(object.organizationId)
@@ -9608,20 +9730,20 @@ export const ProjectOverviewRequest: MessageFns<ProjectOverviewRequest> = {
9608
9730
  : isSet(object.project_id)
9609
9731
  ? globalThis.String(object.project_id)
9610
9732
  : "",
9611
- activeAfter: isSet(object.activeAfter)
9612
- ? fromJsonTimestamp(object.activeAfter)
9613
- : isSet(object.active_after)
9614
- ? fromJsonTimestamp(object.active_after)
9615
- : undefined,
9616
- topSessions: isSet(object.topSessions)
9617
- ? globalThis.Number(object.topSessions)
9618
- : isSet(object.top_sessions)
9619
- ? globalThis.Number(object.top_sessions)
9733
+ timeWindow: isSet(object.timeWindow)
9734
+ ? analyticsTimeWindowFromJSON(object.timeWindow)
9735
+ : isSet(object.time_window)
9736
+ ? analyticsTimeWindowFromJSON(object.time_window)
9620
9737
  : 0,
9738
+ timeZone: isSet(object.timeZone)
9739
+ ? globalThis.String(object.timeZone)
9740
+ : isSet(object.time_zone)
9741
+ ? globalThis.String(object.time_zone)
9742
+ : "",
9621
9743
  };
9622
9744
  },
9623
9745
 
9624
- toJSON(message: ProjectOverviewRequest): unknown {
9746
+ toJSON(message: ActivityRhythmRequest): unknown {
9625
9747
  const obj: any = {};
9626
9748
  if (message.organizationId !== "") {
9627
9749
  obj.organizationId = message.organizationId;
@@ -9629,53 +9751,53 @@ export const ProjectOverviewRequest: MessageFns<ProjectOverviewRequest> = {
9629
9751
  if (message.projectId !== "") {
9630
9752
  obj.projectId = message.projectId;
9631
9753
  }
9632
- if (message.activeAfter !== undefined) {
9633
- obj.activeAfter = message.activeAfter.toISOString();
9754
+ if (message.timeWindow !== 0) {
9755
+ obj.timeWindow = analyticsTimeWindowToJSON(message.timeWindow);
9634
9756
  }
9635
- if (message.topSessions !== 0) {
9636
- obj.topSessions = Math.round(message.topSessions);
9757
+ if (message.timeZone !== "") {
9758
+ obj.timeZone = message.timeZone;
9637
9759
  }
9638
9760
  return obj;
9639
9761
  },
9640
9762
 
9641
- create<I extends Exact<DeepPartial<ProjectOverviewRequest>, I>>(base?: I): ProjectOverviewRequest {
9642
- return ProjectOverviewRequest.fromPartial(base ?? ({} as any));
9763
+ create<I extends Exact<DeepPartial<ActivityRhythmRequest>, I>>(base?: I): ActivityRhythmRequest {
9764
+ return ActivityRhythmRequest.fromPartial(base ?? ({} as any));
9643
9765
  },
9644
- fromPartial<I extends Exact<DeepPartial<ProjectOverviewRequest>, I>>(object: I): ProjectOverviewRequest {
9645
- const message = createBaseProjectOverviewRequest();
9766
+ fromPartial<I extends Exact<DeepPartial<ActivityRhythmRequest>, I>>(object: I): ActivityRhythmRequest {
9767
+ const message = createBaseActivityRhythmRequest();
9646
9768
  message.organizationId = object.organizationId ?? "";
9647
9769
  message.projectId = object.projectId ?? "";
9648
- message.activeAfter = object.activeAfter ?? undefined;
9649
- message.topSessions = object.topSessions ?? 0;
9770
+ message.timeWindow = object.timeWindow ?? 0;
9771
+ message.timeZone = object.timeZone ?? "";
9650
9772
  return message;
9651
9773
  },
9652
9774
  };
9653
9775
 
9654
- function createBaseProjectOverview(): ProjectOverview {
9655
- return { totals: undefined, byModel: [], byProvider: [], bySource: [], topSessions: [] };
9776
+ function createBaseActivityRhythm(): ActivityRhythm {
9777
+ return { buckets: [], windowStart: undefined, windowEnd: undefined, asOf: undefined, timeZone: "" };
9656
9778
  }
9657
9779
 
9658
- export const ProjectOverview: MessageFns<ProjectOverview> = {
9659
- encode(message: ProjectOverview, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
9660
- if (message.totals !== undefined) {
9661
- ProjectOverviewTotals.encode(message.totals, writer.uint32(10).fork()).join();
9780
+ export const ActivityRhythm: MessageFns<ActivityRhythm> = {
9781
+ encode(message: ActivityRhythm, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
9782
+ for (const v of message.buckets) {
9783
+ ActivityRhythmBucket.encode(v!, writer.uint32(10).fork()).join();
9662
9784
  }
9663
- for (const v of message.byModel) {
9664
- ProjectOverviewSlice.encode(v!, writer.uint32(18).fork()).join();
9785
+ if (message.windowStart !== undefined) {
9786
+ Timestamp.encode(toTimestamp(message.windowStart), writer.uint32(18).fork()).join();
9665
9787
  }
9666
- for (const v of message.byProvider) {
9667
- ProjectOverviewSlice.encode(v!, writer.uint32(26).fork()).join();
9788
+ if (message.windowEnd !== undefined) {
9789
+ Timestamp.encode(toTimestamp(message.windowEnd), writer.uint32(26).fork()).join();
9668
9790
  }
9669
- for (const v of message.bySource) {
9670
- ProjectOverviewSlice.encode(v!, writer.uint32(34).fork()).join();
9791
+ if (message.asOf !== undefined) {
9792
+ Timestamp.encode(toTimestamp(message.asOf), writer.uint32(34).fork()).join();
9671
9793
  }
9672
- for (const v of message.topSessions) {
9673
- ProjectSessionRef.encode(v!, writer.uint32(42).fork()).join();
9794
+ if (message.timeZone !== "") {
9795
+ writer.uint32(42).string(message.timeZone);
9674
9796
  }
9675
9797
  return writer;
9676
9798
  },
9677
9799
 
9678
- decode(input: BinaryReader | Uint8Array, length?: number): ProjectOverview {
9800
+ decode(input: BinaryReader | Uint8Array, length?: number): ActivityRhythm {
9679
9801
  const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
9680
9802
  const previousRecursionDepth = (reader as any).__tsProtoDecodeDepth ?? 0;
9681
9803
  if (previousRecursionDepth >= 100) {
@@ -9684,7 +9806,7 @@ export const ProjectOverview: MessageFns<ProjectOverview> = {
9684
9806
  (reader as any).__tsProtoDecodeDepth = previousRecursionDepth + 1;
9685
9807
  try {
9686
9808
  const end = length === undefined ? reader.len : reader.pos + length;
9687
- const message = createBaseProjectOverview();
9809
+ const message = createBaseActivityRhythm();
9688
9810
  while (reader.pos < end) {
9689
9811
  const tag = reader.uint32();
9690
9812
  switch (tag >>> 3) {
@@ -9693,7 +9815,7 @@ export const ProjectOverview: MessageFns<ProjectOverview> = {
9693
9815
  break;
9694
9816
  }
9695
9817
 
9696
- message.totals = ProjectOverviewTotals.decode(reader, reader.uint32());
9818
+ message.buckets.push(ActivityRhythmBucket.decode(reader, reader.uint32()));
9697
9819
  continue;
9698
9820
  }
9699
9821
  case 2: {
@@ -9701,7 +9823,7 @@ export const ProjectOverview: MessageFns<ProjectOverview> = {
9701
9823
  break;
9702
9824
  }
9703
9825
 
9704
- message.byModel.push(ProjectOverviewSlice.decode(reader, reader.uint32()));
9826
+ message.windowStart = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
9705
9827
  continue;
9706
9828
  }
9707
9829
  case 3: {
@@ -9709,7 +9831,7 @@ export const ProjectOverview: MessageFns<ProjectOverview> = {
9709
9831
  break;
9710
9832
  }
9711
9833
 
9712
- message.byProvider.push(ProjectOverviewSlice.decode(reader, reader.uint32()));
9834
+ message.windowEnd = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
9713
9835
  continue;
9714
9836
  }
9715
9837
  case 4: {
@@ -9717,7 +9839,7 @@ export const ProjectOverview: MessageFns<ProjectOverview> = {
9717
9839
  break;
9718
9840
  }
9719
9841
 
9720
- message.bySource.push(ProjectOverviewSlice.decode(reader, reader.uint32()));
9842
+ message.asOf = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
9721
9843
  continue;
9722
9844
  }
9723
9845
  case 5: {
@@ -9725,7 +9847,7 @@ export const ProjectOverview: MessageFns<ProjectOverview> = {
9725
9847
  break;
9726
9848
  }
9727
9849
 
9728
- message.topSessions.push(ProjectSessionRef.decode(reader, reader.uint32()));
9850
+ message.timeZone = reader.string();
9729
9851
  continue;
9730
9852
  }
9731
9853
  }
@@ -9740,135 +9862,123 @@ export const ProjectOverview: MessageFns<ProjectOverview> = {
9740
9862
  }
9741
9863
  },
9742
9864
 
9743
- fromJSON(object: any): ProjectOverview {
9865
+ fromJSON(object: any): ActivityRhythm {
9744
9866
  return {
9745
- totals: isSet(object.totals) ? ProjectOverviewTotals.fromJSON(object.totals) : undefined,
9746
- byModel: globalThis.Array.isArray(object?.byModel)
9747
- ? object.byModel.map((e: any) => ProjectOverviewSlice.fromJSON(e))
9748
- : globalThis.Array.isArray(object?.by_model)
9749
- ? object.by_model.map((e: any) => ProjectOverviewSlice.fromJSON(e))
9750
- : [],
9751
- byProvider: globalThis.Array.isArray(object?.byProvider)
9752
- ? object.byProvider.map((e: any) => ProjectOverviewSlice.fromJSON(e))
9753
- : globalThis.Array.isArray(object?.by_provider)
9754
- ? object.by_provider.map((e: any) => ProjectOverviewSlice.fromJSON(e))
9755
- : [],
9756
- bySource: globalThis.Array.isArray(object?.bySource)
9757
- ? object.bySource.map((e: any) => ProjectOverviewSlice.fromJSON(e))
9758
- : globalThis.Array.isArray(object?.by_source)
9759
- ? object.by_source.map((e: any) => ProjectOverviewSlice.fromJSON(e))
9760
- : [],
9761
- topSessions: globalThis.Array.isArray(object?.topSessions)
9762
- ? object.topSessions.map((e: any) => ProjectSessionRef.fromJSON(e))
9763
- : globalThis.Array.isArray(object?.top_sessions)
9764
- ? object.top_sessions.map((e: any) => ProjectSessionRef.fromJSON(e))
9867
+ buckets: globalThis.Array.isArray(object?.buckets)
9868
+ ? object.buckets.map((e: any) => ActivityRhythmBucket.fromJSON(e))
9765
9869
  : [],
9870
+ windowStart: isSet(object.windowStart)
9871
+ ? fromJsonTimestamp(object.windowStart)
9872
+ : isSet(object.window_start)
9873
+ ? fromJsonTimestamp(object.window_start)
9874
+ : undefined,
9875
+ windowEnd: isSet(object.windowEnd)
9876
+ ? fromJsonTimestamp(object.windowEnd)
9877
+ : isSet(object.window_end)
9878
+ ? fromJsonTimestamp(object.window_end)
9879
+ : undefined,
9880
+ asOf: isSet(object.asOf)
9881
+ ? fromJsonTimestamp(object.asOf)
9882
+ : isSet(object.as_of)
9883
+ ? fromJsonTimestamp(object.as_of)
9884
+ : undefined,
9885
+ timeZone: isSet(object.timeZone)
9886
+ ? globalThis.String(object.timeZone)
9887
+ : isSet(object.time_zone)
9888
+ ? globalThis.String(object.time_zone)
9889
+ : "",
9766
9890
  };
9767
9891
  },
9768
9892
 
9769
- toJSON(message: ProjectOverview): unknown {
9893
+ toJSON(message: ActivityRhythm): unknown {
9770
9894
  const obj: any = {};
9771
- if (message.totals !== undefined) {
9772
- obj.totals = ProjectOverviewTotals.toJSON(message.totals);
9895
+ if (message.buckets?.length) {
9896
+ obj.buckets = message.buckets.map((e) => ActivityRhythmBucket.toJSON(e));
9773
9897
  }
9774
- if (message.byModel?.length) {
9775
- obj.byModel = message.byModel.map((e) => ProjectOverviewSlice.toJSON(e));
9898
+ if (message.windowStart !== undefined) {
9899
+ obj.windowStart = message.windowStart.toISOString();
9776
9900
  }
9777
- if (message.byProvider?.length) {
9778
- obj.byProvider = message.byProvider.map((e) => ProjectOverviewSlice.toJSON(e));
9901
+ if (message.windowEnd !== undefined) {
9902
+ obj.windowEnd = message.windowEnd.toISOString();
9779
9903
  }
9780
- if (message.bySource?.length) {
9781
- obj.bySource = message.bySource.map((e) => ProjectOverviewSlice.toJSON(e));
9904
+ if (message.asOf !== undefined) {
9905
+ obj.asOf = message.asOf.toISOString();
9782
9906
  }
9783
- if (message.topSessions?.length) {
9784
- obj.topSessions = message.topSessions.map((e) => ProjectSessionRef.toJSON(e));
9907
+ if (message.timeZone !== "") {
9908
+ obj.timeZone = message.timeZone;
9785
9909
  }
9786
9910
  return obj;
9787
9911
  },
9788
9912
 
9789
- create<I extends Exact<DeepPartial<ProjectOverview>, I>>(base?: I): ProjectOverview {
9790
- return ProjectOverview.fromPartial(base ?? ({} as any));
9913
+ create<I extends Exact<DeepPartial<ActivityRhythm>, I>>(base?: I): ActivityRhythm {
9914
+ return ActivityRhythm.fromPartial(base ?? ({} as any));
9791
9915
  },
9792
- fromPartial<I extends Exact<DeepPartial<ProjectOverview>, I>>(object: I): ProjectOverview {
9793
- const message = createBaseProjectOverview();
9794
- message.totals = (object.totals !== undefined && object.totals !== null)
9795
- ? ProjectOverviewTotals.fromPartial(object.totals)
9796
- : undefined;
9797
- message.byModel = object.byModel?.map((e) => ProjectOverviewSlice.fromPartial(e)) || [];
9798
- message.byProvider = object.byProvider?.map((e) => ProjectOverviewSlice.fromPartial(e)) || [];
9799
- message.bySource = object.bySource?.map((e) => ProjectOverviewSlice.fromPartial(e)) || [];
9800
- message.topSessions = object.topSessions?.map((e) => ProjectSessionRef.fromPartial(e)) || [];
9916
+ fromPartial<I extends Exact<DeepPartial<ActivityRhythm>, I>>(object: I): ActivityRhythm {
9917
+ const message = createBaseActivityRhythm();
9918
+ message.buckets = object.buckets?.map((e) => ActivityRhythmBucket.fromPartial(e)) || [];
9919
+ message.windowStart = object.windowStart ?? undefined;
9920
+ message.windowEnd = object.windowEnd ?? undefined;
9921
+ message.asOf = object.asOf ?? undefined;
9922
+ message.timeZone = object.timeZone ?? "";
9801
9923
  return message;
9802
9924
  },
9803
9925
  };
9804
9926
 
9805
- function createBaseProjectOverviewTotals(): ProjectOverviewTotals {
9927
+ function createBaseActivityRhythmBucket(): ActivityRhythmBucket {
9806
9928
  return {
9807
- sessions: 0,
9808
- modelCalls: 0,
9929
+ dayOfWeek: 0,
9930
+ hourOfDay: 0,
9931
+ eventCount: 0,
9932
+ modelUsage: undefined,
9933
+ usageUnavailableCount: 0,
9934
+ costUnavailableCount: 0,
9809
9935
  toolCalls: 0,
9810
9936
  userMessages: 0,
9811
- inputTokens: 0,
9812
- outputTokens: 0,
9813
- cacheReadTokens: 0,
9814
- cacheWriteTokens: 0,
9815
- costUsd: 0,
9816
- distinctUsers: 0,
9817
- commits: 0,
9818
- pushes: 0,
9819
- filesTouched: 0,
9820
- lastActivityAt: undefined,
9937
+ sessions: 0,
9938
+ activeUsers: 0,
9939
+ topTool: "",
9821
9940
  };
9822
9941
  }
9823
9942
 
9824
- export const ProjectOverviewTotals: MessageFns<ProjectOverviewTotals> = {
9825
- encode(message: ProjectOverviewTotals, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
9826
- if (message.sessions !== 0) {
9827
- writer.uint32(8).uint64(message.sessions);
9828
- }
9829
- if (message.modelCalls !== 0) {
9830
- writer.uint32(16).uint64(message.modelCalls);
9831
- }
9832
- if (message.toolCalls !== 0) {
9833
- writer.uint32(24).uint64(message.toolCalls);
9834
- }
9835
- if (message.userMessages !== 0) {
9836
- writer.uint32(32).uint64(message.userMessages);
9943
+ export const ActivityRhythmBucket: MessageFns<ActivityRhythmBucket> = {
9944
+ encode(message: ActivityRhythmBucket, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
9945
+ if (message.dayOfWeek !== 0) {
9946
+ writer.uint32(8).uint32(message.dayOfWeek);
9837
9947
  }
9838
- if (message.inputTokens !== 0) {
9839
- writer.uint32(40).uint64(message.inputTokens);
9948
+ if (message.hourOfDay !== 0) {
9949
+ writer.uint32(16).uint32(message.hourOfDay);
9840
9950
  }
9841
- if (message.outputTokens !== 0) {
9842
- writer.uint32(48).uint64(message.outputTokens);
9951
+ if (message.eventCount !== 0) {
9952
+ writer.uint32(24).uint64(message.eventCount);
9843
9953
  }
9844
- if (message.cacheReadTokens !== 0) {
9845
- writer.uint32(56).uint64(message.cacheReadTokens);
9954
+ if (message.modelUsage !== undefined) {
9955
+ TokenActivityMeasures.encode(message.modelUsage, writer.uint32(34).fork()).join();
9846
9956
  }
9847
- if (message.cacheWriteTokens !== 0) {
9848
- writer.uint32(64).uint64(message.cacheWriteTokens);
9957
+ if (message.usageUnavailableCount !== 0) {
9958
+ writer.uint32(40).uint64(message.usageUnavailableCount);
9849
9959
  }
9850
- if (message.costUsd !== 0) {
9851
- writer.uint32(73).double(message.costUsd);
9960
+ if (message.costUnavailableCount !== 0) {
9961
+ writer.uint32(48).uint64(message.costUnavailableCount);
9852
9962
  }
9853
- if (message.distinctUsers !== 0) {
9854
- writer.uint32(80).uint64(message.distinctUsers);
9963
+ if (message.toolCalls !== 0) {
9964
+ writer.uint32(56).uint64(message.toolCalls);
9855
9965
  }
9856
- if (message.commits !== 0) {
9857
- writer.uint32(88).uint64(message.commits);
9966
+ if (message.userMessages !== 0) {
9967
+ writer.uint32(64).uint64(message.userMessages);
9858
9968
  }
9859
- if (message.pushes !== 0) {
9860
- writer.uint32(96).uint64(message.pushes);
9969
+ if (message.sessions !== 0) {
9970
+ writer.uint32(72).uint64(message.sessions);
9861
9971
  }
9862
- if (message.filesTouched !== 0) {
9863
- writer.uint32(104).uint64(message.filesTouched);
9972
+ if (message.activeUsers !== 0) {
9973
+ writer.uint32(80).uint64(message.activeUsers);
9864
9974
  }
9865
- if (message.lastActivityAt !== undefined) {
9866
- Timestamp.encode(toTimestamp(message.lastActivityAt), writer.uint32(114).fork()).join();
9975
+ if (message.topTool !== "") {
9976
+ writer.uint32(90).string(message.topTool);
9867
9977
  }
9868
9978
  return writer;
9869
9979
  },
9870
9980
 
9871
- decode(input: BinaryReader | Uint8Array, length?: number): ProjectOverviewTotals {
9981
+ decode(input: BinaryReader | Uint8Array, length?: number): ActivityRhythmBucket {
9872
9982
  const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
9873
9983
  const previousRecursionDepth = (reader as any).__tsProtoDecodeDepth ?? 0;
9874
9984
  if (previousRecursionDepth >= 100) {
@@ -9877,7 +9987,7 @@ export const ProjectOverviewTotals: MessageFns<ProjectOverviewTotals> = {
9877
9987
  (reader as any).__tsProtoDecodeDepth = previousRecursionDepth + 1;
9878
9988
  try {
9879
9989
  const end = length === undefined ? reader.len : reader.pos + length;
9880
- const message = createBaseProjectOverviewTotals();
9990
+ const message = createBaseActivityRhythmBucket();
9881
9991
  while (reader.pos < end) {
9882
9992
  const tag = reader.uint32();
9883
9993
  switch (tag >>> 3) {
@@ -9886,7 +9996,7 @@ export const ProjectOverviewTotals: MessageFns<ProjectOverviewTotals> = {
9886
9996
  break;
9887
9997
  }
9888
9998
 
9889
- message.sessions = longToNumber(reader.uint64());
9999
+ message.dayOfWeek = reader.uint32();
9890
10000
  continue;
9891
10001
  }
9892
10002
  case 2: {
@@ -9894,7 +10004,7 @@ export const ProjectOverviewTotals: MessageFns<ProjectOverviewTotals> = {
9894
10004
  break;
9895
10005
  }
9896
10006
 
9897
- message.modelCalls = longToNumber(reader.uint64());
10007
+ message.hourOfDay = reader.uint32();
9898
10008
  continue;
9899
10009
  }
9900
10010
  case 3: {
@@ -9902,15 +10012,15 @@ export const ProjectOverviewTotals: MessageFns<ProjectOverviewTotals> = {
9902
10012
  break;
9903
10013
  }
9904
10014
 
9905
- message.toolCalls = longToNumber(reader.uint64());
10015
+ message.eventCount = longToNumber(reader.uint64());
9906
10016
  continue;
9907
10017
  }
9908
10018
  case 4: {
9909
- if (tag !== 32) {
10019
+ if (tag !== 34) {
9910
10020
  break;
9911
10021
  }
9912
10022
 
9913
- message.userMessages = longToNumber(reader.uint64());
10023
+ message.modelUsage = TokenActivityMeasures.decode(reader, reader.uint32());
9914
10024
  continue;
9915
10025
  }
9916
10026
  case 5: {
@@ -9918,7 +10028,7 @@ export const ProjectOverviewTotals: MessageFns<ProjectOverviewTotals> = {
9918
10028
  break;
9919
10029
  }
9920
10030
 
9921
- message.inputTokens = longToNumber(reader.uint64());
10031
+ message.usageUnavailableCount = longToNumber(reader.uint64());
9922
10032
  continue;
9923
10033
  }
9924
10034
  case 6: {
@@ -9926,7 +10036,7 @@ export const ProjectOverviewTotals: MessageFns<ProjectOverviewTotals> = {
9926
10036
  break;
9927
10037
  }
9928
10038
 
9929
- message.outputTokens = longToNumber(reader.uint64());
10039
+ message.costUnavailableCount = longToNumber(reader.uint64());
9930
10040
  continue;
9931
10041
  }
9932
10042
  case 7: {
@@ -9934,7 +10044,7 @@ export const ProjectOverviewTotals: MessageFns<ProjectOverviewTotals> = {
9934
10044
  break;
9935
10045
  }
9936
10046
 
9937
- message.cacheReadTokens = longToNumber(reader.uint64());
10047
+ message.toolCalls = longToNumber(reader.uint64());
9938
10048
  continue;
9939
10049
  }
9940
10050
  case 8: {
@@ -9942,15 +10052,15 @@ export const ProjectOverviewTotals: MessageFns<ProjectOverviewTotals> = {
9942
10052
  break;
9943
10053
  }
9944
10054
 
9945
- message.cacheWriteTokens = longToNumber(reader.uint64());
10055
+ message.userMessages = longToNumber(reader.uint64());
9946
10056
  continue;
9947
10057
  }
9948
10058
  case 9: {
9949
- if (tag !== 73) {
10059
+ if (tag !== 72) {
9950
10060
  break;
9951
10061
  }
9952
10062
 
9953
- message.costUsd = reader.double();
10063
+ message.sessions = longToNumber(reader.uint64());
9954
10064
  continue;
9955
10065
  }
9956
10066
  case 10: {
@@ -9958,39 +10068,15 @@ export const ProjectOverviewTotals: MessageFns<ProjectOverviewTotals> = {
9958
10068
  break;
9959
10069
  }
9960
10070
 
9961
- message.distinctUsers = longToNumber(reader.uint64());
10071
+ message.activeUsers = longToNumber(reader.uint64());
9962
10072
  continue;
9963
10073
  }
9964
10074
  case 11: {
9965
- if (tag !== 88) {
9966
- break;
9967
- }
9968
-
9969
- message.commits = longToNumber(reader.uint64());
9970
- continue;
9971
- }
9972
- case 12: {
9973
- if (tag !== 96) {
9974
- break;
9975
- }
9976
-
9977
- message.pushes = longToNumber(reader.uint64());
9978
- continue;
9979
- }
9980
- case 13: {
9981
- if (tag !== 104) {
9982
- break;
9983
- }
9984
-
9985
- message.filesTouched = longToNumber(reader.uint64());
9986
- continue;
9987
- }
9988
- case 14: {
9989
- if (tag !== 114) {
10075
+ if (tag !== 90) {
9990
10076
  break;
9991
10077
  }
9992
10078
 
9993
- message.lastActivityAt = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
10079
+ message.topTool = reader.string();
9994
10080
  continue;
9995
10081
  }
9996
10082
  }
@@ -10005,13 +10091,37 @@ export const ProjectOverviewTotals: MessageFns<ProjectOverviewTotals> = {
10005
10091
  }
10006
10092
  },
10007
10093
 
10008
- fromJSON(object: any): ProjectOverviewTotals {
10094
+ fromJSON(object: any): ActivityRhythmBucket {
10009
10095
  return {
10010
- sessions: isSet(object.sessions) ? globalThis.Number(object.sessions) : 0,
10011
- modelCalls: isSet(object.modelCalls)
10012
- ? globalThis.Number(object.modelCalls)
10013
- : isSet(object.model_calls)
10014
- ? globalThis.Number(object.model_calls)
10096
+ dayOfWeek: isSet(object.dayOfWeek)
10097
+ ? globalThis.Number(object.dayOfWeek)
10098
+ : isSet(object.day_of_week)
10099
+ ? globalThis.Number(object.day_of_week)
10100
+ : 0,
10101
+ hourOfDay: isSet(object.hourOfDay)
10102
+ ? globalThis.Number(object.hourOfDay)
10103
+ : isSet(object.hour_of_day)
10104
+ ? globalThis.Number(object.hour_of_day)
10105
+ : 0,
10106
+ eventCount: isSet(object.eventCount)
10107
+ ? globalThis.Number(object.eventCount)
10108
+ : isSet(object.event_count)
10109
+ ? globalThis.Number(object.event_count)
10110
+ : 0,
10111
+ modelUsage: isSet(object.modelUsage)
10112
+ ? TokenActivityMeasures.fromJSON(object.modelUsage)
10113
+ : isSet(object.model_usage)
10114
+ ? TokenActivityMeasures.fromJSON(object.model_usage)
10115
+ : undefined,
10116
+ usageUnavailableCount: isSet(object.usageUnavailableCount)
10117
+ ? globalThis.Number(object.usageUnavailableCount)
10118
+ : isSet(object.usage_unavailable_count)
10119
+ ? globalThis.Number(object.usage_unavailable_count)
10120
+ : 0,
10121
+ costUnavailableCount: isSet(object.costUnavailableCount)
10122
+ ? globalThis.Number(object.costUnavailableCount)
10123
+ : isSet(object.cost_unavailable_count)
10124
+ ? globalThis.Number(object.cost_unavailable_count)
10015
10125
  : 0,
10016
10126
  toolCalls: isSet(object.toolCalls)
10017
10127
  ? globalThis.Number(object.toolCalls)
@@ -10023,58 +10133,39 @@ export const ProjectOverviewTotals: MessageFns<ProjectOverviewTotals> = {
10023
10133
  : isSet(object.user_messages)
10024
10134
  ? globalThis.Number(object.user_messages)
10025
10135
  : 0,
10026
- inputTokens: isSet(object.inputTokens)
10027
- ? globalThis.Number(object.inputTokens)
10028
- : isSet(object.input_tokens)
10029
- ? globalThis.Number(object.input_tokens)
10030
- : 0,
10031
- outputTokens: isSet(object.outputTokens)
10032
- ? globalThis.Number(object.outputTokens)
10033
- : isSet(object.output_tokens)
10034
- ? globalThis.Number(object.output_tokens)
10035
- : 0,
10036
- cacheReadTokens: isSet(object.cacheReadTokens)
10037
- ? globalThis.Number(object.cacheReadTokens)
10038
- : isSet(object.cache_read_tokens)
10039
- ? globalThis.Number(object.cache_read_tokens)
10040
- : 0,
10041
- cacheWriteTokens: isSet(object.cacheWriteTokens)
10042
- ? globalThis.Number(object.cacheWriteTokens)
10043
- : isSet(object.cache_write_tokens)
10044
- ? globalThis.Number(object.cache_write_tokens)
10045
- : 0,
10046
- costUsd: isSet(object.costUsd)
10047
- ? globalThis.Number(object.costUsd)
10048
- : isSet(object.cost_usd)
10049
- ? globalThis.Number(object.cost_usd)
10050
- : 0,
10051
- distinctUsers: isSet(object.distinctUsers)
10052
- ? globalThis.Number(object.distinctUsers)
10053
- : isSet(object.distinct_users)
10054
- ? globalThis.Number(object.distinct_users)
10055
- : 0,
10056
- commits: isSet(object.commits) ? globalThis.Number(object.commits) : 0,
10057
- pushes: isSet(object.pushes) ? globalThis.Number(object.pushes) : 0,
10058
- filesTouched: isSet(object.filesTouched)
10059
- ? globalThis.Number(object.filesTouched)
10060
- : isSet(object.files_touched)
10061
- ? globalThis.Number(object.files_touched)
10136
+ sessions: isSet(object.sessions) ? globalThis.Number(object.sessions) : 0,
10137
+ activeUsers: isSet(object.activeUsers)
10138
+ ? globalThis.Number(object.activeUsers)
10139
+ : isSet(object.active_users)
10140
+ ? globalThis.Number(object.active_users)
10062
10141
  : 0,
10063
- lastActivityAt: isSet(object.lastActivityAt)
10064
- ? fromJsonTimestamp(object.lastActivityAt)
10065
- : isSet(object.last_activity_at)
10066
- ? fromJsonTimestamp(object.last_activity_at)
10067
- : undefined,
10142
+ topTool: isSet(object.topTool)
10143
+ ? globalThis.String(object.topTool)
10144
+ : isSet(object.top_tool)
10145
+ ? globalThis.String(object.top_tool)
10146
+ : "",
10068
10147
  };
10069
10148
  },
10070
10149
 
10071
- toJSON(message: ProjectOverviewTotals): unknown {
10150
+ toJSON(message: ActivityRhythmBucket): unknown {
10072
10151
  const obj: any = {};
10073
- if (message.sessions !== 0) {
10074
- obj.sessions = Math.round(message.sessions);
10152
+ if (message.dayOfWeek !== 0) {
10153
+ obj.dayOfWeek = Math.round(message.dayOfWeek);
10075
10154
  }
10076
- if (message.modelCalls !== 0) {
10077
- obj.modelCalls = Math.round(message.modelCalls);
10155
+ if (message.hourOfDay !== 0) {
10156
+ obj.hourOfDay = Math.round(message.hourOfDay);
10157
+ }
10158
+ if (message.eventCount !== 0) {
10159
+ obj.eventCount = Math.round(message.eventCount);
10160
+ }
10161
+ if (message.modelUsage !== undefined) {
10162
+ obj.modelUsage = TokenActivityMeasures.toJSON(message.modelUsage);
10163
+ }
10164
+ if (message.usageUnavailableCount !== 0) {
10165
+ obj.usageUnavailableCount = Math.round(message.usageUnavailableCount);
10166
+ }
10167
+ if (message.costUnavailableCount !== 0) {
10168
+ obj.costUnavailableCount = Math.round(message.costUnavailableCount);
10078
10169
  }
10079
10170
  if (message.toolCalls !== 0) {
10080
10171
  obj.toolCalls = Math.round(message.toolCalls);
@@ -10082,87 +10173,1164 @@ export const ProjectOverviewTotals: MessageFns<ProjectOverviewTotals> = {
10082
10173
  if (message.userMessages !== 0) {
10083
10174
  obj.userMessages = Math.round(message.userMessages);
10084
10175
  }
10085
- if (message.inputTokens !== 0) {
10086
- obj.inputTokens = Math.round(message.inputTokens);
10176
+ if (message.sessions !== 0) {
10177
+ obj.sessions = Math.round(message.sessions);
10087
10178
  }
10088
- if (message.outputTokens !== 0) {
10089
- obj.outputTokens = Math.round(message.outputTokens);
10179
+ if (message.activeUsers !== 0) {
10180
+ obj.activeUsers = Math.round(message.activeUsers);
10090
10181
  }
10091
- if (message.cacheReadTokens !== 0) {
10092
- obj.cacheReadTokens = Math.round(message.cacheReadTokens);
10182
+ if (message.topTool !== "") {
10183
+ obj.topTool = message.topTool;
10093
10184
  }
10094
- if (message.cacheWriteTokens !== 0) {
10095
- obj.cacheWriteTokens = Math.round(message.cacheWriteTokens);
10185
+ return obj;
10186
+ },
10187
+
10188
+ create<I extends Exact<DeepPartial<ActivityRhythmBucket>, I>>(base?: I): ActivityRhythmBucket {
10189
+ return ActivityRhythmBucket.fromPartial(base ?? ({} as any));
10190
+ },
10191
+ fromPartial<I extends Exact<DeepPartial<ActivityRhythmBucket>, I>>(object: I): ActivityRhythmBucket {
10192
+ const message = createBaseActivityRhythmBucket();
10193
+ message.dayOfWeek = object.dayOfWeek ?? 0;
10194
+ message.hourOfDay = object.hourOfDay ?? 0;
10195
+ message.eventCount = object.eventCount ?? 0;
10196
+ message.modelUsage = (object.modelUsage !== undefined && object.modelUsage !== null)
10197
+ ? TokenActivityMeasures.fromPartial(object.modelUsage)
10198
+ : undefined;
10199
+ message.usageUnavailableCount = object.usageUnavailableCount ?? 0;
10200
+ message.costUnavailableCount = object.costUnavailableCount ?? 0;
10201
+ message.toolCalls = object.toolCalls ?? 0;
10202
+ message.userMessages = object.userMessages ?? 0;
10203
+ message.sessions = object.sessions ?? 0;
10204
+ message.activeUsers = object.activeUsers ?? 0;
10205
+ message.topTool = object.topTool ?? "";
10206
+ return message;
10207
+ },
10208
+ };
10209
+
10210
+ function createBaseProjectOverviewRequest(): ProjectOverviewRequest {
10211
+ return { organizationId: "", projectId: "", activeAfter: undefined, topSessions: 0 };
10212
+ }
10213
+
10214
+ export const ProjectOverviewRequest: MessageFns<ProjectOverviewRequest> = {
10215
+ encode(message: ProjectOverviewRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
10216
+ if (message.organizationId !== "") {
10217
+ writer.uint32(10).string(message.organizationId);
10096
10218
  }
10097
- if (message.costUsd !== 0) {
10098
- obj.costUsd = message.costUsd;
10219
+ if (message.projectId !== "") {
10220
+ writer.uint32(18).string(message.projectId);
10221
+ }
10222
+ if (message.activeAfter !== undefined) {
10223
+ Timestamp.encode(toTimestamp(message.activeAfter), writer.uint32(26).fork()).join();
10224
+ }
10225
+ if (message.topSessions !== 0) {
10226
+ writer.uint32(32).int32(message.topSessions);
10227
+ }
10228
+ return writer;
10229
+ },
10230
+
10231
+ decode(input: BinaryReader | Uint8Array, length?: number): ProjectOverviewRequest {
10232
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
10233
+ const previousRecursionDepth = (reader as any).__tsProtoDecodeDepth ?? 0;
10234
+ if (previousRecursionDepth >= 100) {
10235
+ throw new globalThis.Error("protobuf decode recursion limit exceeded");
10236
+ }
10237
+ (reader as any).__tsProtoDecodeDepth = previousRecursionDepth + 1;
10238
+ try {
10239
+ const end = length === undefined ? reader.len : reader.pos + length;
10240
+ const message = createBaseProjectOverviewRequest();
10241
+ while (reader.pos < end) {
10242
+ const tag = reader.uint32();
10243
+ switch (tag >>> 3) {
10244
+ case 1: {
10245
+ if (tag !== 10) {
10246
+ break;
10247
+ }
10248
+
10249
+ message.organizationId = reader.string();
10250
+ continue;
10251
+ }
10252
+ case 2: {
10253
+ if (tag !== 18) {
10254
+ break;
10255
+ }
10256
+
10257
+ message.projectId = reader.string();
10258
+ continue;
10259
+ }
10260
+ case 3: {
10261
+ if (tag !== 26) {
10262
+ break;
10263
+ }
10264
+
10265
+ message.activeAfter = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
10266
+ continue;
10267
+ }
10268
+ case 4: {
10269
+ if (tag !== 32) {
10270
+ break;
10271
+ }
10272
+
10273
+ message.topSessions = reader.int32();
10274
+ continue;
10275
+ }
10276
+ }
10277
+ if ((tag & 7) === 4 || tag === 0) {
10278
+ break;
10279
+ }
10280
+ reader.skip(tag & 7);
10281
+ }
10282
+ return message;
10283
+ } finally {
10284
+ (reader as any).__tsProtoDecodeDepth = previousRecursionDepth;
10285
+ }
10286
+ },
10287
+
10288
+ fromJSON(object: any): ProjectOverviewRequest {
10289
+ return {
10290
+ organizationId: isSet(object.organizationId)
10291
+ ? globalThis.String(object.organizationId)
10292
+ : isSet(object.organization_id)
10293
+ ? globalThis.String(object.organization_id)
10294
+ : "",
10295
+ projectId: isSet(object.projectId)
10296
+ ? globalThis.String(object.projectId)
10297
+ : isSet(object.project_id)
10298
+ ? globalThis.String(object.project_id)
10299
+ : "",
10300
+ activeAfter: isSet(object.activeAfter)
10301
+ ? fromJsonTimestamp(object.activeAfter)
10302
+ : isSet(object.active_after)
10303
+ ? fromJsonTimestamp(object.active_after)
10304
+ : undefined,
10305
+ topSessions: isSet(object.topSessions)
10306
+ ? globalThis.Number(object.topSessions)
10307
+ : isSet(object.top_sessions)
10308
+ ? globalThis.Number(object.top_sessions)
10309
+ : 0,
10310
+ };
10311
+ },
10312
+
10313
+ toJSON(message: ProjectOverviewRequest): unknown {
10314
+ const obj: any = {};
10315
+ if (message.organizationId !== "") {
10316
+ obj.organizationId = message.organizationId;
10317
+ }
10318
+ if (message.projectId !== "") {
10319
+ obj.projectId = message.projectId;
10320
+ }
10321
+ if (message.activeAfter !== undefined) {
10322
+ obj.activeAfter = message.activeAfter.toISOString();
10323
+ }
10324
+ if (message.topSessions !== 0) {
10325
+ obj.topSessions = Math.round(message.topSessions);
10326
+ }
10327
+ return obj;
10328
+ },
10329
+
10330
+ create<I extends Exact<DeepPartial<ProjectOverviewRequest>, I>>(base?: I): ProjectOverviewRequest {
10331
+ return ProjectOverviewRequest.fromPartial(base ?? ({} as any));
10332
+ },
10333
+ fromPartial<I extends Exact<DeepPartial<ProjectOverviewRequest>, I>>(object: I): ProjectOverviewRequest {
10334
+ const message = createBaseProjectOverviewRequest();
10335
+ message.organizationId = object.organizationId ?? "";
10336
+ message.projectId = object.projectId ?? "";
10337
+ message.activeAfter = object.activeAfter ?? undefined;
10338
+ message.topSessions = object.topSessions ?? 0;
10339
+ return message;
10340
+ },
10341
+ };
10342
+
10343
+ function createBaseProjectOverview(): ProjectOverview {
10344
+ return { totals: undefined, byModel: [], byProvider: [], bySource: [], topSessions: [] };
10345
+ }
10346
+
10347
+ export const ProjectOverview: MessageFns<ProjectOverview> = {
10348
+ encode(message: ProjectOverview, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
10349
+ if (message.totals !== undefined) {
10350
+ ProjectOverviewTotals.encode(message.totals, writer.uint32(10).fork()).join();
10351
+ }
10352
+ for (const v of message.byModel) {
10353
+ ProjectOverviewSlice.encode(v!, writer.uint32(18).fork()).join();
10354
+ }
10355
+ for (const v of message.byProvider) {
10356
+ ProjectOverviewSlice.encode(v!, writer.uint32(26).fork()).join();
10357
+ }
10358
+ for (const v of message.bySource) {
10359
+ ProjectOverviewSlice.encode(v!, writer.uint32(34).fork()).join();
10360
+ }
10361
+ for (const v of message.topSessions) {
10362
+ ProjectSessionRef.encode(v!, writer.uint32(42).fork()).join();
10363
+ }
10364
+ return writer;
10365
+ },
10366
+
10367
+ decode(input: BinaryReader | Uint8Array, length?: number): ProjectOverview {
10368
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
10369
+ const previousRecursionDepth = (reader as any).__tsProtoDecodeDepth ?? 0;
10370
+ if (previousRecursionDepth >= 100) {
10371
+ throw new globalThis.Error("protobuf decode recursion limit exceeded");
10372
+ }
10373
+ (reader as any).__tsProtoDecodeDepth = previousRecursionDepth + 1;
10374
+ try {
10375
+ const end = length === undefined ? reader.len : reader.pos + length;
10376
+ const message = createBaseProjectOverview();
10377
+ while (reader.pos < end) {
10378
+ const tag = reader.uint32();
10379
+ switch (tag >>> 3) {
10380
+ case 1: {
10381
+ if (tag !== 10) {
10382
+ break;
10383
+ }
10384
+
10385
+ message.totals = ProjectOverviewTotals.decode(reader, reader.uint32());
10386
+ continue;
10387
+ }
10388
+ case 2: {
10389
+ if (tag !== 18) {
10390
+ break;
10391
+ }
10392
+
10393
+ message.byModel.push(ProjectOverviewSlice.decode(reader, reader.uint32()));
10394
+ continue;
10395
+ }
10396
+ case 3: {
10397
+ if (tag !== 26) {
10398
+ break;
10399
+ }
10400
+
10401
+ message.byProvider.push(ProjectOverviewSlice.decode(reader, reader.uint32()));
10402
+ continue;
10403
+ }
10404
+ case 4: {
10405
+ if (tag !== 34) {
10406
+ break;
10407
+ }
10408
+
10409
+ message.bySource.push(ProjectOverviewSlice.decode(reader, reader.uint32()));
10410
+ continue;
10411
+ }
10412
+ case 5: {
10413
+ if (tag !== 42) {
10414
+ break;
10415
+ }
10416
+
10417
+ message.topSessions.push(ProjectSessionRef.decode(reader, reader.uint32()));
10418
+ continue;
10419
+ }
10420
+ }
10421
+ if ((tag & 7) === 4 || tag === 0) {
10422
+ break;
10423
+ }
10424
+ reader.skip(tag & 7);
10425
+ }
10426
+ return message;
10427
+ } finally {
10428
+ (reader as any).__tsProtoDecodeDepth = previousRecursionDepth;
10429
+ }
10430
+ },
10431
+
10432
+ fromJSON(object: any): ProjectOverview {
10433
+ return {
10434
+ totals: isSet(object.totals) ? ProjectOverviewTotals.fromJSON(object.totals) : undefined,
10435
+ byModel: globalThis.Array.isArray(object?.byModel)
10436
+ ? object.byModel.map((e: any) => ProjectOverviewSlice.fromJSON(e))
10437
+ : globalThis.Array.isArray(object?.by_model)
10438
+ ? object.by_model.map((e: any) => ProjectOverviewSlice.fromJSON(e))
10439
+ : [],
10440
+ byProvider: globalThis.Array.isArray(object?.byProvider)
10441
+ ? object.byProvider.map((e: any) => ProjectOverviewSlice.fromJSON(e))
10442
+ : globalThis.Array.isArray(object?.by_provider)
10443
+ ? object.by_provider.map((e: any) => ProjectOverviewSlice.fromJSON(e))
10444
+ : [],
10445
+ bySource: globalThis.Array.isArray(object?.bySource)
10446
+ ? object.bySource.map((e: any) => ProjectOverviewSlice.fromJSON(e))
10447
+ : globalThis.Array.isArray(object?.by_source)
10448
+ ? object.by_source.map((e: any) => ProjectOverviewSlice.fromJSON(e))
10449
+ : [],
10450
+ topSessions: globalThis.Array.isArray(object?.topSessions)
10451
+ ? object.topSessions.map((e: any) => ProjectSessionRef.fromJSON(e))
10452
+ : globalThis.Array.isArray(object?.top_sessions)
10453
+ ? object.top_sessions.map((e: any) => ProjectSessionRef.fromJSON(e))
10454
+ : [],
10455
+ };
10456
+ },
10457
+
10458
+ toJSON(message: ProjectOverview): unknown {
10459
+ const obj: any = {};
10460
+ if (message.totals !== undefined) {
10461
+ obj.totals = ProjectOverviewTotals.toJSON(message.totals);
10462
+ }
10463
+ if (message.byModel?.length) {
10464
+ obj.byModel = message.byModel.map((e) => ProjectOverviewSlice.toJSON(e));
10465
+ }
10466
+ if (message.byProvider?.length) {
10467
+ obj.byProvider = message.byProvider.map((e) => ProjectOverviewSlice.toJSON(e));
10468
+ }
10469
+ if (message.bySource?.length) {
10470
+ obj.bySource = message.bySource.map((e) => ProjectOverviewSlice.toJSON(e));
10471
+ }
10472
+ if (message.topSessions?.length) {
10473
+ obj.topSessions = message.topSessions.map((e) => ProjectSessionRef.toJSON(e));
10474
+ }
10475
+ return obj;
10476
+ },
10477
+
10478
+ create<I extends Exact<DeepPartial<ProjectOverview>, I>>(base?: I): ProjectOverview {
10479
+ return ProjectOverview.fromPartial(base ?? ({} as any));
10480
+ },
10481
+ fromPartial<I extends Exact<DeepPartial<ProjectOverview>, I>>(object: I): ProjectOverview {
10482
+ const message = createBaseProjectOverview();
10483
+ message.totals = (object.totals !== undefined && object.totals !== null)
10484
+ ? ProjectOverviewTotals.fromPartial(object.totals)
10485
+ : undefined;
10486
+ message.byModel = object.byModel?.map((e) => ProjectOverviewSlice.fromPartial(e)) || [];
10487
+ message.byProvider = object.byProvider?.map((e) => ProjectOverviewSlice.fromPartial(e)) || [];
10488
+ message.bySource = object.bySource?.map((e) => ProjectOverviewSlice.fromPartial(e)) || [];
10489
+ message.topSessions = object.topSessions?.map((e) => ProjectSessionRef.fromPartial(e)) || [];
10490
+ return message;
10491
+ },
10492
+ };
10493
+
10494
+ function createBaseProjectOverviewTotals(): ProjectOverviewTotals {
10495
+ return {
10496
+ sessions: 0,
10497
+ modelCalls: 0,
10498
+ toolCalls: 0,
10499
+ userMessages: 0,
10500
+ inputTokens: 0,
10501
+ outputTokens: 0,
10502
+ cacheReadTokens: 0,
10503
+ cacheWriteTokens: 0,
10504
+ costUsd: 0,
10505
+ distinctUsers: 0,
10506
+ commits: 0,
10507
+ pushes: 0,
10508
+ filesTouched: 0,
10509
+ lastActivityAt: undefined,
10510
+ };
10511
+ }
10512
+
10513
+ export const ProjectOverviewTotals: MessageFns<ProjectOverviewTotals> = {
10514
+ encode(message: ProjectOverviewTotals, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
10515
+ if (message.sessions !== 0) {
10516
+ writer.uint32(8).uint64(message.sessions);
10517
+ }
10518
+ if (message.modelCalls !== 0) {
10519
+ writer.uint32(16).uint64(message.modelCalls);
10520
+ }
10521
+ if (message.toolCalls !== 0) {
10522
+ writer.uint32(24).uint64(message.toolCalls);
10523
+ }
10524
+ if (message.userMessages !== 0) {
10525
+ writer.uint32(32).uint64(message.userMessages);
10526
+ }
10527
+ if (message.inputTokens !== 0) {
10528
+ writer.uint32(40).uint64(message.inputTokens);
10529
+ }
10530
+ if (message.outputTokens !== 0) {
10531
+ writer.uint32(48).uint64(message.outputTokens);
10532
+ }
10533
+ if (message.cacheReadTokens !== 0) {
10534
+ writer.uint32(56).uint64(message.cacheReadTokens);
10535
+ }
10536
+ if (message.cacheWriteTokens !== 0) {
10537
+ writer.uint32(64).uint64(message.cacheWriteTokens);
10538
+ }
10539
+ if (message.costUsd !== 0) {
10540
+ writer.uint32(73).double(message.costUsd);
10541
+ }
10542
+ if (message.distinctUsers !== 0) {
10543
+ writer.uint32(80).uint64(message.distinctUsers);
10544
+ }
10545
+ if (message.commits !== 0) {
10546
+ writer.uint32(88).uint64(message.commits);
10547
+ }
10548
+ if (message.pushes !== 0) {
10549
+ writer.uint32(96).uint64(message.pushes);
10550
+ }
10551
+ if (message.filesTouched !== 0) {
10552
+ writer.uint32(104).uint64(message.filesTouched);
10553
+ }
10554
+ if (message.lastActivityAt !== undefined) {
10555
+ Timestamp.encode(toTimestamp(message.lastActivityAt), writer.uint32(114).fork()).join();
10556
+ }
10557
+ return writer;
10558
+ },
10559
+
10560
+ decode(input: BinaryReader | Uint8Array, length?: number): ProjectOverviewTotals {
10561
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
10562
+ const previousRecursionDepth = (reader as any).__tsProtoDecodeDepth ?? 0;
10563
+ if (previousRecursionDepth >= 100) {
10564
+ throw new globalThis.Error("protobuf decode recursion limit exceeded");
10565
+ }
10566
+ (reader as any).__tsProtoDecodeDepth = previousRecursionDepth + 1;
10567
+ try {
10568
+ const end = length === undefined ? reader.len : reader.pos + length;
10569
+ const message = createBaseProjectOverviewTotals();
10570
+ while (reader.pos < end) {
10571
+ const tag = reader.uint32();
10572
+ switch (tag >>> 3) {
10573
+ case 1: {
10574
+ if (tag !== 8) {
10575
+ break;
10576
+ }
10577
+
10578
+ message.sessions = longToNumber(reader.uint64());
10579
+ continue;
10580
+ }
10581
+ case 2: {
10582
+ if (tag !== 16) {
10583
+ break;
10584
+ }
10585
+
10586
+ message.modelCalls = longToNumber(reader.uint64());
10587
+ continue;
10588
+ }
10589
+ case 3: {
10590
+ if (tag !== 24) {
10591
+ break;
10592
+ }
10593
+
10594
+ message.toolCalls = longToNumber(reader.uint64());
10595
+ continue;
10596
+ }
10597
+ case 4: {
10598
+ if (tag !== 32) {
10599
+ break;
10600
+ }
10601
+
10602
+ message.userMessages = longToNumber(reader.uint64());
10603
+ continue;
10604
+ }
10605
+ case 5: {
10606
+ if (tag !== 40) {
10607
+ break;
10608
+ }
10609
+
10610
+ message.inputTokens = longToNumber(reader.uint64());
10611
+ continue;
10612
+ }
10613
+ case 6: {
10614
+ if (tag !== 48) {
10615
+ break;
10616
+ }
10617
+
10618
+ message.outputTokens = longToNumber(reader.uint64());
10619
+ continue;
10620
+ }
10621
+ case 7: {
10622
+ if (tag !== 56) {
10623
+ break;
10624
+ }
10625
+
10626
+ message.cacheReadTokens = longToNumber(reader.uint64());
10627
+ continue;
10628
+ }
10629
+ case 8: {
10630
+ if (tag !== 64) {
10631
+ break;
10632
+ }
10633
+
10634
+ message.cacheWriteTokens = longToNumber(reader.uint64());
10635
+ continue;
10636
+ }
10637
+ case 9: {
10638
+ if (tag !== 73) {
10639
+ break;
10640
+ }
10641
+
10642
+ message.costUsd = reader.double();
10643
+ continue;
10644
+ }
10645
+ case 10: {
10646
+ if (tag !== 80) {
10647
+ break;
10648
+ }
10649
+
10650
+ message.distinctUsers = longToNumber(reader.uint64());
10651
+ continue;
10652
+ }
10653
+ case 11: {
10654
+ if (tag !== 88) {
10655
+ break;
10656
+ }
10657
+
10658
+ message.commits = longToNumber(reader.uint64());
10659
+ continue;
10660
+ }
10661
+ case 12: {
10662
+ if (tag !== 96) {
10663
+ break;
10664
+ }
10665
+
10666
+ message.pushes = longToNumber(reader.uint64());
10667
+ continue;
10668
+ }
10669
+ case 13: {
10670
+ if (tag !== 104) {
10671
+ break;
10672
+ }
10673
+
10674
+ message.filesTouched = longToNumber(reader.uint64());
10675
+ continue;
10676
+ }
10677
+ case 14: {
10678
+ if (tag !== 114) {
10679
+ break;
10680
+ }
10681
+
10682
+ message.lastActivityAt = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
10683
+ continue;
10684
+ }
10685
+ }
10686
+ if ((tag & 7) === 4 || tag === 0) {
10687
+ break;
10688
+ }
10689
+ reader.skip(tag & 7);
10690
+ }
10691
+ return message;
10692
+ } finally {
10693
+ (reader as any).__tsProtoDecodeDepth = previousRecursionDepth;
10694
+ }
10695
+ },
10696
+
10697
+ fromJSON(object: any): ProjectOverviewTotals {
10698
+ return {
10699
+ sessions: isSet(object.sessions) ? globalThis.Number(object.sessions) : 0,
10700
+ modelCalls: isSet(object.modelCalls)
10701
+ ? globalThis.Number(object.modelCalls)
10702
+ : isSet(object.model_calls)
10703
+ ? globalThis.Number(object.model_calls)
10704
+ : 0,
10705
+ toolCalls: isSet(object.toolCalls)
10706
+ ? globalThis.Number(object.toolCalls)
10707
+ : isSet(object.tool_calls)
10708
+ ? globalThis.Number(object.tool_calls)
10709
+ : 0,
10710
+ userMessages: isSet(object.userMessages)
10711
+ ? globalThis.Number(object.userMessages)
10712
+ : isSet(object.user_messages)
10713
+ ? globalThis.Number(object.user_messages)
10714
+ : 0,
10715
+ inputTokens: isSet(object.inputTokens)
10716
+ ? globalThis.Number(object.inputTokens)
10717
+ : isSet(object.input_tokens)
10718
+ ? globalThis.Number(object.input_tokens)
10719
+ : 0,
10720
+ outputTokens: isSet(object.outputTokens)
10721
+ ? globalThis.Number(object.outputTokens)
10722
+ : isSet(object.output_tokens)
10723
+ ? globalThis.Number(object.output_tokens)
10724
+ : 0,
10725
+ cacheReadTokens: isSet(object.cacheReadTokens)
10726
+ ? globalThis.Number(object.cacheReadTokens)
10727
+ : isSet(object.cache_read_tokens)
10728
+ ? globalThis.Number(object.cache_read_tokens)
10729
+ : 0,
10730
+ cacheWriteTokens: isSet(object.cacheWriteTokens)
10731
+ ? globalThis.Number(object.cacheWriteTokens)
10732
+ : isSet(object.cache_write_tokens)
10733
+ ? globalThis.Number(object.cache_write_tokens)
10734
+ : 0,
10735
+ costUsd: isSet(object.costUsd)
10736
+ ? globalThis.Number(object.costUsd)
10737
+ : isSet(object.cost_usd)
10738
+ ? globalThis.Number(object.cost_usd)
10739
+ : 0,
10740
+ distinctUsers: isSet(object.distinctUsers)
10741
+ ? globalThis.Number(object.distinctUsers)
10742
+ : isSet(object.distinct_users)
10743
+ ? globalThis.Number(object.distinct_users)
10744
+ : 0,
10745
+ commits: isSet(object.commits) ? globalThis.Number(object.commits) : 0,
10746
+ pushes: isSet(object.pushes) ? globalThis.Number(object.pushes) : 0,
10747
+ filesTouched: isSet(object.filesTouched)
10748
+ ? globalThis.Number(object.filesTouched)
10749
+ : isSet(object.files_touched)
10750
+ ? globalThis.Number(object.files_touched)
10751
+ : 0,
10752
+ lastActivityAt: isSet(object.lastActivityAt)
10753
+ ? fromJsonTimestamp(object.lastActivityAt)
10754
+ : isSet(object.last_activity_at)
10755
+ ? fromJsonTimestamp(object.last_activity_at)
10756
+ : undefined,
10757
+ };
10758
+ },
10759
+
10760
+ toJSON(message: ProjectOverviewTotals): unknown {
10761
+ const obj: any = {};
10762
+ if (message.sessions !== 0) {
10763
+ obj.sessions = Math.round(message.sessions);
10764
+ }
10765
+ if (message.modelCalls !== 0) {
10766
+ obj.modelCalls = Math.round(message.modelCalls);
10767
+ }
10768
+ if (message.toolCalls !== 0) {
10769
+ obj.toolCalls = Math.round(message.toolCalls);
10770
+ }
10771
+ if (message.userMessages !== 0) {
10772
+ obj.userMessages = Math.round(message.userMessages);
10773
+ }
10774
+ if (message.inputTokens !== 0) {
10775
+ obj.inputTokens = Math.round(message.inputTokens);
10776
+ }
10777
+ if (message.outputTokens !== 0) {
10778
+ obj.outputTokens = Math.round(message.outputTokens);
10779
+ }
10780
+ if (message.cacheReadTokens !== 0) {
10781
+ obj.cacheReadTokens = Math.round(message.cacheReadTokens);
10782
+ }
10783
+ if (message.cacheWriteTokens !== 0) {
10784
+ obj.cacheWriteTokens = Math.round(message.cacheWriteTokens);
10785
+ }
10786
+ if (message.costUsd !== 0) {
10787
+ obj.costUsd = message.costUsd;
10788
+ }
10789
+ if (message.distinctUsers !== 0) {
10790
+ obj.distinctUsers = Math.round(message.distinctUsers);
10791
+ }
10792
+ if (message.commits !== 0) {
10793
+ obj.commits = Math.round(message.commits);
10794
+ }
10795
+ if (message.pushes !== 0) {
10796
+ obj.pushes = Math.round(message.pushes);
10797
+ }
10798
+ if (message.filesTouched !== 0) {
10799
+ obj.filesTouched = Math.round(message.filesTouched);
10800
+ }
10801
+ if (message.lastActivityAt !== undefined) {
10802
+ obj.lastActivityAt = message.lastActivityAt.toISOString();
10803
+ }
10804
+ return obj;
10805
+ },
10806
+
10807
+ create<I extends Exact<DeepPartial<ProjectOverviewTotals>, I>>(base?: I): ProjectOverviewTotals {
10808
+ return ProjectOverviewTotals.fromPartial(base ?? ({} as any));
10809
+ },
10810
+ fromPartial<I extends Exact<DeepPartial<ProjectOverviewTotals>, I>>(object: I): ProjectOverviewTotals {
10811
+ const message = createBaseProjectOverviewTotals();
10812
+ message.sessions = object.sessions ?? 0;
10813
+ message.modelCalls = object.modelCalls ?? 0;
10814
+ message.toolCalls = object.toolCalls ?? 0;
10815
+ message.userMessages = object.userMessages ?? 0;
10816
+ message.inputTokens = object.inputTokens ?? 0;
10817
+ message.outputTokens = object.outputTokens ?? 0;
10818
+ message.cacheReadTokens = object.cacheReadTokens ?? 0;
10819
+ message.cacheWriteTokens = object.cacheWriteTokens ?? 0;
10820
+ message.costUsd = object.costUsd ?? 0;
10821
+ message.distinctUsers = object.distinctUsers ?? 0;
10822
+ message.commits = object.commits ?? 0;
10823
+ message.pushes = object.pushes ?? 0;
10824
+ message.filesTouched = object.filesTouched ?? 0;
10825
+ message.lastActivityAt = object.lastActivityAt ?? undefined;
10826
+ return message;
10827
+ },
10828
+ };
10829
+
10830
+ function createBaseProjectOverviewSlice(): ProjectOverviewSlice {
10831
+ return { key: "", modelCalls: 0, inputTokens: 0, outputTokens: 0, costUsd: 0 };
10832
+ }
10833
+
10834
+ export const ProjectOverviewSlice: MessageFns<ProjectOverviewSlice> = {
10835
+ encode(message: ProjectOverviewSlice, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
10836
+ if (message.key !== "") {
10837
+ writer.uint32(10).string(message.key);
10838
+ }
10839
+ if (message.modelCalls !== 0) {
10840
+ writer.uint32(16).uint64(message.modelCalls);
10841
+ }
10842
+ if (message.inputTokens !== 0) {
10843
+ writer.uint32(24).uint64(message.inputTokens);
10844
+ }
10845
+ if (message.outputTokens !== 0) {
10846
+ writer.uint32(32).uint64(message.outputTokens);
10847
+ }
10848
+ if (message.costUsd !== 0) {
10849
+ writer.uint32(41).double(message.costUsd);
10850
+ }
10851
+ return writer;
10852
+ },
10853
+
10854
+ decode(input: BinaryReader | Uint8Array, length?: number): ProjectOverviewSlice {
10855
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
10856
+ const previousRecursionDepth = (reader as any).__tsProtoDecodeDepth ?? 0;
10857
+ if (previousRecursionDepth >= 100) {
10858
+ throw new globalThis.Error("protobuf decode recursion limit exceeded");
10859
+ }
10860
+ (reader as any).__tsProtoDecodeDepth = previousRecursionDepth + 1;
10861
+ try {
10862
+ const end = length === undefined ? reader.len : reader.pos + length;
10863
+ const message = createBaseProjectOverviewSlice();
10864
+ while (reader.pos < end) {
10865
+ const tag = reader.uint32();
10866
+ switch (tag >>> 3) {
10867
+ case 1: {
10868
+ if (tag !== 10) {
10869
+ break;
10870
+ }
10871
+
10872
+ message.key = reader.string();
10873
+ continue;
10874
+ }
10875
+ case 2: {
10876
+ if (tag !== 16) {
10877
+ break;
10878
+ }
10879
+
10880
+ message.modelCalls = longToNumber(reader.uint64());
10881
+ continue;
10882
+ }
10883
+ case 3: {
10884
+ if (tag !== 24) {
10885
+ break;
10886
+ }
10887
+
10888
+ message.inputTokens = longToNumber(reader.uint64());
10889
+ continue;
10890
+ }
10891
+ case 4: {
10892
+ if (tag !== 32) {
10893
+ break;
10894
+ }
10895
+
10896
+ message.outputTokens = longToNumber(reader.uint64());
10897
+ continue;
10898
+ }
10899
+ case 5: {
10900
+ if (tag !== 41) {
10901
+ break;
10902
+ }
10903
+
10904
+ message.costUsd = reader.double();
10905
+ continue;
10906
+ }
10907
+ }
10908
+ if ((tag & 7) === 4 || tag === 0) {
10909
+ break;
10910
+ }
10911
+ reader.skip(tag & 7);
10912
+ }
10913
+ return message;
10914
+ } finally {
10915
+ (reader as any).__tsProtoDecodeDepth = previousRecursionDepth;
10916
+ }
10917
+ },
10918
+
10919
+ fromJSON(object: any): ProjectOverviewSlice {
10920
+ return {
10921
+ key: isSet(object.key) ? globalThis.String(object.key) : "",
10922
+ modelCalls: isSet(object.modelCalls)
10923
+ ? globalThis.Number(object.modelCalls)
10924
+ : isSet(object.model_calls)
10925
+ ? globalThis.Number(object.model_calls)
10926
+ : 0,
10927
+ inputTokens: isSet(object.inputTokens)
10928
+ ? globalThis.Number(object.inputTokens)
10929
+ : isSet(object.input_tokens)
10930
+ ? globalThis.Number(object.input_tokens)
10931
+ : 0,
10932
+ outputTokens: isSet(object.outputTokens)
10933
+ ? globalThis.Number(object.outputTokens)
10934
+ : isSet(object.output_tokens)
10935
+ ? globalThis.Number(object.output_tokens)
10936
+ : 0,
10937
+ costUsd: isSet(object.costUsd)
10938
+ ? globalThis.Number(object.costUsd)
10939
+ : isSet(object.cost_usd)
10940
+ ? globalThis.Number(object.cost_usd)
10941
+ : 0,
10942
+ };
10943
+ },
10944
+
10945
+ toJSON(message: ProjectOverviewSlice): unknown {
10946
+ const obj: any = {};
10947
+ if (message.key !== "") {
10948
+ obj.key = message.key;
10949
+ }
10950
+ if (message.modelCalls !== 0) {
10951
+ obj.modelCalls = Math.round(message.modelCalls);
10952
+ }
10953
+ if (message.inputTokens !== 0) {
10954
+ obj.inputTokens = Math.round(message.inputTokens);
10955
+ }
10956
+ if (message.outputTokens !== 0) {
10957
+ obj.outputTokens = Math.round(message.outputTokens);
10958
+ }
10959
+ if (message.costUsd !== 0) {
10960
+ obj.costUsd = message.costUsd;
10961
+ }
10962
+ return obj;
10963
+ },
10964
+
10965
+ create<I extends Exact<DeepPartial<ProjectOverviewSlice>, I>>(base?: I): ProjectOverviewSlice {
10966
+ return ProjectOverviewSlice.fromPartial(base ?? ({} as any));
10967
+ },
10968
+ fromPartial<I extends Exact<DeepPartial<ProjectOverviewSlice>, I>>(object: I): ProjectOverviewSlice {
10969
+ const message = createBaseProjectOverviewSlice();
10970
+ message.key = object.key ?? "";
10971
+ message.modelCalls = object.modelCalls ?? 0;
10972
+ message.inputTokens = object.inputTokens ?? 0;
10973
+ message.outputTokens = object.outputTokens ?? 0;
10974
+ message.costUsd = object.costUsd ?? 0;
10975
+ return message;
10976
+ },
10977
+ };
10978
+
10979
+ function createBaseProjectSessionRef(): ProjectSessionRef {
10980
+ return { sessionId: "", sourceSystem: "", costUsd: 0, modelCalls: 0, lastActivityAt: undefined };
10981
+ }
10982
+
10983
+ export const ProjectSessionRef: MessageFns<ProjectSessionRef> = {
10984
+ encode(message: ProjectSessionRef, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
10985
+ if (message.sessionId !== "") {
10986
+ writer.uint32(10).string(message.sessionId);
10987
+ }
10988
+ if (message.sourceSystem !== "") {
10989
+ writer.uint32(18).string(message.sourceSystem);
10990
+ }
10991
+ if (message.costUsd !== 0) {
10992
+ writer.uint32(25).double(message.costUsd);
10993
+ }
10994
+ if (message.modelCalls !== 0) {
10995
+ writer.uint32(32).uint64(message.modelCalls);
10996
+ }
10997
+ if (message.lastActivityAt !== undefined) {
10998
+ Timestamp.encode(toTimestamp(message.lastActivityAt), writer.uint32(42).fork()).join();
10999
+ }
11000
+ return writer;
11001
+ },
11002
+
11003
+ decode(input: BinaryReader | Uint8Array, length?: number): ProjectSessionRef {
11004
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
11005
+ const previousRecursionDepth = (reader as any).__tsProtoDecodeDepth ?? 0;
11006
+ if (previousRecursionDepth >= 100) {
11007
+ throw new globalThis.Error("protobuf decode recursion limit exceeded");
11008
+ }
11009
+ (reader as any).__tsProtoDecodeDepth = previousRecursionDepth + 1;
11010
+ try {
11011
+ const end = length === undefined ? reader.len : reader.pos + length;
11012
+ const message = createBaseProjectSessionRef();
11013
+ while (reader.pos < end) {
11014
+ const tag = reader.uint32();
11015
+ switch (tag >>> 3) {
11016
+ case 1: {
11017
+ if (tag !== 10) {
11018
+ break;
11019
+ }
11020
+
11021
+ message.sessionId = reader.string();
11022
+ continue;
11023
+ }
11024
+ case 2: {
11025
+ if (tag !== 18) {
11026
+ break;
11027
+ }
11028
+
11029
+ message.sourceSystem = reader.string();
11030
+ continue;
11031
+ }
11032
+ case 3: {
11033
+ if (tag !== 25) {
11034
+ break;
11035
+ }
11036
+
11037
+ message.costUsd = reader.double();
11038
+ continue;
11039
+ }
11040
+ case 4: {
11041
+ if (tag !== 32) {
11042
+ break;
11043
+ }
11044
+
11045
+ message.modelCalls = longToNumber(reader.uint64());
11046
+ continue;
11047
+ }
11048
+ case 5: {
11049
+ if (tag !== 42) {
11050
+ break;
11051
+ }
11052
+
11053
+ message.lastActivityAt = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
11054
+ continue;
11055
+ }
11056
+ }
11057
+ if ((tag & 7) === 4 || tag === 0) {
11058
+ break;
11059
+ }
11060
+ reader.skip(tag & 7);
11061
+ }
11062
+ return message;
11063
+ } finally {
11064
+ (reader as any).__tsProtoDecodeDepth = previousRecursionDepth;
11065
+ }
11066
+ },
11067
+
11068
+ fromJSON(object: any): ProjectSessionRef {
11069
+ return {
11070
+ sessionId: isSet(object.sessionId)
11071
+ ? globalThis.String(object.sessionId)
11072
+ : isSet(object.session_id)
11073
+ ? globalThis.String(object.session_id)
11074
+ : "",
11075
+ sourceSystem: isSet(object.sourceSystem)
11076
+ ? globalThis.String(object.sourceSystem)
11077
+ : isSet(object.source_system)
11078
+ ? globalThis.String(object.source_system)
11079
+ : "",
11080
+ costUsd: isSet(object.costUsd)
11081
+ ? globalThis.Number(object.costUsd)
11082
+ : isSet(object.cost_usd)
11083
+ ? globalThis.Number(object.cost_usd)
11084
+ : 0,
11085
+ modelCalls: isSet(object.modelCalls)
11086
+ ? globalThis.Number(object.modelCalls)
11087
+ : isSet(object.model_calls)
11088
+ ? globalThis.Number(object.model_calls)
11089
+ : 0,
11090
+ lastActivityAt: isSet(object.lastActivityAt)
11091
+ ? fromJsonTimestamp(object.lastActivityAt)
11092
+ : isSet(object.last_activity_at)
11093
+ ? fromJsonTimestamp(object.last_activity_at)
11094
+ : undefined,
11095
+ };
11096
+ },
11097
+
11098
+ toJSON(message: ProjectSessionRef): unknown {
11099
+ const obj: any = {};
11100
+ if (message.sessionId !== "") {
11101
+ obj.sessionId = message.sessionId;
11102
+ }
11103
+ if (message.sourceSystem !== "") {
11104
+ obj.sourceSystem = message.sourceSystem;
11105
+ }
11106
+ if (message.costUsd !== 0) {
11107
+ obj.costUsd = message.costUsd;
11108
+ }
11109
+ if (message.modelCalls !== 0) {
11110
+ obj.modelCalls = Math.round(message.modelCalls);
11111
+ }
11112
+ if (message.lastActivityAt !== undefined) {
11113
+ obj.lastActivityAt = message.lastActivityAt.toISOString();
11114
+ }
11115
+ return obj;
11116
+ },
11117
+
11118
+ create<I extends Exact<DeepPartial<ProjectSessionRef>, I>>(base?: I): ProjectSessionRef {
11119
+ return ProjectSessionRef.fromPartial(base ?? ({} as any));
11120
+ },
11121
+ fromPartial<I extends Exact<DeepPartial<ProjectSessionRef>, I>>(object: I): ProjectSessionRef {
11122
+ const message = createBaseProjectSessionRef();
11123
+ message.sessionId = object.sessionId ?? "";
11124
+ message.sourceSystem = object.sourceSystem ?? "";
11125
+ message.costUsd = object.costUsd ?? 0;
11126
+ message.modelCalls = object.modelCalls ?? 0;
11127
+ message.lastActivityAt = object.lastActivityAt ?? undefined;
11128
+ return message;
11129
+ },
11130
+ };
11131
+
11132
+ function createBaseResourceRankingsRequest(): ResourceRankingsRequest {
11133
+ return { organizationId: "", projectId: "", filter: undefined, dimension: 0, timeWindow: 0, topN: 0 };
11134
+ }
11135
+
11136
+ export const ResourceRankingsRequest: MessageFns<ResourceRankingsRequest> = {
11137
+ encode(message: ResourceRankingsRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
11138
+ if (message.organizationId !== "") {
11139
+ writer.uint32(10).string(message.organizationId);
11140
+ }
11141
+ if (message.projectId !== "") {
11142
+ writer.uint32(18).string(message.projectId);
11143
+ }
11144
+ if (message.filter !== undefined) {
11145
+ AISessionFilter.encode(message.filter, writer.uint32(26).fork()).join();
11146
+ }
11147
+ if (message.dimension !== 0) {
11148
+ writer.uint32(32).int32(message.dimension);
11149
+ }
11150
+ if (message.timeWindow !== 0) {
11151
+ writer.uint32(40).int32(message.timeWindow);
11152
+ }
11153
+ if (message.topN !== 0) {
11154
+ writer.uint32(48).int32(message.topN);
11155
+ }
11156
+ return writer;
11157
+ },
11158
+
11159
+ decode(input: BinaryReader | Uint8Array, length?: number): ResourceRankingsRequest {
11160
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
11161
+ const previousRecursionDepth = (reader as any).__tsProtoDecodeDepth ?? 0;
11162
+ if (previousRecursionDepth >= 100) {
11163
+ throw new globalThis.Error("protobuf decode recursion limit exceeded");
11164
+ }
11165
+ (reader as any).__tsProtoDecodeDepth = previousRecursionDepth + 1;
11166
+ try {
11167
+ const end = length === undefined ? reader.len : reader.pos + length;
11168
+ const message = createBaseResourceRankingsRequest();
11169
+ while (reader.pos < end) {
11170
+ const tag = reader.uint32();
11171
+ switch (tag >>> 3) {
11172
+ case 1: {
11173
+ if (tag !== 10) {
11174
+ break;
11175
+ }
11176
+
11177
+ message.organizationId = reader.string();
11178
+ continue;
11179
+ }
11180
+ case 2: {
11181
+ if (tag !== 18) {
11182
+ break;
11183
+ }
11184
+
11185
+ message.projectId = reader.string();
11186
+ continue;
11187
+ }
11188
+ case 3: {
11189
+ if (tag !== 26) {
11190
+ break;
11191
+ }
11192
+
11193
+ message.filter = AISessionFilter.decode(reader, reader.uint32());
11194
+ continue;
11195
+ }
11196
+ case 4: {
11197
+ if (tag !== 32) {
11198
+ break;
11199
+ }
11200
+
11201
+ message.dimension = reader.int32() as any;
11202
+ continue;
11203
+ }
11204
+ case 5: {
11205
+ if (tag !== 40) {
11206
+ break;
11207
+ }
11208
+
11209
+ message.timeWindow = reader.int32() as any;
11210
+ continue;
11211
+ }
11212
+ case 6: {
11213
+ if (tag !== 48) {
11214
+ break;
11215
+ }
11216
+
11217
+ message.topN = reader.int32();
11218
+ continue;
11219
+ }
11220
+ }
11221
+ if ((tag & 7) === 4 || tag === 0) {
11222
+ break;
11223
+ }
11224
+ reader.skip(tag & 7);
11225
+ }
11226
+ return message;
11227
+ } finally {
11228
+ (reader as any).__tsProtoDecodeDepth = previousRecursionDepth;
11229
+ }
11230
+ },
11231
+
11232
+ fromJSON(object: any): ResourceRankingsRequest {
11233
+ return {
11234
+ organizationId: isSet(object.organizationId)
11235
+ ? globalThis.String(object.organizationId)
11236
+ : isSet(object.organization_id)
11237
+ ? globalThis.String(object.organization_id)
11238
+ : "",
11239
+ projectId: isSet(object.projectId)
11240
+ ? globalThis.String(object.projectId)
11241
+ : isSet(object.project_id)
11242
+ ? globalThis.String(object.project_id)
11243
+ : "",
11244
+ filter: isSet(object.filter) ? AISessionFilter.fromJSON(object.filter) : undefined,
11245
+ dimension: isSet(object.dimension) ? aIResourceDimensionFromJSON(object.dimension) : 0,
11246
+ timeWindow: isSet(object.timeWindow)
11247
+ ? analyticsTimeWindowFromJSON(object.timeWindow)
11248
+ : isSet(object.time_window)
11249
+ ? analyticsTimeWindowFromJSON(object.time_window)
11250
+ : 0,
11251
+ topN: isSet(object.topN)
11252
+ ? globalThis.Number(object.topN)
11253
+ : isSet(object.top_n)
11254
+ ? globalThis.Number(object.top_n)
11255
+ : 0,
11256
+ };
11257
+ },
11258
+
11259
+ toJSON(message: ResourceRankingsRequest): unknown {
11260
+ const obj: any = {};
11261
+ if (message.organizationId !== "") {
11262
+ obj.organizationId = message.organizationId;
10099
11263
  }
10100
- if (message.distinctUsers !== 0) {
10101
- obj.distinctUsers = Math.round(message.distinctUsers);
11264
+ if (message.projectId !== "") {
11265
+ obj.projectId = message.projectId;
10102
11266
  }
10103
- if (message.commits !== 0) {
10104
- obj.commits = Math.round(message.commits);
11267
+ if (message.filter !== undefined) {
11268
+ obj.filter = AISessionFilter.toJSON(message.filter);
10105
11269
  }
10106
- if (message.pushes !== 0) {
10107
- obj.pushes = Math.round(message.pushes);
11270
+ if (message.dimension !== 0) {
11271
+ obj.dimension = aIResourceDimensionToJSON(message.dimension);
10108
11272
  }
10109
- if (message.filesTouched !== 0) {
10110
- obj.filesTouched = Math.round(message.filesTouched);
11273
+ if (message.timeWindow !== 0) {
11274
+ obj.timeWindow = analyticsTimeWindowToJSON(message.timeWindow);
10111
11275
  }
10112
- if (message.lastActivityAt !== undefined) {
10113
- obj.lastActivityAt = message.lastActivityAt.toISOString();
11276
+ if (message.topN !== 0) {
11277
+ obj.topN = Math.round(message.topN);
10114
11278
  }
10115
11279
  return obj;
10116
11280
  },
10117
11281
 
10118
- create<I extends Exact<DeepPartial<ProjectOverviewTotals>, I>>(base?: I): ProjectOverviewTotals {
10119
- return ProjectOverviewTotals.fromPartial(base ?? ({} as any));
11282
+ create<I extends Exact<DeepPartial<ResourceRankingsRequest>, I>>(base?: I): ResourceRankingsRequest {
11283
+ return ResourceRankingsRequest.fromPartial(base ?? ({} as any));
10120
11284
  },
10121
- fromPartial<I extends Exact<DeepPartial<ProjectOverviewTotals>, I>>(object: I): ProjectOverviewTotals {
10122
- const message = createBaseProjectOverviewTotals();
10123
- message.sessions = object.sessions ?? 0;
10124
- message.modelCalls = object.modelCalls ?? 0;
10125
- message.toolCalls = object.toolCalls ?? 0;
10126
- message.userMessages = object.userMessages ?? 0;
10127
- message.inputTokens = object.inputTokens ?? 0;
10128
- message.outputTokens = object.outputTokens ?? 0;
10129
- message.cacheReadTokens = object.cacheReadTokens ?? 0;
10130
- message.cacheWriteTokens = object.cacheWriteTokens ?? 0;
10131
- message.costUsd = object.costUsd ?? 0;
10132
- message.distinctUsers = object.distinctUsers ?? 0;
10133
- message.commits = object.commits ?? 0;
10134
- message.pushes = object.pushes ?? 0;
10135
- message.filesTouched = object.filesTouched ?? 0;
10136
- message.lastActivityAt = object.lastActivityAt ?? undefined;
11285
+ fromPartial<I extends Exact<DeepPartial<ResourceRankingsRequest>, I>>(object: I): ResourceRankingsRequest {
11286
+ const message = createBaseResourceRankingsRequest();
11287
+ message.organizationId = object.organizationId ?? "";
11288
+ message.projectId = object.projectId ?? "";
11289
+ message.filter = (object.filter !== undefined && object.filter !== null)
11290
+ ? AISessionFilter.fromPartial(object.filter)
11291
+ : undefined;
11292
+ message.dimension = object.dimension ?? 0;
11293
+ message.timeWindow = object.timeWindow ?? 0;
11294
+ message.topN = object.topN ?? 0;
10137
11295
  return message;
10138
11296
  },
10139
11297
  };
10140
11298
 
10141
- function createBaseProjectOverviewSlice(): ProjectOverviewSlice {
10142
- return { key: "", modelCalls: 0, inputTokens: 0, outputTokens: 0, costUsd: 0 };
11299
+ function createBaseResourceRankingsResponse(): ResourceRankingsResponse {
11300
+ return {
11301
+ status: undefined,
11302
+ rankings: [],
11303
+ dimension: 0,
11304
+ windowStart: undefined,
11305
+ windowEnd: undefined,
11306
+ asOf: undefined,
11307
+ };
10143
11308
  }
10144
11309
 
10145
- export const ProjectOverviewSlice: MessageFns<ProjectOverviewSlice> = {
10146
- encode(message: ProjectOverviewSlice, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
10147
- if (message.key !== "") {
10148
- writer.uint32(10).string(message.key);
11310
+ export const ResourceRankingsResponse: MessageFns<ResourceRankingsResponse> = {
11311
+ encode(message: ResourceRankingsResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
11312
+ if (message.status !== undefined) {
11313
+ ResponseStatus.encode(message.status, writer.uint32(10).fork()).join();
10149
11314
  }
10150
- if (message.modelCalls !== 0) {
10151
- writer.uint32(16).uint64(message.modelCalls);
11315
+ for (const v of message.rankings) {
11316
+ ResourceRanking.encode(v!, writer.uint32(18).fork()).join();
10152
11317
  }
10153
- if (message.inputTokens !== 0) {
10154
- writer.uint32(24).uint64(message.inputTokens);
11318
+ if (message.dimension !== 0) {
11319
+ writer.uint32(24).int32(message.dimension);
10155
11320
  }
10156
- if (message.outputTokens !== 0) {
10157
- writer.uint32(32).uint64(message.outputTokens);
11321
+ if (message.windowStart !== undefined) {
11322
+ Timestamp.encode(toTimestamp(message.windowStart), writer.uint32(34).fork()).join();
10158
11323
  }
10159
- if (message.costUsd !== 0) {
10160
- writer.uint32(41).double(message.costUsd);
11324
+ if (message.windowEnd !== undefined) {
11325
+ Timestamp.encode(toTimestamp(message.windowEnd), writer.uint32(42).fork()).join();
11326
+ }
11327
+ if (message.asOf !== undefined) {
11328
+ Timestamp.encode(toTimestamp(message.asOf), writer.uint32(50).fork()).join();
10161
11329
  }
10162
11330
  return writer;
10163
11331
  },
10164
11332
 
10165
- decode(input: BinaryReader | Uint8Array, length?: number): ProjectOverviewSlice {
11333
+ decode(input: BinaryReader | Uint8Array, length?: number): ResourceRankingsResponse {
10166
11334
  const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
10167
11335
  const previousRecursionDepth = (reader as any).__tsProtoDecodeDepth ?? 0;
10168
11336
  if (previousRecursionDepth >= 100) {
@@ -10171,7 +11339,7 @@ export const ProjectOverviewSlice: MessageFns<ProjectOverviewSlice> = {
10171
11339
  (reader as any).__tsProtoDecodeDepth = previousRecursionDepth + 1;
10172
11340
  try {
10173
11341
  const end = length === undefined ? reader.len : reader.pos + length;
10174
- const message = createBaseProjectOverviewSlice();
11342
+ const message = createBaseResourceRankingsResponse();
10175
11343
  while (reader.pos < end) {
10176
11344
  const tag = reader.uint32();
10177
11345
  switch (tag >>> 3) {
@@ -10180,15 +11348,15 @@ export const ProjectOverviewSlice: MessageFns<ProjectOverviewSlice> = {
10180
11348
  break;
10181
11349
  }
10182
11350
 
10183
- message.key = reader.string();
11351
+ message.status = ResponseStatus.decode(reader, reader.uint32());
10184
11352
  continue;
10185
11353
  }
10186
11354
  case 2: {
10187
- if (tag !== 16) {
11355
+ if (tag !== 18) {
10188
11356
  break;
10189
11357
  }
10190
11358
 
10191
- message.modelCalls = longToNumber(reader.uint64());
11359
+ message.rankings.push(ResourceRanking.decode(reader, reader.uint32()));
10192
11360
  continue;
10193
11361
  }
10194
11362
  case 3: {
@@ -10196,23 +11364,31 @@ export const ProjectOverviewSlice: MessageFns<ProjectOverviewSlice> = {
10196
11364
  break;
10197
11365
  }
10198
11366
 
10199
- message.inputTokens = longToNumber(reader.uint64());
11367
+ message.dimension = reader.int32() as any;
10200
11368
  continue;
10201
11369
  }
10202
11370
  case 4: {
10203
- if (tag !== 32) {
11371
+ if (tag !== 34) {
10204
11372
  break;
10205
11373
  }
10206
11374
 
10207
- message.outputTokens = longToNumber(reader.uint64());
11375
+ message.windowStart = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
10208
11376
  continue;
10209
11377
  }
10210
11378
  case 5: {
10211
- if (tag !== 41) {
11379
+ if (tag !== 42) {
10212
11380
  break;
10213
11381
  }
10214
11382
 
10215
- message.costUsd = reader.double();
11383
+ message.windowEnd = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
11384
+ continue;
11385
+ }
11386
+ case 6: {
11387
+ if (tag !== 50) {
11388
+ break;
11389
+ }
11390
+
11391
+ message.asOf = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
10216
11392
  continue;
10217
11393
  }
10218
11394
  }
@@ -10227,91 +11403,93 @@ export const ProjectOverviewSlice: MessageFns<ProjectOverviewSlice> = {
10227
11403
  }
10228
11404
  },
10229
11405
 
10230
- fromJSON(object: any): ProjectOverviewSlice {
11406
+ fromJSON(object: any): ResourceRankingsResponse {
10231
11407
  return {
10232
- key: isSet(object.key) ? globalThis.String(object.key) : "",
10233
- modelCalls: isSet(object.modelCalls)
10234
- ? globalThis.Number(object.modelCalls)
10235
- : isSet(object.model_calls)
10236
- ? globalThis.Number(object.model_calls)
10237
- : 0,
10238
- inputTokens: isSet(object.inputTokens)
10239
- ? globalThis.Number(object.inputTokens)
10240
- : isSet(object.input_tokens)
10241
- ? globalThis.Number(object.input_tokens)
10242
- : 0,
10243
- outputTokens: isSet(object.outputTokens)
10244
- ? globalThis.Number(object.outputTokens)
10245
- : isSet(object.output_tokens)
10246
- ? globalThis.Number(object.output_tokens)
10247
- : 0,
10248
- costUsd: isSet(object.costUsd)
10249
- ? globalThis.Number(object.costUsd)
10250
- : isSet(object.cost_usd)
10251
- ? globalThis.Number(object.cost_usd)
10252
- : 0,
11408
+ status: isSet(object.status) ? ResponseStatus.fromJSON(object.status) : undefined,
11409
+ rankings: globalThis.Array.isArray(object?.rankings)
11410
+ ? object.rankings.map((e: any) => ResourceRanking.fromJSON(e))
11411
+ : [],
11412
+ dimension: isSet(object.dimension) ? aIResourceDimensionFromJSON(object.dimension) : 0,
11413
+ windowStart: isSet(object.windowStart)
11414
+ ? fromJsonTimestamp(object.windowStart)
11415
+ : isSet(object.window_start)
11416
+ ? fromJsonTimestamp(object.window_start)
11417
+ : undefined,
11418
+ windowEnd: isSet(object.windowEnd)
11419
+ ? fromJsonTimestamp(object.windowEnd)
11420
+ : isSet(object.window_end)
11421
+ ? fromJsonTimestamp(object.window_end)
11422
+ : undefined,
11423
+ asOf: isSet(object.asOf)
11424
+ ? fromJsonTimestamp(object.asOf)
11425
+ : isSet(object.as_of)
11426
+ ? fromJsonTimestamp(object.as_of)
11427
+ : undefined,
10253
11428
  };
10254
11429
  },
10255
11430
 
10256
- toJSON(message: ProjectOverviewSlice): unknown {
11431
+ toJSON(message: ResourceRankingsResponse): unknown {
10257
11432
  const obj: any = {};
10258
- if (message.key !== "") {
10259
- obj.key = message.key;
11433
+ if (message.status !== undefined) {
11434
+ obj.status = ResponseStatus.toJSON(message.status);
10260
11435
  }
10261
- if (message.modelCalls !== 0) {
10262
- obj.modelCalls = Math.round(message.modelCalls);
11436
+ if (message.rankings?.length) {
11437
+ obj.rankings = message.rankings.map((e) => ResourceRanking.toJSON(e));
10263
11438
  }
10264
- if (message.inputTokens !== 0) {
10265
- obj.inputTokens = Math.round(message.inputTokens);
11439
+ if (message.dimension !== 0) {
11440
+ obj.dimension = aIResourceDimensionToJSON(message.dimension);
10266
11441
  }
10267
- if (message.outputTokens !== 0) {
10268
- obj.outputTokens = Math.round(message.outputTokens);
11442
+ if (message.windowStart !== undefined) {
11443
+ obj.windowStart = message.windowStart.toISOString();
10269
11444
  }
10270
- if (message.costUsd !== 0) {
10271
- obj.costUsd = message.costUsd;
11445
+ if (message.windowEnd !== undefined) {
11446
+ obj.windowEnd = message.windowEnd.toISOString();
11447
+ }
11448
+ if (message.asOf !== undefined) {
11449
+ obj.asOf = message.asOf.toISOString();
10272
11450
  }
10273
11451
  return obj;
10274
11452
  },
10275
11453
 
10276
- create<I extends Exact<DeepPartial<ProjectOverviewSlice>, I>>(base?: I): ProjectOverviewSlice {
10277
- return ProjectOverviewSlice.fromPartial(base ?? ({} as any));
11454
+ create<I extends Exact<DeepPartial<ResourceRankingsResponse>, I>>(base?: I): ResourceRankingsResponse {
11455
+ return ResourceRankingsResponse.fromPartial(base ?? ({} as any));
10278
11456
  },
10279
- fromPartial<I extends Exact<DeepPartial<ProjectOverviewSlice>, I>>(object: I): ProjectOverviewSlice {
10280
- const message = createBaseProjectOverviewSlice();
10281
- message.key = object.key ?? "";
10282
- message.modelCalls = object.modelCalls ?? 0;
10283
- message.inputTokens = object.inputTokens ?? 0;
10284
- message.outputTokens = object.outputTokens ?? 0;
10285
- message.costUsd = object.costUsd ?? 0;
11457
+ fromPartial<I extends Exact<DeepPartial<ResourceRankingsResponse>, I>>(object: I): ResourceRankingsResponse {
11458
+ const message = createBaseResourceRankingsResponse();
11459
+ message.status = (object.status !== undefined && object.status !== null)
11460
+ ? ResponseStatus.fromPartial(object.status)
11461
+ : undefined;
11462
+ message.rankings = object.rankings?.map((e) => ResourceRanking.fromPartial(e)) || [];
11463
+ message.dimension = object.dimension ?? 0;
11464
+ message.windowStart = object.windowStart ?? undefined;
11465
+ message.windowEnd = object.windowEnd ?? undefined;
11466
+ message.asOf = object.asOf ?? undefined;
10286
11467
  return message;
10287
11468
  },
10288
11469
  };
10289
11470
 
10290
- function createBaseProjectSessionRef(): ProjectSessionRef {
10291
- return { sessionId: "", sourceSystem: "", costUsd: 0, modelCalls: 0, lastActivityAt: undefined };
11471
+ function createBaseResourceRanking(): ResourceRanking {
11472
+ return { key: "", count: 0, priorCount: 0, sessionCount: 0 };
10292
11473
  }
10293
11474
 
10294
- export const ProjectSessionRef: MessageFns<ProjectSessionRef> = {
10295
- encode(message: ProjectSessionRef, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
10296
- if (message.sessionId !== "") {
10297
- writer.uint32(10).string(message.sessionId);
10298
- }
10299
- if (message.sourceSystem !== "") {
10300
- writer.uint32(18).string(message.sourceSystem);
11475
+ export const ResourceRanking: MessageFns<ResourceRanking> = {
11476
+ encode(message: ResourceRanking, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
11477
+ if (message.key !== "") {
11478
+ writer.uint32(10).string(message.key);
10301
11479
  }
10302
- if (message.costUsd !== 0) {
10303
- writer.uint32(25).double(message.costUsd);
11480
+ if (message.count !== 0) {
11481
+ writer.uint32(16).uint64(message.count);
10304
11482
  }
10305
- if (message.modelCalls !== 0) {
10306
- writer.uint32(32).uint64(message.modelCalls);
11483
+ if (message.priorCount !== 0) {
11484
+ writer.uint32(24).uint64(message.priorCount);
10307
11485
  }
10308
- if (message.lastActivityAt !== undefined) {
10309
- Timestamp.encode(toTimestamp(message.lastActivityAt), writer.uint32(42).fork()).join();
11486
+ if (message.sessionCount !== 0) {
11487
+ writer.uint32(32).uint64(message.sessionCount);
10310
11488
  }
10311
11489
  return writer;
10312
11490
  },
10313
11491
 
10314
- decode(input: BinaryReader | Uint8Array, length?: number): ProjectSessionRef {
11492
+ decode(input: BinaryReader | Uint8Array, length?: number): ResourceRanking {
10315
11493
  const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
10316
11494
  const previousRecursionDepth = (reader as any).__tsProtoDecodeDepth ?? 0;
10317
11495
  if (previousRecursionDepth >= 100) {
@@ -10320,7 +11498,7 @@ export const ProjectSessionRef: MessageFns<ProjectSessionRef> = {
10320
11498
  (reader as any).__tsProtoDecodeDepth = previousRecursionDepth + 1;
10321
11499
  try {
10322
11500
  const end = length === undefined ? reader.len : reader.pos + length;
10323
- const message = createBaseProjectSessionRef();
11501
+ const message = createBaseResourceRanking();
10324
11502
  while (reader.pos < end) {
10325
11503
  const tag = reader.uint32();
10326
11504
  switch (tag >>> 3) {
@@ -10329,23 +11507,23 @@ export const ProjectSessionRef: MessageFns<ProjectSessionRef> = {
10329
11507
  break;
10330
11508
  }
10331
11509
 
10332
- message.sessionId = reader.string();
11510
+ message.key = reader.string();
10333
11511
  continue;
10334
11512
  }
10335
11513
  case 2: {
10336
- if (tag !== 18) {
11514
+ if (tag !== 16) {
10337
11515
  break;
10338
11516
  }
10339
11517
 
10340
- message.sourceSystem = reader.string();
11518
+ message.count = longToNumber(reader.uint64());
10341
11519
  continue;
10342
11520
  }
10343
11521
  case 3: {
10344
- if (tag !== 25) {
11522
+ if (tag !== 24) {
10345
11523
  break;
10346
11524
  }
10347
11525
 
10348
- message.costUsd = reader.double();
11526
+ message.priorCount = longToNumber(reader.uint64());
10349
11527
  continue;
10350
11528
  }
10351
11529
  case 4: {
@@ -10353,15 +11531,7 @@ export const ProjectSessionRef: MessageFns<ProjectSessionRef> = {
10353
11531
  break;
10354
11532
  }
10355
11533
 
10356
- message.modelCalls = longToNumber(reader.uint64());
10357
- continue;
10358
- }
10359
- case 5: {
10360
- if (tag !== 42) {
10361
- break;
10362
- }
10363
-
10364
- message.lastActivityAt = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
11534
+ message.sessionCount = longToNumber(reader.uint64());
10365
11535
  continue;
10366
11536
  }
10367
11537
  }
@@ -10376,66 +11546,49 @@ export const ProjectSessionRef: MessageFns<ProjectSessionRef> = {
10376
11546
  }
10377
11547
  },
10378
11548
 
10379
- fromJSON(object: any): ProjectSessionRef {
11549
+ fromJSON(object: any): ResourceRanking {
10380
11550
  return {
10381
- sessionId: isSet(object.sessionId)
10382
- ? globalThis.String(object.sessionId)
10383
- : isSet(object.session_id)
10384
- ? globalThis.String(object.session_id)
10385
- : "",
10386
- sourceSystem: isSet(object.sourceSystem)
10387
- ? globalThis.String(object.sourceSystem)
10388
- : isSet(object.source_system)
10389
- ? globalThis.String(object.source_system)
10390
- : "",
10391
- costUsd: isSet(object.costUsd)
10392
- ? globalThis.Number(object.costUsd)
10393
- : isSet(object.cost_usd)
10394
- ? globalThis.Number(object.cost_usd)
11551
+ key: isSet(object.key) ? globalThis.String(object.key) : "",
11552
+ count: isSet(object.count) ? globalThis.Number(object.count) : 0,
11553
+ priorCount: isSet(object.priorCount)
11554
+ ? globalThis.Number(object.priorCount)
11555
+ : isSet(object.prior_count)
11556
+ ? globalThis.Number(object.prior_count)
10395
11557
  : 0,
10396
- modelCalls: isSet(object.modelCalls)
10397
- ? globalThis.Number(object.modelCalls)
10398
- : isSet(object.model_calls)
10399
- ? globalThis.Number(object.model_calls)
11558
+ sessionCount: isSet(object.sessionCount)
11559
+ ? globalThis.Number(object.sessionCount)
11560
+ : isSet(object.session_count)
11561
+ ? globalThis.Number(object.session_count)
10400
11562
  : 0,
10401
- lastActivityAt: isSet(object.lastActivityAt)
10402
- ? fromJsonTimestamp(object.lastActivityAt)
10403
- : isSet(object.last_activity_at)
10404
- ? fromJsonTimestamp(object.last_activity_at)
10405
- : undefined,
10406
11563
  };
10407
11564
  },
10408
11565
 
10409
- toJSON(message: ProjectSessionRef): unknown {
11566
+ toJSON(message: ResourceRanking): unknown {
10410
11567
  const obj: any = {};
10411
- if (message.sessionId !== "") {
10412
- obj.sessionId = message.sessionId;
10413
- }
10414
- if (message.sourceSystem !== "") {
10415
- obj.sourceSystem = message.sourceSystem;
11568
+ if (message.key !== "") {
11569
+ obj.key = message.key;
10416
11570
  }
10417
- if (message.costUsd !== 0) {
10418
- obj.costUsd = message.costUsd;
11571
+ if (message.count !== 0) {
11572
+ obj.count = Math.round(message.count);
10419
11573
  }
10420
- if (message.modelCalls !== 0) {
10421
- obj.modelCalls = Math.round(message.modelCalls);
11574
+ if (message.priorCount !== 0) {
11575
+ obj.priorCount = Math.round(message.priorCount);
10422
11576
  }
10423
- if (message.lastActivityAt !== undefined) {
10424
- obj.lastActivityAt = message.lastActivityAt.toISOString();
11577
+ if (message.sessionCount !== 0) {
11578
+ obj.sessionCount = Math.round(message.sessionCount);
10425
11579
  }
10426
11580
  return obj;
10427
11581
  },
10428
11582
 
10429
- create<I extends Exact<DeepPartial<ProjectSessionRef>, I>>(base?: I): ProjectSessionRef {
10430
- return ProjectSessionRef.fromPartial(base ?? ({} as any));
11583
+ create<I extends Exact<DeepPartial<ResourceRanking>, I>>(base?: I): ResourceRanking {
11584
+ return ResourceRanking.fromPartial(base ?? ({} as any));
10431
11585
  },
10432
- fromPartial<I extends Exact<DeepPartial<ProjectSessionRef>, I>>(object: I): ProjectSessionRef {
10433
- const message = createBaseProjectSessionRef();
10434
- message.sessionId = object.sessionId ?? "";
10435
- message.sourceSystem = object.sourceSystem ?? "";
10436
- message.costUsd = object.costUsd ?? 0;
10437
- message.modelCalls = object.modelCalls ?? 0;
10438
- message.lastActivityAt = object.lastActivityAt ?? undefined;
11586
+ fromPartial<I extends Exact<DeepPartial<ResourceRanking>, I>>(object: I): ResourceRanking {
11587
+ const message = createBaseResourceRanking();
11588
+ message.key = object.key ?? "";
11589
+ message.count = object.count ?? 0;
11590
+ message.priorCount = object.priorCount ?? 0;
11591
+ message.sessionCount = object.sessionCount ?? 0;
10439
11592
  return message;
10440
11593
  },
10441
11594
  };
@@ -13199,6 +14352,11 @@ export interface AIGatewayService {
13199
14352
  * omitted; today is provisional.
13200
14353
  */
13201
14354
  StreamDailyActivity(request: DailyActivityRequest, metadata?: Metadata): Observable<DailyActivity>;
14355
+ /**
14356
+ * Live weekly activity rhythm: a sparse (weekday, hour) heatmap over a bounded sliding window in an
14357
+ * explicit IANA time zone. Every latest logical event counts; settled model calls add token/cost.
14358
+ */
14359
+ StreamActivityRhythm(request: ActivityRhythmRequest, metadata?: Metadata): Observable<ActivityRhythm>;
13202
14360
  /**
13203
14361
  * Live stream of one project's dashboard bundle: headline totals, model/provider/source mix,
13204
14362
  * and top sessions by cost.
@@ -13221,6 +14379,12 @@ export interface AIGatewayService {
13221
14379
  request: ListModelPriceHistoryRequest,
13222
14380
  metadata?: Metadata,
13223
14381
  ): Promise<ListModelPriceHistoryResponse>;
14382
+ /**
14383
+ * Top-N most-used resources of one kind (skills / tools / files / URLs / bash commands) over a
14384
+ * sliding window, each with the prior equal-length window's count for a trend delta and distinct
14385
+ * sessions. Mirrors telemetry.api.v1.
14386
+ */
14387
+ ListResourceRankings(request: ResourceRankingsRequest, metadata?: Metadata): Promise<ResourceRankingsResponse>;
13224
14388
  }
13225
14389
 
13226
14390
  export const AIGatewayServiceServiceName = "gateway.web.v1.AIGatewayService";
@@ -13244,11 +14408,13 @@ export class AIGatewayServiceClientImpl implements AIGatewayService {
13244
14408
  this.StreamGitActivitySummary = this.StreamGitActivitySummary.bind(this);
13245
14409
  this.StreamTokenActivitySummary = this.StreamTokenActivitySummary.bind(this);
13246
14410
  this.StreamDailyActivity = this.StreamDailyActivity.bind(this);
14411
+ this.StreamActivityRhythm = this.StreamActivityRhythm.bind(this);
13247
14412
  this.StreamProjectOverview = this.StreamProjectOverview.bind(this);
13248
14413
  this.ListFiles = this.ListFiles.bind(this);
13249
14414
  this.StreamFilesSummary = this.StreamFilesSummary.bind(this);
13250
14415
  this.ListModelPrices = this.ListModelPrices.bind(this);
13251
14416
  this.ListModelPriceHistory = this.ListModelPriceHistory.bind(this);
14417
+ this.ListResourceRankings = this.ListResourceRankings.bind(this);
13252
14418
  }
13253
14419
  ListSessions(request: ListSessionsRequest, metadata?: Metadata): Promise<ListSessionsResponse> {
13254
14420
  const data = ListSessionsRequest.encode(request).finish();
@@ -13340,6 +14506,12 @@ export class AIGatewayServiceClientImpl implements AIGatewayService {
13340
14506
  return result.pipe(map((data) => DailyActivity.decode(new BinaryReader(data))));
13341
14507
  }
13342
14508
 
14509
+ StreamActivityRhythm(request: ActivityRhythmRequest, metadata?: Metadata): Observable<ActivityRhythm> {
14510
+ const data = ActivityRhythmRequest.encode(request).finish();
14511
+ const result = this.rpc.serverStreamingRequest(this.service, "StreamActivityRhythm", data, metadata);
14512
+ return result.pipe(map((data) => ActivityRhythm.decode(new BinaryReader(data))));
14513
+ }
14514
+
13343
14515
  StreamProjectOverview(request: ProjectOverviewRequest, metadata?: Metadata): Observable<ProjectOverview> {
13344
14516
  const data = ProjectOverviewRequest.encode(request).finish();
13345
14517
  const result = this.rpc.serverStreamingRequest(this.service, "StreamProjectOverview", data, metadata);
@@ -13372,6 +14544,12 @@ export class AIGatewayServiceClientImpl implements AIGatewayService {
13372
14544
  const promise = this.rpc.request(this.service, "ListModelPriceHistory", data, metadata);
13373
14545
  return promise.then((data) => ListModelPriceHistoryResponse.decode(new BinaryReader(data)));
13374
14546
  }
14547
+
14548
+ ListResourceRankings(request: ResourceRankingsRequest, metadata?: Metadata): Promise<ResourceRankingsResponse> {
14549
+ const data = ResourceRankingsRequest.encode(request).finish();
14550
+ const promise = this.rpc.request(this.service, "ListResourceRankings", data, metadata);
14551
+ return promise.then((data) => ResourceRankingsResponse.decode(new BinaryReader(data)));
14552
+ }
13375
14553
  }
13376
14554
 
13377
14555
  interface Rpc {