@bli-cockpit/telemetry-core 0.1.6 → 0.1.7

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.
@@ -5,6 +5,7 @@ export declare const EvidenceCompletenessStatusSchema: z.ZodEnum<{
5
5
  complete: "complete";
6
6
  partial: "partial";
7
7
  empty: "empty";
8
+ unavailable: "unavailable";
8
9
  }>;
9
10
  export type EvidenceCompletenessStatus = z.infer<typeof EvidenceCompletenessStatusSchema>;
10
11
  export declare const EvidenceCompletenessSourceCountSchema: z.ZodObject<{
@@ -15,6 +16,7 @@ export declare const EvidenceCompletenessSourceCountSchema: z.ZodObject<{
15
16
  truncated_count: z.ZodNumber;
16
17
  deferred_count: z.ZodNumber;
17
18
  reused_count: z.ZodNumber;
19
+ failed_count: z.ZodDefault<z.ZodNumber>;
18
20
  }, z.core.$strict>;
19
21
  export type EvidenceCompletenessSourceCount = z.infer<typeof EvidenceCompletenessSourceCountSchema>;
20
22
  export declare const EvidenceCompletenessTotalsSchema: z.ZodObject<{
@@ -24,6 +26,7 @@ export declare const EvidenceCompletenessTotalsSchema: z.ZodObject<{
24
26
  truncated_count: z.ZodNumber;
25
27
  deferred_count: z.ZodNumber;
26
28
  reused_count: z.ZodNumber;
29
+ failed_count: z.ZodDefault<z.ZodNumber>;
27
30
  }, z.core.$strict>;
28
31
  export type EvidenceCompletenessTotals = z.infer<typeof EvidenceCompletenessTotalsSchema>;
29
32
  export declare const EvidenceCompletenessCapSchema: z.ZodObject<{
@@ -40,6 +43,12 @@ export declare const EvidenceCompletenessSkipReasonSchema: z.ZodObject<{
40
43
  count: z.ZodNumber;
41
44
  }, z.core.$strict>;
42
45
  export type EvidenceCompletenessSkipReason = z.infer<typeof EvidenceCompletenessSkipReasonSchema>;
46
+ export declare const EvidenceCompletenessFailureReasonSchema: z.ZodObject<{
47
+ source: z.ZodString;
48
+ reason: z.ZodString;
49
+ count: z.ZodNumber;
50
+ }, z.core.$strict>;
51
+ export type EvidenceCompletenessFailureReason = z.infer<typeof EvidenceCompletenessFailureReasonSchema>;
43
52
  export declare const EvidenceCompletenessTruncationMarkerSchema: z.ZodObject<{
44
53
  source: z.ZodString;
45
54
  reason: z.ZodString;
@@ -57,6 +66,7 @@ export declare const EvidenceCompletenessPayloadSchema: z.ZodObject<{
57
66
  complete: "complete";
58
67
  partial: "partial";
59
68
  empty: "empty";
69
+ unavailable: "unavailable";
60
70
  }>;
61
71
  generated_at: z.ZodString;
62
72
  scan_window: z.ZodObject<{
@@ -72,6 +82,7 @@ export declare const EvidenceCompletenessPayloadSchema: z.ZodObject<{
72
82
  truncated_count: z.ZodNumber;
73
83
  deferred_count: z.ZodNumber;
74
84
  reused_count: z.ZodNumber;
85
+ failed_count: z.ZodDefault<z.ZodNumber>;
75
86
  }, z.core.$strict>>>;
76
87
  totals: z.ZodObject<{
77
88
  scanned_count: z.ZodNumber;
@@ -80,6 +91,7 @@ export declare const EvidenceCompletenessPayloadSchema: z.ZodObject<{
80
91
  truncated_count: z.ZodNumber;
81
92
  deferred_count: z.ZodNumber;
82
93
  reused_count: z.ZodNumber;
94
+ failed_count: z.ZodDefault<z.ZodNumber>;
83
95
  }, z.core.$strict>;
84
96
  caps: z.ZodDefault<z.ZodArray<z.ZodObject<{
85
97
  source: z.ZodString;
@@ -93,6 +105,11 @@ export declare const EvidenceCompletenessPayloadSchema: z.ZodObject<{
93
105
  reason: z.ZodString;
94
106
  count: z.ZodNumber;
95
107
  }, z.core.$strict>>>;
108
+ failure_reasons: z.ZodDefault<z.ZodArray<z.ZodObject<{
109
+ source: z.ZodString;
110
+ reason: z.ZodString;
111
+ count: z.ZodNumber;
112
+ }, z.core.$strict>>>;
96
113
  truncation_markers: z.ZodDefault<z.ZodArray<z.ZodObject<{
97
114
  source: z.ZodString;
98
115
  reason: z.ZodString;
@@ -6,6 +6,7 @@ export const EvidenceCompletenessStatusSchema = z.enum([
6
6
  "partial",
7
7
  "empty",
8
8
  "failed",
9
+ "unavailable",
9
10
  "unknown",
10
11
  ]);
11
12
  export const EvidenceCompletenessSourceCountSchema = z
@@ -17,6 +18,7 @@ export const EvidenceCompletenessSourceCountSchema = z
17
18
  truncated_count: EvidenceCountSchema,
18
19
  deferred_count: EvidenceCountSchema,
19
20
  reused_count: EvidenceCountSchema,
21
+ failed_count: EvidenceCountSchema.default(0),
20
22
  })
21
23
  .strict();
22
24
  export const EvidenceCompletenessTotalsSchema = EvidenceCompletenessSourceCountSchema.omit({ source: true }).strict();
@@ -36,6 +38,7 @@ export const EvidenceCompletenessSkipReasonSchema = z
36
38
  count: EvidenceCountSchema,
37
39
  })
38
40
  .strict();
41
+ export const EvidenceCompletenessFailureReasonSchema = EvidenceCompletenessSkipReasonSchema;
39
42
  export const EvidenceCompletenessTruncationMarkerSchema = z
40
43
  .object({
41
44
  source: NonEmptyStringSchema,
@@ -62,9 +65,38 @@ export const EvidenceCompletenessPayloadSchema = z
62
65
  totals: EvidenceCompletenessTotalsSchema,
63
66
  caps: z.array(EvidenceCompletenessCapSchema).default([]),
64
67
  skip_reasons: z.array(EvidenceCompletenessSkipReasonSchema).default([]),
68
+ failure_reasons: z
69
+ .array(EvidenceCompletenessFailureReasonSchema)
70
+ .default([]),
65
71
  truncation_markers: z
66
72
  .array(EvidenceCompletenessTruncationMarkerSchema)
67
73
  .default([]),
68
74
  notes: z.array(NonEmptyStringSchema.max(160)).default([]),
69
75
  })
70
- .strict();
76
+ .strict()
77
+ .superRefine((payload, context) => {
78
+ const hasGap = payload.totals.skipped_count > 0 ||
79
+ payload.totals.truncated_count > 0 ||
80
+ payload.totals.deferred_count > 0 ||
81
+ payload.totals.failed_count > 0 ||
82
+ payload.caps.some((cap) => cap.applied) ||
83
+ payload.skip_reasons.length > 0 ||
84
+ payload.failure_reasons.length > 0 ||
85
+ payload.truncation_markers.length > 0;
86
+ if (payload.status === "complete" && hasGap) {
87
+ context.addIssue({
88
+ code: "custom",
89
+ message: "complete evidence completeness cannot include skips, caps, truncations, deferrals, or failures",
90
+ path: ["status"],
91
+ });
92
+ }
93
+ if (payload.status === "failed" &&
94
+ payload.totals.failed_count === 0 &&
95
+ payload.failure_reasons.length === 0) {
96
+ context.addIssue({
97
+ code: "custom",
98
+ message: "failed evidence completeness must include a failed count or failure reason",
99
+ path: ["failure_reasons"],
100
+ });
101
+ }
102
+ });
@@ -96,6 +96,7 @@ export declare const TelemetryIngestEventDtoSchema: z.ZodObject<{
96
96
  complete: "complete";
97
97
  partial: "partial";
98
98
  empty: "empty";
99
+ unavailable: "unavailable";
99
100
  }>;
100
101
  generated_at: z.ZodString;
101
102
  scan_window: z.ZodObject<{
@@ -111,6 +112,7 @@ export declare const TelemetryIngestEventDtoSchema: z.ZodObject<{
111
112
  truncated_count: z.ZodNumber;
112
113
  deferred_count: z.ZodNumber;
113
114
  reused_count: z.ZodNumber;
115
+ failed_count: z.ZodDefault<z.ZodNumber>;
114
116
  }, z.core.$strict>>>;
115
117
  totals: z.ZodObject<{
116
118
  scanned_count: z.ZodNumber;
@@ -119,6 +121,7 @@ export declare const TelemetryIngestEventDtoSchema: z.ZodObject<{
119
121
  truncated_count: z.ZodNumber;
120
122
  deferred_count: z.ZodNumber;
121
123
  reused_count: z.ZodNumber;
124
+ failed_count: z.ZodDefault<z.ZodNumber>;
122
125
  }, z.core.$strict>;
123
126
  caps: z.ZodDefault<z.ZodArray<z.ZodObject<{
124
127
  source: z.ZodString;
@@ -132,6 +135,11 @@ export declare const TelemetryIngestEventDtoSchema: z.ZodObject<{
132
135
  reason: z.ZodString;
133
136
  count: z.ZodNumber;
134
137
  }, z.core.$strict>>>;
138
+ failure_reasons: z.ZodDefault<z.ZodArray<z.ZodObject<{
139
+ source: z.ZodString;
140
+ reason: z.ZodString;
141
+ count: z.ZodNumber;
142
+ }, z.core.$strict>>>;
135
143
  truncation_markers: z.ZodDefault<z.ZodArray<z.ZodObject<{
136
144
  source: z.ZodString;
137
145
  reason: z.ZodString;
@@ -517,6 +525,7 @@ export declare const TelemetryIngestEnvelopeSchema: z.ZodObject<{
517
525
  complete: "complete";
518
526
  partial: "partial";
519
527
  empty: "empty";
528
+ unavailable: "unavailable";
520
529
  }>;
521
530
  generated_at: z.ZodString;
522
531
  scan_window: z.ZodObject<{
@@ -532,6 +541,7 @@ export declare const TelemetryIngestEnvelopeSchema: z.ZodObject<{
532
541
  truncated_count: z.ZodNumber;
533
542
  deferred_count: z.ZodNumber;
534
543
  reused_count: z.ZodNumber;
544
+ failed_count: z.ZodDefault<z.ZodNumber>;
535
545
  }, z.core.$strict>>>;
536
546
  totals: z.ZodObject<{
537
547
  scanned_count: z.ZodNumber;
@@ -540,6 +550,7 @@ export declare const TelemetryIngestEnvelopeSchema: z.ZodObject<{
540
550
  truncated_count: z.ZodNumber;
541
551
  deferred_count: z.ZodNumber;
542
552
  reused_count: z.ZodNumber;
553
+ failed_count: z.ZodDefault<z.ZodNumber>;
543
554
  }, z.core.$strict>;
544
555
  caps: z.ZodDefault<z.ZodArray<z.ZodObject<{
545
556
  source: z.ZodString;
@@ -553,6 +564,11 @@ export declare const TelemetryIngestEnvelopeSchema: z.ZodObject<{
553
564
  reason: z.ZodString;
554
565
  count: z.ZodNumber;
555
566
  }, z.core.$strict>>>;
567
+ failure_reasons: z.ZodDefault<z.ZodArray<z.ZodObject<{
568
+ source: z.ZodString;
569
+ reason: z.ZodString;
570
+ count: z.ZodNumber;
571
+ }, z.core.$strict>>>;
556
572
  truncation_markers: z.ZodDefault<z.ZodArray<z.ZodObject<{
557
573
  source: z.ZodString;
558
574
  reason: z.ZodString;
@@ -47,6 +47,34 @@ export const TelemetryIngestEventDtoSchema = z
47
47
  path: ["redaction", "privacy_classification"],
48
48
  });
49
49
  }
50
+ const summaryStatus = event.attributes["evidence_completeness_status"];
51
+ const summarySchemaVersion = event.attributes["evidence_completeness_schema_version"];
52
+ if (event.evidence_completeness) {
53
+ if (summaryStatus !== undefined &&
54
+ summaryStatus !== event.evidence_completeness.status) {
55
+ context.addIssue({
56
+ code: "custom",
57
+ message: "evidence completeness status attribute must match payload",
58
+ path: ["attributes", "evidence_completeness_status"],
59
+ });
60
+ }
61
+ if (summarySchemaVersion !== undefined &&
62
+ summarySchemaVersion !== event.evidence_completeness.schema_version) {
63
+ context.addIssue({
64
+ code: "custom",
65
+ message: "evidence completeness schema version attribute must match payload",
66
+ path: ["attributes", "evidence_completeness_schema_version"],
67
+ });
68
+ }
69
+ }
70
+ else if (typeof summaryStatus === "string" &&
71
+ summaryStatus !== "unknown") {
72
+ context.addIssue({
73
+ code: "custom",
74
+ message: "typed evidence completeness payload is required when status is known",
75
+ path: ["evidence_completeness"],
76
+ });
77
+ }
50
78
  });
51
79
  export const TelemetryIngestEnvelopeSchema = z
52
80
  .object({
@@ -29,6 +29,9 @@ export function isSecretLikePathSegment(value) {
29
29
  // this source file (the public-package pack scanner bans it as a content
30
30
  // pattern, just as the original guard did).
31
31
  const PRIVILEGED_SUPABASE_KEY_NAME = ["SUPABASE", "SERVICE", "ROLE", "KEY"].join("_");
32
+ const SUPABASE_SERVICE_ROLE_NAME = ["SUPABASE", "SERVICE", "ROLE"].join("_");
33
+ const OPENAI_KEY_NAME = ["OPENAI", "API", "KEY"].join("_");
34
+ const MEM0_KEY_NAME = ["MEM0", "API", "KEY"].join("_");
32
35
  /**
33
36
  * Credential names that are only a leak when assigned a value (D13). The value
34
37
  * shape mirrors the long-standing generic pattern: an assignment operator
@@ -39,6 +42,9 @@ const PRIVILEGED_SUPABASE_KEY_NAME = ["SUPABASE", "SERVICE", "ROLE", "KEY"].join
39
42
  const SECRET_NAME_WITH_VALUE_PATTERN = new RegExp(`\\b(?:${[
40
43
  "(?:NEXT_PUBLIC_)?SUPABASE_ANON_KEY",
41
44
  PRIVILEGED_SUPABASE_KEY_NAME,
45
+ SUPABASE_SERVICE_ROLE_NAME,
46
+ OPENAI_KEY_NAME,
47
+ MEM0_KEY_NAME,
42
48
  "SERVICE[_\\s-]?ROLE(?:[_\\s-]?KEY)?",
43
49
  "LANGFUSE_(?:PUBLIC|SECRET)_KEY",
44
50
  "api[_-]?key",
@@ -65,6 +71,7 @@ const SECRET_VALUE_PATTERNS = [
65
71
  /\bxox[baprs]-[A-Za-z0-9-]{16,}/,
66
72
  /\b(?:AKIA|ASIA)[A-Z0-9]{16}\b/,
67
73
  /\b(?:pk|sk)-lf-[A-Za-z0-9_-]{16,}\b/i,
74
+ /\bm0[-_][A-Za-z0-9_-]{16,}\b/i,
68
75
  ];
69
76
  const SECRET_LIKE_CONTENT_PATTERNS = [
70
77
  SECRET_NAME_WITH_VALUE_PATTERN,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bli-cockpit/telemetry-core",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",