@spottoai/types-package 1.0.2-beta.427 → 1.0.2-beta.429

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 (110) hide show
  1. package/dist/azure/dataProtection.d.ts +40 -0
  2. package/dist/azure/dataProtection.d.ts.map +1 -1
  3. package/dist/azure/metrics.d.ts +2 -27
  4. package/dist/azure/metrics.d.ts.map +1 -1
  5. package/dist/azure/payloads.d.ts +7 -7
  6. package/dist/azure/payloads.d.ts.map +1 -1
  7. package/dist/azure/payloads.js +22 -23
  8. package/dist/azure/payloads.js.map +1 -1
  9. package/dist/azure/reportEvidence.d.ts +7 -5
  10. package/dist/azure/reportEvidence.d.ts.map +1 -1
  11. package/dist/azure/reportEvidence.js.map +1 -1
  12. package/dist/azure/reportEvidenceValidation.d.ts.map +1 -1
  13. package/dist/azure/reportEvidenceValidation.js +5 -1
  14. package/dist/azure/reportEvidenceValidation.js.map +1 -1
  15. package/dist/azure/reportEvidenceValidationHelpers.d.ts +3 -16
  16. package/dist/azure/reportEvidenceValidationHelpers.d.ts.map +1 -1
  17. package/dist/azure/reportEvidenceValidationHelpers.js +79 -95
  18. package/dist/azure/reportEvidenceValidationHelpers.js.map +1 -1
  19. package/dist/azure/resilienceFacts.d.ts +100 -0
  20. package/dist/azure/resilienceFacts.d.ts.map +1 -0
  21. package/dist/azure/resilienceFacts.js +20 -0
  22. package/dist/azure/resilienceFacts.js.map +1 -0
  23. package/dist/azure/resilienceFactsValidation.d.ts +4 -0
  24. package/dist/azure/resilienceFactsValidation.d.ts.map +1 -0
  25. package/dist/azure/resilienceFactsValidation.js +70 -0
  26. package/dist/azure/resilienceFactsValidation.js.map +1 -0
  27. package/dist/azure/views.d.ts +7 -0
  28. package/dist/azure/views.d.ts.map +1 -1
  29. package/dist/azure/views.js.map +1 -1
  30. package/dist/common/boundedRows.d.ts +7 -0
  31. package/dist/common/boundedRows.d.ts.map +1 -0
  32. package/dist/{scheduler/scheduler.js → common/boundedRows.js} +1 -1
  33. package/dist/common/boundedRows.js.map +1 -0
  34. package/dist/common/metricStats.d.ts +29 -0
  35. package/dist/common/metricStats.d.ts.map +1 -0
  36. package/dist/{scheduler/bastionSchedule.js → common/metricStats.js} +1 -1
  37. package/dist/common/metricStats.js.map +1 -0
  38. package/dist/common/utilizationStories.d.ts +516 -0
  39. package/dist/common/utilizationStories.d.ts.map +1 -0
  40. package/dist/common/utilizationStories.js +21 -0
  41. package/dist/common/utilizationStories.js.map +1 -0
  42. package/dist/common/utilizationStoriesValidation.d.ts +48 -0
  43. package/dist/common/utilizationStoriesValidation.d.ts.map +1 -0
  44. package/dist/common/utilizationStoriesValidation.js +552 -0
  45. package/dist/common/utilizationStoriesValidation.js.map +1 -0
  46. package/dist/common/validationHelpers.d.ts +18 -0
  47. package/dist/common/validationHelpers.d.ts.map +1 -0
  48. package/dist/common/validationHelpers.js +36 -0
  49. package/dist/common/validationHelpers.js.map +1 -0
  50. package/dist/esm/azure/payloads.js +19 -20
  51. package/dist/esm/azure/reportEvidenceValidation.js +5 -1
  52. package/dist/esm/azure/reportEvidenceValidationHelpers.js +2 -18
  53. package/dist/esm/azure/resilienceFacts.js +16 -0
  54. package/dist/esm/azure/resilienceFactsValidation.js +64 -0
  55. package/dist/esm/common/utilizationStories.js +17 -0
  56. package/dist/esm/common/utilizationStoriesValidation.js +514 -0
  57. package/dist/esm/common/validationHelpers.js +18 -0
  58. package/dist/esm/index.js +4 -3
  59. package/dist/esm/scheduler/index.js +2 -1
  60. package/dist/esm/scheduler/resourceStrategyCapabilityValidation.js +4 -20
  61. package/dist/esm/scheduler/resourceStrategyContracts.js +4 -2
  62. package/dist/esm/scheduler/resourceStrategyScheduleValidation.js +109 -4
  63. package/dist/esm/scheduler/schedulerContracts.js +1 -0
  64. package/dist/esm/scheduler/schedulerValidation.js +363 -0
  65. package/dist/index.d.ts +4 -3
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +4 -3
  68. package/dist/index.js.map +1 -1
  69. package/dist/scheduler/index.d.ts +2 -1
  70. package/dist/scheduler/index.d.ts.map +1 -1
  71. package/dist/scheduler/index.js +2 -1
  72. package/dist/scheduler/index.js.map +1 -1
  73. package/dist/scheduler/resourceStrategyCapabilityValidation.d.ts.map +1 -1
  74. package/dist/scheduler/resourceStrategyCapabilityValidation.js +4 -20
  75. package/dist/scheduler/resourceStrategyCapabilityValidation.js.map +1 -1
  76. package/dist/scheduler/resourceStrategyContracts.d.ts +26 -9
  77. package/dist/scheduler/resourceStrategyContracts.d.ts.map +1 -1
  78. package/dist/scheduler/resourceStrategyContracts.js +4 -2
  79. package/dist/scheduler/resourceStrategyContracts.js.map +1 -1
  80. package/dist/scheduler/resourceStrategyScheduleValidation.d.ts +3 -1
  81. package/dist/scheduler/resourceStrategyScheduleValidation.d.ts.map +1 -1
  82. package/dist/scheduler/resourceStrategyScheduleValidation.js +110 -4
  83. package/dist/scheduler/resourceStrategyScheduleValidation.js.map +1 -1
  84. package/dist/scheduler/schedulerContracts.d.ts +178 -0
  85. package/dist/scheduler/schedulerContracts.d.ts.map +1 -0
  86. package/dist/scheduler/schedulerContracts.js +3 -0
  87. package/dist/scheduler/schedulerContracts.js.map +1 -0
  88. package/dist/scheduler/schedulerValidation.d.ts +14 -0
  89. package/dist/scheduler/schedulerValidation.d.ts.map +1 -0
  90. package/dist/scheduler/schedulerValidation.js +378 -0
  91. package/dist/scheduler/schedulerValidation.js.map +1 -0
  92. package/package.json +5 -3
  93. package/dist/esm/scheduler/bastionScheduleProfile.js +0 -206
  94. package/dist/esm/scheduler/bastionScheduleValidation.js +0 -399
  95. package/dist/scheduler/bastionSchedule.d.ts +0 -113
  96. package/dist/scheduler/bastionSchedule.d.ts.map +0 -1
  97. package/dist/scheduler/bastionSchedule.js.map +0 -1
  98. package/dist/scheduler/bastionScheduleProfile.d.ts +0 -24
  99. package/dist/scheduler/bastionScheduleProfile.d.ts.map +0 -1
  100. package/dist/scheduler/bastionScheduleProfile.js +0 -210
  101. package/dist/scheduler/bastionScheduleProfile.js.map +0 -1
  102. package/dist/scheduler/bastionScheduleValidation.d.ts +0 -10
  103. package/dist/scheduler/bastionScheduleValidation.d.ts.map +0 -1
  104. package/dist/scheduler/bastionScheduleValidation.js +0 -410
  105. package/dist/scheduler/bastionScheduleValidation.js.map +0 -1
  106. package/dist/scheduler/scheduler.d.ts +0 -267
  107. package/dist/scheduler/scheduler.d.ts.map +0 -1
  108. package/dist/scheduler/scheduler.js.map +0 -1
  109. /package/dist/esm/{scheduler/bastionSchedule.js → common/boundedRows.js} +0 -0
  110. /package/dist/esm/{scheduler/scheduler.js → common/metricStats.js} +0 -0
