@codeledger/insight-ui 0.8.9
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/LICENSE +27 -0
- package/dist/components/CockpitLayout.d.ts +60 -0
- package/dist/components/CockpitLayout.d.ts.map +1 -0
- package/dist/components/CockpitLayout.js +49 -0
- package/dist/components/CockpitLayout.js.map +1 -0
- package/dist/components/ScopeControls.d.ts +36 -0
- package/dist/components/ScopeControls.d.ts.map +1 -0
- package/dist/components/ScopeControls.js +137 -0
- package/dist/components/ScopeControls.js.map +1 -0
- package/dist/components/SystemInsights.d.ts +13 -0
- package/dist/components/SystemInsights.d.ts.map +1 -0
- package/dist/components/SystemInsights.js +17 -0
- package/dist/components/SystemInsights.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/pages/Efficiency.d.ts +8 -0
- package/dist/pages/Efficiency.d.ts.map +1 -0
- package/dist/pages/Efficiency.js +66 -0
- package/dist/pages/Efficiency.js.map +1 -0
- package/dist/pages/Integrity.d.ts +8 -0
- package/dist/pages/Integrity.d.ts.map +1 -0
- package/dist/pages/Integrity.js +39 -0
- package/dist/pages/Integrity.js.map +1 -0
- package/dist/pages/Knowledge.d.ts +8 -0
- package/dist/pages/Knowledge.d.ts.map +1 -0
- package/dist/pages/Knowledge.js +32 -0
- package/dist/pages/Knowledge.js.map +1 -0
- package/dist/pages/Overview.d.ts +8 -0
- package/dist/pages/Overview.d.ts.map +1 -0
- package/dist/pages/Overview.js +53 -0
- package/dist/pages/Overview.js.map +1 -0
- package/dist/pages/Quality.d.ts +8 -0
- package/dist/pages/Quality.d.ts.map +1 -0
- package/dist/pages/Quality.js +32 -0
- package/dist/pages/Quality.js.map +1 -0
- package/dist/pages/Value.d.ts +8 -0
- package/dist/pages/Value.d.ts.map +1 -0
- package/dist/pages/Value.js +10 -0
- package/dist/pages/Value.js.map +1 -0
- package/dist/render.d.ts +3 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +105 -0
- package/dist/render.js.map +1 -0
- package/dist/theme.d.ts +2 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +442 -0
- package/dist/theme.js.map +1 -0
- package/package.json +43 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Intelligent Context AI, Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
Note: This license applies to the CLI wrapper, types, repository scanning,
|
|
26
|
+
instrumentation, harness, and report packages (the "Plugin"). The scoring
|
|
27
|
+
engine (packages/core-engine/bin/) is licensed separately under LICENSE-CORE.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
import type { InsightHotspotEntry, InsightPatternEntry, InsightRecommendation, InsightShadowEntry, InsightSignal, InsightValueTrend, ValueScopeContext } from '@codeledger/types';
|
|
3
|
+
interface PageHeaderProps {
|
|
4
|
+
title: string;
|
|
5
|
+
subtitle?: string;
|
|
6
|
+
scope: ValueScopeContext;
|
|
7
|
+
confidence?: string;
|
|
8
|
+
syntheticLabel?: string;
|
|
9
|
+
trend?: InsightValueTrend;
|
|
10
|
+
}
|
|
11
|
+
export declare function PageHeader({ title, subtitle, scope, confidence, syntheticLabel, trend }: PageHeaderProps): ReactElement;
|
|
12
|
+
export interface MetricCardDefinition {
|
|
13
|
+
label: string;
|
|
14
|
+
value: number;
|
|
15
|
+
detail: string;
|
|
16
|
+
metricKey?: string;
|
|
17
|
+
severity?: 'high' | 'medium' | 'low';
|
|
18
|
+
format?: 'percent' | 'raw';
|
|
19
|
+
}
|
|
20
|
+
export declare function MetricGrid({ cards }: {
|
|
21
|
+
cards: MetricCardDefinition[];
|
|
22
|
+
}): ReactElement;
|
|
23
|
+
interface EvidenceLinkProps {
|
|
24
|
+
metric: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function EvidenceLink({ metric }: EvidenceLinkProps): ReactElement;
|
|
27
|
+
export declare function InsightStrip(props: {
|
|
28
|
+
insights?: InsightSignal[];
|
|
29
|
+
title?: string;
|
|
30
|
+
subtitle?: string;
|
|
31
|
+
focusMetrics?: string[];
|
|
32
|
+
limit?: number;
|
|
33
|
+
}): ReactElement | null;
|
|
34
|
+
export declare function ValueHero({ estimated, scope, confidence, trend, }: {
|
|
35
|
+
estimated: number;
|
|
36
|
+
scope: ValueScopeContext;
|
|
37
|
+
confidence?: string;
|
|
38
|
+
trend?: InsightValueTrend;
|
|
39
|
+
}): ReactElement;
|
|
40
|
+
export declare function ActionCallout({ recommendations }: {
|
|
41
|
+
recommendations: InsightRecommendation[];
|
|
42
|
+
}): ReactElement | null;
|
|
43
|
+
export declare function HotspotList({ entries, title }: {
|
|
44
|
+
entries: InsightHotspotEntry[];
|
|
45
|
+
title: string;
|
|
46
|
+
}): ReactElement;
|
|
47
|
+
export declare function PatternSpreadList({ patterns }: {
|
|
48
|
+
patterns?: InsightPatternEntry[];
|
|
49
|
+
}): ReactElement | null;
|
|
50
|
+
export declare function ShadowHotspotList({ entries }: {
|
|
51
|
+
entries?: InsightShadowEntry[];
|
|
52
|
+
}): ReactElement | null;
|
|
53
|
+
export declare function ValueBreakdownCard({ label, hours, share, metricKey, }: {
|
|
54
|
+
label: string;
|
|
55
|
+
hours: number;
|
|
56
|
+
share: number;
|
|
57
|
+
metricKey: string;
|
|
58
|
+
}): ReactElement;
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=CockpitLayout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CockpitLayout.d.ts","sourceRoot":"","sources":["../../src/components/CockpitLayout.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { SystemInsights } from './SystemInsights.js';
|
|
3
|
+
export function PageHeader({ title, subtitle, scope, confidence, syntheticLabel, trend }) {
|
|
4
|
+
return (_jsxs("section", { className: "page-header", children: [_jsxs("div", { children: [_jsx("p", { className: "page-title", children: title }), subtitle && _jsx("p", { className: "page-subtitle", children: subtitle }), _jsxs("div", { className: "scope-context-bar", children: [_jsx("span", { children: scope.windowLabel }), _jsxs("span", { children: [scope.executions, " executions \u00B7 ", scope.repos, " repos"] }), _jsxs("span", { children: ["Teams: ", scope.teams.length > 0 ? scope.teams.join(', ') : 'unattributed'] })] }), trend && (_jsxs("p", { className: "page-trend-note", children: ["Value ", trend.direction, " ", Math.abs(trend.delta), " vs ", trend.period, "."] }))] }), _jsxs("div", { className: "header-badges", children: [confidence && _jsxs("span", { className: `confidence-badge ${confidence}`, children: ["Confidence: ", confidence] }), syntheticLabel && _jsx("span", { className: "synthetic-pill", children: syntheticLabel })] })] }));
|
|
5
|
+
}
|
|
6
|
+
export function MetricGrid({ cards }) {
|
|
7
|
+
return (_jsx("div", { className: "metric-grid", children: cards.map((card) => (_jsx(MetricCard, { ...card }, card.label))) }));
|
|
8
|
+
}
|
|
9
|
+
function MetricCard({ label, value, detail, metricKey, severity, format = 'percent' }) {
|
|
10
|
+
return (_jsxs("article", { className: "metric-card", children: [_jsxs("header", { children: [_jsx("span", { className: "metric-label", children: label }), severity && _jsx("span", { className: `metric-severity ${severity}`, children: severity })] }), _jsxs("div", { className: "metric-display", children: [_jsx("strong", { children: format === 'percent' ? `${Math.round(value * 100)}%` : value.toFixed(2) }), _jsx("span", { children: detail })] }), metricKey && (_jsx("footer", { children: _jsx(EvidenceLink, { metric: metricKey }) }))] }));
|
|
11
|
+
}
|
|
12
|
+
export function EvidenceLink({ metric }) {
|
|
13
|
+
return (_jsx("button", { className: "btn-link evidence-link", "data-metric": metric, children: "View evidence" }));
|
|
14
|
+
}
|
|
15
|
+
export function InsightStrip(props) {
|
|
16
|
+
if (!props.insights || props.insights.length === 0)
|
|
17
|
+
return null;
|
|
18
|
+
return (_jsx("div", { className: "insight-strip", children: _jsx(SystemInsights, { ...props, className: "insight-strip-panel", limit: props.limit ?? 4 }) }));
|
|
19
|
+
}
|
|
20
|
+
export function ValueHero({ estimated, scope, confidence, trend, }) {
|
|
21
|
+
return (_jsxs("section", { className: "value-hero", children: [_jsxs("div", { children: [_jsx("p", { className: "kicker", children: "Value" }), _jsxs("h2", { className: "value-title", children: ["$", Math.round(estimated).toLocaleString()] }), trend && (_jsxs("p", { className: "value-trend-note", children: [trend.direction, " ", Math.abs(trend.delta), " vs ", trend.period] })), _jsxs("div", { className: "scope-context-bar", children: [_jsx("span", { children: scope.windowLabel }), _jsxs("span", { children: [scope.executions, " executions"] }), _jsxs("span", { children: [scope.repos, " repos"] })] })] }), confidence && _jsx("span", { className: `confidence-badge ${confidence}`, children: confidence })] }));
|
|
22
|
+
}
|
|
23
|
+
export function ActionCallout({ recommendations }) {
|
|
24
|
+
if (!recommendations || recommendations.length === 0) {
|
|
25
|
+
return (_jsx("section", { className: "action-callout", children: _jsx("p", { children: "No priority actions right now." }) }));
|
|
26
|
+
}
|
|
27
|
+
return (_jsxs("section", { className: "action-callout", children: [_jsx("div", { className: "kicker", children: "Next action" }), _jsx("div", { className: "callout-grid", children: recommendations.slice(0, 3).map((item) => (_jsxs("article", { children: [_jsxs("div", { className: "callout-title", children: [_jsx("strong", { children: item.title }), _jsx("span", { className: `metric-severity ${item.severity}`, children: item.severity })] }), _jsx("p", { children: item.description })] }, item.title))) })] }));
|
|
28
|
+
}
|
|
29
|
+
export function HotspotList({ entries, title }) {
|
|
30
|
+
if (!entries || entries.length === 0) {
|
|
31
|
+
return (_jsxs("section", { className: "hotspot-list", children: [_jsx("div", { className: "kicker", children: title }), _jsx("p", { className: "scope-context", children: "No hotspots detected yet." })] }));
|
|
32
|
+
}
|
|
33
|
+
return (_jsxs("section", { className: "hotspot-list", children: [_jsx("div", { className: "kicker", children: title }), _jsx("div", { className: "hotspot-items", children: entries.slice(0, 4).map((entry) => (_jsxs("article", { children: [_jsxs("header", { children: [_jsx("strong", { children: entry.repo }), _jsx("span", { className: `trend-indicator ${entry.direction}`, children: entry.direction })] }), _jsx("p", { children: entry.label }), _jsxs("div", { className: "hotspot-metrics", children: [_jsxs("span", { children: [Math.round(entry.value * 100), "%"] }), _jsxs("span", { children: [Math.round(entry.secondaryValue * 100), "%"] })] }), _jsx(EvidenceLink, { metric: entry.label === 'Rework' ? 'reworkRatio' : entry.label === 'Violations' ? 'integrityDrift' : 'executionReliability' })] }, `${entry.repo}-${entry.label}`))) })] }));
|
|
34
|
+
}
|
|
35
|
+
export function PatternSpreadList({ patterns }) {
|
|
36
|
+
if (!patterns || patterns.length === 0)
|
|
37
|
+
return null;
|
|
38
|
+
return (_jsxs("section", { className: "pattern-list", children: [_jsx("div", { className: "kicker", children: "Top reused patterns" }), _jsx("div", { className: "pattern-items", children: patterns.slice(0, 4).map((pattern) => (_jsxs("article", { children: [_jsx("strong", { children: pattern.pattern }), _jsxs("p", { children: [pattern.count, " reuse events \u00B7 ", pattern.repos.join(', ')] })] }, pattern.pattern))) })] }));
|
|
39
|
+
}
|
|
40
|
+
export function ShadowHotspotList({ entries }) {
|
|
41
|
+
if (!entries || entries.length === 0)
|
|
42
|
+
return null;
|
|
43
|
+
return (_jsxs("section", { className: "hotspot-list", children: [_jsx("div", { className: "kicker", children: "Shadow knowledge hotspots" }), _jsx("div", { className: "hotspot-items", children: entries.slice(0, 4).map((entry) => (_jsxs("article", { children: [_jsx("strong", { children: entry.repo }), _jsxs("p", { children: ["Shadow index ", entry.shadowIndex.toFixed(2)] })] }, entry.repo))) })] }));
|
|
44
|
+
}
|
|
45
|
+
export function ValueBreakdownCard({ label, hours, share, metricKey, }) {
|
|
46
|
+
const shareLabel = Number.isFinite(share) ? `${(share * 100).toFixed(1)}%` : '—';
|
|
47
|
+
return (_jsxs("div", { className: "row value-breakdown-row", children: [_jsxs("div", { children: [_jsx("strong", { children: label }), _jsxs("span", { children: [hours.toFixed(1), " hours \u00B7 ", shareLabel] })] }), _jsx(EvidenceLink, { metric: metricKey })] }));
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=CockpitLayout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CockpitLayout.js","sourceRoot":"","sources":["../../src/components/CockpitLayout.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
import type { AttributionStatus, HotspotSummary, InsightSnapshot, PatternSpreadSummary, ScopeComparison, SyntheticScenarioSummary } from '@codeledger/types';
|
|
3
|
+
interface ScopeHeaderProps {
|
|
4
|
+
snapshot: InsightSnapshot;
|
|
5
|
+
pathname: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function ScopeHeader({ snapshot, pathname }: ScopeHeaderProps): ReactElement | null;
|
|
8
|
+
export declare function ModeTabs({ pathname, snapshot }: {
|
|
9
|
+
pathname: string;
|
|
10
|
+
snapshot: InsightSnapshot;
|
|
11
|
+
}): ReactElement;
|
|
12
|
+
interface ComparisonPanelProps {
|
|
13
|
+
comparisons: ScopeComparison[];
|
|
14
|
+
title?: string;
|
|
15
|
+
limit?: number;
|
|
16
|
+
filter?: string[];
|
|
17
|
+
}
|
|
18
|
+
export declare function ComparisonPanel({ comparisons, title, limit, filter }: ComparisonPanelProps): ReactElement | null;
|
|
19
|
+
interface HotspotPanelProps {
|
|
20
|
+
summaries?: HotspotSummary[];
|
|
21
|
+
type: HotspotSummary['type'];
|
|
22
|
+
title: string;
|
|
23
|
+
placeholder: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function HotspotPanel({ summaries, type, title, placeholder }: HotspotPanelProps): ReactElement;
|
|
26
|
+
interface PatternSpreadProps {
|
|
27
|
+
patternSpread?: PatternSpreadSummary;
|
|
28
|
+
}
|
|
29
|
+
export declare function PatternSpreadPanel({ patternSpread }: PatternSpreadProps): ReactElement | null;
|
|
30
|
+
interface ScenarioBannerProps {
|
|
31
|
+
syntheticScenario?: SyntheticScenarioSummary | null;
|
|
32
|
+
}
|
|
33
|
+
export declare function ScenarioBanner({ syntheticScenario }: ScenarioBannerProps): ReactElement | null;
|
|
34
|
+
export declare function formatAttribution(attribution?: AttributionStatus): string;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=ScopeControls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScopeControls.d.ts","sourceRoot":"","sources":["../../src/components/ScopeControls.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EAEd,eAAe,EAEf,oBAAoB,EACpB,eAAe,EAEf,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAG3B,UAAU,gBAAgB;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AA4BD,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,gBAAgB,GAAG,YAAY,GAAG,IAAI,CA+CzF;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,GAAG,YAAY,CA4B9G;AA2FD,UAAU,oBAAoB;IAC5B,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,EAAE,WAAW,EAAE,KAA2B,EAAE,KAAS,EAAE,MAAM,EAAE,EAAE,oBAAoB,GAAG,YAAY,GAAG,IAAI,CA0B1I;AAED,UAAU,iBAAiB;IACzB,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,iBAAiB,GAAG,YAAY,CAkDrG;AAED,UAAU,kBAAkB;IAC1B,aAAa,CAAC,EAAE,oBAAoB,CAAC;CACtC;AAED,wBAAgB,kBAAkB,CAAC,EAAE,aAAa,EAAE,EAAE,kBAAkB,GAAG,YAAY,GAAG,IAAI,CA6B7F;AAED,UAAU,mBAAmB;IAC3B,iBAAiB,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAC;CACrD;AAED,wBAAgB,cAAc,CAAC,EAAE,iBAAiB,EAAE,EAAE,mBAAmB,GAAG,YAAY,GAAG,IAAI,CAc9F;AAED,wBAAgB,iBAAiB,CAAC,WAAW,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAGzE"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { DEFAULT_INSIGHT_SCENARIO_ID, listScenarioSummaries } from '@codeledger/telemetry';
|
|
3
|
+
const metricLabels = {
|
|
4
|
+
executionReliability: 'Execution reliability',
|
|
5
|
+
reworkRatio: 'Rework ratio',
|
|
6
|
+
integrityDrift: 'Integrity drift',
|
|
7
|
+
patternReuseRate: 'Pattern reuse rate',
|
|
8
|
+
goldenPathAdherence: 'Golden path adherence',
|
|
9
|
+
};
|
|
10
|
+
const scopeTypeLabels = {
|
|
11
|
+
repo: 'Repo',
|
|
12
|
+
team: 'Team',
|
|
13
|
+
org: 'Org',
|
|
14
|
+
};
|
|
15
|
+
const MODE_DESCRIPTIONS = {
|
|
16
|
+
'your-team': 'Live engineering signals from your current scope.',
|
|
17
|
+
'what-this-becomes': 'Scenario-backed projection leveraging simulated event history.',
|
|
18
|
+
};
|
|
19
|
+
const MODE_OPTIONS = [
|
|
20
|
+
{ id: 'your-team', label: 'Your Team', description: 'Live signals from today.' },
|
|
21
|
+
{ id: 'what-this-becomes', label: 'What This Becomes', description: 'Projected compounding value.' },
|
|
22
|
+
];
|
|
23
|
+
const SCENARIO_OPTIONS = listScenarioSummaries();
|
|
24
|
+
export function ScopeHeader({ snapshot, pathname }) {
|
|
25
|
+
const summary = snapshot.scopeSummary;
|
|
26
|
+
const filters = summary?.filters ?? snapshot.filters;
|
|
27
|
+
const attribution = summary?.attribution ?? snapshot.attributionStatus;
|
|
28
|
+
const scopeType = summary?.scopeType ?? (filters.scopeType ?? 'repo');
|
|
29
|
+
const scopeId = summary?.scopeId ?? filters.scopeId ?? '';
|
|
30
|
+
const scopeLabel = summary?.scopeLabel ?? (scopeId || 'Workspace');
|
|
31
|
+
const eventCount = summary?.eventCount ?? snapshot.eventCount;
|
|
32
|
+
const repoCount = summary?.repoCount ?? snapshot.metrics.overview.repos.length;
|
|
33
|
+
const teamCount = summary?.teamCount ?? snapshot.metrics.overview.teams.length;
|
|
34
|
+
const viewMode = filters.view ?? 'your-team';
|
|
35
|
+
const viewLabel = viewMode === 'your-team' ? 'Your Team' : 'What This Becomes';
|
|
36
|
+
return (_jsxs("section", { className: "scope-shell", children: [_jsxs("div", { children: [_jsxs("div", { className: "scope-title", children: ["Viewing: ", scopeTypeLabels[scopeType], scopeType === 'org' ? '' : ` / ${scopeLabel}`] }), _jsxs("p", { className: "scope-context", children: ["Based on ", eventCount, " events across ", repoCount, " repo", repoCount === 1 ? '' : 's', teamCount ? ` and ${teamCount} team${teamCount === 1 ? '' : 's'}` : '', "."] }), _jsxs("p", { className: "scope-context scope-view-mode", children: ["Mode: ", _jsx("strong", { children: viewLabel }), " \u2014 ", MODE_DESCRIPTIONS[viewMode]] }), attribution && (_jsxs("p", { className: "scope-context", children: ["Attribution quality: ", attribution.quality, " \u00B7 ", attribution.unattributedEvents, " unattributed events"] }))] }), _jsxs("div", { className: "scope-actions", children: [_jsx(ScopeSelector, { pathname: pathname, filters: filters, metrics: snapshot.metrics.overview, currentScopeType: scopeType, currentScopeId: scopeId }), viewMode === 'what-this-becomes' && (_jsx(ScenarioPicker, { filters: filters, pathname: pathname })), _jsx(ScenarioBanner, { syntheticScenario: snapshot.syntheticScenario ?? null })] })] }));
|
|
37
|
+
}
|
|
38
|
+
export function ModeTabs({ pathname, snapshot }) {
|
|
39
|
+
const filters = snapshot.filters;
|
|
40
|
+
const viewMode = filters.view ?? 'your-team';
|
|
41
|
+
const scenarioChoice = filters.scenarioId ?? DEFAULT_INSIGHT_SCENARIO_ID;
|
|
42
|
+
const pathPrefix = pathname === '/' ? '/' : pathname;
|
|
43
|
+
return (_jsx("nav", { className: "mode-tabs", children: MODE_OPTIONS.map((mode) => {
|
|
44
|
+
const overrides = {
|
|
45
|
+
view: mode.id,
|
|
46
|
+
};
|
|
47
|
+
if (mode.id === 'what-this-becomes') {
|
|
48
|
+
overrides.scenarioId = scenarioChoice;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
overrides.scenarioId = undefined;
|
|
52
|
+
}
|
|
53
|
+
const query = buildFiltersQuery(filters, overrides);
|
|
54
|
+
const href = query ? `${pathPrefix}?${query}` : pathPrefix;
|
|
55
|
+
return (_jsxs("a", { className: `mode-pill ${mode.id === viewMode ? 'active' : ''}`, href: href, children: [_jsx("span", { children: mode.label }), _jsx("small", { children: mode.description })] }, mode.id));
|
|
56
|
+
}) }));
|
|
57
|
+
}
|
|
58
|
+
function ScopeSelector({ pathname, filters, metrics, currentScopeType, currentScopeId, }) {
|
|
59
|
+
const pathPrefix = pathname === '/' ? '/' : pathname;
|
|
60
|
+
const repoOption = currentScopeType === 'repo' ? currentScopeId : metrics.repos[0] ?? 'workspace';
|
|
61
|
+
const teamOption = currentScopeType === 'team' ? currentScopeId : metrics.teams[0] ?? 'unattributed';
|
|
62
|
+
const orgLink = `${pathPrefix}?${buildFiltersQuery(filters, { scopeType: 'org' })}`;
|
|
63
|
+
const repoLink = `${pathPrefix}?${buildFiltersQuery(filters, { scopeType: 'repo', scopeId: repoOption })}`;
|
|
64
|
+
const teamLink = `${pathPrefix}?${buildFiltersQuery(filters, { scopeType: 'team', scopeId: teamOption })}`;
|
|
65
|
+
return (_jsxs("div", { className: "scope-selector", children: [_jsx("span", { className: "scope-selector-label", children: "Scope" }), _jsxs("div", { className: "scope-selector-row", children: [_jsxs("a", { className: `scope-pill ${currentScopeType === 'repo' ? 'active' : ''}`, href: repoLink, children: ["Repo: ", repoOption] }), _jsxs("a", { className: `scope-pill ${currentScopeType === 'team' ? 'active' : ''}`, href: teamLink, children: ["Team: ", teamOption] }), _jsx("a", { className: `scope-pill ${currentScopeType === 'org' ? 'active' : ''}`, href: orgLink, children: "Org view" })] })] }));
|
|
66
|
+
}
|
|
67
|
+
function ScenarioPicker({ filters, pathname }) {
|
|
68
|
+
if (SCENARIO_OPTIONS.length === 0)
|
|
69
|
+
return null;
|
|
70
|
+
const activeScenario = filters.scenarioId ?? DEFAULT_INSIGHT_SCENARIO_ID;
|
|
71
|
+
const pathPrefix = pathname === '/' ? '/' : pathname;
|
|
72
|
+
return (_jsxs("div", { className: "scenario-picker", children: [_jsx("span", { className: "scenario-picker-label", children: "Projected scenario" }), _jsx("div", { className: "scenario-picker-row", children: SCENARIO_OPTIONS.map((scenario) => {
|
|
73
|
+
const query = buildFiltersQuery(filters, {
|
|
74
|
+
view: 'what-this-becomes',
|
|
75
|
+
scenarioId: scenario.id,
|
|
76
|
+
});
|
|
77
|
+
const href = query ? `${pathPrefix}?${query}` : pathPrefix;
|
|
78
|
+
return (_jsx("a", { className: `scenario-pill ${scenario.id === activeScenario ? 'active' : ''}`, href: href, children: scenario.label }, scenario.id));
|
|
79
|
+
}) })] }));
|
|
80
|
+
}
|
|
81
|
+
function buildFiltersQuery(filters, overrides) {
|
|
82
|
+
const params = new URLSearchParams();
|
|
83
|
+
const combined = { ...filters, ...overrides };
|
|
84
|
+
if (combined.dateFrom)
|
|
85
|
+
params.set('dateFrom', combined.dateFrom);
|
|
86
|
+
if (combined.dateTo)
|
|
87
|
+
params.set('dateTo', combined.dateTo);
|
|
88
|
+
if (combined.scopeType)
|
|
89
|
+
params.set('scopeType', combined.scopeType);
|
|
90
|
+
if (combined.scopeId)
|
|
91
|
+
params.set('scopeId', combined.scopeId);
|
|
92
|
+
if (combined.view)
|
|
93
|
+
params.set('view', combined.view);
|
|
94
|
+
if (combined.scenarioId)
|
|
95
|
+
params.set('scenario', combined.scenarioId);
|
|
96
|
+
return params.toString();
|
|
97
|
+
}
|
|
98
|
+
export function ComparisonPanel({ comparisons, title = 'Scope comparisons', limit = 3, filter }) {
|
|
99
|
+
const rows = (comparisons ?? [])
|
|
100
|
+
.filter((entry) => !filter || filter.includes(entry.metric))
|
|
101
|
+
.slice(0, limit);
|
|
102
|
+
if (rows.length === 0)
|
|
103
|
+
return null;
|
|
104
|
+
return (_jsxs("section", { className: "panel comparison-panel", children: [_jsx("div", { className: "kicker", children: title }), _jsx("div", { className: "comparison-grid", children: rows.map((entry) => (_jsxs("article", { className: "comparison-card", children: [_jsxs("div", { className: "comparison-card-header", children: [_jsx("strong", { children: metricLabels[entry.metric] ?? entry.metric }), _jsx("span", { className: `comparison-direction ${entry.direction}`, children: entry.direction })] }), _jsxs("div", { className: "comparison-value", children: [Math.round(entry.scopeValue * 100), "%"] }), _jsx("p", { className: "comparison-detail", children: entry.detail }), _jsxs("span", { className: `comparison-confidence ${entry.confidence}`, children: [entry.confidence, " confidence"] })] }, `${entry.metric}-${entry.baselineScope}`))) })] }));
|
|
105
|
+
}
|
|
106
|
+
export function HotspotPanel({ summaries, type, title, placeholder }) {
|
|
107
|
+
const summary = summaries?.find((entry) => entry.type === type);
|
|
108
|
+
if (!summary) {
|
|
109
|
+
return (_jsxs("section", { className: "panel hotspot-panel", children: [_jsx("div", { className: "kicker", children: title }), _jsx("p", { className: "scope-context", children: placeholder })] }));
|
|
110
|
+
}
|
|
111
|
+
if (type !== 'quality' && type !== 'integrity') {
|
|
112
|
+
return (_jsxs("section", { className: "panel hotspot-panel", children: [_jsx("div", { className: "kicker", children: title }), _jsx("p", { className: "scope-context", children: placeholder })] }));
|
|
113
|
+
}
|
|
114
|
+
const entries = summary.entries;
|
|
115
|
+
return (_jsxs("section", { className: "panel hotspot-panel", children: [_jsx("div", { className: "kicker", children: title }), entries.length === 0 ? (_jsx("p", { className: "scope-context", children: placeholder })) : (_jsx("div", { className: "hotspot-grid", children: entries.slice(0, 4).map((entry) => (_jsxs("article", { className: "hotspot-card", children: [_jsxs("div", { className: "hotspot-header", children: [_jsx("strong", { children: entry.repo }), _jsx("span", { className: `trend-indicator ${entry.direction}`, children: entry.direction })] }), _jsxs("div", { className: "hotspot-body", children: [_jsxs("div", { children: [_jsx("span", { children: entry.label }), _jsx("strong", { children: entry.value.toFixed(entry.value >= 1 ? 0 : 2) })] }), _jsxs("div", { children: [_jsx("span", { children: "Secondary" }), _jsx("strong", { children: entry.secondaryValue.toFixed(entry.secondaryValue >= 1 ? 0 : 2) })] })] }), _jsx("p", { className: "hotspot-note", children: entry.direction === 'up' ? 'Trending up' : entry.direction === 'down' ? 'Cooling down' : 'Stable' })] }, `${entry.repo}-${entry.label}`))) }))] }));
|
|
116
|
+
}
|
|
117
|
+
export function PatternSpreadPanel({ patternSpread }) {
|
|
118
|
+
if (!patternSpread || patternSpread.crossRepoPatterns.length === 0) {
|
|
119
|
+
return (_jsxs("section", { className: "panel pattern-panel", children: [_jsx("div", { className: "kicker", children: "Pattern spread" }), _jsx("p", { className: "scope-context", children: "No cross-repo pattern spread detected yet." })] }));
|
|
120
|
+
}
|
|
121
|
+
return (_jsxs("section", { className: "panel pattern-panel", children: [_jsx("div", { className: "kicker", children: "Pattern spread" }), _jsx("div", { className: "pattern-grid", children: patternSpread.crossRepoPatterns.map((pattern) => (_jsxs("article", { className: "pattern-card", children: [_jsx("strong", { children: pattern.pattern }), _jsxs("div", { className: "pattern-meta", children: [_jsxs("span", { children: [pattern.occurrenceCount, " occurrences \u00B7 ", pattern.reusedCount, " reuses"] }), _jsxs("span", { children: [pattern.distinctRepos, " repos \u00B7 ", pattern.distinctTeams, " teams"] }), _jsxs("span", { children: ["Reuse rate ", Math.round(pattern.reuseRate * 100), "%"] }), _jsxs("span", { children: ["Cross-repo reuse ", Math.round(pattern.crossRepoReuseRate * 100), "%"] })] }), pattern.successLink && _jsx("p", { className: "hotspot-note", children: pattern.successLink.detail })] }, pattern.pattern))) })] }));
|
|
122
|
+
}
|
|
123
|
+
export function ScenarioBanner({ syntheticScenario }) {
|
|
124
|
+
if (!syntheticScenario || syntheticScenario.scenarioIds.length === 0)
|
|
125
|
+
return null;
|
|
126
|
+
const scenarioId = syntheticScenario.scenarioIds[0];
|
|
127
|
+
const scenarioMeta = SCENARIO_OPTIONS.find((entry) => entry.id === scenarioId);
|
|
128
|
+
const label = scenarioMeta?.label ?? scenarioId ?? syntheticScenario.scenarioIds.join(', ');
|
|
129
|
+
const ratio = (syntheticScenario.ratio * 100).toFixed(1);
|
|
130
|
+
return (_jsxs("div", { className: "scenario-banner", children: [_jsx("strong", { children: "Scenario-based projection" }), _jsxs("span", { children: ["Scenario: ", label] }), scenarioMeta?.description && _jsx("span", { children: scenarioMeta.description }), _jsxs("span", { children: [syntheticScenario.syntheticEventCount, " synthetic events (", ratio, "% of this scope)"] })] }));
|
|
131
|
+
}
|
|
132
|
+
export function formatAttribution(attribution) {
|
|
133
|
+
if (!attribution)
|
|
134
|
+
return 'Attribution data unavailable';
|
|
135
|
+
return `${attribution.attributedEvents}/${attribution.totalEvents} attributed`;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=ScopeControls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScopeControls.js","sourceRoot":"","sources":["../../src/components/ScopeControls.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
import type { InsightSignal } from '@codeledger/types';
|
|
3
|
+
interface Props {
|
|
4
|
+
insights?: InsightSignal[];
|
|
5
|
+
focusMetrics?: string[];
|
|
6
|
+
title?: string;
|
|
7
|
+
subtitle?: string;
|
|
8
|
+
limit?: number;
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function SystemInsights({ insights, focusMetrics, title, subtitle, limit, className, }: Props): ReactElement | null;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=SystemInsights.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SystemInsights.d.ts","sourceRoot":"","sources":["../../src/components/SystemInsights.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAyB,MAAM,mBAAmB,CAAC;AAE9E,UAAU,KAAK;IACb,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,YAAY,EACZ,KAA6B,EAC7B,QAAQ,EACR,KAAS,EACT,SAAS,GACV,EAAE,KAAK,GAAG,YAAY,GAAG,IAAI,CA4B7B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
const severityClass = {
|
|
3
|
+
info: 'info',
|
|
4
|
+
warn: 'warn',
|
|
5
|
+
critical: 'critical',
|
|
6
|
+
};
|
|
7
|
+
export function SystemInsights({ insights, focusMetrics, title = 'Signals this period', subtitle, limit = 4, className, }) {
|
|
8
|
+
if (!insights || insights.length === 0)
|
|
9
|
+
return null;
|
|
10
|
+
const filtered = focusMetrics
|
|
11
|
+
? insights.filter((signal) => focusMetrics.includes(signal.linkedMetric))
|
|
12
|
+
: insights;
|
|
13
|
+
if (filtered.length === 0)
|
|
14
|
+
return null;
|
|
15
|
+
return (_jsxs("section", { className: `panel insights-panel ${className ?? ''}`, children: [_jsxs("div", { children: [_jsx("div", { className: "kicker", children: title }), subtitle && _jsx("p", { className: "scope-context", children: subtitle })] }), _jsx("ul", { children: filtered.slice(0, limit).map((signal) => (_jsxs("li", { children: [_jsxs("div", { children: [_jsx("strong", { children: signal.title }), _jsx("span", { children: signal.detail })] }), _jsxs("div", { className: "insight-actions", children: [_jsx("span", { className: `insight-severity ${severityClass[signal.severity]}`, children: signal.severity }), _jsx("a", { className: "btn-link", href: signal.link, children: "View evidence" })] })] }, signal.title))) })] }));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=SystemInsights.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SystemInsights.js","sourceRoot":"","sources":["../../src/components/SystemInsights.tsx"],"names":[],"mappings":";AAYA,MAAM,aAAa,GAA0C;IAC3D,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,UAAU;CACrB,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,EAC7B,QAAQ,EACR,YAAY,EACZ,KAAK,GAAG,qBAAqB,EAC7B,QAAQ,EACR,KAAK,GAAG,CAAC,EACT,SAAS,GACH;IACN,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,MAAM,QAAQ,GAAG,YAAY;QAC3B,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACzE,CAAC,CAAC,QAAQ,CAAC;IACb,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,CACL,mBAAS,SAAS,EAAE,wBAAwB,SAAS,IAAI,EAAE,EAAE,aAC3D,0BACE,cAAK,SAAS,EAAC,QAAQ,YAAE,KAAK,GAAO,EACpC,QAAQ,IAAI,YAAG,SAAS,EAAC,eAAe,YAAE,QAAQ,GAAK,IACpD,EACN,uBACG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACxC,yBACE,0BACE,2BAAS,MAAM,CAAC,KAAK,GAAU,EAC/B,yBAAO,MAAM,CAAC,MAAM,GAAQ,IACxB,EACN,eAAK,SAAS,EAAC,iBAAiB,aAC9B,eAAM,SAAS,EAAE,oBAAoB,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,YAAG,MAAM,CAAC,QAAQ,GAAQ,EAC/F,YAAG,SAAS,EAAC,UAAU,EAAC,IAAI,EAAE,MAAM,CAAC,IAAI,8BAAmB,IACxD,KARC,MAAM,CAAC,KAAK,CAShB,CACN,CAAC,GACC,IACG,CACX,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
import type { InsightSnapshot } from '@codeledger/types';
|
|
3
|
+
interface Props {
|
|
4
|
+
snapshot: InsightSnapshot;
|
|
5
|
+
}
|
|
6
|
+
export declare function EfficiencyPage({ snapshot }: Props): ReactElement;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=Efficiency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Efficiency.d.ts","sourceRoot":"","sources":["../../src/pages/Efficiency.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIzD,UAAU,KAAK;IACb,QAAQ,EAAE,eAAe,CAAC;CAC3B;AA4BD,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,GAAG,YAAY,CAuGhE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { InsightStrip, MetricGrid, PageHeader } from '../components/CockpitLayout.js';
|
|
3
|
+
function formatPct(value) {
|
|
4
|
+
return `${Math.round(value * 100)}%`;
|
|
5
|
+
}
|
|
6
|
+
function promptLiftSummary(value, denominator) {
|
|
7
|
+
if (denominator === 0)
|
|
8
|
+
return 'No prompt refinement events yet.';
|
|
9
|
+
if (value >= 0.75)
|
|
10
|
+
return 'Prompt Coach is driving consistently clearer tasks.';
|
|
11
|
+
if (value >= 0.50)
|
|
12
|
+
return 'Moderate adoption — teams are starting to refine more tasks.';
|
|
13
|
+
return 'Early stage — most tasks bypass refinement.';
|
|
14
|
+
}
|
|
15
|
+
function compressionSummary(value, denominator) {
|
|
16
|
+
if (denominator === 0)
|
|
17
|
+
return 'No context compression data yet.';
|
|
18
|
+
const pct = Math.round(value * 100);
|
|
19
|
+
if (pct >= 40)
|
|
20
|
+
return `Context packs are ${pct}% smaller on average — tight, focused scope.`;
|
|
21
|
+
if (pct >= 20)
|
|
22
|
+
return `Context reduced by ${pct}% — meaningful but room to improve.`;
|
|
23
|
+
return `Context reduction is ${pct}% — teams may benefit from more prompt refinement.`;
|
|
24
|
+
}
|
|
25
|
+
function wasteSummary(value, numerator, denominator) {
|
|
26
|
+
if (denominator === 0)
|
|
27
|
+
return 'No waste avoidance data yet.';
|
|
28
|
+
if (value >= 0.70)
|
|
29
|
+
return `Strong signal: ${numerator} retries and first-pass wins observed.`;
|
|
30
|
+
if (value >= 0.40)
|
|
31
|
+
return 'Moderate waste reduction — better prompts are starting to pay off.';
|
|
32
|
+
return 'Early signal — waste avoidance will strengthen with more prompt adoption.';
|
|
33
|
+
}
|
|
34
|
+
export function EfficiencyPage({ snapshot }) {
|
|
35
|
+
const syntheticLabel = snapshot.syntheticScenario?.scenarioIds?.join(', ');
|
|
36
|
+
const { metrics, insights, value } = snapshot;
|
|
37
|
+
const eff = metrics.efficiency;
|
|
38
|
+
const cards = [
|
|
39
|
+
{
|
|
40
|
+
label: 'Prompt lift',
|
|
41
|
+
value: eff.promptLift.value,
|
|
42
|
+
detail: promptLiftSummary(eff.promptLift.value, eff.promptLift.denominator),
|
|
43
|
+
metricKey: 'promptLift',
|
|
44
|
+
severity: eff.promptLift.denominator === 0 ? undefined : eff.promptLift.value < 0.5 ? 'medium' : 'low',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
label: 'Context compression',
|
|
48
|
+
value: eff.contextCompression.value,
|
|
49
|
+
detail: compressionSummary(eff.contextCompression.value, eff.contextCompression.denominator),
|
|
50
|
+
metricKey: 'contextCompression',
|
|
51
|
+
severity: eff.contextCompression.denominator === 0 ? undefined : eff.contextCompression.value < 0.25 ? 'medium' : 'low',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
label: 'Waste avoided',
|
|
55
|
+
value: eff.wasteAvoided.value,
|
|
56
|
+
detail: wasteSummary(eff.wasteAvoided.value, eff.wasteAvoided.numerator, eff.wasteAvoided.denominator),
|
|
57
|
+
metricKey: 'wasteAvoided',
|
|
58
|
+
severity: eff.wasteAvoided.denominator === 0 ? undefined : eff.wasteAvoided.value < 0.4 ? 'medium' : 'low',
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
const hasData = eff.promptLift.denominator > 0;
|
|
62
|
+
const trend = snapshot.metrics.overview.trend;
|
|
63
|
+
const hasTrend = trend.length >= 2;
|
|
64
|
+
return (_jsxs("div", { className: "efficiency-page", children: [_jsx(PageHeader, { title: "Execution efficiency", subtitle: "How prompt refinement and context compression reduce waste", scope: value.scope, confidence: value.confidence, syntheticLabel: syntheticLabel }), !hasData && (_jsxs("div", { className: "efficiency-zero-state panel", children: [_jsx("p", { children: _jsx("strong", { children: "No prompt refinement events yet." }) }), _jsx("p", { children: "When your team uses Prompt Coach, this tab will show how refined prompts lead to smaller context, fewer retries, and less rework." }), _jsx("p", { className: "causal-chain", children: "better prompts \u2192 smaller context \u2192 fewer retries \u2192 less rework \u2192 higher first-pass success" })] })), _jsx(MetricGrid, { cards: cards }), hasData && (_jsxs("section", { className: "panel", children: [_jsx("div", { className: "kicker", children: "Waste avoided is an estimated operational proxy" }), _jsx("p", { className: "scope-context", children: "Based on retries avoided, first-pass success, and low rework signals. Not a precise financial metric \u2014 use as a directional indicator." })] })), hasTrend && (_jsxs("section", { className: "panel", children: [_jsx("div", { className: "kicker", children: "Prompt \u2192 Context \u2192 Outcome" }), _jsxs("p", { className: "scope-context", children: ["Prompt lift: ", formatPct(trend[trend.length - 1].efficiency), " |", ' ', "First-pass success: ", formatPct(trend[trend.length - 1].quality), " |", ' ', "Trend over ", trend.length, " days"] }), _jsx("div", { className: "trend-compact", children: trend.slice(-14).map((point) => (_jsxs("div", { className: "trend-bar-group", children: [_jsx("div", { className: "trend-bar trend-bar-lift", style: { height: `${Math.round(point.efficiency * 60)}px` }, title: `Prompt lift: ${formatPct(point.efficiency)}` }), _jsx("div", { className: "trend-bar trend-bar-quality", style: { height: `${Math.round(point.quality * 60)}px` }, title: `First-pass: ${formatPct(point.quality)}` })] }, point.date))) }), _jsxs("div", { className: "trend-legend", children: [_jsxs("span", { className: "legend-item", children: [_jsx("span", { className: "dot dot-lift" }), " Prompt lift"] }), _jsxs("span", { className: "legend-item", children: [_jsx("span", { className: "dot dot-quality" }), " First-pass success"] })] })] })), _jsx(InsightStrip, { insights: insights, focusMetrics: ['promptLift', 'contextCompression', 'wasteAvoided'], title: "Efficiency signals", subtitle: "What changed in execution efficiency", limit: 3 })] }));
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=Efficiency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Efficiency.js","sourceRoot":"","sources":["../../src/pages/Efficiency.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
import type { InsightSnapshot } from '@codeledger/types';
|
|
3
|
+
interface Props {
|
|
4
|
+
snapshot: InsightSnapshot;
|
|
5
|
+
}
|
|
6
|
+
export declare function IntegrityPage({ snapshot }: Props): ReactElement;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=Integrity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Integrity.d.ts","sourceRoot":"","sources":["../../src/pages/Integrity.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKzD,UAAU,KAAK;IACb,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,GAAG,YAAY,CA2D/D"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { HotspotPanel } from '../components/ScopeControls.js';
|
|
3
|
+
import { InsightStrip, MetricGrid, PageHeader } from '../components/CockpitLayout.js';
|
|
4
|
+
export function IntegrityPage({ snapshot }) {
|
|
5
|
+
const syntheticLabel = snapshot.syntheticScenario?.scenarioIds?.join(', ');
|
|
6
|
+
const { metrics, insights, value } = snapshot;
|
|
7
|
+
const cards = [
|
|
8
|
+
{
|
|
9
|
+
label: 'Write safety',
|
|
10
|
+
value: metrics.integrity.writeSafetySuccessRate.value,
|
|
11
|
+
detail: 'Write safety success',
|
|
12
|
+
metricKey: 'writeSafetySuccessRate',
|
|
13
|
+
severity: 'low',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
label: 'Redact rate',
|
|
17
|
+
value: metrics.integrity.redactRate.value,
|
|
18
|
+
detail: 'Redactions applied',
|
|
19
|
+
metricKey: 'redactRate',
|
|
20
|
+
severity: metrics.integrity.redactRate.value > 0.3 ? 'high' : 'medium',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
label: 'Reject rate',
|
|
24
|
+
value: metrics.integrity.rejectRate.value,
|
|
25
|
+
detail: 'Rejected executions',
|
|
26
|
+
metricKey: 'rejectRate',
|
|
27
|
+
severity: metrics.integrity.rejectRate.value > 0.2 ? 'high' : 'medium',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
label: 'Integrity drift',
|
|
31
|
+
value: metrics.integrity.integrityDrift.value,
|
|
32
|
+
detail: 'Policy violations',
|
|
33
|
+
metricKey: 'integrityDrift',
|
|
34
|
+
severity: metrics.integrity.integrityDrift.value > 0.25 ? 'high' : 'medium',
|
|
35
|
+
},
|
|
36
|
+
];
|
|
37
|
+
return (_jsxs("div", { className: "integrity-page", children: [_jsx(PageHeader, { title: "Integrity cockpit", subtitle: "Governance, policy, and redact signals", scope: value.scope, confidence: value.confidence, syntheticLabel: syntheticLabel }), _jsx(MetricGrid, { cards: cards }), _jsx(InsightStrip, { insights: insights, focusMetrics: ['writeSafetySuccessRate', 'integrityDrift', 'rejectRate'], title: "System signals", subtitle: "What changed in integrity", limit: 3 }), _jsx(HotspotPanel, { summaries: snapshot.hotspotSummaries, type: "integrity", title: "Violation concentration", placeholder: "Integrity is stable; no concentrated violations." })] }));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=Integrity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Integrity.js","sourceRoot":"","sources":["../../src/pages/Integrity.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAMtF,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAS;IAC/C,MAAM,cAAc,GAAG,QAAQ,CAAC,iBAAiB,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3E,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;IAC9C,MAAM,KAAK,GAA2B;QACpC;YACE,KAAK,EAAE,cAAc;YACrB,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,sBAAsB,CAAC,KAAK;YACrD,MAAM,EAAE,sBAAsB;YAC9B,SAAS,EAAE,wBAAwB;YACnC,QAAQ,EAAE,KAAK;SAChB;QACD;YACE,KAAK,EAAE,aAAa;YACpB,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK;YACzC,MAAM,EAAE,oBAAoB;YAC5B,SAAS,EAAE,YAAY;YACvB,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;SACvE;QACD;YACE,KAAK,EAAE,aAAa;YACpB,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK;YACzC,MAAM,EAAE,qBAAqB;YAC7B,SAAS,EAAE,YAAY;YACvB,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;SACvE;QACD;YACE,KAAK,EAAE,iBAAiB;YACxB,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK;YAC7C,MAAM,EAAE,mBAAmB;YAC3B,SAAS,EAAE,gBAAgB;YAC3B,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;SAC5E;KACF,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,gBAAgB,aAC7B,KAAC,UAAU,IACT,KAAK,EAAC,mBAAmB,EACzB,QAAQ,EAAC,wCAAwC,EACjD,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,UAAU,EAAE,KAAK,CAAC,UAAU,EAC5B,cAAc,EAAE,cAAc,GAC9B,EACF,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,EAC5B,KAAC,YAAY,IACX,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,CAAC,wBAAwB,EAAE,gBAAgB,EAAE,YAAY,CAAC,EACxE,KAAK,EAAC,gBAAgB,EACtB,QAAQ,EAAC,2BAA2B,EACpC,KAAK,EAAE,CAAC,GACR,EACF,KAAC,YAAY,IACX,SAAS,EAAE,QAAQ,CAAC,gBAAgB,EACpC,IAAI,EAAC,WAAW,EAChB,KAAK,EAAC,yBAAyB,EAC/B,WAAW,EAAC,kDAAkD,GAC9D,IACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
import type { InsightSnapshot } from '@codeledger/types';
|
|
3
|
+
interface Props {
|
|
4
|
+
snapshot: InsightSnapshot;
|
|
5
|
+
}
|
|
6
|
+
export declare function KnowledgePage({ snapshot }: Props): ReactElement;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=Knowledge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Knowledge.d.ts","sourceRoot":"","sources":["../../src/pages/Knowledge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKzD,UAAU,KAAK;IACb,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,GAAG,YAAY,CAgD/D"}
|