setActions(toggle(actions, value))}
- />
- {level === 'custom' && (
-
- Advanced Custom switches
- {(Object.keys(custom) as Array).map(
- (key) => (
-
-
- setCustom((current) => {
- const next = { ...current, [key]: !current[key] };
- if (
- key === 'turnObservations' &&
- !next.turnObservations
- ) {
- next.nearbyAgents = false;
- next.recentEvents = false;
- next.recentControlChanges = false;
- }
- return next;
- })
- }
- />
- {customOptionLabel(key)}
-
- ),
- )}
-
- )}
- >
- )}
- {open && !swarmMode && !parsedRequest.success && (
-
- Select at least one agent, outcome, and action, and enter a valid
- range.
-
- )}
+
+ Swarm exports include all agents, retained swarm ticks, and provider
+ attempts for the entire retained experiment.
+
+
+ JSON serialization
+
+ setSerialization(
+ event.target.value as ExperimentExportRequest['serialization'],
+ )
+ }
+ >
+ Compact · AI sharing default
+ Pretty · human review
+
+
{disabled && (
- {swarmMode
- ? 'Pause playback and wait for the active swarm tick or reset to finish.'
- : 'Pause playback and wait for all turn and reset work to finish.'}
+ Pause playback and wait for the active swarm tick or reset to finish.
)}
- {preview &&
- (swarmMode ? (
-
-
-
Committed swarm ticks
- {preview.matchingSwarmTickCount} retained
-
-
-
Provider attempts
- {preview.matchingProviderAttemptCount} retained
-
-
-
Size
- {preview.serializedUtf8Bytes} bytes
-
-
-
Approx. AI input
- {preview.approximateAiInputTokens} tokens
-
-
-
Selected cost
- {formatCost(preview.knownCostCredits)}
-
-
- ) : (
-
-
-
Control changes
- {preview.matchingControlChangeCount} matched
-
-
-
Size
- {preview.serializedUtf8Bytes} bytes
-
-
-
Approx. AI input
- {preview.approximateAiInputTokens} tokens
-
-
-
Selected cost
- {formatCost(preview.knownCostCredits)}
-
-
- ))}
+ {preview && (
+
+
+
Committed swarm ticks
+ {preview.matchingSwarmTickCount} retained
+
+
+
Provider attempts
+ {preview.matchingProviderAttemptCount} retained
+
+
+
Size
+ {preview.serializedUtf8Bytes} bytes
+
+
+
Approx. AI input
+ {preview.approximateAiInputTokens} tokens
+
+
+
Retained cost
+ {formatCost(preview.knownCostCredits)}
+
+
+ )}
{notice && (
{notice}
@@ -3468,52 +2928,6 @@ function trapModalFocus(event: ReactKeyboardEvent) {
}
}
-function FilterChecks({
- label,
- options,
- selected,
- onToggle,
-}: {
- label: string;
- options: readonly T[];
- selected: T[];
- onToggle: (value: T) => void;
-}) {
- return (
-
- {label}
-
- {options.map((option) => (
-
- onToggle(option)}
- />
- {option.replaceAll('-', ' ')}
-
- ))}
-
-
- );
-}
-
-function customOptionLabel(key: keyof CustomExportOptions): string {
- return {
- turnObservations: 'Turn observations',
- nearbyAgents: 'Nearby agents',
- recentEvents: 'Recent events',
- recentControlChanges: 'Recent control changes in observations',
- validationDetails: 'Validation details',
- resultingEvents: 'Resulting events',
- providerUsageMetadata: 'Provider usage metadata',
- initialWorldState: 'Initial world state',
- currentWorldState: 'Current world state',
- computedMetrics: 'Computed metrics',
- controlChanges: 'Canonical control changes',
- }[key];
-}
-
function attemptExhaustionLabel(
reason: SimulationSnapshot['experiment']['attemptAccounting']['exhaustionReason'],
): string {