@gravitee/gamma-lib-observability 3.3.0-beta.2 → 3.3.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.
Files changed (75) hide show
  1. package/INTEGRATION.md +0 -60
  2. package/README.md +0 -1
  3. package/USAGE_GUIDE.md +0 -41
  4. package/dist/{targets-source.js → dashboard-access-provider.js} +1 -28
  5. package/dist/dashboards/adapters/index.d.ts +1 -1
  6. package/dist/dashboards/adapters/index.d.ts.map +1 -1
  7. package/dist/dashboards/adapters/time-series-adapter.d.ts +30 -12
  8. package/dist/dashboards/adapters/time-series-adapter.d.ts.map +1 -1
  9. package/dist/dashboards/index.d.ts +2 -1
  10. package/dist/dashboards/index.d.ts.map +1 -1
  11. package/dist/dashboards/resolve-zoom-range.d.ts +31 -0
  12. package/dist/dashboards/resolve-zoom-range.d.ts.map +1 -0
  13. package/dist/filters/FilterAsyncValueField.d.ts +7 -1
  14. package/dist/filters/FilterAsyncValueField.d.ts.map +1 -1
  15. package/dist/filters/FilterValueField.d.ts.map +1 -1
  16. package/dist/filters/index.d.ts +1 -1
  17. package/dist/filters/index.d.ts.map +1 -1
  18. package/dist/filters/resolve-period.d.ts +6 -0
  19. package/dist/filters/resolve-period.d.ts.map +1 -1
  20. package/dist/hooks/query-keys.d.ts +0 -14
  21. package/dist/hooks/query-keys.d.ts.map +1 -1
  22. package/dist/index.d.ts +2 -4
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +2669 -4219
  25. package/dist/logs/detail/components/LogDetailContextChart.d.ts +8 -0
  26. package/dist/logs/detail/components/LogDetailContextChart.d.ts.map +1 -1
  27. package/dist/styles/observability.css +1 -1
  28. package/dist/testing/graphene-core-icons-mock.d.ts +0 -2
  29. package/dist/testing/graphene-core-icons-mock.d.ts.map +1 -1
  30. package/dist/testing/graphene-core-mock.d.ts +1 -15
  31. package/dist/testing/graphene-core-mock.d.ts.map +1 -1
  32. package/dist/testing/index.d.ts +0 -1
  33. package/dist/testing/index.d.ts.map +1 -1
  34. package/dist/testing.js +36 -365
  35. package/dist/types-entry.d.ts +0 -2
  36. package/dist/types-entry.d.ts.map +1 -1
  37. package/package.json +1 -1
  38. package/dist/targets/EvaluateNowButton.d.ts +0 -19
  39. package/dist/targets/EvaluateNowButton.d.ts.map +0 -1
  40. package/dist/targets/RuleTrend.d.ts +0 -19
  41. package/dist/targets/RuleTrend.d.ts.map +0 -1
  42. package/dist/targets/TargetCard.d.ts +0 -20
  43. package/dist/targets/TargetCard.d.ts.map +0 -1
  44. package/dist/targets/TargetForm.d.ts +0 -19
  45. package/dist/targets/TargetForm.d.ts.map +0 -1
  46. package/dist/targets/TargetHeatmap.d.ts +0 -25
  47. package/dist/targets/TargetHeatmap.d.ts.map +0 -1
  48. package/dist/targets/TargetStatusBadge.d.ts +0 -18
  49. package/dist/targets/TargetStatusBadge.d.ts.map +0 -1
  50. package/dist/targets/TargetsPanel.d.ts +0 -15
  51. package/dist/targets/TargetsPanel.d.ts.map +0 -1
  52. package/dist/targets/api-type-names.d.ts +0 -5
  53. package/dist/targets/api-type-names.d.ts.map +0 -1
  54. package/dist/targets/evaluation-summary.d.ts +0 -34
  55. package/dist/targets/evaluation-summary.d.ts.map +0 -1
  56. package/dist/targets/format.d.ts +0 -26
  57. package/dist/targets/format.d.ts.map +0 -1
  58. package/dist/targets/history-range.d.ts +0 -44
  59. package/dist/targets/history-range.d.ts.map +0 -1
  60. package/dist/targets/http-targets-source.d.ts +0 -10
  61. package/dist/targets/http-targets-source.d.ts.map +0 -1
  62. package/dist/targets/index.d.ts +0 -15
  63. package/dist/targets/index.d.ts.map +0 -1
  64. package/dist/targets/rule-filters.d.ts +0 -7
  65. package/dist/targets/rule-filters.d.ts.map +0 -1
  66. package/dist/targets/targets-provider.d.ts +0 -27
  67. package/dist/targets/targets-provider.d.ts.map +0 -1
  68. package/dist/targets/targets-source.d.ts +0 -51
  69. package/dist/targets/targets-source.d.ts.map +0 -1
  70. package/dist/targets/testing/in-memory-targets-source.d.ts +0 -41
  71. package/dist/targets/testing/in-memory-targets-source.d.ts.map +0 -1
  72. package/dist/targets/types.d.ts +0 -130
  73. package/dist/targets/types.d.ts.map +0 -1
  74. package/dist/targets/use-targets.d.ts +0 -44
  75. package/dist/targets/use-targets.d.ts.map +0 -1
