@absolutejs/voice 0.0.22-beta.346 → 0.0.22-beta.347
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.
- package/dist/client/index.js +131 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +135 -0
- package/dist/proofTrends.d.ts +65 -0
- package/dist/react/index.js +131 -0
- package/dist/vue/index.js +131 -0
- package/package.json +1 -1
package/dist/client/index.js
CHANGED
|
@@ -3829,6 +3829,7 @@ var normalizeVoiceProofTrendReport = (value, options = {}) => {
|
|
|
3829
3829
|
return buildVoiceProofTrendReport({
|
|
3830
3830
|
...value,
|
|
3831
3831
|
maxAgeMs: options.maxAgeMs ?? value.maxAgeMs,
|
|
3832
|
+
now: options.now ?? ("now" in value ? value.now : undefined),
|
|
3832
3833
|
source: value.source ?? options.source
|
|
3833
3834
|
});
|
|
3834
3835
|
};
|
|
@@ -4085,6 +4086,64 @@ var buildVoiceProofTrendReportFromRealCallProfiles = (options) => {
|
|
|
4085
4086
|
summary
|
|
4086
4087
|
});
|
|
4087
4088
|
};
|
|
4089
|
+
var flattenProofTrendCycles = (reports) => reports.flatMap((report) => report.cycles ?? []);
|
|
4090
|
+
var buildVoiceRealCallProfileHistoryReport = (options = {}) => {
|
|
4091
|
+
const generatedAt = options.generatedAt ?? (options.now instanceof Date ? options.now.toISOString() : typeof options.now === "number" ? new Date(options.now).toISOString() : typeof options.now === "string" ? new Date(options.now).toISOString() : new Date().toISOString());
|
|
4092
|
+
const evidenceReport = options.evidence && options.evidence.length > 0 ? buildVoiceProofTrendReportFromRealCallProfiles({
|
|
4093
|
+
...options,
|
|
4094
|
+
evidence: options.evidence,
|
|
4095
|
+
generatedAt,
|
|
4096
|
+
source: `${options.source ?? "real-call-profile-history"}#evidence`
|
|
4097
|
+
}) : undefined;
|
|
4098
|
+
const history = [
|
|
4099
|
+
...(options.reports ?? []).map((report) => normalizeVoiceProofTrendReport(report, {
|
|
4100
|
+
maxAgeMs: options.maxAgeMs,
|
|
4101
|
+
now: options.now
|
|
4102
|
+
})),
|
|
4103
|
+
...evidenceReport ? [evidenceReport] : []
|
|
4104
|
+
];
|
|
4105
|
+
const profiles = buildVoiceProofTrendProfileSummaries(history, options);
|
|
4106
|
+
const summary = {
|
|
4107
|
+
cycles: history.reduce((total, report) => total + (report.summary.cycles ?? report.cycles.length), 0),
|
|
4108
|
+
failedReports: history.filter((report) => report.ok !== true).length,
|
|
4109
|
+
maxLiveP95Ms: maxNumber(history.map(readProofTrendMaxLiveP95)),
|
|
4110
|
+
maxProviderP95Ms: maxNumber(history.map(readProofTrendMaxProviderP95)),
|
|
4111
|
+
maxTurnP95Ms: maxNumber(history.map(readProofTrendMaxTurnP95)),
|
|
4112
|
+
profileCount: profiles.length,
|
|
4113
|
+
profiles,
|
|
4114
|
+
providers: readProofTrendProviders(history),
|
|
4115
|
+
runtimeChannel: aggregateProofTrendRuntimeChannel(history.map(readProofTrendRuntimeChannel).filter((channel) => channel !== undefined))
|
|
4116
|
+
};
|
|
4117
|
+
const trend = buildVoiceProofTrendReport({
|
|
4118
|
+
baseUrl: options.baseUrl,
|
|
4119
|
+
cycles: flattenProofTrendCycles(history),
|
|
4120
|
+
generatedAt,
|
|
4121
|
+
maxAgeMs: options.maxAgeMs,
|
|
4122
|
+
now: options.now,
|
|
4123
|
+
ok: history.length > 0 && summary.failedReports === 0 && profiles.every((profile) => profile.status !== "fail"),
|
|
4124
|
+
source: options.source ?? "real-call-profile-history",
|
|
4125
|
+
summary
|
|
4126
|
+
});
|
|
4127
|
+
const recommendations = buildVoiceProofTrendRecommendationReport(trend, options);
|
|
4128
|
+
const issues = [
|
|
4129
|
+
...history.length === 0 ? ["No real-call profile reports were present."] : [],
|
|
4130
|
+
...profiles.length === 0 ? ["No benchmark profiles were present."] : [],
|
|
4131
|
+
...summary.failedReports > 0 ? [`${summary.failedReports} real-call profile report(s) failed.`] : [],
|
|
4132
|
+
...recommendations.issues
|
|
4133
|
+
];
|
|
4134
|
+
return {
|
|
4135
|
+
generatedAt,
|
|
4136
|
+
history,
|
|
4137
|
+
issues,
|
|
4138
|
+
ok: trend.ok && issues.length === 0,
|
|
4139
|
+
recommendations,
|
|
4140
|
+
reports: history.length,
|
|
4141
|
+
source: trend.source,
|
|
4142
|
+
status: issues.length > 0 ? trend.status === "pass" ? "fail" : trend.status : trend.status,
|
|
4143
|
+
summary,
|
|
4144
|
+
trend
|
|
4145
|
+
};
|
|
4146
|
+
};
|
|
4088
4147
|
var normalizeProviderStatus = (status) => status === "pass" ? "pass" : status === "fail" ? "fail" : "warn";
|
|
4089
4148
|
var providerSortScore = (provider) => [
|
|
4090
4149
|
recommendationStatusRank[provider.status],
|
|
@@ -4461,6 +4520,37 @@ var renderVoiceProofTrendRecommendationHTML = (report, title = "Voice Provider R
|
|
|
4461
4520
|
const profileRows = report.profiles.length === 0 ? "<li>No benchmark profiles were present.</li>" : report.profiles.map((profile) => `<li><strong>${escapeHtml3(profile.label ?? profile.id)}</strong><span>${escapeHtml3(profile.status)} \xB7 ${escapeHtml3(formatProviderMix(profile.bestProviders))}</span><small>${escapeHtml3(profile.nextMove)}</small></li>`).join("");
|
|
4462
4521
|
return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1" /><title>${escapeHtml3(title)}</title><style>body{background:#101418;color:#f7f3e8;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:1120px;padding:32px}.hero,article{background:#17201d;border:1px solid #2e3d36;border-radius:24px;margin-bottom:16px;padding:22px}.hero{background:linear-gradient(135deg,rgba(20,184,166,.18),rgba(245,158,11,.12))}.eyebrow{color:#5eead4;font-weight:900;letter-spacing:.1em;text-transform:uppercase}h1{font-size:clamp(2.2rem,6vw,4.7rem);letter-spacing:-.06em;line-height:.92;margin:.2rem 0 1rem}.summary{display:flex;flex-wrap:wrap;gap:10px}.pill{border:1px solid #42534a;border-radius:999px;padding:8px 12px}.pass{border-color:rgba(34,197,94,.55)}.warn{border-color:rgba(245,158,11,.7)}.fail{border-color:rgba(239,68,68,.75)}pre{background:#0b1110;border-radius:14px;overflow:auto;padding:12px}a{color:#5eead4}li{margin:.45rem 0}li span,li small{display:block;color:#c9d3ca}</style></head><body><main><section class="hero"><p class="eyebrow">Sustained proof recommendations</p><h1>${escapeHtml3(title)}</h1><p>Generated ${escapeHtml3(report.generatedAt)} from ${escapeHtml3(report.source)}.</p><div class="summary"><span class="pill">Status ${escapeHtml3(report.status)}</span><span class="pill">Provider ${report.summary.keepCurrentProviderPath ? "keep" : "change"}</span><span class="pill">Best mix ${escapeHtml3(formatProviderMix(report.bestProviders))}</span><span class="pill">Profiles ${String(report.profiles.length)}</span><span class="pill">Runtime ${report.summary.keepCurrentRuntimeChannel ? "keep" : "tune"}</span><span class="pill">${String(report.summary.recommendedActions)} action(s)</span></div></section>${cards}<section class="hero"><h2>Benchmark Profiles</h2><ul>${profileRows}</ul></section><section class="hero"><h2>Provider Comparison</h2><ul>${providerRows}</ul></section><section class="hero"><h2>Issues</h2><ul>${issues}</ul></section></main></body></html>`;
|
|
4463
4522
|
};
|
|
4523
|
+
var renderVoiceRealCallProfileHistoryMarkdown = (report, title = "Voice Real-Call Profile History") => [
|
|
4524
|
+
`# ${title}`,
|
|
4525
|
+
"",
|
|
4526
|
+
`- Status: ${report.status}`,
|
|
4527
|
+
`- Reports: ${String(report.reports)}`,
|
|
4528
|
+
`- Profiles: ${String(report.summary.profileCount)}`,
|
|
4529
|
+
`- Cycles: ${String(report.summary.cycles ?? 0)}`,
|
|
4530
|
+
`- Source: ${report.source}`,
|
|
4531
|
+
`- Best provider mix: ${formatProviderMix(report.recommendations.bestProviders)}`,
|
|
4532
|
+
"",
|
|
4533
|
+
"## Profiles",
|
|
4534
|
+
"",
|
|
4535
|
+
"| Profile | Status | Live p95 | Provider p95 | Turn p95 | Provider mix |",
|
|
4536
|
+
"| --- | --- | ---: | ---: | ---: | --- |",
|
|
4537
|
+
...report.summary.profiles?.length ? report.summary.profiles.map((profile) => `| ${escapeMarkdown(profile.label ?? profile.id)} | ${profile.status ?? "unknown"} | ${profile.maxLiveP95Ms ?? "n/a"} | ${profile.maxProviderP95Ms ?? "n/a"} | ${profile.maxTurnP95Ms ?? "n/a"} | ${escapeMarkdown(formatProviderMix(profile.providers ?? []))} |`) : ["| n/a | n/a | n/a | n/a | n/a | No profiles present. |"],
|
|
4538
|
+
"",
|
|
4539
|
+
"## Recommendations",
|
|
4540
|
+
"",
|
|
4541
|
+
...report.recommendations.recommendations.map((recommendation) => `- ${recommendation.status}: ${recommendation.recommendation} ${recommendation.nextMove}`),
|
|
4542
|
+
"",
|
|
4543
|
+
"## Issues",
|
|
4544
|
+
"",
|
|
4545
|
+
...report.issues.length ? report.issues.map((issue) => `- ${issue}`) : ["- None"]
|
|
4546
|
+
].join(`
|
|
4547
|
+
`);
|
|
4548
|
+
var renderVoiceRealCallProfileHistoryHTML = (report, title = "Voice Real-Call Profile History") => {
|
|
4549
|
+
const profileRows = report.summary.profiles?.length ? report.summary.profiles.map((profile) => `<tr><td>${escapeHtml3(profile.label ?? profile.id)}</td><td>${escapeHtml3(profile.status ?? "unknown")}</td><td>${escapeHtml3(profile.maxLiveP95Ms ?? "n/a")}</td><td>${escapeHtml3(profile.maxProviderP95Ms ?? "n/a")}</td><td>${escapeHtml3(profile.maxTurnP95Ms ?? "n/a")}</td><td>${escapeHtml3(formatProviderMix(profile.providers ?? []))}</td></tr>`).join("") : '<tr><td colspan="6">No profiles present.</td></tr>';
|
|
4550
|
+
const recommendations = report.recommendations.recommendations.map((recommendation) => `<article class="${escapeHtml3(recommendation.status)}"><p class="eyebrow">${escapeHtml3(recommendation.surface)} \xB7 ${escapeHtml3(recommendation.status)}</p><h2>${escapeHtml3(recommendation.recommendation)}</h2><p>${escapeHtml3(recommendation.nextMove)}</p></article>`).join("");
|
|
4551
|
+
const issues = report.issues.length === 0 ? "<li>None</li>" : report.issues.map((issue) => `<li>${escapeHtml3(issue)}</li>`).join("");
|
|
4552
|
+
return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1" /><title>${escapeHtml3(title)}</title><style>body{background:#111510;color:#f6f0dd;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:1120px;padding:32px}.hero,article,.card{background:#182117;border:1px solid #32412d;border-radius:24px;margin-bottom:16px;padding:22px}.hero{background:linear-gradient(135deg,rgba(132,204,22,.16),rgba(20,184,166,.12))}.eyebrow{color:#bef264;font-weight:900;letter-spacing:.1em;text-transform:uppercase}h1{font-size:clamp(2.2rem,6vw,4.7rem);letter-spacing:-.06em;line-height:.92;margin:.2rem 0 1rem}.summary{display:flex;flex-wrap:wrap;gap:10px}.pill{border:1px solid #52624b;border-radius:999px;padding:8px 12px}.pass{border-color:rgba(34,197,94,.55)}.warn{border-color:rgba(245,158,11,.7)}.fail{border-color:rgba(239,68,68,.75)}table{border-collapse:collapse;width:100%}td,th{border-bottom:1px solid #32412d;padding:10px;text-align:left}</style></head><body><main><section class="hero"><p class="eyebrow">Real-call benchmark history</p><h1>${escapeHtml3(title)}</h1><p>Generated ${escapeHtml3(report.generatedAt)} from ${escapeHtml3(report.source)}.</p><div class="summary"><span class="pill">Status ${escapeHtml3(report.status)}</span><span class="pill">Reports ${String(report.reports)}</span><span class="pill">Profiles ${String(report.summary.profileCount)}</span><span class="pill">Cycles ${String(report.summary.cycles ?? 0)}</span><span class="pill">Best mix ${escapeHtml3(formatProviderMix(report.recommendations.bestProviders))}</span></div></section><section class="card"><h2>Profiles</h2><table><thead><tr><th>Profile</th><th>Status</th><th>Live p95</th><th>Provider p95</th><th>Turn p95</th><th>Provider mix</th></tr></thead><tbody>${profileRows}</tbody></table></section>${recommendations}<section class="card"><h2>Issues</h2><ul>${issues}</ul></section></main></body></html>`;
|
|
4553
|
+
};
|
|
4464
4554
|
var createVoiceProofTrendRecommendationRoutes = (options) => {
|
|
4465
4555
|
const path = options.path ?? "/api/voice/proof-trend-recommendations";
|
|
4466
4556
|
const htmlPath = options.htmlPath === undefined ? "/voice/proof-trend-recommendations" : options.htmlPath;
|
|
@@ -4503,6 +4593,47 @@ var createVoiceProofTrendRecommendationRoutes = (options) => {
|
|
|
4503
4593
|
}
|
|
4504
4594
|
return routes;
|
|
4505
4595
|
};
|
|
4596
|
+
var createVoiceRealCallProfileHistoryRoutes = (options = {}) => {
|
|
4597
|
+
const path = options.path ?? "/api/voice/real-call-profile-history";
|
|
4598
|
+
const htmlPath = options.htmlPath === undefined ? "/voice/real-call-profile-history" : options.htmlPath;
|
|
4599
|
+
const markdownPath = options.markdownPath === undefined ? "/voice/real-call-profile-history.md" : options.markdownPath;
|
|
4600
|
+
const title = options.title ?? "Voice Real-Call Profile History";
|
|
4601
|
+
const routes = new Elysia({
|
|
4602
|
+
name: options.name ?? "absolutejs-voice-real-call-profile-history"
|
|
4603
|
+
});
|
|
4604
|
+
const loadReport = async () => {
|
|
4605
|
+
const { source, ...routeOptions } = options;
|
|
4606
|
+
const sourceOptions = source === undefined ? routeOptions : typeof source === "function" ? await source() : source;
|
|
4607
|
+
return buildVoiceRealCallProfileHistoryReport({
|
|
4608
|
+
...routeOptions,
|
|
4609
|
+
...sourceOptions
|
|
4610
|
+
});
|
|
4611
|
+
};
|
|
4612
|
+
routes.get(path, async () => Response.json(await loadReport(), { headers: options.headers }));
|
|
4613
|
+
if (htmlPath !== false) {
|
|
4614
|
+
routes.get(htmlPath, async () => {
|
|
4615
|
+
const report = await loadReport();
|
|
4616
|
+
return new Response(renderVoiceRealCallProfileHistoryHTML(report, title), {
|
|
4617
|
+
headers: {
|
|
4618
|
+
"content-type": "text/html; charset=utf-8",
|
|
4619
|
+
...Object.fromEntries(new Headers(options.headers))
|
|
4620
|
+
}
|
|
4621
|
+
});
|
|
4622
|
+
});
|
|
4623
|
+
}
|
|
4624
|
+
if (markdownPath !== false) {
|
|
4625
|
+
routes.get(markdownPath, async () => {
|
|
4626
|
+
const report = await loadReport();
|
|
4627
|
+
return new Response(renderVoiceRealCallProfileHistoryMarkdown(report, title), {
|
|
4628
|
+
headers: {
|
|
4629
|
+
"content-type": "text/markdown; charset=utf-8",
|
|
4630
|
+
...Object.fromEntries(new Headers(options.headers))
|
|
4631
|
+
}
|
|
4632
|
+
});
|
|
4633
|
+
});
|
|
4634
|
+
}
|
|
4635
|
+
return routes;
|
|
4636
|
+
};
|
|
4506
4637
|
var createVoiceProofTrendRoutes = (options) => {
|
|
4507
4638
|
const path = options.path ?? "/api/voice/proof-trends";
|
|
4508
4639
|
const routes = new Elysia({
|
package/dist/index.d.ts
CHANGED
|
@@ -30,10 +30,10 @@ export { assertVoicePlatformCoverage, buildVoicePlatformCoverageSummary, createV
|
|
|
30
30
|
export { assertVoiceCompetitiveCoverage, buildVoiceCompetitiveCoverageReport, createVoiceCompetitiveCoverageRoutes, evaluateVoiceCompetitiveCoverage, renderVoiceCompetitiveCoverageHTML, renderVoiceCompetitiveCoverageMarkdown } from './competitiveCoverage';
|
|
31
31
|
export type { VoiceCompetitiveCoverageAssertionInput, VoiceCompetitiveCoverageAssertionReport, VoiceCompetitiveCoverageIssue, VoiceCompetitiveCoverageLevel, VoiceCompetitiveCoverageReport, VoiceCompetitiveCoverageReportInput, VoiceCompetitiveCoverageRoutesOptions, VoiceCompetitiveCoverageStatus, VoiceCompetitiveCoverageSummary, VoiceCompetitiveDepthLevel, VoiceCompetitiveEvidence, VoiceCompetitiveSurface } from './competitiveCoverage';
|
|
32
32
|
export type { VoicePlatformCoverageAssertionInput, VoicePlatformCoverageAssertionReport, VoicePlatformCoverageEvidence, VoicePlatformCoverageRoutesOptions, VoicePlatformCoverageStatus, VoicePlatformCoverageSummary, VoicePlatformCoverageSummaryInput, VoicePlatformCoverageSurface } from './platformCoverage';
|
|
33
|
-
export { assertVoiceProofTrendEvidence, buildEmptyVoiceProofTrendReport, buildVoiceProofTrendProfileSummaries, buildVoiceProofTrendRecommendationReport, buildVoiceProofTrendReportFromRealCallProfiles, buildVoiceProofTrendReport, createVoiceProofTrendRecommendationRoutes, createVoiceProofTrendRoutes, DEFAULT_VOICE_PROOF_TREND_PROFILE_DEFINITIONS, DEFAULT_VOICE_PROOF_TRENDS_MAX_AGE_MS, evaluateVoiceProofTrendEvidence, formatVoiceProofTrendAge, normalizeVoiceProofTrendReport, readVoiceProofTrendReportFile, renderVoiceProofTrendRecommendationHTML, renderVoiceProofTrendRecommendationMarkdown } from './proofTrends';
|
|
33
|
+
export { assertVoiceProofTrendEvidence, buildEmptyVoiceProofTrendReport, buildVoiceProofTrendProfileSummaries, buildVoiceProofTrendRecommendationReport, buildVoiceProofTrendReportFromRealCallProfiles, buildVoiceProofTrendReport, buildVoiceRealCallProfileHistoryReport, createVoiceProofTrendRecommendationRoutes, createVoiceProofTrendRoutes, createVoiceRealCallProfileHistoryRoutes, DEFAULT_VOICE_PROOF_TREND_PROFILE_DEFINITIONS, DEFAULT_VOICE_PROOF_TRENDS_MAX_AGE_MS, evaluateVoiceProofTrendEvidence, formatVoiceProofTrendAge, normalizeVoiceProofTrendReport, readVoiceProofTrendReportFile, renderVoiceProofTrendRecommendationHTML, renderVoiceProofTrendRecommendationMarkdown, renderVoiceRealCallProfileHistoryHTML, renderVoiceRealCallProfileHistoryMarkdown } from './proofTrends';
|
|
34
34
|
export { buildVoiceProviderDecisionTraceReport, createVoiceProviderDecisionTraceEvent, createVoiceProviderDecisionTraceRoutes, listVoiceProviderDecisionTraces, renderVoiceProviderDecisionTraceHTML, renderVoiceProviderDecisionTraceMarkdown } from './providerDecisionTraces';
|
|
35
35
|
export type { VoiceProviderDecisionStatus, VoiceProviderDecisionSurfaceReport, VoiceProviderDecisionTrace, VoiceProviderDecisionTraceInput, VoiceProviderDecisionTraceIssue, VoiceProviderDecisionTraceReport, VoiceProviderDecisionTraceReportOptions, VoiceProviderDecisionTraceRoutesOptions } from './providerDecisionTraces';
|
|
36
|
-
export type { VoiceProofTrendAssertionInput, VoiceProofTrendAssertionReport, VoiceProofTrendCycle, VoiceProofTrendProfileDefinition, VoiceProofTrendProfileRecommendation, VoiceProofTrendProfileSummaryOptions, VoiceProofTrendProfileSummary, VoiceProofTrendProviderRecommendation, VoiceProofTrendProviderSummary, VoiceProofTrendRecommendation, VoiceProofTrendRecommendationOptions, VoiceProofTrendRecommendationReport, VoiceProofTrendRecommendationRoutesOptions, VoiceProofTrendRecommendationStatus, VoiceProofTrendRecommendationSurface, VoiceProofTrendRealCallProfileEvidence, VoiceProofTrendRealCallProfileReportOptions, VoiceProofTrendReport, VoiceProofTrendReportInput, VoiceProofTrendRoutesOptions, VoiceProofTrendRuntimeChannelSummary, VoiceProofTrendStatus, VoiceProofTrendSummary } from './proofTrends';
|
|
36
|
+
export type { VoiceProofTrendAssertionInput, VoiceProofTrendAssertionReport, VoiceProofTrendCycle, VoiceProofTrendProfileDefinition, VoiceProofTrendProfileRecommendation, VoiceProofTrendProfileSummaryOptions, VoiceProofTrendProfileSummary, VoiceProofTrendProviderRecommendation, VoiceProofTrendProviderSummary, VoiceProofTrendRecommendation, VoiceProofTrendRecommendationOptions, VoiceProofTrendRecommendationReport, VoiceProofTrendRecommendationRoutesOptions, VoiceProofTrendRecommendationStatus, VoiceProofTrendRecommendationSurface, VoiceProofTrendRealCallProfileEvidence, VoiceProofTrendRealCallProfileReportOptions, VoiceProofTrendReport, VoiceProofTrendReportInput, VoiceProofTrendRoutesOptions, VoiceProofTrendRuntimeChannelSummary, VoiceProofTrendStatus, VoiceProofTrendSummary, VoiceRealCallProfileHistoryOptions, VoiceRealCallProfileHistoryReport, VoiceRealCallProfileHistoryRoutesOptions } from './proofTrends';
|
|
37
37
|
export { assertVoiceSloCalibration, buildVoiceSloCalibrationReport, buildVoiceSloReadinessThresholdReport, createVoiceSloReadinessThresholdOptions, createVoiceSloReadinessThresholdRoutes, createVoiceSloThresholdProfile, createVoiceSloCalibrationRoutes, renderVoiceSloCalibrationMarkdown, renderVoiceSloReadinessThresholdHTML, renderVoiceSloReadinessThresholdMarkdown } from './sloCalibration';
|
|
38
38
|
export type { VoiceSloCalibrationMetricKey, VoiceSloCalibrationOptions, VoiceSloCalibrationReport, VoiceSloCalibrationRoutesOptions, VoiceSloCalibrationSample, VoiceSloCalibrationStatus, VoiceSloCalibrationThreshold, VoiceSloCalibrationThresholds, VoiceSloReadinessThresholdReport, VoiceSloReadinessThresholdReportOptions, VoiceSloReadinessThresholdOptions, VoiceSloReadinessThresholdRoutesOptions, VoiceSloThresholdProfile } from './sloCalibration';
|
|
39
39
|
export { assertVoiceLiveOpsControlEvidence, assertVoiceLiveOpsEvidence, buildVoiceLiveOpsControlState, createVoiceLiveOpsController, createVoiceLiveOpsRoutes, createVoiceMemoryLiveOpsControlStore, evaluateVoiceLiveOpsControlEvidence, evaluateVoiceLiveOpsEvidence, getVoiceLiveOpsControlStatus, VOICE_LIVE_OPS_ACTIONS } from './liveOps';
|
package/dist/index.js
CHANGED
|
@@ -14731,6 +14731,7 @@ var normalizeVoiceProofTrendReport = (value, options = {}) => {
|
|
|
14731
14731
|
return buildVoiceProofTrendReport({
|
|
14732
14732
|
...value,
|
|
14733
14733
|
maxAgeMs: options.maxAgeMs ?? value.maxAgeMs,
|
|
14734
|
+
now: options.now ?? ("now" in value ? value.now : undefined),
|
|
14734
14735
|
source: value.source ?? options.source
|
|
14735
14736
|
});
|
|
14736
14737
|
};
|
|
@@ -14987,6 +14988,64 @@ var buildVoiceProofTrendReportFromRealCallProfiles = (options) => {
|
|
|
14987
14988
|
summary
|
|
14988
14989
|
});
|
|
14989
14990
|
};
|
|
14991
|
+
var flattenProofTrendCycles = (reports) => reports.flatMap((report) => report.cycles ?? []);
|
|
14992
|
+
var buildVoiceRealCallProfileHistoryReport = (options = {}) => {
|
|
14993
|
+
const generatedAt = options.generatedAt ?? (options.now instanceof Date ? options.now.toISOString() : typeof options.now === "number" ? new Date(options.now).toISOString() : typeof options.now === "string" ? new Date(options.now).toISOString() : new Date().toISOString());
|
|
14994
|
+
const evidenceReport = options.evidence && options.evidence.length > 0 ? buildVoiceProofTrendReportFromRealCallProfiles({
|
|
14995
|
+
...options,
|
|
14996
|
+
evidence: options.evidence,
|
|
14997
|
+
generatedAt,
|
|
14998
|
+
source: `${options.source ?? "real-call-profile-history"}#evidence`
|
|
14999
|
+
}) : undefined;
|
|
15000
|
+
const history = [
|
|
15001
|
+
...(options.reports ?? []).map((report) => normalizeVoiceProofTrendReport(report, {
|
|
15002
|
+
maxAgeMs: options.maxAgeMs,
|
|
15003
|
+
now: options.now
|
|
15004
|
+
})),
|
|
15005
|
+
...evidenceReport ? [evidenceReport] : []
|
|
15006
|
+
];
|
|
15007
|
+
const profiles = buildVoiceProofTrendProfileSummaries(history, options);
|
|
15008
|
+
const summary = {
|
|
15009
|
+
cycles: history.reduce((total, report) => total + (report.summary.cycles ?? report.cycles.length), 0),
|
|
15010
|
+
failedReports: history.filter((report) => report.ok !== true).length,
|
|
15011
|
+
maxLiveP95Ms: maxNumber(history.map(readProofTrendMaxLiveP95)),
|
|
15012
|
+
maxProviderP95Ms: maxNumber(history.map(readProofTrendMaxProviderP95)),
|
|
15013
|
+
maxTurnP95Ms: maxNumber(history.map(readProofTrendMaxTurnP95)),
|
|
15014
|
+
profileCount: profiles.length,
|
|
15015
|
+
profiles,
|
|
15016
|
+
providers: readProofTrendProviders(history),
|
|
15017
|
+
runtimeChannel: aggregateProofTrendRuntimeChannel(history.map(readProofTrendRuntimeChannel).filter((channel) => channel !== undefined))
|
|
15018
|
+
};
|
|
15019
|
+
const trend = buildVoiceProofTrendReport({
|
|
15020
|
+
baseUrl: options.baseUrl,
|
|
15021
|
+
cycles: flattenProofTrendCycles(history),
|
|
15022
|
+
generatedAt,
|
|
15023
|
+
maxAgeMs: options.maxAgeMs,
|
|
15024
|
+
now: options.now,
|
|
15025
|
+
ok: history.length > 0 && summary.failedReports === 0 && profiles.every((profile) => profile.status !== "fail"),
|
|
15026
|
+
source: options.source ?? "real-call-profile-history",
|
|
15027
|
+
summary
|
|
15028
|
+
});
|
|
15029
|
+
const recommendations = buildVoiceProofTrendRecommendationReport(trend, options);
|
|
15030
|
+
const issues = [
|
|
15031
|
+
...history.length === 0 ? ["No real-call profile reports were present."] : [],
|
|
15032
|
+
...profiles.length === 0 ? ["No benchmark profiles were present."] : [],
|
|
15033
|
+
...summary.failedReports > 0 ? [`${summary.failedReports} real-call profile report(s) failed.`] : [],
|
|
15034
|
+
...recommendations.issues
|
|
15035
|
+
];
|
|
15036
|
+
return {
|
|
15037
|
+
generatedAt,
|
|
15038
|
+
history,
|
|
15039
|
+
issues,
|
|
15040
|
+
ok: trend.ok && issues.length === 0,
|
|
15041
|
+
recommendations,
|
|
15042
|
+
reports: history.length,
|
|
15043
|
+
source: trend.source,
|
|
15044
|
+
status: issues.length > 0 ? trend.status === "pass" ? "fail" : trend.status : trend.status,
|
|
15045
|
+
summary,
|
|
15046
|
+
trend
|
|
15047
|
+
};
|
|
15048
|
+
};
|
|
14990
15049
|
var normalizeProviderStatus = (status) => status === "pass" ? "pass" : status === "fail" ? "fail" : "warn";
|
|
14991
15050
|
var providerSortScore = (provider) => [
|
|
14992
15051
|
recommendationStatusRank[provider.status],
|
|
@@ -15363,6 +15422,37 @@ var renderVoiceProofTrendRecommendationHTML = (report, title = "Voice Provider R
|
|
|
15363
15422
|
const profileRows = report.profiles.length === 0 ? "<li>No benchmark profiles were present.</li>" : report.profiles.map((profile) => `<li><strong>${escapeHtml23(profile.label ?? profile.id)}</strong><span>${escapeHtml23(profile.status)} \xB7 ${escapeHtml23(formatProviderMix(profile.bestProviders))}</span><small>${escapeHtml23(profile.nextMove)}</small></li>`).join("");
|
|
15364
15423
|
return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1" /><title>${escapeHtml23(title)}</title><style>body{background:#101418;color:#f7f3e8;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:1120px;padding:32px}.hero,article{background:#17201d;border:1px solid #2e3d36;border-radius:24px;margin-bottom:16px;padding:22px}.hero{background:linear-gradient(135deg,rgba(20,184,166,.18),rgba(245,158,11,.12))}.eyebrow{color:#5eead4;font-weight:900;letter-spacing:.1em;text-transform:uppercase}h1{font-size:clamp(2.2rem,6vw,4.7rem);letter-spacing:-.06em;line-height:.92;margin:.2rem 0 1rem}.summary{display:flex;flex-wrap:wrap;gap:10px}.pill{border:1px solid #42534a;border-radius:999px;padding:8px 12px}.pass{border-color:rgba(34,197,94,.55)}.warn{border-color:rgba(245,158,11,.7)}.fail{border-color:rgba(239,68,68,.75)}pre{background:#0b1110;border-radius:14px;overflow:auto;padding:12px}a{color:#5eead4}li{margin:.45rem 0}li span,li small{display:block;color:#c9d3ca}</style></head><body><main><section class="hero"><p class="eyebrow">Sustained proof recommendations</p><h1>${escapeHtml23(title)}</h1><p>Generated ${escapeHtml23(report.generatedAt)} from ${escapeHtml23(report.source)}.</p><div class="summary"><span class="pill">Status ${escapeHtml23(report.status)}</span><span class="pill">Provider ${report.summary.keepCurrentProviderPath ? "keep" : "change"}</span><span class="pill">Best mix ${escapeHtml23(formatProviderMix(report.bestProviders))}</span><span class="pill">Profiles ${String(report.profiles.length)}</span><span class="pill">Runtime ${report.summary.keepCurrentRuntimeChannel ? "keep" : "tune"}</span><span class="pill">${String(report.summary.recommendedActions)} action(s)</span></div></section>${cards}<section class="hero"><h2>Benchmark Profiles</h2><ul>${profileRows}</ul></section><section class="hero"><h2>Provider Comparison</h2><ul>${providerRows}</ul></section><section class="hero"><h2>Issues</h2><ul>${issues}</ul></section></main></body></html>`;
|
|
15365
15424
|
};
|
|
15425
|
+
var renderVoiceRealCallProfileHistoryMarkdown = (report, title = "Voice Real-Call Profile History") => [
|
|
15426
|
+
`# ${title}`,
|
|
15427
|
+
"",
|
|
15428
|
+
`- Status: ${report.status}`,
|
|
15429
|
+
`- Reports: ${String(report.reports)}`,
|
|
15430
|
+
`- Profiles: ${String(report.summary.profileCount)}`,
|
|
15431
|
+
`- Cycles: ${String(report.summary.cycles ?? 0)}`,
|
|
15432
|
+
`- Source: ${report.source}`,
|
|
15433
|
+
`- Best provider mix: ${formatProviderMix(report.recommendations.bestProviders)}`,
|
|
15434
|
+
"",
|
|
15435
|
+
"## Profiles",
|
|
15436
|
+
"",
|
|
15437
|
+
"| Profile | Status | Live p95 | Provider p95 | Turn p95 | Provider mix |",
|
|
15438
|
+
"| --- | --- | ---: | ---: | ---: | --- |",
|
|
15439
|
+
...report.summary.profiles?.length ? report.summary.profiles.map((profile) => `| ${escapeMarkdown2(profile.label ?? profile.id)} | ${profile.status ?? "unknown"} | ${profile.maxLiveP95Ms ?? "n/a"} | ${profile.maxProviderP95Ms ?? "n/a"} | ${profile.maxTurnP95Ms ?? "n/a"} | ${escapeMarkdown2(formatProviderMix(profile.providers ?? []))} |`) : ["| n/a | n/a | n/a | n/a | n/a | No profiles present. |"],
|
|
15440
|
+
"",
|
|
15441
|
+
"## Recommendations",
|
|
15442
|
+
"",
|
|
15443
|
+
...report.recommendations.recommendations.map((recommendation) => `- ${recommendation.status}: ${recommendation.recommendation} ${recommendation.nextMove}`),
|
|
15444
|
+
"",
|
|
15445
|
+
"## Issues",
|
|
15446
|
+
"",
|
|
15447
|
+
...report.issues.length ? report.issues.map((issue) => `- ${issue}`) : ["- None"]
|
|
15448
|
+
].join(`
|
|
15449
|
+
`);
|
|
15450
|
+
var renderVoiceRealCallProfileHistoryHTML = (report, title = "Voice Real-Call Profile History") => {
|
|
15451
|
+
const profileRows = report.summary.profiles?.length ? report.summary.profiles.map((profile) => `<tr><td>${escapeHtml23(profile.label ?? profile.id)}</td><td>${escapeHtml23(profile.status ?? "unknown")}</td><td>${escapeHtml23(profile.maxLiveP95Ms ?? "n/a")}</td><td>${escapeHtml23(profile.maxProviderP95Ms ?? "n/a")}</td><td>${escapeHtml23(profile.maxTurnP95Ms ?? "n/a")}</td><td>${escapeHtml23(formatProviderMix(profile.providers ?? []))}</td></tr>`).join("") : '<tr><td colspan="6">No profiles present.</td></tr>';
|
|
15452
|
+
const recommendations = report.recommendations.recommendations.map((recommendation) => `<article class="${escapeHtml23(recommendation.status)}"><p class="eyebrow">${escapeHtml23(recommendation.surface)} \xB7 ${escapeHtml23(recommendation.status)}</p><h2>${escapeHtml23(recommendation.recommendation)}</h2><p>${escapeHtml23(recommendation.nextMove)}</p></article>`).join("");
|
|
15453
|
+
const issues = report.issues.length === 0 ? "<li>None</li>" : report.issues.map((issue) => `<li>${escapeHtml23(issue)}</li>`).join("");
|
|
15454
|
+
return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1" /><title>${escapeHtml23(title)}</title><style>body{background:#111510;color:#f6f0dd;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:1120px;padding:32px}.hero,article,.card{background:#182117;border:1px solid #32412d;border-radius:24px;margin-bottom:16px;padding:22px}.hero{background:linear-gradient(135deg,rgba(132,204,22,.16),rgba(20,184,166,.12))}.eyebrow{color:#bef264;font-weight:900;letter-spacing:.1em;text-transform:uppercase}h1{font-size:clamp(2.2rem,6vw,4.7rem);letter-spacing:-.06em;line-height:.92;margin:.2rem 0 1rem}.summary{display:flex;flex-wrap:wrap;gap:10px}.pill{border:1px solid #52624b;border-radius:999px;padding:8px 12px}.pass{border-color:rgba(34,197,94,.55)}.warn{border-color:rgba(245,158,11,.7)}.fail{border-color:rgba(239,68,68,.75)}table{border-collapse:collapse;width:100%}td,th{border-bottom:1px solid #32412d;padding:10px;text-align:left}</style></head><body><main><section class="hero"><p class="eyebrow">Real-call benchmark history</p><h1>${escapeHtml23(title)}</h1><p>Generated ${escapeHtml23(report.generatedAt)} from ${escapeHtml23(report.source)}.</p><div class="summary"><span class="pill">Status ${escapeHtml23(report.status)}</span><span class="pill">Reports ${String(report.reports)}</span><span class="pill">Profiles ${String(report.summary.profileCount)}</span><span class="pill">Cycles ${String(report.summary.cycles ?? 0)}</span><span class="pill">Best mix ${escapeHtml23(formatProviderMix(report.recommendations.bestProviders))}</span></div></section><section class="card"><h2>Profiles</h2><table><thead><tr><th>Profile</th><th>Status</th><th>Live p95</th><th>Provider p95</th><th>Turn p95</th><th>Provider mix</th></tr></thead><tbody>${profileRows}</tbody></table></section>${recommendations}<section class="card"><h2>Issues</h2><ul>${issues}</ul></section></main></body></html>`;
|
|
15455
|
+
};
|
|
15366
15456
|
var createVoiceProofTrendRecommendationRoutes = (options) => {
|
|
15367
15457
|
const path = options.path ?? "/api/voice/proof-trend-recommendations";
|
|
15368
15458
|
const htmlPath = options.htmlPath === undefined ? "/voice/proof-trend-recommendations" : options.htmlPath;
|
|
@@ -15405,6 +15495,47 @@ var createVoiceProofTrendRecommendationRoutes = (options) => {
|
|
|
15405
15495
|
}
|
|
15406
15496
|
return routes;
|
|
15407
15497
|
};
|
|
15498
|
+
var createVoiceRealCallProfileHistoryRoutes = (options = {}) => {
|
|
15499
|
+
const path = options.path ?? "/api/voice/real-call-profile-history";
|
|
15500
|
+
const htmlPath = options.htmlPath === undefined ? "/voice/real-call-profile-history" : options.htmlPath;
|
|
15501
|
+
const markdownPath = options.markdownPath === undefined ? "/voice/real-call-profile-history.md" : options.markdownPath;
|
|
15502
|
+
const title = options.title ?? "Voice Real-Call Profile History";
|
|
15503
|
+
const routes = new Elysia21({
|
|
15504
|
+
name: options.name ?? "absolutejs-voice-real-call-profile-history"
|
|
15505
|
+
});
|
|
15506
|
+
const loadReport = async () => {
|
|
15507
|
+
const { source, ...routeOptions } = options;
|
|
15508
|
+
const sourceOptions = source === undefined ? routeOptions : typeof source === "function" ? await source() : source;
|
|
15509
|
+
return buildVoiceRealCallProfileHistoryReport({
|
|
15510
|
+
...routeOptions,
|
|
15511
|
+
...sourceOptions
|
|
15512
|
+
});
|
|
15513
|
+
};
|
|
15514
|
+
routes.get(path, async () => Response.json(await loadReport(), { headers: options.headers }));
|
|
15515
|
+
if (htmlPath !== false) {
|
|
15516
|
+
routes.get(htmlPath, async () => {
|
|
15517
|
+
const report = await loadReport();
|
|
15518
|
+
return new Response(renderVoiceRealCallProfileHistoryHTML(report, title), {
|
|
15519
|
+
headers: {
|
|
15520
|
+
"content-type": "text/html; charset=utf-8",
|
|
15521
|
+
...Object.fromEntries(new Headers(options.headers))
|
|
15522
|
+
}
|
|
15523
|
+
});
|
|
15524
|
+
});
|
|
15525
|
+
}
|
|
15526
|
+
if (markdownPath !== false) {
|
|
15527
|
+
routes.get(markdownPath, async () => {
|
|
15528
|
+
const report = await loadReport();
|
|
15529
|
+
return new Response(renderVoiceRealCallProfileHistoryMarkdown(report, title), {
|
|
15530
|
+
headers: {
|
|
15531
|
+
"content-type": "text/markdown; charset=utf-8",
|
|
15532
|
+
...Object.fromEntries(new Headers(options.headers))
|
|
15533
|
+
}
|
|
15534
|
+
});
|
|
15535
|
+
});
|
|
15536
|
+
}
|
|
15537
|
+
return routes;
|
|
15538
|
+
};
|
|
15408
15539
|
var createVoiceProofTrendRoutes = (options) => {
|
|
15409
15540
|
const path = options.path ?? "/api/voice/proof-trends";
|
|
15410
15541
|
const routes = new Elysia21({
|
|
@@ -36985,6 +37116,8 @@ export {
|
|
|
36985
37116
|
renderVoiceRealtimeProviderContractHTML,
|
|
36986
37117
|
renderVoiceRealtimeChannelMarkdown,
|
|
36987
37118
|
renderVoiceRealtimeChannelHTML,
|
|
37119
|
+
renderVoiceRealCallProfileHistoryMarkdown,
|
|
37120
|
+
renderVoiceRealCallProfileHistoryHTML,
|
|
36988
37121
|
renderVoiceQualityHTML,
|
|
36989
37122
|
renderVoiceProviderSloMarkdown,
|
|
36990
37123
|
renderVoiceProviderSloHTML,
|
|
@@ -37228,6 +37361,7 @@ export {
|
|
|
37228
37361
|
createVoiceRealtimeProviderContractRoutes,
|
|
37229
37362
|
createVoiceRealtimeProviderContractMatrixPreset,
|
|
37230
37363
|
createVoiceRealtimeChannelRoutes,
|
|
37364
|
+
createVoiceRealCallProfileHistoryRoutes,
|
|
37231
37365
|
createVoiceReadinessProfile,
|
|
37232
37366
|
createVoiceQualityRoutes,
|
|
37233
37367
|
createVoiceProviderSloRoutes,
|
|
@@ -37438,6 +37572,7 @@ export {
|
|
|
37438
37572
|
buildVoiceRealtimeProviderContractMatrix,
|
|
37439
37573
|
buildVoiceRealtimeChannelRuntimeSamplesFromTrace,
|
|
37440
37574
|
buildVoiceRealtimeChannelReport,
|
|
37575
|
+
buildVoiceRealCallProfileHistoryReport,
|
|
37441
37576
|
buildVoiceProviderSloReport,
|
|
37442
37577
|
buildVoiceProviderOrchestrationReport,
|
|
37443
37578
|
buildVoiceProviderDecisionTraceReport,
|
package/dist/proofTrends.d.ts
CHANGED
|
@@ -257,6 +257,39 @@ export type VoiceProofTrendRecommendationRoutesOptions = VoiceProofTrendRecommen
|
|
|
257
257
|
source?: (() => Promise<VoiceProofTrendReport | VoiceProofTrendReportInput> | VoiceProofTrendReport | VoiceProofTrendReportInput) | VoiceProofTrendReport | VoiceProofTrendReportInput;
|
|
258
258
|
title?: string;
|
|
259
259
|
};
|
|
260
|
+
export type VoiceRealCallProfileHistoryReport = {
|
|
261
|
+
generatedAt: string;
|
|
262
|
+
history: VoiceProofTrendReport[];
|
|
263
|
+
issues: string[];
|
|
264
|
+
ok: boolean;
|
|
265
|
+
recommendations: VoiceProofTrendRecommendationReport;
|
|
266
|
+
reports: number;
|
|
267
|
+
source: string;
|
|
268
|
+
status: VoiceProofTrendStatus;
|
|
269
|
+
summary: VoiceProofTrendSummary & {
|
|
270
|
+
failedReports: number;
|
|
271
|
+
profileCount: number;
|
|
272
|
+
};
|
|
273
|
+
trend: VoiceProofTrendReport;
|
|
274
|
+
};
|
|
275
|
+
export type VoiceRealCallProfileHistoryOptions = VoiceProofTrendProfileSummaryOptions & VoiceProofTrendRecommendationOptions & {
|
|
276
|
+
baseUrl?: string;
|
|
277
|
+
evidence?: readonly VoiceProofTrendRealCallProfileEvidence[];
|
|
278
|
+
generatedAt?: string;
|
|
279
|
+
maxAgeMs?: number;
|
|
280
|
+
now?: Date | number | string;
|
|
281
|
+
reports?: readonly (VoiceProofTrendReport | VoiceProofTrendReportInput)[];
|
|
282
|
+
source?: string;
|
|
283
|
+
};
|
|
284
|
+
export type VoiceRealCallProfileHistoryRoutesOptions = Omit<VoiceRealCallProfileHistoryOptions, 'source'> & {
|
|
285
|
+
headers?: HeadersInit;
|
|
286
|
+
htmlPath?: false | string;
|
|
287
|
+
markdownPath?: false | string;
|
|
288
|
+
name?: string;
|
|
289
|
+
path?: string;
|
|
290
|
+
source?: (() => Promise<VoiceRealCallProfileHistoryOptions> | VoiceRealCallProfileHistoryOptions) | VoiceRealCallProfileHistoryOptions;
|
|
291
|
+
title?: string;
|
|
292
|
+
};
|
|
260
293
|
export declare const DEFAULT_VOICE_PROOF_TRENDS_MAX_AGE_MS: number;
|
|
261
294
|
export declare const DEFAULT_VOICE_PROOF_TREND_PROFILE_DEFINITIONS: ({
|
|
262
295
|
description: string;
|
|
@@ -279,6 +312,7 @@ export declare const buildVoiceProofTrendReport: (input?: VoiceProofTrendReportI
|
|
|
279
312
|
export declare const buildEmptyVoiceProofTrendReport: (source?: string, maxAgeMs?: number) => VoiceProofTrendReport;
|
|
280
313
|
export declare const normalizeVoiceProofTrendReport: (value: VoiceProofTrendReport | VoiceProofTrendReportInput, options?: {
|
|
281
314
|
maxAgeMs?: number;
|
|
315
|
+
now?: Date | number | string;
|
|
282
316
|
source?: string;
|
|
283
317
|
}) => VoiceProofTrendReport;
|
|
284
318
|
export declare const readVoiceProofTrendReportFile: (path: string, options?: {
|
|
@@ -286,11 +320,14 @@ export declare const readVoiceProofTrendReportFile: (path: string, options?: {
|
|
|
286
320
|
}) => Promise<VoiceProofTrendReport>;
|
|
287
321
|
export declare const buildVoiceProofTrendProfileSummaries: (input: VoiceProofTrendReport | readonly VoiceProofTrendReport[], options?: VoiceProofTrendProfileSummaryOptions) => VoiceProofTrendProfileSummary[];
|
|
288
322
|
export declare const buildVoiceProofTrendReportFromRealCallProfiles: (options: VoiceProofTrendRealCallProfileReportOptions) => VoiceProofTrendReport;
|
|
323
|
+
export declare const buildVoiceRealCallProfileHistoryReport: (options?: VoiceRealCallProfileHistoryOptions) => VoiceRealCallProfileHistoryReport;
|
|
289
324
|
export declare const evaluateVoiceProofTrendEvidence: (report: VoiceProofTrendReport, input?: VoiceProofTrendAssertionInput) => VoiceProofTrendAssertionReport;
|
|
290
325
|
export declare const assertVoiceProofTrendEvidence: (report: VoiceProofTrendReport, input?: VoiceProofTrendAssertionInput) => VoiceProofTrendAssertionReport;
|
|
291
326
|
export declare const buildVoiceProofTrendRecommendationReport: (report: VoiceProofTrendReport, options?: VoiceProofTrendRecommendationOptions) => VoiceProofTrendRecommendationReport;
|
|
292
327
|
export declare const renderVoiceProofTrendRecommendationMarkdown: (report: VoiceProofTrendRecommendationReport, title?: string) => string;
|
|
293
328
|
export declare const renderVoiceProofTrendRecommendationHTML: (report: VoiceProofTrendRecommendationReport, title?: string) => string;
|
|
329
|
+
export declare const renderVoiceRealCallProfileHistoryMarkdown: (report: VoiceRealCallProfileHistoryReport, title?: string) => string;
|
|
330
|
+
export declare const renderVoiceRealCallProfileHistoryHTML: (report: VoiceRealCallProfileHistoryReport, title?: string) => string;
|
|
294
331
|
export declare const createVoiceProofTrendRecommendationRoutes: (options: VoiceProofTrendRecommendationRoutesOptions) => Elysia<"", {
|
|
295
332
|
decorator: {};
|
|
296
333
|
store: {};
|
|
@@ -319,6 +356,34 @@ export declare const createVoiceProofTrendRecommendationRoutes: (options: VoiceP
|
|
|
319
356
|
standaloneSchema: {};
|
|
320
357
|
response: {};
|
|
321
358
|
}>;
|
|
359
|
+
export declare const createVoiceRealCallProfileHistoryRoutes: (options?: VoiceRealCallProfileHistoryRoutesOptions) => Elysia<"", {
|
|
360
|
+
decorator: {};
|
|
361
|
+
store: {};
|
|
362
|
+
derive: {};
|
|
363
|
+
resolve: {};
|
|
364
|
+
}, {
|
|
365
|
+
typebox: {};
|
|
366
|
+
error: {};
|
|
367
|
+
}, {
|
|
368
|
+
schema: {};
|
|
369
|
+
standaloneSchema: {};
|
|
370
|
+
macro: {};
|
|
371
|
+
macroFn: {};
|
|
372
|
+
parser: {};
|
|
373
|
+
response: {};
|
|
374
|
+
}, {}, {
|
|
375
|
+
derive: {};
|
|
376
|
+
resolve: {};
|
|
377
|
+
schema: {};
|
|
378
|
+
standaloneSchema: {};
|
|
379
|
+
response: {};
|
|
380
|
+
}, {
|
|
381
|
+
derive: {};
|
|
382
|
+
resolve: {};
|
|
383
|
+
schema: {};
|
|
384
|
+
standaloneSchema: {};
|
|
385
|
+
response: {};
|
|
386
|
+
}>;
|
|
322
387
|
export declare const createVoiceProofTrendRoutes: (options: VoiceProofTrendRoutesOptions) => Elysia<"", {
|
|
323
388
|
decorator: {};
|
|
324
389
|
store: {};
|
package/dist/react/index.js
CHANGED
|
@@ -1577,6 +1577,7 @@ var normalizeVoiceProofTrendReport = (value, options = {}) => {
|
|
|
1577
1577
|
return buildVoiceProofTrendReport({
|
|
1578
1578
|
...value,
|
|
1579
1579
|
maxAgeMs: options.maxAgeMs ?? value.maxAgeMs,
|
|
1580
|
+
now: options.now ?? ("now" in value ? value.now : undefined),
|
|
1580
1581
|
source: value.source ?? options.source
|
|
1581
1582
|
});
|
|
1582
1583
|
};
|
|
@@ -1833,6 +1834,64 @@ var buildVoiceProofTrendReportFromRealCallProfiles = (options) => {
|
|
|
1833
1834
|
summary
|
|
1834
1835
|
});
|
|
1835
1836
|
};
|
|
1837
|
+
var flattenProofTrendCycles = (reports) => reports.flatMap((report) => report.cycles ?? []);
|
|
1838
|
+
var buildVoiceRealCallProfileHistoryReport = (options = {}) => {
|
|
1839
|
+
const generatedAt = options.generatedAt ?? (options.now instanceof Date ? options.now.toISOString() : typeof options.now === "number" ? new Date(options.now).toISOString() : typeof options.now === "string" ? new Date(options.now).toISOString() : new Date().toISOString());
|
|
1840
|
+
const evidenceReport = options.evidence && options.evidence.length > 0 ? buildVoiceProofTrendReportFromRealCallProfiles({
|
|
1841
|
+
...options,
|
|
1842
|
+
evidence: options.evidence,
|
|
1843
|
+
generatedAt,
|
|
1844
|
+
source: `${options.source ?? "real-call-profile-history"}#evidence`
|
|
1845
|
+
}) : undefined;
|
|
1846
|
+
const history = [
|
|
1847
|
+
...(options.reports ?? []).map((report) => normalizeVoiceProofTrendReport(report, {
|
|
1848
|
+
maxAgeMs: options.maxAgeMs,
|
|
1849
|
+
now: options.now
|
|
1850
|
+
})),
|
|
1851
|
+
...evidenceReport ? [evidenceReport] : []
|
|
1852
|
+
];
|
|
1853
|
+
const profiles = buildVoiceProofTrendProfileSummaries(history, options);
|
|
1854
|
+
const summary = {
|
|
1855
|
+
cycles: history.reduce((total, report) => total + (report.summary.cycles ?? report.cycles.length), 0),
|
|
1856
|
+
failedReports: history.filter((report) => report.ok !== true).length,
|
|
1857
|
+
maxLiveP95Ms: maxNumber(history.map(readProofTrendMaxLiveP95)),
|
|
1858
|
+
maxProviderP95Ms: maxNumber(history.map(readProofTrendMaxProviderP95)),
|
|
1859
|
+
maxTurnP95Ms: maxNumber(history.map(readProofTrendMaxTurnP95)),
|
|
1860
|
+
profileCount: profiles.length,
|
|
1861
|
+
profiles,
|
|
1862
|
+
providers: readProofTrendProviders(history),
|
|
1863
|
+
runtimeChannel: aggregateProofTrendRuntimeChannel(history.map(readProofTrendRuntimeChannel).filter((channel) => channel !== undefined))
|
|
1864
|
+
};
|
|
1865
|
+
const trend = buildVoiceProofTrendReport({
|
|
1866
|
+
baseUrl: options.baseUrl,
|
|
1867
|
+
cycles: flattenProofTrendCycles(history),
|
|
1868
|
+
generatedAt,
|
|
1869
|
+
maxAgeMs: options.maxAgeMs,
|
|
1870
|
+
now: options.now,
|
|
1871
|
+
ok: history.length > 0 && summary.failedReports === 0 && profiles.every((profile) => profile.status !== "fail"),
|
|
1872
|
+
source: options.source ?? "real-call-profile-history",
|
|
1873
|
+
summary
|
|
1874
|
+
});
|
|
1875
|
+
const recommendations = buildVoiceProofTrendRecommendationReport(trend, options);
|
|
1876
|
+
const issues = [
|
|
1877
|
+
...history.length === 0 ? ["No real-call profile reports were present."] : [],
|
|
1878
|
+
...profiles.length === 0 ? ["No benchmark profiles were present."] : [],
|
|
1879
|
+
...summary.failedReports > 0 ? [`${summary.failedReports} real-call profile report(s) failed.`] : [],
|
|
1880
|
+
...recommendations.issues
|
|
1881
|
+
];
|
|
1882
|
+
return {
|
|
1883
|
+
generatedAt,
|
|
1884
|
+
history,
|
|
1885
|
+
issues,
|
|
1886
|
+
ok: trend.ok && issues.length === 0,
|
|
1887
|
+
recommendations,
|
|
1888
|
+
reports: history.length,
|
|
1889
|
+
source: trend.source,
|
|
1890
|
+
status: issues.length > 0 ? trend.status === "pass" ? "fail" : trend.status : trend.status,
|
|
1891
|
+
summary,
|
|
1892
|
+
trend
|
|
1893
|
+
};
|
|
1894
|
+
};
|
|
1836
1895
|
var normalizeProviderStatus = (status) => status === "pass" ? "pass" : status === "fail" ? "fail" : "warn";
|
|
1837
1896
|
var providerSortScore = (provider) => [
|
|
1838
1897
|
recommendationStatusRank[provider.status],
|
|
@@ -2209,6 +2268,37 @@ var renderVoiceProofTrendRecommendationHTML = (report, title = "Voice Provider R
|
|
|
2209
2268
|
const profileRows = report.profiles.length === 0 ? "<li>No benchmark profiles were present.</li>" : report.profiles.map((profile) => `<li><strong>${escapeHtml5(profile.label ?? profile.id)}</strong><span>${escapeHtml5(profile.status)} \xB7 ${escapeHtml5(formatProviderMix(profile.bestProviders))}</span><small>${escapeHtml5(profile.nextMove)}</small></li>`).join("");
|
|
2210
2269
|
return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1" /><title>${escapeHtml5(title)}</title><style>body{background:#101418;color:#f7f3e8;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:1120px;padding:32px}.hero,article{background:#17201d;border:1px solid #2e3d36;border-radius:24px;margin-bottom:16px;padding:22px}.hero{background:linear-gradient(135deg,rgba(20,184,166,.18),rgba(245,158,11,.12))}.eyebrow{color:#5eead4;font-weight:900;letter-spacing:.1em;text-transform:uppercase}h1{font-size:clamp(2.2rem,6vw,4.7rem);letter-spacing:-.06em;line-height:.92;margin:.2rem 0 1rem}.summary{display:flex;flex-wrap:wrap;gap:10px}.pill{border:1px solid #42534a;border-radius:999px;padding:8px 12px}.pass{border-color:rgba(34,197,94,.55)}.warn{border-color:rgba(245,158,11,.7)}.fail{border-color:rgba(239,68,68,.75)}pre{background:#0b1110;border-radius:14px;overflow:auto;padding:12px}a{color:#5eead4}li{margin:.45rem 0}li span,li small{display:block;color:#c9d3ca}</style></head><body><main><section class="hero"><p class="eyebrow">Sustained proof recommendations</p><h1>${escapeHtml5(title)}</h1><p>Generated ${escapeHtml5(report.generatedAt)} from ${escapeHtml5(report.source)}.</p><div class="summary"><span class="pill">Status ${escapeHtml5(report.status)}</span><span class="pill">Provider ${report.summary.keepCurrentProviderPath ? "keep" : "change"}</span><span class="pill">Best mix ${escapeHtml5(formatProviderMix(report.bestProviders))}</span><span class="pill">Profiles ${String(report.profiles.length)}</span><span class="pill">Runtime ${report.summary.keepCurrentRuntimeChannel ? "keep" : "tune"}</span><span class="pill">${String(report.summary.recommendedActions)} action(s)</span></div></section>${cards}<section class="hero"><h2>Benchmark Profiles</h2><ul>${profileRows}</ul></section><section class="hero"><h2>Provider Comparison</h2><ul>${providerRows}</ul></section><section class="hero"><h2>Issues</h2><ul>${issues}</ul></section></main></body></html>`;
|
|
2211
2270
|
};
|
|
2271
|
+
var renderVoiceRealCallProfileHistoryMarkdown = (report, title = "Voice Real-Call Profile History") => [
|
|
2272
|
+
`# ${title}`,
|
|
2273
|
+
"",
|
|
2274
|
+
`- Status: ${report.status}`,
|
|
2275
|
+
`- Reports: ${String(report.reports)}`,
|
|
2276
|
+
`- Profiles: ${String(report.summary.profileCount)}`,
|
|
2277
|
+
`- Cycles: ${String(report.summary.cycles ?? 0)}`,
|
|
2278
|
+
`- Source: ${report.source}`,
|
|
2279
|
+
`- Best provider mix: ${formatProviderMix(report.recommendations.bestProviders)}`,
|
|
2280
|
+
"",
|
|
2281
|
+
"## Profiles",
|
|
2282
|
+
"",
|
|
2283
|
+
"| Profile | Status | Live p95 | Provider p95 | Turn p95 | Provider mix |",
|
|
2284
|
+
"| --- | --- | ---: | ---: | ---: | --- |",
|
|
2285
|
+
...report.summary.profiles?.length ? report.summary.profiles.map((profile) => `| ${escapeMarkdown(profile.label ?? profile.id)} | ${profile.status ?? "unknown"} | ${profile.maxLiveP95Ms ?? "n/a"} | ${profile.maxProviderP95Ms ?? "n/a"} | ${profile.maxTurnP95Ms ?? "n/a"} | ${escapeMarkdown(formatProviderMix(profile.providers ?? []))} |`) : ["| n/a | n/a | n/a | n/a | n/a | No profiles present. |"],
|
|
2286
|
+
"",
|
|
2287
|
+
"## Recommendations",
|
|
2288
|
+
"",
|
|
2289
|
+
...report.recommendations.recommendations.map((recommendation) => `- ${recommendation.status}: ${recommendation.recommendation} ${recommendation.nextMove}`),
|
|
2290
|
+
"",
|
|
2291
|
+
"## Issues",
|
|
2292
|
+
"",
|
|
2293
|
+
...report.issues.length ? report.issues.map((issue) => `- ${issue}`) : ["- None"]
|
|
2294
|
+
].join(`
|
|
2295
|
+
`);
|
|
2296
|
+
var renderVoiceRealCallProfileHistoryHTML = (report, title = "Voice Real-Call Profile History") => {
|
|
2297
|
+
const profileRows = report.summary.profiles?.length ? report.summary.profiles.map((profile) => `<tr><td>${escapeHtml5(profile.label ?? profile.id)}</td><td>${escapeHtml5(profile.status ?? "unknown")}</td><td>${escapeHtml5(profile.maxLiveP95Ms ?? "n/a")}</td><td>${escapeHtml5(profile.maxProviderP95Ms ?? "n/a")}</td><td>${escapeHtml5(profile.maxTurnP95Ms ?? "n/a")}</td><td>${escapeHtml5(formatProviderMix(profile.providers ?? []))}</td></tr>`).join("") : '<tr><td colspan="6">No profiles present.</td></tr>';
|
|
2298
|
+
const recommendations = report.recommendations.recommendations.map((recommendation) => `<article class="${escapeHtml5(recommendation.status)}"><p class="eyebrow">${escapeHtml5(recommendation.surface)} \xB7 ${escapeHtml5(recommendation.status)}</p><h2>${escapeHtml5(recommendation.recommendation)}</h2><p>${escapeHtml5(recommendation.nextMove)}</p></article>`).join("");
|
|
2299
|
+
const issues = report.issues.length === 0 ? "<li>None</li>" : report.issues.map((issue) => `<li>${escapeHtml5(issue)}</li>`).join("");
|
|
2300
|
+
return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1" /><title>${escapeHtml5(title)}</title><style>body{background:#111510;color:#f6f0dd;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:1120px;padding:32px}.hero,article,.card{background:#182117;border:1px solid #32412d;border-radius:24px;margin-bottom:16px;padding:22px}.hero{background:linear-gradient(135deg,rgba(132,204,22,.16),rgba(20,184,166,.12))}.eyebrow{color:#bef264;font-weight:900;letter-spacing:.1em;text-transform:uppercase}h1{font-size:clamp(2.2rem,6vw,4.7rem);letter-spacing:-.06em;line-height:.92;margin:.2rem 0 1rem}.summary{display:flex;flex-wrap:wrap;gap:10px}.pill{border:1px solid #52624b;border-radius:999px;padding:8px 12px}.pass{border-color:rgba(34,197,94,.55)}.warn{border-color:rgba(245,158,11,.7)}.fail{border-color:rgba(239,68,68,.75)}table{border-collapse:collapse;width:100%}td,th{border-bottom:1px solid #32412d;padding:10px;text-align:left}</style></head><body><main><section class="hero"><p class="eyebrow">Real-call benchmark history</p><h1>${escapeHtml5(title)}</h1><p>Generated ${escapeHtml5(report.generatedAt)} from ${escapeHtml5(report.source)}.</p><div class="summary"><span class="pill">Status ${escapeHtml5(report.status)}</span><span class="pill">Reports ${String(report.reports)}</span><span class="pill">Profiles ${String(report.summary.profileCount)}</span><span class="pill">Cycles ${String(report.summary.cycles ?? 0)}</span><span class="pill">Best mix ${escapeHtml5(formatProviderMix(report.recommendations.bestProviders))}</span></div></section><section class="card"><h2>Profiles</h2><table><thead><tr><th>Profile</th><th>Status</th><th>Live p95</th><th>Provider p95</th><th>Turn p95</th><th>Provider mix</th></tr></thead><tbody>${profileRows}</tbody></table></section>${recommendations}<section class="card"><h2>Issues</h2><ul>${issues}</ul></section></main></body></html>`;
|
|
2301
|
+
};
|
|
2212
2302
|
var createVoiceProofTrendRecommendationRoutes = (options) => {
|
|
2213
2303
|
const path = options.path ?? "/api/voice/proof-trend-recommendations";
|
|
2214
2304
|
const htmlPath = options.htmlPath === undefined ? "/voice/proof-trend-recommendations" : options.htmlPath;
|
|
@@ -2251,6 +2341,47 @@ var createVoiceProofTrendRecommendationRoutes = (options) => {
|
|
|
2251
2341
|
}
|
|
2252
2342
|
return routes;
|
|
2253
2343
|
};
|
|
2344
|
+
var createVoiceRealCallProfileHistoryRoutes = (options = {}) => {
|
|
2345
|
+
const path = options.path ?? "/api/voice/real-call-profile-history";
|
|
2346
|
+
const htmlPath = options.htmlPath === undefined ? "/voice/real-call-profile-history" : options.htmlPath;
|
|
2347
|
+
const markdownPath = options.markdownPath === undefined ? "/voice/real-call-profile-history.md" : options.markdownPath;
|
|
2348
|
+
const title = options.title ?? "Voice Real-Call Profile History";
|
|
2349
|
+
const routes = new Elysia({
|
|
2350
|
+
name: options.name ?? "absolutejs-voice-real-call-profile-history"
|
|
2351
|
+
});
|
|
2352
|
+
const loadReport = async () => {
|
|
2353
|
+
const { source, ...routeOptions } = options;
|
|
2354
|
+
const sourceOptions = source === undefined ? routeOptions : typeof source === "function" ? await source() : source;
|
|
2355
|
+
return buildVoiceRealCallProfileHistoryReport({
|
|
2356
|
+
...routeOptions,
|
|
2357
|
+
...sourceOptions
|
|
2358
|
+
});
|
|
2359
|
+
};
|
|
2360
|
+
routes.get(path, async () => Response.json(await loadReport(), { headers: options.headers }));
|
|
2361
|
+
if (htmlPath !== false) {
|
|
2362
|
+
routes.get(htmlPath, async () => {
|
|
2363
|
+
const report = await loadReport();
|
|
2364
|
+
return new Response(renderVoiceRealCallProfileHistoryHTML(report, title), {
|
|
2365
|
+
headers: {
|
|
2366
|
+
"content-type": "text/html; charset=utf-8",
|
|
2367
|
+
...Object.fromEntries(new Headers(options.headers))
|
|
2368
|
+
}
|
|
2369
|
+
});
|
|
2370
|
+
});
|
|
2371
|
+
}
|
|
2372
|
+
if (markdownPath !== false) {
|
|
2373
|
+
routes.get(markdownPath, async () => {
|
|
2374
|
+
const report = await loadReport();
|
|
2375
|
+
return new Response(renderVoiceRealCallProfileHistoryMarkdown(report, title), {
|
|
2376
|
+
headers: {
|
|
2377
|
+
"content-type": "text/markdown; charset=utf-8",
|
|
2378
|
+
...Object.fromEntries(new Headers(options.headers))
|
|
2379
|
+
}
|
|
2380
|
+
});
|
|
2381
|
+
});
|
|
2382
|
+
}
|
|
2383
|
+
return routes;
|
|
2384
|
+
};
|
|
2254
2385
|
var createVoiceProofTrendRoutes = (options) => {
|
|
2255
2386
|
const path = options.path ?? "/api/voice/proof-trends";
|
|
2256
2387
|
const routes = new Elysia({
|
package/dist/vue/index.js
CHANGED
|
@@ -1498,6 +1498,7 @@ var normalizeVoiceProofTrendReport = (value, options = {}) => {
|
|
|
1498
1498
|
return buildVoiceProofTrendReport({
|
|
1499
1499
|
...value,
|
|
1500
1500
|
maxAgeMs: options.maxAgeMs ?? value.maxAgeMs,
|
|
1501
|
+
now: options.now ?? ("now" in value ? value.now : undefined),
|
|
1501
1502
|
source: value.source ?? options.source
|
|
1502
1503
|
});
|
|
1503
1504
|
};
|
|
@@ -1754,6 +1755,64 @@ var buildVoiceProofTrendReportFromRealCallProfiles = (options) => {
|
|
|
1754
1755
|
summary
|
|
1755
1756
|
});
|
|
1756
1757
|
};
|
|
1758
|
+
var flattenProofTrendCycles = (reports) => reports.flatMap((report) => report.cycles ?? []);
|
|
1759
|
+
var buildVoiceRealCallProfileHistoryReport = (options = {}) => {
|
|
1760
|
+
const generatedAt = options.generatedAt ?? (options.now instanceof Date ? options.now.toISOString() : typeof options.now === "number" ? new Date(options.now).toISOString() : typeof options.now === "string" ? new Date(options.now).toISOString() : new Date().toISOString());
|
|
1761
|
+
const evidenceReport = options.evidence && options.evidence.length > 0 ? buildVoiceProofTrendReportFromRealCallProfiles({
|
|
1762
|
+
...options,
|
|
1763
|
+
evidence: options.evidence,
|
|
1764
|
+
generatedAt,
|
|
1765
|
+
source: `${options.source ?? "real-call-profile-history"}#evidence`
|
|
1766
|
+
}) : undefined;
|
|
1767
|
+
const history = [
|
|
1768
|
+
...(options.reports ?? []).map((report) => normalizeVoiceProofTrendReport(report, {
|
|
1769
|
+
maxAgeMs: options.maxAgeMs,
|
|
1770
|
+
now: options.now
|
|
1771
|
+
})),
|
|
1772
|
+
...evidenceReport ? [evidenceReport] : []
|
|
1773
|
+
];
|
|
1774
|
+
const profiles = buildVoiceProofTrendProfileSummaries(history, options);
|
|
1775
|
+
const summary = {
|
|
1776
|
+
cycles: history.reduce((total, report) => total + (report.summary.cycles ?? report.cycles.length), 0),
|
|
1777
|
+
failedReports: history.filter((report) => report.ok !== true).length,
|
|
1778
|
+
maxLiveP95Ms: maxNumber(history.map(readProofTrendMaxLiveP95)),
|
|
1779
|
+
maxProviderP95Ms: maxNumber(history.map(readProofTrendMaxProviderP95)),
|
|
1780
|
+
maxTurnP95Ms: maxNumber(history.map(readProofTrendMaxTurnP95)),
|
|
1781
|
+
profileCount: profiles.length,
|
|
1782
|
+
profiles,
|
|
1783
|
+
providers: readProofTrendProviders(history),
|
|
1784
|
+
runtimeChannel: aggregateProofTrendRuntimeChannel(history.map(readProofTrendRuntimeChannel).filter((channel) => channel !== undefined))
|
|
1785
|
+
};
|
|
1786
|
+
const trend = buildVoiceProofTrendReport({
|
|
1787
|
+
baseUrl: options.baseUrl,
|
|
1788
|
+
cycles: flattenProofTrendCycles(history),
|
|
1789
|
+
generatedAt,
|
|
1790
|
+
maxAgeMs: options.maxAgeMs,
|
|
1791
|
+
now: options.now,
|
|
1792
|
+
ok: history.length > 0 && summary.failedReports === 0 && profiles.every((profile) => profile.status !== "fail"),
|
|
1793
|
+
source: options.source ?? "real-call-profile-history",
|
|
1794
|
+
summary
|
|
1795
|
+
});
|
|
1796
|
+
const recommendations = buildVoiceProofTrendRecommendationReport(trend, options);
|
|
1797
|
+
const issues = [
|
|
1798
|
+
...history.length === 0 ? ["No real-call profile reports were present."] : [],
|
|
1799
|
+
...profiles.length === 0 ? ["No benchmark profiles were present."] : [],
|
|
1800
|
+
...summary.failedReports > 0 ? [`${summary.failedReports} real-call profile report(s) failed.`] : [],
|
|
1801
|
+
...recommendations.issues
|
|
1802
|
+
];
|
|
1803
|
+
return {
|
|
1804
|
+
generatedAt,
|
|
1805
|
+
history,
|
|
1806
|
+
issues,
|
|
1807
|
+
ok: trend.ok && issues.length === 0,
|
|
1808
|
+
recommendations,
|
|
1809
|
+
reports: history.length,
|
|
1810
|
+
source: trend.source,
|
|
1811
|
+
status: issues.length > 0 ? trend.status === "pass" ? "fail" : trend.status : trend.status,
|
|
1812
|
+
summary,
|
|
1813
|
+
trend
|
|
1814
|
+
};
|
|
1815
|
+
};
|
|
1757
1816
|
var normalizeProviderStatus = (status) => status === "pass" ? "pass" : status === "fail" ? "fail" : "warn";
|
|
1758
1817
|
var providerSortScore = (provider) => [
|
|
1759
1818
|
recommendationStatusRank[provider.status],
|
|
@@ -2130,6 +2189,37 @@ var renderVoiceProofTrendRecommendationHTML = (report, title = "Voice Provider R
|
|
|
2130
2189
|
const profileRows = report.profiles.length === 0 ? "<li>No benchmark profiles were present.</li>" : report.profiles.map((profile) => `<li><strong>${escapeHtml5(profile.label ?? profile.id)}</strong><span>${escapeHtml5(profile.status)} \xB7 ${escapeHtml5(formatProviderMix(profile.bestProviders))}</span><small>${escapeHtml5(profile.nextMove)}</small></li>`).join("");
|
|
2131
2190
|
return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1" /><title>${escapeHtml5(title)}</title><style>body{background:#101418;color:#f7f3e8;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:1120px;padding:32px}.hero,article{background:#17201d;border:1px solid #2e3d36;border-radius:24px;margin-bottom:16px;padding:22px}.hero{background:linear-gradient(135deg,rgba(20,184,166,.18),rgba(245,158,11,.12))}.eyebrow{color:#5eead4;font-weight:900;letter-spacing:.1em;text-transform:uppercase}h1{font-size:clamp(2.2rem,6vw,4.7rem);letter-spacing:-.06em;line-height:.92;margin:.2rem 0 1rem}.summary{display:flex;flex-wrap:wrap;gap:10px}.pill{border:1px solid #42534a;border-radius:999px;padding:8px 12px}.pass{border-color:rgba(34,197,94,.55)}.warn{border-color:rgba(245,158,11,.7)}.fail{border-color:rgba(239,68,68,.75)}pre{background:#0b1110;border-radius:14px;overflow:auto;padding:12px}a{color:#5eead4}li{margin:.45rem 0}li span,li small{display:block;color:#c9d3ca}</style></head><body><main><section class="hero"><p class="eyebrow">Sustained proof recommendations</p><h1>${escapeHtml5(title)}</h1><p>Generated ${escapeHtml5(report.generatedAt)} from ${escapeHtml5(report.source)}.</p><div class="summary"><span class="pill">Status ${escapeHtml5(report.status)}</span><span class="pill">Provider ${report.summary.keepCurrentProviderPath ? "keep" : "change"}</span><span class="pill">Best mix ${escapeHtml5(formatProviderMix(report.bestProviders))}</span><span class="pill">Profiles ${String(report.profiles.length)}</span><span class="pill">Runtime ${report.summary.keepCurrentRuntimeChannel ? "keep" : "tune"}</span><span class="pill">${String(report.summary.recommendedActions)} action(s)</span></div></section>${cards}<section class="hero"><h2>Benchmark Profiles</h2><ul>${profileRows}</ul></section><section class="hero"><h2>Provider Comparison</h2><ul>${providerRows}</ul></section><section class="hero"><h2>Issues</h2><ul>${issues}</ul></section></main></body></html>`;
|
|
2132
2191
|
};
|
|
2192
|
+
var renderVoiceRealCallProfileHistoryMarkdown = (report, title = "Voice Real-Call Profile History") => [
|
|
2193
|
+
`# ${title}`,
|
|
2194
|
+
"",
|
|
2195
|
+
`- Status: ${report.status}`,
|
|
2196
|
+
`- Reports: ${String(report.reports)}`,
|
|
2197
|
+
`- Profiles: ${String(report.summary.profileCount)}`,
|
|
2198
|
+
`- Cycles: ${String(report.summary.cycles ?? 0)}`,
|
|
2199
|
+
`- Source: ${report.source}`,
|
|
2200
|
+
`- Best provider mix: ${formatProviderMix(report.recommendations.bestProviders)}`,
|
|
2201
|
+
"",
|
|
2202
|
+
"## Profiles",
|
|
2203
|
+
"",
|
|
2204
|
+
"| Profile | Status | Live p95 | Provider p95 | Turn p95 | Provider mix |",
|
|
2205
|
+
"| --- | --- | ---: | ---: | ---: | --- |",
|
|
2206
|
+
...report.summary.profiles?.length ? report.summary.profiles.map((profile) => `| ${escapeMarkdown(profile.label ?? profile.id)} | ${profile.status ?? "unknown"} | ${profile.maxLiveP95Ms ?? "n/a"} | ${profile.maxProviderP95Ms ?? "n/a"} | ${profile.maxTurnP95Ms ?? "n/a"} | ${escapeMarkdown(formatProviderMix(profile.providers ?? []))} |`) : ["| n/a | n/a | n/a | n/a | n/a | No profiles present. |"],
|
|
2207
|
+
"",
|
|
2208
|
+
"## Recommendations",
|
|
2209
|
+
"",
|
|
2210
|
+
...report.recommendations.recommendations.map((recommendation) => `- ${recommendation.status}: ${recommendation.recommendation} ${recommendation.nextMove}`),
|
|
2211
|
+
"",
|
|
2212
|
+
"## Issues",
|
|
2213
|
+
"",
|
|
2214
|
+
...report.issues.length ? report.issues.map((issue) => `- ${issue}`) : ["- None"]
|
|
2215
|
+
].join(`
|
|
2216
|
+
`);
|
|
2217
|
+
var renderVoiceRealCallProfileHistoryHTML = (report, title = "Voice Real-Call Profile History") => {
|
|
2218
|
+
const profileRows = report.summary.profiles?.length ? report.summary.profiles.map((profile) => `<tr><td>${escapeHtml5(profile.label ?? profile.id)}</td><td>${escapeHtml5(profile.status ?? "unknown")}</td><td>${escapeHtml5(profile.maxLiveP95Ms ?? "n/a")}</td><td>${escapeHtml5(profile.maxProviderP95Ms ?? "n/a")}</td><td>${escapeHtml5(profile.maxTurnP95Ms ?? "n/a")}</td><td>${escapeHtml5(formatProviderMix(profile.providers ?? []))}</td></tr>`).join("") : '<tr><td colspan="6">No profiles present.</td></tr>';
|
|
2219
|
+
const recommendations = report.recommendations.recommendations.map((recommendation) => `<article class="${escapeHtml5(recommendation.status)}"><p class="eyebrow">${escapeHtml5(recommendation.surface)} \xB7 ${escapeHtml5(recommendation.status)}</p><h2>${escapeHtml5(recommendation.recommendation)}</h2><p>${escapeHtml5(recommendation.nextMove)}</p></article>`).join("");
|
|
2220
|
+
const issues = report.issues.length === 0 ? "<li>None</li>" : report.issues.map((issue) => `<li>${escapeHtml5(issue)}</li>`).join("");
|
|
2221
|
+
return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1" /><title>${escapeHtml5(title)}</title><style>body{background:#111510;color:#f6f0dd;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:1120px;padding:32px}.hero,article,.card{background:#182117;border:1px solid #32412d;border-radius:24px;margin-bottom:16px;padding:22px}.hero{background:linear-gradient(135deg,rgba(132,204,22,.16),rgba(20,184,166,.12))}.eyebrow{color:#bef264;font-weight:900;letter-spacing:.1em;text-transform:uppercase}h1{font-size:clamp(2.2rem,6vw,4.7rem);letter-spacing:-.06em;line-height:.92;margin:.2rem 0 1rem}.summary{display:flex;flex-wrap:wrap;gap:10px}.pill{border:1px solid #52624b;border-radius:999px;padding:8px 12px}.pass{border-color:rgba(34,197,94,.55)}.warn{border-color:rgba(245,158,11,.7)}.fail{border-color:rgba(239,68,68,.75)}table{border-collapse:collapse;width:100%}td,th{border-bottom:1px solid #32412d;padding:10px;text-align:left}</style></head><body><main><section class="hero"><p class="eyebrow">Real-call benchmark history</p><h1>${escapeHtml5(title)}</h1><p>Generated ${escapeHtml5(report.generatedAt)} from ${escapeHtml5(report.source)}.</p><div class="summary"><span class="pill">Status ${escapeHtml5(report.status)}</span><span class="pill">Reports ${String(report.reports)}</span><span class="pill">Profiles ${String(report.summary.profileCount)}</span><span class="pill">Cycles ${String(report.summary.cycles ?? 0)}</span><span class="pill">Best mix ${escapeHtml5(formatProviderMix(report.recommendations.bestProviders))}</span></div></section><section class="card"><h2>Profiles</h2><table><thead><tr><th>Profile</th><th>Status</th><th>Live p95</th><th>Provider p95</th><th>Turn p95</th><th>Provider mix</th></tr></thead><tbody>${profileRows}</tbody></table></section>${recommendations}<section class="card"><h2>Issues</h2><ul>${issues}</ul></section></main></body></html>`;
|
|
2222
|
+
};
|
|
2133
2223
|
var createVoiceProofTrendRecommendationRoutes = (options) => {
|
|
2134
2224
|
const path = options.path ?? "/api/voice/proof-trend-recommendations";
|
|
2135
2225
|
const htmlPath = options.htmlPath === undefined ? "/voice/proof-trend-recommendations" : options.htmlPath;
|
|
@@ -2172,6 +2262,47 @@ var createVoiceProofTrendRecommendationRoutes = (options) => {
|
|
|
2172
2262
|
}
|
|
2173
2263
|
return routes;
|
|
2174
2264
|
};
|
|
2265
|
+
var createVoiceRealCallProfileHistoryRoutes = (options = {}) => {
|
|
2266
|
+
const path = options.path ?? "/api/voice/real-call-profile-history";
|
|
2267
|
+
const htmlPath = options.htmlPath === undefined ? "/voice/real-call-profile-history" : options.htmlPath;
|
|
2268
|
+
const markdownPath = options.markdownPath === undefined ? "/voice/real-call-profile-history.md" : options.markdownPath;
|
|
2269
|
+
const title = options.title ?? "Voice Real-Call Profile History";
|
|
2270
|
+
const routes = new Elysia({
|
|
2271
|
+
name: options.name ?? "absolutejs-voice-real-call-profile-history"
|
|
2272
|
+
});
|
|
2273
|
+
const loadReport = async () => {
|
|
2274
|
+
const { source, ...routeOptions } = options;
|
|
2275
|
+
const sourceOptions = source === undefined ? routeOptions : typeof source === "function" ? await source() : source;
|
|
2276
|
+
return buildVoiceRealCallProfileHistoryReport({
|
|
2277
|
+
...routeOptions,
|
|
2278
|
+
...sourceOptions
|
|
2279
|
+
});
|
|
2280
|
+
};
|
|
2281
|
+
routes.get(path, async () => Response.json(await loadReport(), { headers: options.headers }));
|
|
2282
|
+
if (htmlPath !== false) {
|
|
2283
|
+
routes.get(htmlPath, async () => {
|
|
2284
|
+
const report = await loadReport();
|
|
2285
|
+
return new Response(renderVoiceRealCallProfileHistoryHTML(report, title), {
|
|
2286
|
+
headers: {
|
|
2287
|
+
"content-type": "text/html; charset=utf-8",
|
|
2288
|
+
...Object.fromEntries(new Headers(options.headers))
|
|
2289
|
+
}
|
|
2290
|
+
});
|
|
2291
|
+
});
|
|
2292
|
+
}
|
|
2293
|
+
if (markdownPath !== false) {
|
|
2294
|
+
routes.get(markdownPath, async () => {
|
|
2295
|
+
const report = await loadReport();
|
|
2296
|
+
return new Response(renderVoiceRealCallProfileHistoryMarkdown(report, title), {
|
|
2297
|
+
headers: {
|
|
2298
|
+
"content-type": "text/markdown; charset=utf-8",
|
|
2299
|
+
...Object.fromEntries(new Headers(options.headers))
|
|
2300
|
+
}
|
|
2301
|
+
});
|
|
2302
|
+
});
|
|
2303
|
+
}
|
|
2304
|
+
return routes;
|
|
2305
|
+
};
|
|
2175
2306
|
var createVoiceProofTrendRoutes = (options) => {
|
|
2176
2307
|
const path = options.path ?? "/api/voice/proof-trends";
|
|
2177
2308
|
const routes = new Elysia({
|