@@ -0,0 +1,516 @@
1
+ /**
2
+ * Utilization stories: shared contracts for per-resource utilization profiles, the compact
3
+ * `utilizationSignal` carried on portal resource rows, the per-subscription story artifacts
4
+ * (`azure-portal/subscriptions/{id}/stories/{storyKey}.json`), the bounded story samples embedded
5
+ * in the subscription report evidence pack, and the cloud-engine config schemas that drive them.
6
+ *
7
+ * Provider-neutral (`provider` on every profile); depends only on other `common/` modules.
8
+ * Spec: `Specs/reporting/utilization-stories-types-package.md` (parent: core `specs/reporting/utilization-stories.md`).
9
+ *
10
+ * Producer: cloud-engine (`UtilizationProfileBuilder`, `StoryAccumulator`). Consumers: api (story routes), ui
11
+ * (story pages, report sections), report evidence pack (`reporting.stories`).
12
+ *
13
+ * All contracts are additive: consumers must tolerate unknown fields, and every optional field may be absent on
14
+ * artifacts produced by older engine versions.
15
+ */
16
+ import type { MetricStats } from './metricStats';
17
+ import type { ReportBoundedRows } from './boundedRows';
18
+ export type Provider = 'azure' | 'aws';
19
+ export type MetricRole = 'primary' | 'secondary' | 'context';
20
+ export type DimensionPolicy = 'average' | 'sum' | 'max' | 'split';
21
+ export type MetricVisual = 'sparkline' | 'trend' | 'capacity-bar' | 'mix-bar' | 'event-strip';
22
+ export type BilledOn = 'allocated' | 'used' | 'included';
23
+ /** One daily-bucketed metric series over the evidence window, ready for a sparkline or trend visual. */
24
+ export interface MetricSparkline {
25
+ /** Generic profile key: "cpu", "memory", "dtu", "ru", "capacity", "usedCapacity", "transactions", ... */
26
+ key: string;
27
+ /** Provider metric name behind the key. */
28
+ metricName: string;
29
+ role: MetricRole;
30
+ visual: MetricVisual;
31
+ unit: string;
32
+ /** Resolved at build time; null when no sensible axis maximum exists. */
33
+ axisMax: number | null;
34
+ axisMaxSource?: 'config' | 'capacity' | 'observed';
35
+ /** Capacity metrics only. */
36
+ billedOn?: BilledOn;
37
+ dimensions?: {
38
+ policy: DimensionPolicy;
39
+ name?: string;
40
+ value?: string;
41
+ seriesCount: number;
42
+ };
43
+ /** ISO date (UTC) of bucket 0. */
44
+ start: string;
45
+ bucket: 'P1D';
46
+ /** `windowDays` entries; null = no samples that day. */
47
+ avg: (number | null)[];
48
+ p95: (number | null)[];
49
+ max: (number | null)[];
50
+ stats: MetricStats;
51
+ sourcePoints: number;
52
+ }
53
+ export interface CapacityDescriptor {
54
+ sku: string | null;
55
+ tier: string | null;
56
+ units: number | null;
57
+ /** "vCPU" | "vCore" | "DTU" | "instances" | "RU/s" | "units" | "nodes" | ... */
58
+ unitName: string;
59
+ memoryGB?: number | null;
60
+ scaleMode: 'fixed' | 'autoscale' | 'serverless';
61
+ /** Display label, e.g. "4 vCPU · 32 GB RAM". */
62
+ label: string;
63
+ }
64
+ export type RunMode = 'stop-start' | 'auto-pause' | 'scale-to-zero' | 'always-on';
65
+ export type SizingVerdict = 'oversized' | 'undersized' | 'busy' | 'rebalance' | 'mostly-off' | 'idle' | 'no-telemetry' | 'fits' | 'unknown';
66
+ export type ScheduleFit = 'good' | 'fair' | 'low' | 'done' | 'insufficient-data' | 'not-applicable';
67
+ export type ScheduleAction = 'stop' | 'pause' | 'scale';
68
+ export type TelemetryStatus = 'collected' | 'partial' | 'no-series' | 'unavailable';
69
+ /**
70
+ * How the running/stopped signal was derived. `metric-presence` alone cannot distinguish a stopped resource from a
71
+ * collection gap, so it must be corroborated (see `RunningProfile.corroboration`) before it may drive a schedule fit
72
+ * or a `mostly-off` verdict.
73
+ */
74
+ export type RunningBasis = 'power-state' | 'billing-hours' | 'metric-presence';
75
+ export interface RunningProfile {
76
+ signalMetric: string;
77
+ basis: RunningBasis;
78
+ /**
79
+ * Independent sources (never the basis itself) whose daily running hours agree with `daily` within the engine's
80
+ * tolerance. Empty when none. Guard rule: `scheduleFit` in good|fair|low and `verdict` = mostly-off require
81
+ * `basis !== 'metric-presence'` or a corroboration entry other than `metric-presence`, plus
82
+ * `evidenceWindow.telemetry === 'collected'`; otherwise the engine emits `insufficient-data` / `unknown`.
83
+ */
84
+ corroboration: RunningBasis[];
85
+ /** Share of each day's expected samples that carried a value (or, for power-state/billing bases, the running share). */
86
+ daily: (number | null)[];
87
+ share: number | null;
88
+ weekly?: {
89
+ timezone: string;
90
+ /** 7 x 24 */
91
+ running: (number | null)[][];
92
+ /** 7 x 24, mean of the primary metric while running. */
93
+ usage: (number | null)[][];
94
+ businessHours: {
95
+ runningShare: number | null;
96
+ usageMean: number | null;
97
+ };
98
+ offHours: {
99
+ runningShare: number | null;
100
+ usageMean: number | null;
101
+ };
102
+ };
103
+ }
104
+ export interface CommitmentCoverage {
105
+ coveragePercent: number | null;
106
+ benefitTypes: ('reservation' | 'savings-plan')[];
107
+ benefitNames: string[];
108
+ coveredCost: number | null;
109
+ uncoveredCost: number | null;
110
+ windowStart: string;
111
+ windowEnd: string;
112
+ }
113
+ export interface EvidenceWindow {
114
+ windowStart: string;
115
+ windowEnd: string;
116
+ days: number;
117
+ sampleCount: number;
118
+ telemetry: TelemetryStatus;
119
+ confidence: 'high' | 'medium' | 'low';
120
+ }
121
+ export interface VerdictReason {
122
+ rule: string;
123
+ values: Record<string, number | null>;
124
+ }
125
+ export interface UtilizationProfile {
126
+ provider: Provider;
127
+ /** "compute" | "database" | "storage" | "networking" | "integration" | "analytics" | ... */
128
+ family: string;
129
+ capacity: CapacityDescriptor;
130
+ runMode: RunMode;
131
+ metrics: MetricSparkline[];
132
+ running?: RunningProfile;
133
+ verdict: SizingVerdict;
134
+ verdictReasons: VerdictReason[];
135
+ /** Corroborating stable keys, e.g. "cpu-low", "advisor-rightsize". */
136
+ evidence: string[];
137
+ scheduleFit: ScheduleFit;
138
+ scheduleAction?: ScheduleAction;
139
+ coverage?: CommitmentCoverage;
140
+ /** Derived from billing config (pool, plan, scale set, cluster). */
141
+ ownerResourceId?: string;
142
+ evidenceWindow: EvidenceWindow;
143
+ /** `${resourceId}|${verdict}` */
144
+ fingerprint: string;
145
+ }
146
+ /** Compact form carried on portal `resources.json` rows and used by list views. */
147
+ export interface UtilizationSignal {
148
+ verdict: SizingVerdict;
149
+ scheduleFit: ScheduleFit;
150
+ primary: {
151
+ key: string;
152
+ p95: number | null;
153
+ sparkline: (number | null)[];
154
+ };
155
+ secondary?: {
156
+ key: string;
157
+ p95: number | null;
158
+ sparkline: (number | null)[];
159
+ };
160
+ coverage?: Pick<CommitmentCoverage, 'coveragePercent' | 'benefitTypes'>;
161
+ betterSku?: SkuOptionSummary;
162
+ telemetry: TelemetryStatus;
163
+ }
164
+ export type SkuOptionKind = 'same-shape' | 'fits-usage' | 'trade-off' | 'cross-platform';
165
+ export interface SkuOption {
166
+ kind: SkuOptionKind;
167
+ /** e.g. "Standard_E8as_v4" */
168
+ sku: string;
169
+ /** e.g. "E8as v4" */
170
+ label: string;
171
+ capacity?: {
172
+ units: number | null;
173
+ memoryGB?: number | null;
174
+ };
175
+ monthlyCost: number | null;
176
+ currency: string;
177
+ savingsPercent: number | null;
178
+ savingsMonthly: number | null;
179
+ /** Provider capability keys, e.g. "maxDataDiskCount". */
180
+ lostCapabilities: string[];
181
+ confidence?: 'high' | 'medium' | 'low';
182
+ }
183
+ export interface SkuOptionSummary {
184
+ kind: SkuOptionKind;
185
+ label: string;
186
+ savingsPercent: number | null;
187
+ }
188
+ export type CapabilityState = 'enabled' | 'disabled' | 'partial' | 'unknown' | 'not-applicable';
189
+ export interface ProtectionCapability {
190
+ /**
191
+ * "backup" | "replication" | "placement" | "disk-redundancy" | "patching" | "snapshots" | "geo-replication" |
192
+ * "pitr-retention" | "long-term-retention" | "zone-redundancy" | "backup-storage-redundancy" | "redundancy" |
193
+ * "soft-delete" | "versioning" | "point-in-time-restore" | "immutability" | "multi-region" | "continuous-backup" |
194
+ * "purge-protection" | ...
195
+ */
196
+ key: string;
197
+ state: CapabilityState;
198
+ required: boolean;
199
+ label: string;
200
+ details?: Record<string, string | number | boolean | null>;
201
+ costIfEnabled?: number | null;
202
+ evidence: {
203
+ source: string;
204
+ observedAt?: string | null;
205
+ };
206
+ }
207
+ export interface ProtectionProfile {
208
+ provider: Provider;
209
+ capabilities: ProtectionCapability[];
210
+ missingRequired: string[];
211
+ slaPercent?: number | null;
212
+ }
213
+ export type StoryKey = 'oversized-resources' | 'right-sku' | 'schedule-candidates' | 'resilience-recovery' | 'hybrid-benefit' | 'commitments';
214
+ export declare const STORY_KEYS: readonly StoryKey[];
215
+ export type StoryCellKind = 'text' | 'number' | 'money' | 'percent' | 'mark' | 'dot' | 'sparkline' | 'dual' | 'capacity-bar' | 'mix-bar' | 'event-strip' | 'weekly-grid';
216
+ export type SeriesRole = 'primary' | 'secondary';
217
+ export type StatusTone = 'good' | 'warn' | 'bad' | 'neutral' | 'muted';
218
+ export interface TextCell {
219
+ kind: 'text';
220
+ value: string | null;
221
+ /** Optional second line, e.g. "4 vCPU · 32 GB RAM" under a SKU. */
222
+ detail?: string | null;
223
+ }
224
+ export interface NumberCell {
225
+ kind: 'number';
226
+ value: number | null;
227
+ unit?: string;
228
+ decimals?: number;
229
+ }
230
+ export interface MoneyCell {
231
+ kind: 'money';
232
+ value: number | null;
233
+ currency: string;
234
+ }
235
+ export interface PercentCell {
236
+ kind: 'percent';
237
+ value: number | null;
238
+ }
239
+ /** One-word verdict / rating with an icon and tone; `state` is the stable enum value behind the label. */
240
+ export interface MarkCell {
241
+ kind: 'mark';
242
+ state: string;
243
+ label: string;
244
+ tone: StatusTone;
245
+ icon?: string;
246
+ hint?: string;
247
+ }
248
+ /** A single indicator dot, e.g. "better SKU available". */
249
+ export interface DotCell {
250
+ kind: 'dot';
251
+ present: boolean;
252
+ tone: StatusTone;
253
+ label?: string;
254
+ hint?: string;
255
+ }
256
+ export interface SparklineCell {
257
+ kind: 'sparkline';
258
+ role: SeriesRole;
259
+ /** Daily values for the window; null = no samples that day. */
260
+ values: (number | null)[];
261
+ axisMax: number | null;
262
+ unit: string;
263
+ p95: number | null;
264
+ label: string;
265
+ }
266
+ /** Primary and secondary series merged into one column at narrow layouts. */
267
+ export interface DualCell {
268
+ kind: 'dual';
269
+ primary: SparklineCell;
270
+ secondary: SparklineCell | null;
271
+ }
272
+ export interface CapacityBarCell {
273
+ kind: 'capacity-bar';
274
+ used: number | null;
275
+ total: number | null;
276
+ unit: string;
277
+ label: string;
278
+ }
279
+ export interface MixBarCell {
280
+ kind: 'mix-bar';
281
+ parts: {
282
+ key: string;
283
+ label: string;
284
+ value: number;
285
+ }[];
286
+ unit: string;
287
+ total: number;
288
+ }
289
+ export interface EventStripCell {
290
+ kind: 'event-strip';
291
+ events: ('ok' | 'failed' | null)[];
292
+ /** ISO date (UTC) of event 0. */
293
+ start: string;
294
+ label?: string;
295
+ }
296
+ export interface WeeklyGridCell {
297
+ kind: 'weekly-grid';
298
+ timezone: string;
299
+ /** 7 x 24 running share. */
300
+ running: (number | null)[][];
301
+ businessHoursShare: number | null;
302
+ offHoursShare: number | null;
303
+ }
304
+ export type StoryCell = TextCell | NumberCell | MoneyCell | PercentCell | MarkCell | DotCell | SparklineCell | DualCell | CapacityBarCell | MixBarCell | EventStripCell | WeeklyGridCell;
305
+ export interface StoryRowBase {
306
+ resourceId: string;
307
+ name: string;
308
+ type: string;
309
+ location: string;
310
+ subscriptionId: string;
311
+ tenantId: string;
312
+ companyId: string;
313
+ currency: string;
314
+ spend30d: number | null;
315
+ savingsMax: number | null;
316
+ ownerResourceId?: string;
317
+ fingerprint: string;
318
+ /** One entry per column key of the owning section; kinds match `StoryColumn.cell`. */
319
+ cells: Record<string, StoryCell>;
320
+ }
321
+ export interface OversizedResourceRow extends StoryRowBase {
322
+ profile: UtilizationProfile;
323
+ betterSku?: SkuOptionSummary;
324
+ }
325
+ export interface RightSkuRow extends StoryRowBase {
326
+ current: SkuOption;
327
+ options: SkuOption[];
328
+ verdict: 'modernise' | 'downsize' | 'consider' | 'keep';
329
+ usage: {
330
+ primaryP95: number | null;
331
+ secondaryP95: number | null;
332
+ telemetry: TelemetryStatus;
333
+ };
334
+ }
335
+ export interface ScheduleCandidateRow extends StoryRowBase {
336
+ /** `profile.running.weekly` is always present on schedule candidates. */
337
+ profile: UtilizationProfile;
338
+ action: ScheduleAction;
339
+ }
340
+ export interface ResilienceRow extends StoryRowBase {
341
+ protection: ProtectionProfile;
342
+ backupRuns?: ('ok' | 'failed' | null)[];
343
+ lastRecoveryPointAt?: string | null;
344
+ uptimeDays?: number | null;
345
+ activeHealthEvents?: number;
346
+ }
347
+ export interface HybridBenefitRow extends StoryRowBase {
348
+ productFamily: string;
349
+ serviceModel: string;
350
+ edition: string | null;
351
+ vCpuCount: number | null;
352
+ configurationStatus: string;
353
+ technicalEligibilityStatus: string;
354
+ coverageStatus: string;
355
+ entitlementStatus: string;
356
+ decision: {
357
+ status: string;
358
+ headline: string;
359
+ paybackMonths: number | null;
360
+ confidence: string;
361
+ };
362
+ reasonCodes: string[];
363
+ licenceObservedStableDays: number | null;
364
+ }
365
+ export interface CommitmentRow extends StoryRowBase {
366
+ coverage: CommitmentCoverage;
367
+ utilization?: {
368
+ primaryKey: string;
369
+ p95: number | null;
370
+ };
371
+ }
372
+ export interface StoryRowByKey {
373
+ 'oversized-resources': OversizedResourceRow;
374
+ 'right-sku': RightSkuRow;
375
+ 'schedule-candidates': ScheduleCandidateRow;
376
+ 'resilience-recovery': ResilienceRow;
377
+ 'hybrid-benefit': HybridBenefitRow;
378
+ commitments: CommitmentRow;
379
+ }
380
+ export declare const STORY_LIMITS: {
381
+ readonly sectionRows: 1000;
382
+ readonly sampleRows: 50;
383
+ readonly windowDays: 30;
384
+ readonly weeklyGridDays: 7;
385
+ readonly weeklyGridHours: 24;
386
+ /** Story fingerprints retained per monthly history period (all stories together). */
387
+ readonly historyFingerprints: 2000;
388
+ };
389
+ /** Reuses ReportBoundedRows<T> (totalCount / rows / omittedCount) from reportEvidence.ts. */
390
+ export interface StorySection<TRow> extends ReportBoundedRows<TRow> {
391
+ resourceType: string;
392
+ family: string;
393
+ columns: StoryColumn[];
394
+ }
395
+ /**
396
+ * Column definition for the generic story table. `cell` names the renderer; `priority` drives the responsive
397
+ * tiers (1 always shown ... 5 first to drop); `roleClass` drives layout width and the primary/secondary merge:
398
+ * a section that has a `sec` column also carries a `dual` column, shown instead of `prim` + `sec` at narrow tiers.
399
+ */
400
+ export interface StoryColumn {
401
+ key: string;
402
+ label: string;
403
+ cell: StoryCellKind;
404
+ priority: 1 | 2 | 3 | 4 | 5;
405
+ roleClass?: 'res' | 'prim' | 'sec' | 'nums' | 'cap' | 'read' | 'cost' | 'save' | 'dual';
406
+ hint?: string;
407
+ }
408
+ export interface StorySummary {
409
+ counts: Record<string, number>;
410
+ spend: Record<string, number>;
411
+ currency: string;
412
+ note?: string;
413
+ }
414
+ export interface StoryArtifact<TRow = unknown> {
415
+ storyKey: StoryKey;
416
+ scope: {
417
+ companyId: string;
418
+ tenantId: string;
419
+ subscriptionId: string;
420
+ displayName: string;
421
+ currency: string;
422
+ };
423
+ generation: {
424
+ sourceRunId: string;
425
+ generatedAt: string;
426
+ };
427
+ window: {
428
+ start: string;
429
+ end: string;
430
+ days: number;
431
+ timezone: string;
432
+ };
433
+ summary: StorySummary;
434
+ sections: StorySection<TRow>[];
435
+ }
436
+ /**
437
+ * Compact identity of one published story row, retained per monthly history period so a later report can say
438
+ * whether a row was previously reported (`previouslyReported`) and how its saving moved. Selected across all six
439
+ * stories by `savingsMax` desc, `storyKey` asc, `resourceId` asc and bounded by `STORY_LIMITS.historyFingerprints`.
440
+ */
441
+ export interface StoryFingerprint {
442
+ storyKey: StoryKey;
443
+ resourceId: string;
444
+ /** The row's `fingerprint` (`${resourceId}|${verdict}` and story-specific variants). */
445
+ fingerprint: string;
446
+ savingsMax: number | null;
447
+ }
448
+ export interface StorySample<TRow = unknown> {
449
+ summary: StorySummary;
450
+ /** At most STORY_LIMITS.sampleRows rows per section. */
451
+ sections: StorySection<TRow>[];
452
+ }
453
+ export type ReportingStories = Partial<Record<StoryKey, StorySample>>;
454
+ export interface UtilizationProfileConfig {
455
+ version: 1;
456
+ defaults: {
457
+ windowDays: number;
458
+ bucket: 'P1D';
459
+ weeklyProfile: boolean;
460
+ verdictRules: Record<string, string>;
461
+ };
462
+ /** Keyed by lowercase resource type. */
463
+ profiles: Record<string, UtilizationProfileEntry>;
464
+ }
465
+ export interface UtilizationProfileEntry {
466
+ family: string;
467
+ producer?: 'parser' | 'strategy';
468
+ /** jsonata over the resource */
469
+ capacityLabel?: string;
470
+ runMode: RunMode;
471
+ /** metric key */
472
+ runningSignal?: string | null;
473
+ scheduleFit?: boolean | ScheduleAction;
474
+ variants?: {
475
+ when: string;
476
+ metrics: UtilizationMetricEntry[];
477
+ verdictRules?: Record<string, string>;
478
+ }[];
479
+ metrics?: UtilizationMetricEntry[];
480
+ verdictRules?: Record<string, string>;
481
+ skuAlternatives?: {
482
+ source: string;
483
+ capabilityKeys?: string[];
484
+ };
485
+ }
486
+ export interface UtilizationMetricEntry {
487
+ key: string;
488
+ metricName: string;
489
+ collection?: string;
490
+ role: MetricRole;
491
+ visual?: MetricVisual;
492
+ unit?: string;
493
+ axisMax?: number;
494
+ axisMaxExpression?: string;
495
+ billedOn?: BilledOn;
496
+ transform?: string;
497
+ requires?: string;
498
+ when?: string;
499
+ dimensions?: {
500
+ policy: DimensionPolicy;
501
+ name?: string;
502
+ };
503
+ priority?: 1 | 2 | 3 | 4 | 5;
504
+ }
505
+ export interface ResilienceProfileConfig {
506
+ version: 1;
507
+ profiles: Record<string, {
508
+ capabilities: {
509
+ key: string;
510
+ required: boolean;
511
+ source: string;
512
+ sla?: string;
513
+ }[];
514
+ }>;
515
+ }
516
+ //# sourceMappingURL=utilizationStories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utilizationStories.d.ts","sourceRoot":"","sources":["../../src/common/utilizationStories.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.STORY_LIMITS = exports.STORY_KEYS = void 0;
4
+ exports.STORY_KEYS = [
5
+ 'oversized-resources',
6
+ 'right-sku',
7
+ 'schedule-candidates',
8
+ 'resilience-recovery',
9
+ 'hybrid-benefit',
10
+ 'commitments',
11
+ ];
12
+ exports.STORY_LIMITS = {
13
+ sectionRows: 1000,
14
+ sampleRows: 50,
15
+ windowDays: 30,
16
+ weeklyGridDays: 7,
17
+ weeklyGridHours: 24,
18
+ /** Story fingerprints retained per monthly history period (all stories together). */
19
+ historyFingerprints: 2000,
20
+ };
21
+ //# sourceMappingURL=utilizationStories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utilizationStories.js","sourceRoot":"","sources":["../../src/common/utilizationStories.ts"],"names":[],"mappings":";;;AA6Ma,QAAA,UAAU,GAAwB;IAC7C,qBAAqB;IACrB,WAAW;IACX,qBAAqB;IACrB,qBAAqB;IACrB,gBAAgB;IAChB,aAAa;CACd,CAAC;AAyLW,QAAA,YAAY,GAAG;IAC1B,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,EAAE;IACd,cAAc,EAAE,CAAC;IACjB,eAAe,EAAE,EAAE;IACnB,qFAAqF;IACrF,mBAAmB,EAAE,IAAI;CACjB,CAAC"}
@@ -0,0 +1,48 @@
1
+ import type { ReportBoundedRows } from './boundedRows';
2
+ import { type CapacityDescriptor, type CommitmentCoverage, type CommitmentRow, type EvidenceWindow, type HybridBenefitRow, type MetricSparkline, type OversizedResourceRow, type ProtectionCapability, type ProtectionProfile, type ReportingStories, type ResilienceProfileConfig, type ResilienceRow, type RightSkuRow, type RunningProfile, type ScheduleCandidateRow, type SkuOption, type SkuOptionSummary, type StoryArtifact, type StoryCell, type StoryColumn, type StoryFingerprint, type StoryKey, type StoryRowBase, type StorySample, type StorySection, type StorySummary, type UtilizationMetricEntry, type UtilizationProfile, type UtilizationProfileConfig, type UtilizationProfileEntry, type UtilizationSignal } from './utilizationStories';
3
+ export declare const isMetricSparkline: (value: unknown, days?: number) => value is MetricSparkline;
4
+ export declare const isCapacityDescriptor: (value: unknown) => value is CapacityDescriptor;
5
+ export declare const isRunningProfile: (value: unknown, days?: number) => value is RunningProfile;
6
+ /** A running signal derived from metric presence alone is not evidence of stopped time; it needs an independent source. */
7
+ export declare const isCorroboratedRunningProfile: (value: RunningProfile) => boolean;
8
+ export declare const isCommitmentCoverage: (value: unknown) => value is CommitmentCoverage;
9
+ export declare const isEvidenceWindow: (value: unknown) => value is EvidenceWindow;
10
+ export declare const isSkuOptionSummary: (value: unknown) => value is SkuOptionSummary;
11
+ export declare const isSkuOption: (value: unknown) => value is SkuOption;
12
+ export declare const isUtilizationProfile: (value: unknown, days?: number) => value is UtilizationProfile;
13
+ export declare const isUtilizationSignal: (value: unknown) => value is UtilizationSignal;
14
+ export declare const isProtectionCapability: (value: unknown) => value is ProtectionCapability;
15
+ export declare const isProtectionProfile: (value: unknown) => value is ProtectionProfile;
16
+ export declare const isStoryCell: (value: unknown) => value is StoryCell;
17
+ export declare const isStoryColumn: (value: unknown) => value is StoryColumn;
18
+ /** Every column has a cell on the row, and the cell's kind matches the column's renderer. */
19
+ export declare const hasCellsForColumns: (row: StoryRowBase, columns: StoryColumn[]) => boolean;
20
+ export declare const isOversizedResourceRow: (value: unknown, days?: number) => value is OversizedResourceRow;
21
+ export declare const isRightSkuRow: (value: unknown) => value is RightSkuRow;
22
+ /** Schedule candidates always carry a corroborated weekly running profile. */
23
+ export declare const isScheduleCandidateRow: (value: unknown, days?: number) => value is ScheduleCandidateRow;
24
+ export declare const isResilienceRow: (value: unknown) => value is ResilienceRow;
25
+ export declare const isHybridBenefitRow: (value: unknown) => value is HybridBenefitRow;
26
+ export declare const isCommitmentRow: (value: unknown) => value is CommitmentRow;
27
+ /** Row guard for a story key; unknown keys reject every row. */
28
+ export declare const storyRowGuard: (storyKey: string, days?: number) => ((row: unknown) => row is StoryRowBase);
29
+ export declare const isStorySummary: (value: unknown) => value is StorySummary;
30
+ export declare const isStorySection: (value: unknown, storyKey: string, limit: number, days?: number) => value is StorySection<StoryRowBase>;
31
+ /** Every row of an artifact belongs to the artifact's scope; a row from another company, tenant or subscription is rejected. */
32
+ export declare const isRowInScope: (row: StoryRowBase, scope: {
33
+ companyId: string;
34
+ tenantId: string;
35
+ subscriptionId: string;
36
+ }) => boolean;
37
+ export declare const isStoryArtifact: (value: unknown, storyKey?: StoryKey) => value is StoryArtifact<StoryRowBase>;
38
+ /** Bounded sample embedded in the evidence pack; rows are validated for `storyKey`, window days are not known here. */
39
+ export declare const isStorySample: (value: unknown, storyKey: StoryKey) => value is StorySample<StoryRowBase>;
40
+ export declare const isStoryFingerprint: (value: unknown) => value is StoryFingerprint;
41
+ /** Bounded, de-duplicated (storyKey + fingerprint) fingerprint rows for one history period. */
42
+ export declare const isStoryFingerprintRows: (value: unknown) => value is ReportBoundedRows<StoryFingerprint>;
43
+ export declare const isReportingStories: (value: unknown) => value is ReportingStories;
44
+ export declare const isUtilizationMetricEntry: (value: unknown) => value is UtilizationMetricEntry;
45
+ export declare const isUtilizationProfileEntry: (value: unknown) => value is UtilizationProfileEntry;
46
+ export declare const isUtilizationProfileConfig: (value: unknown) => value is UtilizationProfileConfig;
47
+ export declare const isResilienceProfileConfig: (value: unknown) => value is ResilienceProfileConfig;
48
+ //# sourceMappingURL=utilizationStoriesValidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utilizationStoriesValidation.d.ts","sourceRoot":"","sources":["../../src/common/utilizationStoriesValidation.ts"],"names":[],"mappings":"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"}