@linxiraos/pi-stats 1.1.13 → 1.1.15

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 (36) hide show
  1. package/CHANGELOG.md +10 -35
  2. package/dist/client/index.css +1 -1
  3. package/dist/client/index.js +56 -56
  4. package/dist/client/styles.css +46 -46
  5. package/dist/types/client/components/chart-shared.d.ts +21 -21
  6. package/dist/types/client/components/models-table-shared.d.ts +14 -14
  7. package/dist/types/client/data/formatters.d.ts +7 -2
  8. package/dist/types/client/traces/trace-colors.d.ts +1 -1
  9. package/dist/types/client/types.d.ts +2 -0
  10. package/dist/types/db.d.ts +24 -2
  11. package/dist/types/parser.d.ts +45 -2
  12. package/dist/types/shared-types.d.ts +4 -0
  13. package/dist/types/trace.d.ts +1 -1
  14. package/dist/types/types.d.ts +21 -0
  15. package/package.json +4 -4
  16. package/src/aggregator.ts +4 -0
  17. package/src/client/app/AppLayout.tsx +1 -1
  18. package/src/client/app/NavRail.tsx +1 -1
  19. package/src/client/components/AgentTokenShare.tsx +6 -6
  20. package/src/client/components/chart-shared.tsx +22 -22
  21. package/src/client/data/formatters.ts +15 -3
  22. package/src/client/routes/BehaviorRoute.tsx +10 -10
  23. package/src/client/routes/ModelsRoute.tsx +1 -1
  24. package/src/client/routes/OverviewRoute.tsx +4 -4
  25. package/src/client/routes/ProvidersRoute.tsx +3 -3
  26. package/src/client/routes/TracesRoute.tsx +10 -3
  27. package/src/client/styles.css +54 -52
  28. package/src/client/traces/SummaryStrip.tsx +2 -2
  29. package/src/client/traces/trace-colors.ts +13 -13
  30. package/src/client/types.ts +2 -0
  31. package/src/db.ts +242 -46
  32. package/src/parser.ts +131 -18
  33. package/src/server.ts +1 -1
  34. package/src/shared-types.ts +4 -0
  35. package/src/trace.ts +52 -8
  36. package/src/types.ts +20 -0
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Shared chart primitives for the dashboard timeline charts: the OMP color
2
+ * Shared chart primitives for the dashboard timeline charts: the Zeta color
3
3
  * palette, light/dark chart chrome, legend/tooltip + scale plumbing, dataset
4
4
  * styling, and the top-N-by-model / aggregate bucketing used by the cost and
5
5
  * behavior series.
@@ -7,17 +7,17 @@
7
7
 
8
8
  import { format } from "@linxiraos/pi-utils/dates";
9
9
 
10
- // OMP brand palette (packages/collab-web/src/styles/tokens.css): pink/purple/cyan.
11
- // Categorical series lead with the brand gradient hues (pink -> purple -> cyan).
10
+ // Zeta palette (web-ui/lib/theme/themes/zeta-dark.json): neutral graphite lead
11
+ // plus the zeta categorical chart colors. Mid-tone series read on both themes.
12
12
  export const MODEL_COLORS = [
13
- "#ed4abf", // brand pink (accent)
14
- "#9b4dff", // brand violet
15
- "#5ad8e6", // brand cyan
16
- "#62d394", // green
17
- "#c77dff", // light purple
18
- "#ff8fd1", // light pink
19
- "#f5c14b", // amber
20
- "#ff6b7d", // rose
13
+ "#9d9d9d", // zeta neutral (surface.mutedForeground)
14
+ "#f07178", // zeta red
15
+ "#e5c07b", // zeta amber
16
+ "#98c379", // zeta green
17
+ "#61afef", // zeta blue
18
+ "#c678dd", // zeta violet
19
+ "#d19a66", // zeta orange
20
+ "#56b6c2", // zeta cyan
21
21
  ];
22
22
 
