@opengeni/react 0.23.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/{chunk-UQS7OQDE.js → chunk-AVPU5PMC.js} +6 -4
  2. package/dist/chunk-AVPU5PMC.js.map +1 -0
  3. package/dist/{chunk-CATATY77.js → chunk-RDPDU4TA.js} +7 -6
  4. package/dist/chunk-RDPDU4TA.js.map +1 -0
  5. package/dist/{chunk-UAHPKLB6.js → chunk-SHOFILHJ.js} +18 -8
  6. package/dist/chunk-SHOFILHJ.js.map +1 -0
  7. package/dist/{composer-CVm5uoUI.d.ts → composer-BXb0Q1HF.d.ts} +18 -4
  8. package/dist/composer.d.ts +2 -2
  9. package/dist/composer.js +2 -2
  10. package/dist/fleet-decision-projection-SLNZMS42.js +241 -0
  11. package/dist/fleet-decision-projection-SLNZMS42.js.map +1 -0
  12. package/dist/fleet-decision-row-GGCAT4E4.js +351 -0
  13. package/dist/fleet-decision-row-GGCAT4E4.js.map +1 -0
  14. package/dist/index.d.ts +12 -9
  15. package/dist/index.js +332 -224
  16. package/dist/index.js.map +1 -1
  17. package/dist/{session-Db00TRwl.d.ts → session-BEvtFWhe.d.ts} +40 -14
  18. package/dist/session.d.ts +2 -2
  19. package/dist/session.js +2 -2
  20. package/dist/{use-composer-By1wn3MM.d.ts → use-composer-BnEzheSk.d.ts} +8 -2
  21. package/package.json +2 -2
  22. package/src/components/composer.tsx +7 -6
  23. package/src/components/message-timeline.tsx +2 -2
  24. package/src/hooks/use-composer.ts +15 -5
  25. package/src/hooks/use-file-attachments.ts +95 -2
  26. package/src/hooks/use-goal.ts +22 -4
  27. package/src/hooks/use-workspace-sessions.ts +30 -5
  28. package/src/timeline/activity-rail.tsx +17 -1
  29. package/src/timeline/fleet-decision-projection.ts +366 -0
  30. package/src/timeline/fleet-decision-row.tsx +412 -0
  31. package/src/timeline/index.ts +2 -0
  32. package/src/timeline/projection.ts +19 -8
  33. package/src/timeline/tool-display-name.ts +16 -0
  34. package/src/timeline/tool-renderers.tsx +1 -1
  35. package/src/timeline/types.ts +68 -1
  36. package/dist/chunk-CATATY77.js.map +0 -1
  37. package/dist/chunk-UAHPKLB6.js.map +0 -1
  38. package/dist/chunk-UQS7OQDE.js.map +0 -1