@@ -1,19 +0,0 @@
1
- import { PerformanceTarget, TargetDefinition, TargetMetricSpec, TargetsSubjectProps } from './types';
2
- export interface TargetFormProps {
3
- readonly open: boolean;
4
- readonly onOpenChange: (open: boolean) => void;
5
- readonly subject: TargetsSubjectProps;
6
- readonly metrics: readonly TargetMetricSpec[];
7
- /** The target being edited; absent to define a new one. */
8
- readonly target?: PerformanceTarget;
9
- /** Rejects with the server's refusal; a `ruleIndex` on it lands on that rule. */
10
- readonly onSubmit: (definition: TargetDefinition) => Promise<unknown>;
11
- }
12
- /**
13
- * "Define targets": the rules, then the window, with the interval and the
14
- * minimum sample size behind an advanced toggle. Every choice comes from the
15
- * analytics definition of the subject's types, so nothing here can be
16
- * declared that the server would refuse for vocabulary.
17
- */
18
- export declare function TargetForm({ open, onOpenChange, subject, metrics, target, onSubmit }: TargetFormProps): import("react/jsx-runtime").JSX.Element;
19
- //# sourceMappingURL=TargetForm.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TargetForm.d.ts","sourceRoot":"","sources":["../../src/targets/TargetForm.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAGhB,gBAAgB,EAIhB,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAqDjB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IACpC,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACvE;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,eAAe,2CAerG"}
@@ -1,25 +0,0 @@
1
- import { TimeAxis } from './history-range';
2
- import { PerformanceTarget, TargetEvaluation, TargetMetricSpec } from './types';
3
- export interface TargetHeatmapProps {
4
- readonly target: PerformanceTarget;
5
- /** Most recent first, as the API serves them; placed on the axis by their timestamp. */
6
- readonly evaluations: readonly TargetEvaluation[];
7
- readonly metrics: readonly TargetMetricSpec[];
8
- /**
9
- * The time the strip spans, one slot per interval. Without it the strip runs from the oldest evaluation to the
10
- * newest, at the target's interval.
11
- */
12
- readonly axis?: TimeAxis;
13
- readonly className?: string;
14
- }
15
- /**
16
- * The history as one status timeline per rule on a time axis: each evaluation
17
- * sits in the window its timestamp falls in, runs of equal verdicts are drawn
18
- * as flat blocks, and a window nothing was recorded in stays blank, so a quiet
19
- * hour under back-off looks like a quiet hour. Reads left to right, oldest
20
- * first. A cursor follows the pointer, or the arrow keys, one window at a
21
- * time, however thin a window is at the widest range; the card names the
22
- * window and the run it belongs to.
23
- */
24
- export declare function TargetHeatmap({ target, evaluations, metrics, axis, className }: TargetHeatmapProps): import("react/jsx-runtime").JSX.Element | null;
25
- //# sourceMappingURL=TargetHeatmap.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TargetHeatmap.d.ts","sourceRoot":"","sources":["../../src/targets/TargetHeatmap.tsx"],"names":[],"mappings":"AAaA,OAAO,EAA0B,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAEhB,gBAAgB,EAGjB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,wFAAwF;IACxF,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AA0HD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,kBAAkB,kDA+ClG"}
@@ -1,18 +0,0 @@
1
- import { TargetEvaluation, TargetEvaluationStatus } from './types';
2
- type BadgeVariant = 'success' | 'destructive' | 'secondary';
3
- export declare function statusBadgeVariant(status: TargetEvaluationStatus): BadgeVariant;
4
- export interface TargetStatusBadgeProps {
5
- /**
6
- * The reference's latest evaluation from the batch endpoint: `null` when it
7
- * has no target or no evaluation yet, `undefined` while the batch loads.
8
- */
9
- readonly evaluation: TargetEvaluation | null | undefined;
10
- readonly className?: string;
11
- }
12
- /**
13
- * The one-word answer for a list row. Fed by `useLatestTargetEvaluations`
14
- * over the whole list, so a table of a hundred rows costs one request.
15
- */
16
- export declare function TargetStatusBadge({ evaluation, className }: TargetStatusBadgeProps): import("react/jsx-runtime").JSX.Element;
17
- export {};
18
- //# sourceMappingURL=TargetStatusBadge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TargetStatusBadge.d.ts","sourceRoot":"","sources":["../../src/targets/TargetStatusBadge.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAExE,KAAK,YAAY,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;AAQ5D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,GAAG,YAAY,CAE/E;AAED,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CA6BlF"}
@@ -1,15 +0,0 @@
1
- import { TargetsSubjectProps } from './types';
2
- export interface TargetsPanelProps extends TargetsSubjectProps {
3
- /** Hides every write: define, edit, delete, evaluate now. Reads need no flag. */
4
- readonly readOnly?: boolean;
5
- readonly className?: string;
6
- }
7
- /**
8
- * The "Targets" tab of any subject: the targets declared under `reference`,
9
- * their latest verdicts, and the form to declare more. Knows nothing about
10
- * APIs versus agents beyond the three subject props; mount it under a
11
- * `TargetsProvider`. Waits while the provider's base URL is still being
12
- * resolved, as it is on a hard refresh, rather than asking the host to.
13
- */
14
- export declare function TargetsPanel(props: TargetsPanelProps): import("react/jsx-runtime").JSX.Element;
15
- //# sourceMappingURL=TargetsPanel.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TargetsPanel.d.ts","sourceRoot":"","sources":["../../src/targets/TargetsPanel.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAGtE,MAAM,WAAW,iBAAkB,SAAQ,mBAAmB;IAC5D,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,2CAMpD"}
@@ -1,5 +0,0 @@
1
- export declare function analyticsApiName(apiType: string): string | undefined;
2
- /** The distinct definition names of a subject's types, in order; types the definition does not know are dropped. */
3
- export declare function analyticsApiNames(apiTypes: readonly string[]): string[];
4
- export declare function apiTypeLabel(apiType: string): string;
5
- //# sourceMappingURL=api-type-names.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-type-names.d.ts","sourceRoot":"","sources":["../../src/targets/api-type-names.ts"],"names":[],"mappings":"AA2BA,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEpE;AAED,oHAAoH;AACpH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAOvE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKpD"}
@@ -1,34 +0,0 @@
1
- import { TargetEvaluation, TargetRuleResult } from './types';
2
- export interface NotEvaluableContext {
3
- readonly minSampleSize: number;
4
- readonly coveredApiIds: readonly string[];
5
- }
6
- /**
7
- * Why a rule could not be evaluated, in words the owner can act on. The
8
- * server only says NOT_EVALUABLE; the three causes are told apart here, from
9
- * the most structural (nothing attributed) to the most transient (a quiet
10
- * window).
11
- */
12
- export declare function notEvaluableReason(rule: TargetRuleResult, context: NotEvaluableContext): string | undefined;
13
- export interface HistorySummary {
14
- /** How many evaluations were looked at. */
15
- readonly total: number;
16
- /** How many of them missed the target. */
17
- readonly missed: number;
18
- /** Length of the run of misses ending with the latest evaluation; 0 when the latest window was met. */
19
- readonly consecutiveMissed: number;
20
- /** `evaluatedAt` of the oldest evaluation of that run. */
21
- readonly missedSince: string | undefined;
22
- /** Length of the run of met windows ending with the latest evaluation; 0 when the latest window was not met. */
23
- readonly consecutiveMet: number;
24
- /** `evaluatedAt` of the oldest evaluation of that run. */
25
- readonly metSince: string | undefined;
26
- /**
27
- * Length of the run of not-evaluable windows ending with the latest evaluation. The scheduler backs an idle
28
- * target off from a few of these on, so a long run is why the latest evaluation is older than the interval.
29
- */
30
- readonly consecutiveNotEvaluable: number;
31
- }
32
- /** Reads a history page (most recent first) into the numbers the banner and the heatmap quote. */
33
- export declare function summarizeHistory(evaluations: readonly TargetEvaluation[]): HistorySummary;
34
- //# sourceMappingURL=evaluation-summary.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"evaluation-summary.d.ts","sourceRoot":"","sources":["../../src/targets/evaluation-summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAElE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,mBAAmB,GAAG,MAAM,GAAG,SAAS,CAQ3G;AAED,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,uGAAuG;IACvG,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,gHAAgH;IAChH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC;;;OAGG;IACH,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;CAC1C;AAgBD,kGAAkG;AAClG,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,GAAG,cAAc,CAYzF"}
@@ -1,26 +0,0 @@
1
- import { TargetDeviation, TargetEvaluationStatus, TargetOperator, TargetRule } from './types';
2
- /**
3
- * A value in the metric's declared unit, kept in that unit (milliseconds stay
4
- * milliseconds) so the number on the target equals the number on the
5
- * dashboard, which is what makes the evaluation trustworthy at a glance.
6
- */
7
- export declare function formatMetricValue(value: number, unit: string | undefined): string;
8
- export declare function operatorSymbol(operator: TargetOperator): string;
9
- export declare function measureLabel(measure: string): string;
10
- export interface RuleMetricInfo {
11
- readonly label?: string;
12
- readonly unit?: string;
13
- }
14
- /** `p95 Gateway response time`: what the rule measures, without the threshold. */
15
- export declare function describeRuleSubject(rule: Pick<TargetRule, 'metric' | 'measure'>, metric?: RuleMetricInfo): string;
16
- /** `≤ 2,000 ms`: the boundary the rule declares. */
17
- export declare function describeThreshold(rule: Pick<TargetRule, 'operator' | 'threshold'>, metric?: RuleMetricInfo): string;
18
- /** `p95 Gateway response time ≤ 2,000 ms`; the metric name stands in until the definition is loaded. */
19
- export declare function describeRule(rule: Pick<TargetRule, 'metric' | 'measure' | 'operator' | 'threshold'>, metric?: RuleMetricInfo): string;
20
- /** `+2,810 ms (+141%)`: how far the observed value sits from the threshold, in the unit and as a share of it. */
21
- export declare function formatDeviation(deviation: TargetDeviation, unit: string | undefined): string;
22
- export declare function formatClock(iso: string): string;
23
- export declare function formatDurationSeconds(seconds: number): string;
24
- export declare function statusLabel(status: TargetEvaluationStatus): string;
25
- export declare function formatTimeAgo(iso: string, now?: number): string;
26
- //# sourceMappingURL=format.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/targets/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAwBnG;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAajF;AAID,wBAAgB,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAE/D;AAYD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIpD;AAKD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,SAAS,CAAC,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,MAAM,CAGjH;AAED,oDAAoD;AACpD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,WAAW,CAAC,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,MAAM,CAEnH;AAED,wGAAwG;AACxG,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC,EACvE,MAAM,CAAC,EAAE,cAAc,GACtB,MAAM,CAER;AAED,iHAAiH;AACjH,wBAAgB,eAAe,CAAC,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAK5F;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAU7D;AAQD,wBAAgB,WAAW,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAElE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAM3E"}
@@ -1,44 +0,0 @@
1
- import { TargetEvaluation } from './types';
2
- /** How far back the result view looks; bounded by what the server keeps. */
3
- export type HistoryRange = '2h' | '6h' | '24h';
4
- export declare const HISTORY_RANGES: readonly {
5
- readonly value: HistoryRange;
6
- readonly label: string;
7
- readonly seconds: number;
8
- }[];
9
- /** The server keeps this many evaluations per target: 24 h at the default five-minute interval. */
10
- export declare const HISTORY_RETENTION = 288;
11
- /** How many windows a range spans at the target's interval: what the timeline draws, recorded or not. */
12
- export declare function spanWindows(range: HistoryRange, intervalSeconds: number): number;
13
- /** How many evaluations to fetch for a range: at most one per window, never more than the server keeps. */
14
- export declare function windowsFor(range: HistoryRange, intervalSeconds: number): number;
15
- /**
16
- * The time the history is drawn against: `slots` consecutive windows of the
17
- * target's interval ending at `to`. Evaluations are placed by their timestamp,
18
- * so a stretch the scheduler skipped stays empty instead of being squeezed
19
- * away, and a range means the time it names.
20
- */
21
- export interface TimeAxis {
22
- /** Epoch milliseconds of the first slot's start. */
23
- readonly from: number;
24
- /** Epoch milliseconds the last slot ends at. */
25
- readonly to: number;
26
- readonly intervalSeconds: number;
27
- readonly slots: number;
28
- }
29
- export declare function timeAxis(range: HistoryRange, intervalSeconds: number, now?: number): TimeAxis;
30
- /**
31
- * The slot an instant falls in, or `undefined` outside the axis. An instant up
32
- * to one interval past the end still lands in the last slot: the server's clock
33
- * may run slightly ahead of the browser's, and the newest evaluation must show.
34
- */
35
- export declare function slotOf(axis: TimeAxis, at: string): number | undefined;
36
- /** ISO timestamp of a slot's start. */
37
- export declare function slotStart(axis: TimeAxis, index: number): string;
38
- /**
39
- * One entry per slot, oldest first: the evaluation recorded in that window, or
40
- * `undefined` when none was. When two fall in one slot (an evaluate-now next to
41
- * the scheduled run) the latest wins. Evaluations outside the axis are dropped.
42
- */
43
- export declare function placeOnAxis(evaluations: readonly TargetEvaluation[], axis: TimeAxis): readonly (TargetEvaluation | undefined)[];
44
- //# sourceMappingURL=history-range.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"history-range.d.ts","sourceRoot":"","sources":["../../src/targets/history-range.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,4EAA4E;AAC5E,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;AAE/C,eAAO,MAAM,cAAc,EAAE,SAAS;IACpC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,EAIA,CAAC;AAEF,mGAAmG;AACnG,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,yGAAyG;AACzG,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAGhF;AAED,2GAA2G;AAC3G,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,QAAQ,CAIzG;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMrE;AAED,uCAAuC;AACvC,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,WAAW,EAAE,SAAS,gBAAgB,EAAE,EACxC,IAAI,EAAE,QAAQ,GACb,SAAS,CAAC,gBAAgB,GAAG,SAAS,CAAC,EAAE,CAS3C"}
@@ -1,10 +0,0 @@
1
- import { HttpOptions } from '../providers/http-provider';
2
- import { TargetsSource } from './targets-source';
3
- /**
4
- * {@link TargetsSource} backed by the Management API v2 under `baseUrl`,
5
- * which is the environment root the other HTTP sources of this library use
6
- * (`/management/v2/environments/{envId}`): targets and the analytics
7
- * definition are both children of it.
8
- */
9
- export declare function createHttpTargetsSource(baseUrl: string, options?: HttpOptions): TargetsSource;
10
- //# sourceMappingURL=http-targets-source.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http-targets-source.d.ts","sourceRoot":"","sources":["../../src/targets/http-targets-source.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAoE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA2BxH;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,aAAa,CAsH7F"}
@@ -1,15 +0,0 @@
1
- export { TargetsPanel, type TargetsPanelProps } from './TargetsPanel';
2
- export { TargetStatusBadge, statusBadgeVariant, type TargetStatusBadgeProps } from './TargetStatusBadge';
3
- export { TargetHeatmap, type TargetHeatmapProps } from './TargetHeatmap';
4
- export { RuleTrend, type RuleTrendProps } from './RuleTrend';
5
- export { HISTORY_RANGES, HISTORY_RETENTION, placeOnAxis, slotOf, slotStart, spanWindows, timeAxis, windowsFor, type HistoryRange, type TimeAxis, } from './history-range';
6
- export { TargetsProvider, useOptionalTargetsSource, useTargetsSource, type TargetsProviderProps, } from './targets-provider';
7
- export { createHttpTargetsSource } from './http-targets-source';
8
- export { TargetRateLimitedError, TargetsApiError, isTargetRateLimited, targetErrorRuleIndex, type TargetHistoryQuery, type TargetsSource, } from './targets-source';
9
- export { HISTORY_WINDOWS, TARGETS_REFRESH_INTERVAL_MS, useLatestTargetEvaluations, useTargetFilterSpecs, useTargetHistory, useTargetMetricCatalog, useTargetMutations, useTargetsByReference, type TargetMetricCatalog, } from './use-targets';
10
- export { analyticsApiName, analyticsApiNames, apiTypeLabel } from './api-type-names';
11
- export { notEvaluableReason, summarizeHistory, type HistorySummary, type NotEvaluableContext, } from './evaluation-summary';
12
- export { describeRule, describeRuleSubject, describeThreshold, formatDeviation, formatDurationSeconds, formatMetricValue, formatTimeAgo, measureLabel, operatorSymbol, statusLabel, type RuleMetricInfo, } from './format';
13
- export { offeredFilterNames, offeredFilterOperators, TARGET_FILTER_OPERATORS } from './rule-filters';
14
- export type { LatestTargetEvaluations, PerformanceTarget, TargetDefinition, TargetDeviation, TargetEvaluation, TargetEvaluationPage, TargetEvaluationStatus, TargetFilterOperator, TargetFilterSpec, TargetFilterSpecType, TargetMetricSpec, TargetOperator, TargetRule, TargetRuleFilter, TargetRuleResult, TargetsSubjectProps, TargetSubject, } from './types';
15
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/targets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACzG,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,MAAM,EACN,SAAS,EACT,WAAW,EACX,QAAQ,EACR,UAAU,EACV,KAAK,YAAY,EACjB,KAAK,QAAQ,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,gBAAgB,EAChB,KAAK,oBAAoB,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,KAAK,aAAa,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,eAAe,EACf,2BAA2B,EAC3B,0BAA0B,EAC1B,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,cAAc,EACd,WAAW,EACX,KAAK,cAAc,GACpB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACrG,YAAY,EACV,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,GACd,MAAM,SAAS,CAAC"}
@@ -1,7 +0,0 @@
1
- import { TargetFilterOperator, TargetFilterSpec, TargetMetricSpec } from './types';
2
- export declare function offeredFilterNames(metric: TargetMetricSpec): string[];
3
- /** `PerformanceTargetFilterOperator` on the wire; the definition may advertise more (NEQ, ...) for the explorer. */
4
- export declare const TARGET_FILTER_OPERATORS: readonly TargetFilterOperator[];
5
- export declare function offeredFilterOperators(spec: TargetFilterSpec | undefined): TargetFilterOperator[];
6
- export declare function filterOperatorLabel(operator: TargetFilterOperator): string;
7
- //# sourceMappingURL=rule-filters.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rule-filters.d.ts","sourceRoot":"","sources":["../../src/targets/rule-filters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAiCxF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAErE;AAED,oHAAoH;AACpH,eAAO,MAAM,uBAAuB,EAAE,SAAS,oBAAoB,EAA2C,CAAC;AAE/G,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,GAAG,oBAAoB,EAAE,CAMjG;AAUD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,CAE1E"}
@@ -1,27 +0,0 @@
1
- import { ReactNode } from 'react';
2
- import { HttpOptions } from '../providers/http-provider';
3
- import { TargetsSource } from './targets-source';
4
- export interface TargetsProviderProps {
5
- /**
6
- * Environment root of the Management API v2 (`{managementBaseURL}/v2/environments/{envId}`),
7
- * where the targets and the analytics definition live. Not the Gamma-scoped
8
- * URL `observability.Routes` takes. `undefined` while the host is still
9
- * resolving it: the badges then wait, and the panel must not be mounted yet.
10
- */
11
- readonly baseUrl?: string;
12
- /** Transport options; falls back to the nearest `HttpProvider`, then to bare `fetch`. */
13
- readonly http?: HttpOptions;
14
- /** A ready-made source, for tests and stories. Wins over `baseUrl`. */
15
- readonly source?: TargetsSource;
16
- readonly children: ReactNode;
17
- }
18
- /**
19
- * Hands the targets components their data source. Hosts give it the
20
- * environment `baseUrl` (and `http` unless an `HttpProvider` is already
21
- * above); tests hand it a source.
22
- */
23
- export declare function TargetsProvider({ baseUrl, http, source, children }: TargetsProviderProps): import("react/jsx-runtime").JSX.Element;
24
- /** The source when one is ready; `undefined` outside a provider or while its `baseUrl` is unresolved. */
25
- export declare function useOptionalTargetsSource(): TargetsSource | undefined;
26
- export declare function useTargetsSource(): TargetsSource;
27
- //# sourceMappingURL=targets-provider.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"targets-provider.d.ts","sourceRoot":"","sources":["../../src/targets/targets-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3E,OAAO,EAAwC,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEpG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAItD,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,yFAAyF;IACzF,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CAUxF;AAED,yGAAyG;AACzG,wBAAgB,wBAAwB,IAAI,aAAa,GAAG,SAAS,CAEpE;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAMhD"}
@@ -1,51 +0,0 @@
1
- import { LatestTargetEvaluations, PerformanceTarget, TargetDefinition, TargetEvaluation, TargetEvaluationPage, TargetFilterSpec, TargetMetricSpec } from './types';
2
- export interface TargetHistoryQuery {
3
- /** 1-based page number. */
4
- readonly page: number;
5
- readonly perPage: number;
6
- }
7
- /**
8
- * Port onto the performance targets and the analytics definition they are
9
- * validated against. `createHttpTargetsSource` is the production adapter;
10
- * tests and stories supply an in-memory one.
11
- */
12
- export interface TargetsSource {
13
- listByReference(reference: string, signal?: AbortSignal): Promise<PerformanceTarget[]>;
14
- create(definition: TargetDefinition, signal?: AbortSignal): Promise<PerformanceTarget>;
15
- update(targetId: string, definition: TargetDefinition, signal?: AbortSignal): Promise<PerformanceTarget>;
16
- remove(targetId: string, signal?: AbortSignal): Promise<void>;
17
- /** Runs the evaluation now and stores it. Rejects with {@link TargetRateLimitedError} on a 429. */
18
- evaluateNow(targetId: string, signal?: AbortSignal): Promise<TargetEvaluation>;
19
- /** The evaluation history of a target, most recent first. */
20
- fetchHistory(targetId: string, query: TargetHistoryQuery, signal?: AbortSignal): Promise<TargetEvaluationPage>;
21
- /** One batch call for every reference of a list; never one request per row. */
22
- fetchLatestByReferences(references: readonly string[], signal?: AbortSignal): Promise<LatestTargetEvaluations>;
23
- /** The metrics the analytics definition offers for one API type name (`HTTP_PROXY`, `LLM`, `MCP`, ...). */
24
- fetchMetricSpecs(apiName: string, signal?: AbortSignal): Promise<TargetMetricSpec[]>;
25
- /** The filters the analytics definition offers for one metric. */
26
- fetchFilterSpecs(metricName: string, signal?: AbortSignal): Promise<TargetFilterSpec[]>;
27
- }
28
- /**
29
- * A refused or failed call to the targets API. The status is what callers
30
- * branch on, for the reason `dashboard-errors.ts` gives: a published library
31
- * can end up twice on disk, and `instanceof` then fails on an error that is
32
- * structurally this one.
33
- */
34
- export declare class TargetsApiError extends Error {
35
- readonly status: number;
36
- /** Set on a 400 that names the rule at fault (`parameters.ruleIndex`). */
37
- readonly ruleIndex?: number;
38
- constructor(status: number, message: string, ruleIndex?: number);
39
- }
40
- /** The target was evaluated too recently; `retryAfterSeconds` comes from the `Retry-After` header. */
41
- export declare class TargetRateLimitedError extends TargetsApiError {
42
- readonly retryAfterSeconds: number;
43
- constructor(message: string, retryAfterSeconds: number);
44
- }
45
- /** Whether a failure is the evaluate-now rate limit; reads the status, not the class. */
46
- export declare function isTargetRateLimited(error: unknown): error is {
47
- retryAfterSeconds: number;
48
- };
49
- /** The rule a 400 blamed, or `undefined` when the failure was not about one rule. */
50
- export declare function targetErrorRuleIndex(error: unknown): number | undefined;
51
- //# sourceMappingURL=targets-source.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"targets-source.d.ts","sourceRoot":"","sources":["../../src/targets/targets-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,kBAAkB;IACjC,2BAA2B;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACvF,MAAM,CAAC,UAAU,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACvF,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACzG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,mGAAmG;IACnG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/E,6DAA6D;IAC7D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC/G,+EAA+E;IAC/E,uBAAuB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC/G,2GAA2G;IAC3G,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACrF,kEAAkE;IAClE,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;CACzF;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;gBAEhB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CAMhE;AAED,sGAAsG;AACtG,qBAAa,sBAAuB,SAAQ,eAAe;IACzD,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;gBAEvB,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM;CAKvD;AAQD,yFAAyF;AACzF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI;IAAE,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAE1F;AAED,qFAAqF;AACrF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIvE"}
@@ -1,41 +0,0 @@
1
- import { TargetsSource } from '../targets-source';
2
- import { PerformanceTarget, TargetEvaluation, TargetMetricSpec } from '../types';
3
- /**
4
- * A cut of the analytics definition, by API name, large enough for the
5
- * picker to show every behaviour it has: shared HTTP metrics, an LLM-only
6
- * metric, and protocol filters on MCP and LLM.
7
- */
8
- export declare const SAMPLE_METRIC_SPECS: Readonly<Record<string, readonly TargetMetricSpec[]>>;
9
- export interface InMemoryTargetsSourceOptions {
10
- readonly targets?: readonly PerformanceTarget[];
11
- /** Evaluations per target id, most recent first. */
12
- readonly evaluations?: Readonly<Record<string, readonly TargetEvaluation[]>>;
13
- readonly metricSpecs?: Readonly<Record<string, readonly TargetMetricSpec[]>>;
14
- /** Produces the evaluation "evaluate now" stores; defaults to a quiet window (NOT_EVALUABLE, no traffic). */
15
- readonly evaluate?: (target: PerformanceTarget, now: Date) => TargetEvaluation;
16
- /** Seconds a second "evaluate now" is refused for, as the server does; 0 disables the limit. */
17
- readonly rateLimitSeconds?: number;
18
- /** Start refused for this many seconds, for the rate-limited story. */
19
- readonly rateLimitedForSeconds?: number;
20
- /** Every call takes this long, so stories can show the loading states. */
21
- readonly latencyMs?: number;
22
- /** Every call fails with this error. */
23
- readonly failure?: Error;
24
- readonly now?: () => Date;
25
- }
26
- export interface InMemoryTargetsSource extends TargetsSource {
27
- /** Current stored targets, for assertions. */
28
- readonly targets: () => PerformanceTarget[];
29
- /** Stored evaluations of a target, most recent first. */
30
- readonly evaluationsOf: (targetId: string) => TargetEvaluation[];
31
- }
32
- /** A quiet window: every rule NOT_EVALUABLE for lack of traffic. */
33
- export declare function quietEvaluation(target: PerformanceTarget, now: Date): TargetEvaluation;
34
- /**
35
- * {@link TargetsSource} over plain arrays: the seam tests and stories drive
36
- * the components through, with the server's two refusals (400 on an unknown
37
- * metric, 429 inside the rate limit) reproduced so the screens that handle
38
- * them can be shown.
39
- */
40
- export declare function createInMemoryTargetsSource(options?: InMemoryTargetsSourceOptions): InMemoryTargetsSource;
41
- //# sourceMappingURL=in-memory-targets-source.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"in-memory-targets-source.d.ts","sourceRoot":"","sources":["../../../src/targets/testing/in-memory-targets-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2C,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,KAAK,EAEV,iBAAiB,EAEjB,gBAAgB,EAEhB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AAiDlB;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAC,CAqCrF,CAAC;AAmDF,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAChD,oDAAoD;IACpD,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAC,CAAC,CAAC;IAC7E,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAC,CAAC,CAAC;IAC7E,6GAA6G;IAC7G,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,IAAI,KAAK,gBAAgB,CAAC;IAC/E,gGAAgG;IAChG,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,uEAAuE;IACvE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,wCAAwC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,iBAAiB,EAAE,CAAC;IAC5C,yDAAyD;IACzD,QAAQ,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,gBAAgB,EAAE,CAAC;CAClE;AAQD,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,IAAI,GAAG,gBAAgB,CAoBtF;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,4BAAiC,GAAG,qBAAqB,CAmH7G"}
@@ -1,130 +0,0 @@
1
- /**
2
- * Wire vocabulary of the Management API v2 performance targets
3
- * (`/environments/{envId}/performance-targets`). Field names follow the
4
- * OpenAPI schemas one to one so a payload can be posted back unchanged.
5
- */
6
- /** PASS when the rule holds, BREACH when it does not, NOT_EVALUABLE when the window held too few samples. */
7
- export type TargetEvaluationStatus = 'PASS' | 'BREACH' | 'NOT_EVALUABLE';
8
- /** How the observed value is compared to the threshold; the rule passes when the comparison holds. */
9
- export type TargetOperator = 'LT' | 'LTE' | 'GT' | 'GTE';
10
- /** Operator of a rule filter, from the analytics engine filter vocabulary. */
11
- export type TargetFilterOperator = 'EQ' | 'IN' | 'LTE' | 'GTE' | 'CONTAINS';
12
- export interface TargetRuleFilter {
13
- /** A filter name of the analytics definition, e.g. `MCP_PROXY_TOOL`. */
14
- readonly name: string;
15
- readonly operator: TargetFilterOperator;
16
- /** A string, a number or an array of strings depending on the operator. */
17
- readonly value: string | number | readonly string[];
18
- }
19
- export interface TargetRule {
20
- /** A metric name of the analytics definition, e.g. `HTTP_GATEWAY_RESPONSE_TIME`. */
21
- readonly metric: string;
22
- /** A measure of that metric, e.g. `P95`. */
23
- readonly measure: string;
24
- readonly operator: TargetOperator;
25
- /** The boundary of acceptable behaviour, in the metric's unit. */
26
- readonly threshold: number;
27
- /** Restricts the rule to the subject ids of these API types; empty or absent means the whole subject. */
28
- readonly apiTypes?: readonly string[];
29
- readonly filters?: readonly TargetRuleFilter[];
30
- }
31
- export interface TargetSubject {
32
- /** The API ids whose gateway telemetry is evaluated. */
33
- readonly apiIds: readonly string[];
34
- /** An opaque lookup key chosen by the caller (an API id, an agent catalog id). */
35
- readonly reference: string;
36
- }
37
- /** What is posted to create or replace a target. */
38
- export interface TargetDefinition {
39
- readonly subject: TargetSubject;
40
- /** The rolling window evaluated, in seconds. Must be at least the interval. */
41
- readonly windowSeconds: number;
42
- /** How often the target is evaluated, in seconds. */
43
- readonly intervalSeconds: number;
44
- /** Below this many samples in the window a rule is NOT_EVALUABLE rather than PASS. */
45
- readonly minSampleSize: number;
46
- readonly rules: readonly TargetRule[];
47
- }
48
- export interface PerformanceTarget extends TargetDefinition {
49
- readonly id: string;
50
- readonly createdAt?: string;
51
- readonly updatedAt?: string;
52
- }
53
- export interface TargetDeviation {
54
- /** Observed minus threshold, in the metric's unit. */
55
- readonly absolute: number;
56
- /** Absolute deviation relative to the threshold. */
57
- readonly ratio: number;
58
- }
59
- export interface TargetRuleResult {
60
- readonly metric: string;
61
- readonly measure: string;
62
- readonly operator: TargetOperator;
63
- readonly threshold: number;
64
- /** The measured value; absent when the rule is NOT_EVALUABLE. */
65
- readonly observed?: number;
66
- readonly deviation?: TargetDeviation;
67
- /** How many samples the window held for this rule. */
68
- readonly sampleCount?: number;
69
- readonly status: TargetEvaluationStatus;
70
- }
71
- export interface TargetEvaluation {
72
- readonly id: string;
73
- readonly targetId: string;
74
- /** The subject reference of the target at evaluation time. */
75
- readonly reference: string;
76
- /** The worst status of the rules. */
77
- readonly status: TargetEvaluationStatus;
78
- readonly rules: readonly TargetRuleResult[];
79
- readonly windowFrom: string;
80
- readonly windowTo: string;
81
- /** The API ids the evaluation actually covered, so a lagging subject is visible. */
82
- readonly coveredApiIds: readonly string[];
83
- readonly evaluatedAt: string;
84
- }
85
- export interface TargetEvaluationPage {
86
- readonly data: readonly TargetEvaluation[];
87
- readonly totalCount: number;
88
- }
89
- /** The latest evaluation per requested reference; `null` when the reference has no target or no evaluation yet. */
90
- export type LatestTargetEvaluations = Readonly<Record<string, TargetEvaluation | null>>;
91
- /** One metric of the analytics definition, as served for one API type. */
92
- export interface TargetMetricSpec {
93
- readonly name: string;
94
- readonly label: string;
95
- readonly apis: readonly string[];
96
- readonly unit?: string;
97
- readonly measures: readonly string[];
98
- readonly facets: readonly string[];
99
- readonly filters: readonly string[];
100
- }
101
- export type TargetFilterSpecType = 'KEYWORD' | 'STRING' | 'NUMBER' | 'ENUM';
102
- /** One filter of the analytics definition, as served for one metric. */
103
- export interface TargetFilterSpec {
104
- readonly name: string;
105
- readonly label: string;
106
- readonly type: TargetFilterSpecType;
107
- readonly operators: readonly string[];
108
- readonly enumValues?: readonly (string | {
109
- readonly value: string;
110
- readonly label: string;
111
- })[];
112
- readonly range?: {
113
- readonly min: number;
114
- readonly max: number;
115
- };
116
- readonly apiTypes?: readonly string[];
117
- }
118
- /**
119
- * Everything the panel knows about what it is looking at. The host supplies
120
- * it; the panel never learns whether the subject is an API or an agent.
121
- */
122
- export interface TargetsSubjectProps {
123
- /** The lookup key the host will use to find these targets again. */
124
- readonly reference: string;
125
- /** The API ids whose telemetry is evaluated; may be empty while a host has not attributed any yet. */
126
- readonly apiIds: readonly string[];
127
- /** The `ApiType` values of those APIs (`PROXY`, `LLM_PROXY`, `MCP_PROXY`, `A2A_PROXY`, ...). */
128
- readonly apiTypes: readonly string[];
129
- }
130
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/targets/types.ts"],"names":[],"mappings":"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"}
@@ -1,44 +0,0 @@
1
- import { UseQueryResult } from '@tanstack/react-query';
2
- import { TargetDefinition, TargetMetricSpec } from './types';
3
- /** How many windows the result view looks back on: 24 five-minute windows are two hours. */
4
- export declare const HISTORY_WINDOWS = 24;
5
- /** The scheduler ticks every minute; polling faster cannot show anything new. */
6
- export declare const TARGETS_REFRESH_INTERVAL_MS = 60000;
7
- export declare function useTargetsByReference(reference: string): UseQueryResult<NoInfer<import('./types').PerformanceTarget[]>, Error>;
8
- export declare function useTargetHistory(targetId: string, perPage?: number): UseQueryResult<NoInfer<import('./types').TargetEvaluationPage>, Error>;
9
- /**
10
- * The latest evaluation of every reference of a list, for its badges: one
11
- * request per 500 references, never one per row. Stays pending while the
12
- * provider has no source yet (a host still resolving its base URL), so a list
13
- * can render before the badges can be answered.
14
- */
15
- export declare function useLatestTargetEvaluations(references: readonly string[]): UseQueryResult<NoInfer<Readonly<Record<string, import('./types').TargetEvaluation | null>>>, Error>;
16
- export interface TargetMetricCatalog {
17
- /** Every metric at least one type of the subject supports, once, sorted by label. */
18
- readonly metrics: readonly TargetMetricSpec[];
19
- readonly isLoading: boolean;
20
- readonly error: Error | null;
21
- }
22
- /**
23
- * The metrics a form may offer for a subject: the definition of each of its
24
- * API types, merged. A metric served for several types appears once, with
25
- * `apis` covering all of them, so a rule scoped to one type can be checked
26
- * against the same list.
27
- */
28
- export declare function useTargetMetricCatalog(apiTypes: readonly string[]): TargetMetricCatalog;
29
- export declare function useTargetFilterSpecs(metricName: string | undefined): UseQueryResult<NoInfer<import('./types').TargetFilterSpec[]>, Error>;
30
- /**
31
- * The writes on the targets of one reference. Each one refreshes what it
32
- * changed: the list for a create/update/delete, the history and the badges
33
- * for an evaluation.
34
- */
35
- export declare function useTargetMutations(reference: string): {
36
- create: import('@tanstack/react-query').UseMutationResult<import('./types').PerformanceTarget, Error, TargetDefinition, unknown>;
37
- update: import('@tanstack/react-query').UseMutationResult<import('./types').PerformanceTarget, Error, {
38
- targetId: string;
39
- definition: TargetDefinition;
40
- }, unknown>;
41
- remove: import('@tanstack/react-query').UseMutationResult<void, Error, string, unknown>;
42
- evaluateNow: import('@tanstack/react-query').UseMutationResult<import('./types').TargetEvaluation, Error, string, unknown>;
43
- };
44
- //# sourceMappingURL=use-targets.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-targets.d.ts","sourceRoot":"","sources":["../../src/targets/use-targets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqD,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM/G,OAAO,KAAK,EAA2B,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3F,4FAA4F;AAC5F,eAAO,MAAM,eAAe,KAAK,CAAC;AAQlC,iFAAiF;AACjF,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAElD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,yEAQtD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,MAAwB,0EAQnF;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,uGAkBvE;AAED,MAAM,WAAW,mBAAmB;IAClC,qFAAqF;IACrF,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,mBAAmB,CAWvF;AA8BD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,wEAQlE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM;;;kBAuBG,MAAM;oBAAc,gBAAgB;;;;EAgB1F"}