23
23
  export function buildModelColorLookup(
@@ -38,22 +38,22 @@ export function buildModelColorLookup(
38
38
 
39
39
  export const CHART_THEMES = {
40
40
  dark: {
41
- legendLabel: "#a89fb3",
42
- tooltipBackground: "#241a2e",
43
- tooltipTitle: "#eae5ef",
44
- tooltipBody: "#a89fb3",
41
+ legendLabel: "#9d9d9d",
42
+ tooltipBackground: "#232323",
43
+ tooltipTitle: "#f5f5f5",
44
+ tooltipBody: "#9d9d9d",
45
45
  tooltipBorder: "rgba(255, 255, 255, 0.12)",
46
46
  grid: "rgba(255, 255, 255, 0.06)",
47
- tick: "#867a93",
47
+ tick: "#7a7a7a",
48
48
  },
49
49
  light: {
50
- legendLabel: "#5a5462",
50
+ legendLabel: "#616161",
51
51
  tooltipBackground: "#ffffff",
52
- tooltipTitle: "#241a2e",
53
- tooltipBody: "#5a5462",
54
- tooltipBorder: "rgba(20, 12, 28, 0.15)",
55
- grid: "rgba(20, 12, 28, 0.08)",
56
- tick: "#6a6275",
52
+ tooltipTitle: "#1f1f1f",
53
+ tooltipBody: "#616161",
54
+ tooltipBorder: "rgba(0, 0, 0, 0.15)",
55
+ grid: "rgba(0, 0, 0, 0.08)",
56
+ tick: "#8c8c8c",
57
57
  },
58
58
  } as const;
59
59
 
@@ -23,10 +23,22 @@ export function formatEstimatedCost(value: number, unpricedRequests: number, dig
23
23
  return value === 0 && unpricedRequests > 0 ? "N/A" : formatCost(value, digits);
24
24
  }
25
25
 
26
- /** Format one request's cost, distinguishing unpriced SuperGrok usage from free usage. */
27
- export function formatMessageCost(message: Pick<MessageStats, "provider" | "usage">, digits?: number): string {
26
+ /**
27
+ * Format one request's cost, distinguishing unpriced usage from free usage.
28
+ * Mirrors the server's `unpricedRequestSql`: `xai-oauth` is billed through a
29
+ * subscription, and `costUnpriced` marks a row the ingest path could not price
30
+ * (a scheduled card with no recoverable request timestamp).
31
+ */
32
+ export function formatMessageCost(
33
+ message: Pick<MessageStats, "provider" | "usage" | "costUnpriced">,
34
+ digits?: number,
35
+ ): string {
28
36
  const unpricedRequests =
29
- message.provider === "xai-oauth" && message.usage.totalTokens > 0 && message.usage.cost.total === 0 ? 1 : 0;
37
+ message.usage.totalTokens > 0 &&
38
+ message.usage.cost.total === 0 &&
39
+ (message.provider === "xai-oauth" || message.costUnpriced === true)
40
+ ? 1
41
+ : 0;
30
42
  return formatEstimatedCost(message.usage.cost.total, unpricedRequests, digits);
31
43
  }
32
44
 
@@ -416,37 +416,37 @@ function BehaviorModelsTable({
416
416
  label="Yelling (CAPS)"
417
417
  total={model.totalYelling}
418
418
  messages={model.totalMessages}
419
- valueClass="text-[#ed4abf]"
419
+ valueClass="text-[#f07178]"
420
420
  />
421
421
  <DetailRow
422
422
  label="Profanity"
423
423
  total={model.totalProfanity}
424
424
  messages={model.totalMessages}
425
- valueClass="text-[#ff6b7d]"
425
+ valueClass="text-[#d19a66]"
426
426
  />
427
427
  <DetailRow
428
428
  label="Anguish (!!!, nooo, dude, ..)"
429
429
  total={model.totalAnguish}
430
430
  messages={model.totalMessages}
431
- valueClass="text-[#9b4dff]"
431
+ valueClass="text-[#c678dd]"
432
432
  />
433
433
  <DetailRow
434
434
  label="Negation (no/nope/wrong)"
435
435
  total={model.totalNegation}
436
436
  messages={model.totalMessages}
437
- valueClass="text-[#5ad8e6]"
437
+ valueClass="text-[#56b6c2]"
438
438
  />
439
439
  <DetailRow
440
440
  label="Repetition (i meant, still doesnt)"
441
441
  total={model.totalRepetition}
442
442
  messages={model.totalMessages}
443
- valueClass="text-[#5ad8e6]"
443
+ valueClass="text-[#56b6c2]"
444
444
  />
445
445
  <DetailRow
446
446
  label="Blame (you didnt, stop X-ing)"
447
447
  total={model.totalBlame}
448
448
  messages={model.totalMessages}
449
- valueClass="text-[#5ad8e6]"
449
+ valueClass="text-[#56b6c2]"
450
450
  />
451
451
  <DetailRow
452
452
  label="Avg chars / msg"
@@ -515,10 +515,10 @@ function DetailRow({
515
515
  }
516
516
 
517
517
  const SERIES_COLORS = {
518
- yelling: "#ed4abf", // brand pink
519
- profanity: "#ff6b7d", // rose
520
- anguish: "#9b4dff", // brand violet
521
- frustration: "#5ad8e6", // brand cyan
518
+ yelling: "#f07178", // zeta red
519
+ profanity: "#d19a66", // zeta orange
520
+ anguish: "#c678dd", // zeta violet
521
+ frustration: "#56b6c2", // zeta cyan
522
522
  } as const;
523
523
 
524
524
  function BreakdownChart({ data, chartTheme }: { data: DailyPoint[]; chartTheme: TableChartTheme }) {
@@ -441,7 +441,7 @@ function PerformanceChart({
441
441
  {
442
442
  label: "TTFT",
443
443
  data: data.map(d => d.avgTtftSeconds ?? null),
444
- ...lineSeriesStyle("#5ad8e6"),
444
+ ...lineSeriesStyle("#61afef"),
445
445
  yAxisID: "y" as const,
446
446
  },
447
447
  {
@@ -53,8 +53,8 @@ export function OverviewRoute({ active, range, refreshTrigger, onRequestClick }:
53
53
  {
54
54
  label: "Requests",
55
55
  data: overview.timeSeries.map(pt => pt.requests),
56
- borderColor: "#5ad8e6",
57
- backgroundColor: "rgba(90, 216, 230, 0.12)",
56
+ borderColor: "#61afef",
57
+ backgroundColor: "rgba(97, 175, 239, 0.12)",
58
58
  tension: 0.2,
59
59
  borderWidth: 2,
60
60
  pointRadius,
@@ -64,8 +64,8 @@ export function OverviewRoute({ active, range, refreshTrigger, onRequestClick }:
64
64
  {
65
65
  label: "Errors",
66
66
  data: overview.timeSeries.map(pt => pt.errors),
67
- borderColor: "#ff6b7d",
68
- backgroundColor: "rgba(255, 107, 125, 0.12)",
67
+ borderColor: "#f07178",
68
+ backgroundColor: "rgba(240, 113, 120, 0.12)",
69
69
  tension: 0.2,
70
70
  borderWidth: 2,
71
71
  pointRadius,
@@ -396,9 +396,9 @@ function WindowInsightsPanel({ insights }: { insights: ProviderWindowInsight[] }
396
396
  // ---------------------------------------------------------------------------
397
397
 
398
398
  const UTILIZATION_COLORS = {
399
- ok: "#62d394",
400
- warning: "#f5c14b",
401
- exhausted: "#ff6b7d",
399
+ ok: "#98c379",
400
+ warning: "#e5c07b",
401
+ exhausted: "#f07178",
402
402
  } as const;
403
403
 
404
404
  function WindowUtilizationPanel({ usageSeries }: { usageSeries: UsageWindowSeries[] }) {
@@ -5,7 +5,7 @@
5
5
 
6
6
  import { useMemo, useState } from "react";
7
7
  import { getSessions } from "../api";
8
- import { formatCompact, formatCost, formatDurationMs, formatRelativeTime } from "../data/formatters";
8
+ import { formatCompact, formatDurationMs, formatEstimatedCost, formatRelativeTime } from "../data/formatters";
9
9
  import { useResource } from "../data/useResource";
10
10
  import { TraceView } from "../traces/TraceView";
11
11
  import type { SessionSummary } from "../types";
@@ -110,7 +110,12 @@ export function TracesRoute({ active, session, onOpenSession, refreshTrigger }:
110
110
  numeric: true,
111
111
  render: (item: SessionSummary) => formatCompact(item.totalTokens),
112
112
  },
113
- { key: "cost", header: "Cost", numeric: true, render: (item: SessionSummary) => formatCost(item.costTotal) },
113
+ {
114
+ key: "cost",
115
+ header: "Cost",
116
+ numeric: true,
117
+ render: (item: SessionSummary) => formatEstimatedCost(item.costTotal, item.unpricedRequests),
118
+ },
114
119
  { key: "models", header: "Models", render: (item: SessionSummary) => <ModelChips models={item.models} /> },
115
120
  ],
116
121
  [],
@@ -138,7 +143,9 @@ export function TracesRoute({ active, session, onOpenSession, refreshTrigger }:
138
143
  </div>
139
144
  <div>
140
145
  <div className="stats-mobile-card-label">Cost</div>
141
- <div className="stats-mobile-card-value">{formatCost(item.costTotal)}</div>
146
+ <div className="stats-mobile-card-value">
147
+ {formatEstimatedCost(item.costTotal, item.unpricedRequests)}
148
+ </div>
142
149
  </div>
143
150
  </div>
144
151
  </div>
@@ -1,29 +1,29 @@
1
1
  @import "tailwindcss/index.css";
2
2
 
3
3
  /* ==========================================================================
4
- OMP Theme Variables & Color Scheme
4
+ Theme Variables & Color Scheme
5
5
  ========================================================================== */
6
6
  :root {
7
7
  color-scheme: dark;
8
- /* OMP brand palette — packages/collab-web/src/styles/tokens.css:
9
- deep-purple surfaces (hue 307), pink accent #ed4abf, cyan focus ring #5ad8e6. */
10
- --page: oklch(0.16 0.02 307);
11
- --surface: oklch(0.19 0.022 307);
12
- --surface-2: oklch(0.235 0.026 307);
13
- --border: oklch(1 0 0 / 9%);
14
- --border-strong: oklch(1 0 0 / 13%);
15
- --text: oklch(0.92 0.01 307);
16
- --muted: oklch(0.71 0.016 307);
17
- --dim: oklch(0.53 0.018 307);
18
- --accent: oklch(0.674 0.23 341); /* brand pink #ed4abf */
19
- --accent-fg: oklch(0.2 0.07 341); /* ink on accent fills */
20
- --accent-muted: oklch(0.674 0.23 341 / 18%);
21
- --link: oklch(0.817 0.112 205); /* brand cyan #5ad8e6 */
22
- --success: oklch(0.76 0.14 150);
23
- --danger: oklch(0.66 0.19 25);
24
- --warning: oklch(0.79 0.14 85);
25
-
26
- /* Bridge the view components' token vocabulary to the OMP base tokens so
8
+ /* Zeta dark palette — web-ui/lib/theme/themes/zeta-dark.json:
9
+ neutral graphite surfaces, #EAEAEA accent, no blue accent. */
10
+ --page: #161616;
11
+ --surface: #1e1e1e;
12
+ --surface-2: #232323;
13
+ --border: #2e2e2e;
14
+ --border-strong: #3c3c3c;
15
+ --text: #f5f5f5;
16
+ --muted: #9d9d9d;
17
+ --dim: #6e6e6e;
18
+ --accent: #eaeaea; /* primary.base */
19
+ --accent-fg: #161616; /* primary.foreground — ink on accent fills */
20
+ --accent-muted: rgb(234 234 234 / 0.18); /* primary.muted */
21
+ --link: #61afef; /* status.info */
22
+ --success: #98c379; /* status.success */
23
+ --danger: #f07178; /* status.error */
24
+ --warning: #e5c07b; /* status.warning */
25
+
26
+ /* Bridge the view components' token vocabulary to the Zeta base tokens so
27
27
  muted/secondary text and semantic accents resolve instead of silently
28
28
  falling back to inherited text color. Re-resolve per theme via var(). */
29
29
  --text-primary: var(--text);
@@ -47,44 +47,46 @@
47
47
  @media (prefers-color-scheme: light) {
48
48
  :root:not([data-theme]) {
49
49
  color-scheme: light;
50
- --page: oklch(0.985 0.004 307);
51
- --surface: oklch(1 0 0);
52
- --surface-2: oklch(0.965 0.006 307);
53
- --border: oklch(0 0 0 / 10%);
54
- --border-strong: oklch(0 0 0 / 15%);
55
- --text: oklch(0.26 0.03 307);
56
- --muted: oklch(0.46 0.03 307);
57
- --dim: oklch(0.58 0.025 307);
58
- --accent: oklch(0.62 0.23 341);
59
- --accent-fg: oklch(0.99 0.01 341);
60
- --accent-muted: oklch(0.62 0.23 341 / 14%);
61
- --link: oklch(0.58 0.13 230);
62
- --success: oklch(0.55 0.13 150);
63
- --danger: oklch(0.55 0.19 25);
50
+ /* Zeta light palette — web-ui/lib/theme/themes/zeta-light.json. */
51
+ --page: #fafafa;
52
+ --surface: #ffffff;
53
+ --surface-2: #f0f0f0;
54
+ --border: #e0e0e0;
55
+ --border-strong: #c8c8c8;
56
+ --text: #1f1f1f;
57
+ --muted: #616161;
58
+ --dim: #9e9e9e;
59
+ --accent: #1a1a1a;
60
+ --accent-fg: #fafafa;
61
+ --accent-muted: rgb(26 26 26 / 0.14);
62
+ --link: #4078c0;
63
+ --success: #50a14f;
64
+ --danger: #e45649;
64
65
  --select-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
65
- --warning: oklch(0.6 0.13 85);
66
+ --warning: #986801;
66
67
  }
67
68
  }
68
69
 
69
70
  /* Explicit theme override (toggle or persisted preference). */
70
71
  [data-theme="light"] {
71
72
  color-scheme: light;
72
- --page: oklch(0.985 0.004 307);
73
- --surface: oklch(1 0 0);
74
- --surface-2: oklch(0.965 0.006 307);
75
- --border: oklch(0 0 0 / 10%);
76
- --border-strong: oklch(0 0 0 / 15%);
77
- --text: oklch(0.26 0.03 307);
78
- --muted: oklch(0.46 0.03 307);
79
- --dim: oklch(0.58 0.025 307);
80
- --accent: oklch(0.62 0.23 341);
81
- --accent-fg: oklch(0.99 0.01 341);
82
- --accent-muted: oklch(0.62 0.23 341 / 14%);
83
- --link: oklch(0.58 0.13 230);
84
- --success: oklch(0.55 0.13 150);
85
- --danger: oklch(0.55 0.19 25);
73
+ /* Zeta light palette — web-ui/lib/theme/themes/zeta-light.json. */
74
+ --page: #fafafa;
75
+ --surface: #ffffff;
76
+ --surface-2: #f0f0f0;
77
+ --border: #e0e0e0;
78
+ --border-strong: #c8c8c8;
79
+ --text: #1f1f1f;
80
+ --muted: #616161;
81
+ --dim: #9e9e9e;
82
+ --accent: #1a1a1a;
83
+ --accent-fg: #fafafa;
84
+ --accent-muted: rgb(26 26 26 / 0.14);
85
+ --link: #4078c0;
86
+ --success: #50a14f;
87
+ --danger: #e45649;
86
88
  --select-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
87
- --warning: oklch(0.6 0.13 85);
89
+ --warning: #986801;
88
90
  }
89
91
 
90
92
  /* ==========================================================================
@@ -1293,7 +1295,7 @@
1293
1295
  }
1294
1296
 
1295
1297
  /* ==========================================================================
1296
- Brand mark on the OMP wordmark (both rail + mobile drawer headers)
1298
+ Brand mark on the ZETA wordmark (both rail + mobile drawer headers)
1297
1299
  ========================================================================== */
1298
1300
  .stats-logo-container {
1299
1301
  display: grid;
@@ -1308,7 +1310,7 @@
1308
1310
  width: 16px;
1309
1311
  height: 16px;
1310
1312
  border-radius: 4px;
1311
- background: linear-gradient(135deg, #ed4abf 0%, #9b4dff 50%, #5ad8e6 100%); /* OMP brand gradient mark */
1313
+ background: linear-gradient(135deg, #eaeaea 0%, #9d9d9d 50%, #3c3c3c 100%); /* Zeta graphite mark */
1312
1314
  }
1313
1315
 
1314
1316
  .stats-logo-text,
@@ -3,7 +3,7 @@
3
3
  * tool calls, agents, tokens, cost.
4
4
  */
5
5
 
6
- import { formatCompact, formatCost, formatDurationMs, formatInteger } from "../data/formatters";
6
+ import { formatCompact, formatDurationMs, formatEstimatedCost, formatInteger } from "../data/formatters";
7
7
  import type { TraceSummary } from "../types";
8
8
 
9
9
  export interface SummaryStripProps {
@@ -21,7 +21,7 @@ export function SummaryStrip({ summary }: SummaryStripProps) {
21
21
  { label: "Tool Calls", value: formatInteger(summary.toolCalls) },
22
22
  { label: "Agents", value: formatInteger(summary.subagents) },
23
23
  { label: "Tokens", value: formatCompact(summary.totalTokens) },
24
- { label: "Cost", value: formatCost(summary.costTotal) },
24
+ { label: "Cost", value: formatEstimatedCost(summary.costTotal, summary.unpricedRequests) },
25
25
  ];
26
26
 
27
27
  return (
@@ -23,7 +23,7 @@ export interface TraceTheme {
23
23
  tick: string;
24
24
  /** Span label text drawn inside blocks. */
25
25
  spanText: string;
26
- /** Selection outline (brand cyan focus ring). */
26
+ /** Selection outline (theme focus accent). */
27
27
  selection: string;
28
28
  tooltipBackground: string;
29
29
  tooltipTitle: string;
@@ -45,12 +45,12 @@ export const TRACE_THEMES: Record<"dark" | "light", TraceTheme> = {
45
45
  turnBand: "rgba(255, 255, 255, 0.035)",
46
46
  surface: "transparent",
47
47
  grid: "rgba(255, 255, 255, 0.06)",
48
- tick: "#867a93",
49
- spanText: "#16121c",
50
- selection: "#5ad8e6",
51
- tooltipBackground: "#241a2e",
52
- tooltipTitle: "#eae5ef",
53
- tooltipBody: "#a89fb3",
48
+ tick: "#7a7a7a",
49
+ spanText: "#161616",
50
+ selection: "#eaeaea",
51
+ tooltipBackground: "#232323",
52
+ tooltipTitle: "#f5f5f5",
53
+ tooltipBody: "#9d9d9d",
54
54
  tooltipBorder: "rgba(255, 255, 255, 0.12)",
55
55
  },
56
56
  light: {
@@ -65,13 +65,13 @@ export const TRACE_THEMES: Record<"dark" | "light", TraceTheme> = {
65
65
  marker: "#ca8a04",
66
66
  turnBand: "rgba(0, 0, 0, 0.04)",
67
67
  surface: "transparent",
68
- grid: "rgba(20, 12, 28, 0.08)",
69
- tick: "#6a6275",
68
+ grid: "rgba(0, 0, 0, 0.08)",
69
+ tick: "#8c8c8c",
70
70
  spanText: "#ffffff",
71
- selection: "#0e7490",
71
+ selection: "#1a1a1a",
72
72
  tooltipBackground: "#ffffff",
73
- tooltipTitle: "#241a2e",
74
- tooltipBody: "#5a5462",
75
- tooltipBorder: "rgba(20, 12, 28, 0.15)",
73
+ tooltipTitle: "#1f1f1f",
74
+ tooltipBody: "#616161",
75
+ tooltipBorder: "rgba(0, 0, 0, 0.15)",
76
76
  },
77
77
  };
@@ -54,6 +54,8 @@ export interface MessageStats {
54
54
  stopReason: string;
55
55
  errorMessage: string | null;
56
56
  usage: Usage;
57
+ /** Ingest found no tariff to price this request from; its zero is unknown spend. */
58
+ costUnpriced?: boolean;
57
59
  }
58
60
 
59
61
  export interface RequestDetails extends MessageStats {