@@ -0,0 +1,241 @@
1
+ // src/timeline/fleet-decision-projection.ts
2
+ var FLEET_ACTUAL_OUTCOMES = ["selected", "waiting", "none"];
3
+ var FLEET_ACTUAL_REASONS = [
4
+ "lease_reused",
5
+ "pin",
6
+ "rotation",
7
+ "active",
8
+ "all_capped",
9
+ "none"
10
+ ];
11
+ var FLEET_SHADOW_OUTCOMES = ["selected", "paced", "none"];
12
+ var FLEET_SHADOW_REASONS = [
13
+ "fenced_in_flight",
14
+ "fenced_candidate_missing",
15
+ "admission_paced",
16
+ "no_eligible_candidate",
17
+ "overlay_isolated_empty",
18
+ "best_score",
19
+ "affinity_best",
20
+ "hysteresis_hold"
21
+ ];
22
+ var FLEET_COMPARISONS = [
23
+ "match",
24
+ "different_candidate",
25
+ "different_outcome",
26
+ "not_comparable_truncated"
27
+ ];
28
+ var FLEET_CONFIDENCES = ["unknown", "low", "medium", "high"];
29
+ var FLEET_ADMISSION_OUTCOMES = ["admit", "pace"];
30
+ var FLEET_ADMISSION_REASONS = [
31
+ "fenced_in_flight",
32
+ "pacing_disabled",
33
+ "capacity_unknown",
34
+ "capacity_available",
35
+ "work_conserving_borrow",
36
+ "manager_priority",
37
+ "standard_starvation_bound",
38
+ "capacity_saturated",
39
+ "emergency_fuse"
40
+ ];
41
+ var FLEET_ADMISSION_REASON_CLASSIFICATION = {
42
+ fenced_in_flight: "admit",
43
+ pacing_disabled: "admit",
44
+ capacity_unknown: "admit",
45
+ capacity_available: "admit",
46
+ work_conserving_borrow: "admit",
47
+ manager_priority: "pace",
48
+ standard_starvation_bound: "admit",
49
+ capacity_saturated: "pace",
50
+ emergency_fuse: "pace"
51
+ };
52
+ var FLEET_REJECTION_REASONS = [
53
+ "allocator_disabled",
54
+ "unavailable",
55
+ "cooling",
56
+ "quota_ceiling",
57
+ "overlay_isolation"
58
+ ];
59
+ var FLEET_MAX_CANDIDATES = 32;
60
+ var FLEET_MAX_COUNT = 1e6;
61
+ function fleetDecisionItem(event, payload) {
62
+ const actual = asRecord(payload.actual);
63
+ const replay = asRecord(payload.replay);
64
+ const input = asRecord(replay.input);
65
+ const decision = asRecord(replay.decision);
66
+ const admission = asRecord(decision.admission);
67
+ if (payload.schemaVersion !== 1 || payload.mode !== "shadow" || replay.schemaVersion !== 1 || replay.mode !== "shadow" || replay.policyVersion !== "adaptive-shadow-v1") {
68
+ return null;
69
+ }
70
+ const actualOutcome = fleetEnum(actual.outcome, FLEET_ACTUAL_OUTCOMES);
71
+ const actualReason = fleetEnum(actual.reason, FLEET_ACTUAL_REASONS);
72
+ const shadowOutcome = fleetEnum(decision.outcome, FLEET_SHADOW_OUTCOMES);
73
+ const shadowReason = fleetEnum(decision.reason, FLEET_SHADOW_REASONS);
74
+ const comparison = fleetEnum(payload.comparison, FLEET_COMPARISONS);
75
+ const confidence = fleetEnum(decision.confidence, FLEET_CONFIDENCES);
76
+ const admissionOutcome = fleetEnum(admission.outcome, FLEET_ADMISSION_OUTCOMES);
77
+ const admissionReason = fleetEnum(admission.reason, FLEET_ADMISSION_REASONS);
78
+ if (!actualOutcome || !actualReason || !shadowOutcome || !shadowReason || !comparison || !confidence || !admissionOutcome || !admissionReason) {
79
+ return null;
80
+ }
81
+ if (typeof admission.borrowedIdleCapacity !== "boolean" || typeof decision.borrowedOverlayCapacity !== "boolean") {
82
+ return null;
83
+ }
84
+ const actualCandidateKey = fleetCandidateKey(actual.candidateKey);
85
+ const shadowCandidateKey = fleetCandidateKey(decision.selectedCandidateKey);
86
+ if (actualCandidateKey === void 0 || shadowCandidateKey === void 0) {
87
+ return null;
88
+ }
89
+ if (actualOutcome === "selected" !== (actualCandidateKey !== null) || shadowOutcome === "selected" !== (shadowCandidateKey !== null)) {
90
+ return null;
91
+ }
92
+ const candidates = input.candidates;
93
+ if (!Array.isArray(candidates) || candidates.length > FLEET_MAX_CANDIDATES) {
94
+ return null;
95
+ }
96
+ const candidateKeys = /* @__PURE__ */ new Set();
97
+ for (const candidate of candidates) {
98
+ const key = asRecord(candidate).key;
99
+ if (!isFleetCandidateAlias(key) || candidateKeys.has(key)) {
100
+ return null;
101
+ }
102
+ candidateKeys.add(key);
103
+ }
104
+ const truncatedCandidateCount = fleetCount(replay.truncatedCandidateCount);
105
+ const strandedEligibleCount = fleetCount(decision.strandedEligibleCount);
106
+ if (truncatedCandidateCount === null || strandedEligibleCount === null || strandedEligibleCount > candidates.length || !fleetDecisionSemanticsAreConsistent({
107
+ actualOutcome,
108
+ actualReason,
109
+ shadowOutcome,
110
+ shadowReason,
111
+ admissionOutcome,
112
+ admissionReason,
113
+ borrowedIdleCapacity: admission.borrowedIdleCapacity,
114
+ borrowedOverlayCapacity: decision.borrowedOverlayCapacity,
115
+ strandedEligibleCount
116
+ })) {
117
+ return null;
118
+ }
119
+ if (shadowCandidateKey !== null && !candidateKeys.has(shadowCandidateKey)) {
120
+ return null;
121
+ }
122
+ if (actualCandidateKey !== null && !candidateKeys.has(actualCandidateKey) && !(comparison === "not_comparable_truncated" && truncatedCandidateCount > 0)) {
123
+ return null;
124
+ }
125
+ if (comparison === "not_comparable_truncated" && (truncatedCandidateCount === 0 || actualCandidateKey === null || candidateKeys.has(actualCandidateKey))) {
126
+ return null;
127
+ }
128
+ if (!fleetComparisonIsConsistent(
129
+ comparison,
130
+ actualOutcome,
131
+ actualCandidateKey,
132
+ shadowOutcome,
133
+ shadowCandidateKey
134
+ )) {
135
+ return null;
136
+ }
137
+ const rawScores = decision.scores;
138
+ if (!Array.isArray(rawScores)) {
139
+ return null;
140
+ }
141
+ const scores = [];
142
+ const scoreKeys = /* @__PURE__ */ new Set();
143
+ for (const value of rawScores.slice(0, FLEET_MAX_CANDIDATES)) {
144
+ const score = asRecord(value);
145
+ const candidateKey = score.candidateKey;
146
+ const parsedRejectionReason = score.rejectionReason === null ? null : fleetEnum(score.rejectionReason, FLEET_REJECTION_REASONS);
147
+ if (score.rejectionReason !== null && parsedRejectionReason === null) {
148
+ return null;
149
+ }
150
+ const rejectionReason = parsedRejectionReason;
151
+ const total = fleetFiniteNumber(score.total);
152
+ const scoreConfidence = fleetEnum(score.confidence, FLEET_CONFIDENCES);
153
+ if (!isFleetCandidateAlias(candidateKey) || !candidateKeys.has(candidateKey) || scoreKeys.has(candidateKey) || typeof score.eligible !== "boolean" || total === null || !scoreConfidence || (score.eligible ? rejectionReason !== null : rejectionReason === null)) {
154
+ return null;
155
+ }
156
+ scoreKeys.add(candidateKey);
157
+ scores.push({
158
+ candidateKey,
159
+ eligible: score.eligible,
160
+ rejectionReason,
161
+ total,
162
+ confidence: scoreConfidence
163
+ });
164
+ }
165
+ if (shadowCandidateKey !== null && !scoreKeys.has(shadowCandidateKey)) {
166
+ return null;
167
+ }
168
+ return {
169
+ kind: "fleet-decision",
170
+ id: event.id,
171
+ turnId: event.turnId ?? null,
172
+ policyVersion: "adaptive-shadow-v1",
173
+ actualOutcome,
174
+ actualCandidateKey,
175
+ actualReason,
176
+ shadowOutcome,
177
+ shadowCandidateKey,
178
+ shadowReason,
179
+ comparison,
180
+ confidence,
181
+ admissionOutcome,
182
+ admissionReason,
183
+ borrowedIdleCapacity: admission.borrowedIdleCapacity,
184
+ borrowedOverlayCapacity: decision.borrowedOverlayCapacity,
185
+ strandedEligibleCount,
186
+ candidateCount: candidates.length,
187
+ truncatedCandidateCount,
188
+ scoreRowsTruncatedCount: Math.max(0, rawScores.length - FLEET_MAX_CANDIDATES),
189
+ scores,
190
+ occurredAt: event.occurredAt
191
+ };
192
+ }
193
+ function fleetEnum(value, values) {
194
+ return typeof value === "string" && values.includes(value) ? value : null;
195
+ }
196
+ function isFleetCandidateAlias(value) {
197
+ return typeof value === "string" && /^c[0-9a-z]{2}$/.test(value);
198
+ }
199
+ function fleetCandidateKey(value) {
200
+ return value === null ? null : isFleetCandidateAlias(value) ? value : void 0;
201
+ }
202
+ function fleetCount(value) {
203
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 && value <= FLEET_MAX_COUNT ? value : null;
204
+ }
205
+ function fleetFiniteNumber(value) {
206
+ return typeof value === "number" && Number.isFinite(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER ? value : null;
207
+ }
208
+ function fleetComparisonIsConsistent(comparison, actualOutcome, actualCandidateKey, shadowOutcome, shadowCandidateKey) {
209
+ if (comparison === "not_comparable_truncated") {
210
+ return actualOutcome === "selected" && actualCandidateKey !== null;
211
+ }
212
+ const comparableActualOutcome = actualOutcome === "selected" ? "selected" : "none";
213
+ const comparableShadowOutcome = shadowOutcome === "selected" ? "selected" : "none";
214
+ if (comparison === "different_outcome") {
215
+ return comparableActualOutcome !== comparableShadowOutcome;
216
+ }
217
+ if (comparableActualOutcome !== comparableShadowOutcome) {
218
+ return false;
219
+ }
220
+ if (comparison === "different_candidate") {
221
+ return comparableActualOutcome === "selected" && actualCandidateKey !== shadowCandidateKey;
222
+ }
223
+ return comparableActualOutcome !== "selected" || actualCandidateKey === shadowCandidateKey;
224
+ }
225
+ function fleetDecisionSemanticsAreConsistent(input) {
226
+ const actualConsistent = input.actualOutcome === "selected" ? ["lease_reused", "pin", "rotation", "active"].includes(input.actualReason) : input.actualOutcome === "waiting" ? input.actualReason === "all_capped" : input.actualReason === "none";
227
+ const shadowConsistent = input.shadowOutcome === "selected" ? ["fenced_in_flight", "best_score", "affinity_best", "hysteresis_hold"].includes(
228
+ input.shadowReason
229
+ ) : input.shadowOutcome === "paced" ? input.shadowReason === "admission_paced" : ["fenced_candidate_missing", "no_eligible_candidate", "overlay_isolated_empty"].includes(
230
+ input.shadowReason
231
+ );
232
+ const pacedAdmissionReason = FLEET_ADMISSION_REASON_CLASSIFICATION[input.admissionReason] === "pace";
233
+ return actualConsistent && shadowConsistent && input.admissionOutcome === "pace" === pacedAdmissionReason && input.shadowOutcome === "paced" === (input.admissionOutcome === "pace") && input.borrowedIdleCapacity === (input.admissionReason === "work_conserving_borrow") && (!input.borrowedOverlayCapacity || input.shadowOutcome === "selected" && input.strandedEligibleCount === 0);
234
+ }
235
+ function asRecord(value) {
236
+ return value !== null && typeof value === "object" ? value : {};
237
+ }
238
+ export {
239
+ fleetDecisionItem as default
240
+ };
241
+ //# sourceMappingURL=fleet-decision-projection-SLNZMS42.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/timeline/fleet-decision-projection.ts"],"sourcesContent":["import type { SessionEvent } from \"@opengeni/sdk\";\nimport type { FleetDecisionItem, FleetDecisionScoreItem } from \"./types\";\n\nconst FLEET_ACTUAL_OUTCOMES = [\"selected\", \"waiting\", \"none\"] as const;\nconst FLEET_ACTUAL_REASONS = [\n \"lease_reused\",\n \"pin\",\n \"rotation\",\n \"active\",\n \"all_capped\",\n \"none\",\n] as const;\nconst FLEET_SHADOW_OUTCOMES = [\"selected\", \"paced\", \"none\"] as const;\nconst FLEET_SHADOW_REASONS = [\n \"fenced_in_flight\",\n \"fenced_candidate_missing\",\n \"admission_paced\",\n \"no_eligible_candidate\",\n \"overlay_isolated_empty\",\n \"best_score\",\n \"affinity_best\",\n \"hysteresis_hold\",\n] as const;\nconst FLEET_COMPARISONS = [\n \"match\",\n \"different_candidate\",\n \"different_outcome\",\n \"not_comparable_truncated\",\n] as const;\nconst FLEET_CONFIDENCES = [\"unknown\", \"low\", \"medium\", \"high\"] as const;\nconst FLEET_ADMISSION_OUTCOMES = [\"admit\", \"pace\"] as const;\nconst FLEET_ADMISSION_REASONS = [\n \"fenced_in_flight\",\n \"pacing_disabled\",\n \"capacity_unknown\",\n \"capacity_available\",\n \"work_conserving_borrow\",\n \"manager_priority\",\n \"standard_starvation_bound\",\n \"capacity_saturated\",\n \"emergency_fuse\",\n] as const;\ntype FleetAdmissionReason = (typeof FLEET_ADMISSION_REASONS)[number];\nconst FLEET_ADMISSION_REASON_CLASSIFICATION = {\n fenced_in_flight: \"admit\",\n pacing_disabled: \"admit\",\n capacity_unknown: \"admit\",\n capacity_available: \"admit\",\n work_conserving_borrow: \"admit\",\n manager_priority: \"pace\",\n standard_starvation_bound: \"admit\",\n capacity_saturated: \"pace\",\n emergency_fuse: \"pace\",\n} as const satisfies Record<FleetAdmissionReason, \"admit\" | \"pace\">;\nconst FLEET_REJECTION_REASONS = [\n \"allocator_disabled\",\n \"unavailable\",\n \"cooling\",\n \"quota_ceiling\",\n \"overlay_isolation\",\n] as const;\nconst FLEET_MAX_CANDIDATES = 32;\nconst FLEET_MAX_COUNT = 1_000_000;\n\n/**\n * Project the identity-free fleet event into the deliberately smaller UI\n * contract. This is a trust boundary: session event payloads are untyped, so\n * arbitrary strings (fingerprints, provider errors, future metadata) must never\n * become renderable copy. Only fixed enums and event-local aliases cross it.\n */\nexport default function fleetDecisionItem(\n event: SessionEvent,\n payload: Record<string, unknown>,\n): FleetDecisionItem | null {\n const actual = asRecord(payload.actual);\n const replay = asRecord(payload.replay);\n const input = asRecord(replay.input);\n const decision = asRecord(replay.decision);\n const admission = asRecord(decision.admission);\n if (\n payload.schemaVersion !== 1 ||\n payload.mode !== \"shadow\" ||\n replay.schemaVersion !== 1 ||\n replay.mode !== \"shadow\" ||\n replay.policyVersion !== \"adaptive-shadow-v1\"\n ) {\n return null;\n }\n\n const actualOutcome = fleetEnum(actual.outcome, FLEET_ACTUAL_OUTCOMES);\n const actualReason = fleetEnum(actual.reason, FLEET_ACTUAL_REASONS);\n const shadowOutcome = fleetEnum(decision.outcome, FLEET_SHADOW_OUTCOMES);\n const shadowReason = fleetEnum(decision.reason, FLEET_SHADOW_REASONS);\n const comparison = fleetEnum(payload.comparison, FLEET_COMPARISONS);\n const confidence = fleetEnum(decision.confidence, FLEET_CONFIDENCES);\n const admissionOutcome = fleetEnum(admission.outcome, FLEET_ADMISSION_OUTCOMES);\n const admissionReason = fleetEnum(admission.reason, FLEET_ADMISSION_REASONS);\n if (\n !actualOutcome ||\n !actualReason ||\n !shadowOutcome ||\n !shadowReason ||\n !comparison ||\n !confidence ||\n !admissionOutcome ||\n !admissionReason\n ) {\n return null;\n }\n if (\n typeof admission.borrowedIdleCapacity !== \"boolean\" ||\n typeof decision.borrowedOverlayCapacity !== \"boolean\"\n ) {\n return null;\n }\n\n const actualCandidateKey = fleetCandidateKey(actual.candidateKey);\n const shadowCandidateKey = fleetCandidateKey(decision.selectedCandidateKey);\n if (actualCandidateKey === undefined || shadowCandidateKey === undefined) {\n return null;\n }\n if (\n (actualOutcome === \"selected\") !== (actualCandidateKey !== null) ||\n (shadowOutcome === \"selected\") !== (shadowCandidateKey !== null)\n ) {\n return null;\n }\n\n const candidates = input.candidates;\n if (!Array.isArray(candidates) || candidates.length > FLEET_MAX_CANDIDATES) {\n return null;\n }\n const candidateKeys = new Set<string>();\n for (const candidate of candidates) {\n const key = asRecord(candidate).key;\n if (!isFleetCandidateAlias(key) || candidateKeys.has(key)) {\n return null;\n }\n candidateKeys.add(key);\n }\n\n const truncatedCandidateCount = fleetCount(replay.truncatedCandidateCount);\n const strandedEligibleCount = fleetCount(decision.strandedEligibleCount);\n if (\n truncatedCandidateCount === null ||\n strandedEligibleCount === null ||\n strandedEligibleCount > candidates.length ||\n !fleetDecisionSemanticsAreConsistent({\n actualOutcome,\n actualReason,\n shadowOutcome,\n shadowReason,\n admissionOutcome,\n admissionReason,\n borrowedIdleCapacity: admission.borrowedIdleCapacity,\n borrowedOverlayCapacity: decision.borrowedOverlayCapacity,\n strandedEligibleCount,\n })\n ) {\n return null;\n }\n if (shadowCandidateKey !== null && !candidateKeys.has(shadowCandidateKey)) {\n return null;\n }\n if (\n actualCandidateKey !== null &&\n !candidateKeys.has(actualCandidateKey) &&\n !(comparison === \"not_comparable_truncated\" && truncatedCandidateCount > 0)\n ) {\n return null;\n }\n if (\n comparison === \"not_comparable_truncated\" &&\n (truncatedCandidateCount === 0 ||\n actualCandidateKey === null ||\n candidateKeys.has(actualCandidateKey))\n ) {\n return null;\n }\n\n if (\n !fleetComparisonIsConsistent(\n comparison,\n actualOutcome,\n actualCandidateKey,\n shadowOutcome,\n shadowCandidateKey,\n )\n ) {\n return null;\n }\n\n const rawScores = decision.scores;\n if (!Array.isArray(rawScores)) {\n return null;\n }\n const scores: FleetDecisionScoreItem[] = [];\n const scoreKeys = new Set<string>();\n for (const value of rawScores.slice(0, FLEET_MAX_CANDIDATES)) {\n const score = asRecord(value);\n const candidateKey = score.candidateKey;\n const parsedRejectionReason =\n score.rejectionReason === null\n ? null\n : fleetEnum(score.rejectionReason, FLEET_REJECTION_REASONS);\n if (score.rejectionReason !== null && parsedRejectionReason === null) {\n return null;\n }\n const rejectionReason = parsedRejectionReason;\n const total = fleetFiniteNumber(score.total);\n const scoreConfidence = fleetEnum(score.confidence, FLEET_CONFIDENCES);\n if (\n !isFleetCandidateAlias(candidateKey) ||\n !candidateKeys.has(candidateKey) ||\n scoreKeys.has(candidateKey) ||\n typeof score.eligible !== \"boolean\" ||\n total === null ||\n !scoreConfidence ||\n (score.eligible ? rejectionReason !== null : rejectionReason === null)\n ) {\n return null;\n }\n scoreKeys.add(candidateKey);\n scores.push({\n candidateKey,\n eligible: score.eligible,\n rejectionReason,\n total,\n confidence: scoreConfidence,\n });\n }\n if (shadowCandidateKey !== null && !scoreKeys.has(shadowCandidateKey)) {\n return null;\n }\n\n return {\n kind: \"fleet-decision\",\n id: event.id,\n turnId: event.turnId ?? null,\n policyVersion: \"adaptive-shadow-v1\",\n actualOutcome,\n actualCandidateKey,\n actualReason,\n shadowOutcome,\n shadowCandidateKey,\n shadowReason,\n comparison,\n confidence,\n admissionOutcome,\n admissionReason,\n borrowedIdleCapacity: admission.borrowedIdleCapacity,\n borrowedOverlayCapacity: decision.borrowedOverlayCapacity,\n strandedEligibleCount,\n candidateCount: candidates.length,\n truncatedCandidateCount,\n scoreRowsTruncatedCount: Math.max(0, rawScores.length - FLEET_MAX_CANDIDATES),\n scores,\n occurredAt: event.occurredAt,\n };\n}\n\nfunction fleetEnum<const Values extends readonly string[]>(\n value: unknown,\n values: Values,\n): Values[number] | null {\n return typeof value === \"string\" && (values as readonly string[]).includes(value)\n ? (value as Values[number])\n : null;\n}\n\n/** c00..czz: ordinal aliases scoped to one event, never stable account ids. */\nfunction isFleetCandidateAlias(value: unknown): value is string {\n return typeof value === \"string\" && /^c[0-9a-z]{2}$/.test(value);\n}\n\n/** `undefined` denotes malformed; `null` is a valid no-selection value. */\nfunction fleetCandidateKey(value: unknown): string | null | undefined {\n return value === null ? null : isFleetCandidateAlias(value) ? value : undefined;\n}\n\nfunction fleetCount(value: unknown): number | null {\n return typeof value === \"number\" &&\n Number.isSafeInteger(value) &&\n value >= 0 &&\n value <= FLEET_MAX_COUNT\n ? value\n : null;\n}\n\nfunction fleetFiniteNumber(value: unknown): number | null {\n return typeof value === \"number\" &&\n Number.isFinite(value) &&\n Math.abs(value) <= Number.MAX_SAFE_INTEGER\n ? value\n : null;\n}\n\nfunction fleetComparisonIsConsistent(\n comparison: FleetDecisionItem[\"comparison\"],\n actualOutcome: FleetDecisionItem[\"actualOutcome\"],\n actualCandidateKey: string | null,\n shadowOutcome: FleetDecisionItem[\"shadowOutcome\"],\n shadowCandidateKey: string | null,\n): boolean {\n if (comparison === \"not_comparable_truncated\") {\n return actualOutcome === \"selected\" && actualCandidateKey !== null;\n }\n const comparableActualOutcome = actualOutcome === \"selected\" ? \"selected\" : \"none\";\n const comparableShadowOutcome = shadowOutcome === \"selected\" ? \"selected\" : \"none\";\n if (comparison === \"different_outcome\") {\n return comparableActualOutcome !== comparableShadowOutcome;\n }\n if (comparableActualOutcome !== comparableShadowOutcome) {\n return false;\n }\n if (comparison === \"different_candidate\") {\n return comparableActualOutcome === \"selected\" && actualCandidateKey !== shadowCandidateKey;\n }\n return comparableActualOutcome !== \"selected\" || actualCandidateKey === shadowCandidateKey;\n}\n\nfunction fleetDecisionSemanticsAreConsistent(input: {\n actualOutcome: FleetDecisionItem[\"actualOutcome\"];\n actualReason: FleetDecisionItem[\"actualReason\"];\n shadowOutcome: FleetDecisionItem[\"shadowOutcome\"];\n shadowReason: FleetDecisionItem[\"shadowReason\"];\n admissionOutcome: FleetDecisionItem[\"admissionOutcome\"];\n admissionReason: FleetDecisionItem[\"admissionReason\"];\n borrowedIdleCapacity: boolean;\n borrowedOverlayCapacity: boolean;\n strandedEligibleCount: number;\n}): boolean {\n const actualConsistent =\n input.actualOutcome === \"selected\"\n ? [\"lease_reused\", \"pin\", \"rotation\", \"active\"].includes(input.actualReason)\n : input.actualOutcome === \"waiting\"\n ? input.actualReason === \"all_capped\"\n : input.actualReason === \"none\";\n const shadowConsistent =\n input.shadowOutcome === \"selected\"\n ? [\"fenced_in_flight\", \"best_score\", \"affinity_best\", \"hysteresis_hold\"].includes(\n input.shadowReason,\n )\n : input.shadowOutcome === \"paced\"\n ? input.shadowReason === \"admission_paced\"\n : [\"fenced_candidate_missing\", \"no_eligible_candidate\", \"overlay_isolated_empty\"].includes(\n input.shadowReason,\n );\n // Keep this mapping exhaustive so a newly accepted admission reason cannot\n // silently be dropped from the paced/admitted event consistency check.\n const pacedAdmissionReason =\n FLEET_ADMISSION_REASON_CLASSIFICATION[input.admissionReason] === \"pace\";\n return (\n actualConsistent &&\n shadowConsistent &&\n (input.admissionOutcome === \"pace\") === pacedAdmissionReason &&\n (input.shadowOutcome === \"paced\") === (input.admissionOutcome === \"pace\") &&\n input.borrowedIdleCapacity === (input.admissionReason === \"work_conserving_borrow\") &&\n (!input.borrowedOverlayCapacity ||\n (input.shadowOutcome === \"selected\" && input.strandedEligibleCount === 0))\n );\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === \"object\" ? (value as Record<string, unknown>) : {};\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,351 @@
1
+ // src/timeline/fleet-decision-row.tsx
2
+ function GaugeMark({ className, j, s }) {
3
+ return s("svg", {
4
+ "aria-hidden": "true",
5
+ className,
6
+ fill: "none",
7
+ height: "24",
8
+ stroke: "currentColor",
9
+ strokeLinecap: "round",
10
+ strokeLinejoin: "round",
11
+ strokeWidth: "2",
12
+ viewBox: "0 0 24 24",
13
+ width: "24",
14
+ children: [
15
+ j("path", { d: "m 12 14 4-4" }, "needle"),
16
+ j("path", { d: "M3.34 19a10 10 0 1 1 17.32 0" }, "arc")
17
+ ]
18
+ });
19
+ }
20
+ var FLEET_ACTUAL_REASON_LABEL = {
21
+ lease_reused: "Reused the fenced lease",
22
+ pin: "Kept the session pin",
23
+ rotation: "Rotated for capacity",
24
+ active: "Used the active subscription",
25
+ all_capped: "All observed subscriptions were capped",
26
+ none: "No production candidate was selected"
27
+ };
28
+ var FLEET_SHADOW_REASON_LABEL = {
29
+ fenced_in_flight: "Kept the fenced in-flight assignment",
30
+ fenced_candidate_missing: "The fenced assignment was missing from the snapshot",
31
+ admission_paced: "Admission would have been paced",
32
+ no_eligible_candidate: "No candidate passed the policy checks",
33
+ overlay_isolated_empty: "Explicit isolation left no eligible candidate",
34
+ best_score: "Selected the lowest-pressure candidate",
35
+ affinity_best: "Session affinity was already best",
36
+ hysteresis_hold: "Hysteresis avoided a low-value switch"
37
+ };
38
+ var FLEET_COMPARISON_LABEL = {
39
+ match: "Production and shadow matched",
40
+ different_candidate: "Shadow preferred another candidate",
41
+ different_outcome: "Production and shadow outcomes differed",
42
+ not_comparable_truncated: "Comparison limited by bounded candidate data"
43
+ };
44
+ var FLEET_ADMISSION_REASON_LABEL = {
45
+ fenced_in_flight: "In-flight assignment was fenced",
46
+ pacing_disabled: "Admission pacing was disabled",
47
+ capacity_unknown: "Capacity was unknown, so work remained admissible",
48
+ capacity_available: "Observed capacity was available",
49
+ work_conserving_borrow: "Idle capacity was borrowed for standard work",
50
+ manager_priority: "Standard work was paced for queued manager demand",
51
+ standard_starvation_bound: "The standard-work starvation bound was reached",
52
+ capacity_saturated: "Observed dynamic capacity was saturated",
53
+ emergency_fuse: "The emergency fuse blocked new work"
54
+ };
55
+ var FLEET_REJECTION_LABEL = {
56
+ allocator_disabled: "Allocator disabled",
57
+ unavailable: "Unavailable",
58
+ cooling: "Cooling down",
59
+ quota_ceiling: "Quota ceiling reached",
60
+ overlay_isolation: "Outside explicit isolation"
61
+ };
62
+ var FLEET_CONFIDENCE_LABEL = {
63
+ unknown: "Unknown confidence",
64
+ low: "Low confidence",
65
+ medium: "Medium confidence",
66
+ high: "High confidence"
67
+ };
68
+ function FleetDecisionRow({
69
+ item,
70
+ d: ActivityDisclosure,
71
+ b: BodyNote,
72
+ j,
73
+ s
74
+ }) {
75
+ const scoreRowsHidden = item.scoreRowsTruncatedCount > 0;
76
+ const scores = item.scores.length > 0 ? j(
77
+ "div",
78
+ {
79
+ className: "min-w-0",
80
+ children: [
81
+ j(
82
+ "h4",
83
+ {
84
+ className: "text-og-sm font-medium text-og-fg",
85
+ children: "Bounded candidate scores"
86
+ },
87
+ "heading"
88
+ ),
89
+ j(
90
+ "p",
91
+ {
92
+ className: "mt-0.5 text-og-xs leading-5 text-og-fg-subtle",
93
+ children: "Lower scores rank first. Candidate aliases are temporary and local to this event."
94
+ },
95
+ "description"
96
+ ),
97
+ j(
98
+ "ul",
99
+ {
100
+ className: "mt-2 flex min-w-0 flex-col gap-1.5",
101
+ "aria-label": "Candidate scores",
102
+ children: item.scores.map(
103
+ (score) => s(
104
+ "li",
105
+ {
106
+ className: "flex min-w-0 flex-col gap-1 rounded-og-sm bg-og-surface-1 px-2.5 py-2 text-og-sm sm:flex-row sm:items-center sm:gap-3",
107
+ children: [
108
+ j(
109
+ "span",
110
+ {
111
+ className: "font-og-mono text-og-fg",
112
+ children: score.candidateKey
113
+ },
114
+ "candidate"
115
+ ),
116
+ j(
117
+ "span",
118
+ {
119
+ className: "min-w-0 text-og-fg-muted sm:flex-1",
120
+ children: score.eligible ? "Eligible" : score.rejectionReason ? FLEET_REJECTION_LABEL[score.rejectionReason] : "Unavailable"
121
+ },
122
+ "eligibility"
123
+ ),
124
+ s(
125
+ "span",
126
+ {
127
+ className: "font-og-mono text-og-fg-subtle",
128
+ children: [
129
+ "score ",
130
+ formatFleetScore(score.total),
131
+ " \xB7",
132
+ " ",
133
+ FLEET_CONFIDENCE_LABEL[score.confidence]
134
+ ]
135
+ },
136
+ "score"
137
+ )
138
+ ]
139
+ },
140
+ score.candidateKey
141
+ )
142
+ )
143
+ },
144
+ "rows"
145
+ )
146
+ ]
147
+ },
148
+ "score-list"
149
+ ) : null;
150
+ const truncated = item.truncatedCandidateCount > 0 ? j(
151
+ BodyNote,
152
+ {
153
+ tone: "muted",
154
+ children: [
155
+ item.truncatedCandidateCount,
156
+ " additional ",
157
+ item.truncatedCandidateCount === 1 ? "candidate was" : "candidates were",
158
+ " excluded from this bounded replay record."
159
+ ]
160
+ },
161
+ "truncated"
162
+ ) : null;
163
+ const hidden = scoreRowsHidden ? j(
164
+ BodyNote,
165
+ {
166
+ tone: "muted",
167
+ children: [
168
+ item.scoreRowsTruncatedCount,
169
+ " additional ",
170
+ item.scoreRowsTruncatedCount === 1 ? "score row was" : "score rows were",
171
+ " hidden by this view\u2019s safety limit."
172
+ ]
173
+ },
174
+ "hidden"
175
+ ) : null;
176
+ return j(ActivityDisclosure, {
177
+ icon: j(GaugeMark, { className: "size-3.5", j, s }),
178
+ iconTone: "muted",
179
+ title: "Fleet policy shadow",
180
+ preview: FLEET_COMPARISON_LABEL[item.comparison],
181
+ chip: {
182
+ tone: "muted",
183
+ text: item.comparison === "match" ? "matched" : item.comparison === "not_comparable_truncated" ? "limited" : "different"
184
+ },
185
+ children: s("section", {
186
+ "aria-label": "Fleet policy shadow details",
187
+ className: "flex min-w-0 flex-col gap-3",
188
+ children: [
189
+ j(
190
+ BodyNote,
191
+ {
192
+ tone: "muted",
193
+ children: "Shadow observation only \u2014 it did not change the subscription serving this turn."
194
+ },
195
+ "observation"
196
+ ),
197
+ j(
198
+ "dl",
199
+ {
200
+ className: "grid min-w-0 grid-cols-1 gap-x-5 gap-y-3 sm:grid-cols-2",
201
+ children: [
202
+ j(
203
+ FleetDetail,
204
+ {
205
+ term: "Production",
206
+ value: fleetOutcomeLabel(item.actualOutcome, item.actualCandidateKey),
207
+ note: FLEET_ACTUAL_REASON_LABEL[item.actualReason],
208
+ j,
209
+ s
210
+ },
211
+ "production"
212
+ ),
213
+ j(
214
+ FleetDetail,
215
+ {
216
+ term: "Shadow policy",
217
+ value: fleetOutcomeLabel(item.shadowOutcome, item.shadowCandidateKey),
218
+ note: FLEET_SHADOW_REASON_LABEL[item.shadowReason],
219
+ j,
220
+ s
221
+ },
222
+ "shadow"
223
+ ),
224
+ j(
225
+ FleetDetail,
226
+ {
227
+ term: "Comparison",
228
+ value: FLEET_COMPARISON_LABEL[item.comparison],
229
+ j,
230
+ s
231
+ },
232
+ "comparison"
233
+ ),
234
+ j(
235
+ FleetDetail,
236
+ {
237
+ term: "Decision confidence",
238
+ value: FLEET_CONFIDENCE_LABEL[item.confidence],
239
+ j,
240
+ s
241
+ },
242
+ "confidence"
243
+ ),
244
+ j(
245
+ FleetDetail,
246
+ {
247
+ term: "Admission",
248
+ value: item.admissionOutcome === "admit" ? "Would admit new work" : "Would pace new work",
249
+ note: FLEET_ADMISSION_REASON_LABEL[item.admissionReason],
250
+ j,
251
+ s
252
+ },
253
+ "admission"
254
+ ),
255
+ j(
256
+ FleetDetail,
257
+ {
258
+ term: "Observed candidates",
259
+ value: `${item.candidateCount} in the bounded replay`,
260
+ j,
261
+ s
262
+ },
263
+ "candidate-count"
264
+ ),
265
+ j(
266
+ FleetDetail,
267
+ {
268
+ term: "Idle-capacity borrowing",
269
+ value: item.borrowedIdleCapacity ? "Borrowed for standard work" : "Not borrowed",
270
+ j,
271
+ s
272
+ },
273
+ "idle-capacity"
274
+ ),
275
+ j(
276
+ FleetDetail,
277
+ {
278
+ term: "Named-policy borrowing",
279
+ value: item.borrowedOverlayCapacity ? "Borrowed outside the preferred group" : "Not borrowed",
280
+ j,
281
+ s
282
+ },
283
+ "named-policy"
284
+ ),
285
+ j(
286
+ FleetDetail,
287
+ {
288
+ term: "Stranded capacity",
289
+ value: item.strandedEligibleCount === 0 ? "None" : `${item.strandedEligibleCount} eligible ${item.strandedEligibleCount === 1 ? "candidate" : "candidates"}`,
290
+ note: item.strandedEligibleCount > 0 ? "Capacity excluded by explicit isolation; existing fenced turns are unchanged." : void 0,
291
+ j,
292
+ s
293
+ },
294
+ "stranded-capacity"
295
+ )
296
+ ]
297
+ },
298
+ "details"
299
+ ),
300
+ scores,
301
+ truncated,
302
+ hidden
303
+ ]
304
+ })
305
+ });
306
+ }
307
+ function FleetDetail({
308
+ term,
309
+ value,
310
+ note,
311
+ j,
312
+ s
313
+ }) {
314
+ return j("div", {
315
+ className: "min-w-0",
316
+ children: [
317
+ j(
318
+ "dt",
319
+ {
320
+ className: "text-og-xs font-medium uppercase tracking-wide text-og-fg-subtle",
321
+ children: term
322
+ },
323
+ "term"
324
+ ),
325
+ s(
326
+ "dd",
327
+ {
328
+ className: "mt-0.5 break-words text-og-sm text-og-fg-muted",
329
+ children: [
330
+ j("span", { className: "text-og-fg", children: value }, "value"),
331
+ note ? j("span", { className: "mt-0.5 block leading-5", children: note }, "note") : null
332
+ ]
333
+ },
334
+ "description"
335
+ )
336
+ ]
337
+ });
338
+ }
339
+ function fleetOutcomeLabel(outcome, candidateKey) {
340
+ if (outcome === "selected" && candidateKey) return `Selected ${candidateKey}`;
341
+ if (outcome === "waiting") return "Waiting for capacity";
342
+ if (outcome === "paced") return "Paced before placement";
343
+ return "No candidate selected";
344
+ }
345
+ function formatFleetScore(value) {
346
+ return new Intl.NumberFormat("en-US", { maximumFractionDigits: 2 }).format(value);
347
+ }
348
+ export {
349
+ FleetDecisionRow as default
350
+ };
351
+ //# sourceMappingURL=fleet-decision-row-GGCAT4E4.js.map