+
+
+
+
+ {!selectedAgent ? (
+
+ No agents in fleet yet. Forge a worker and connect to see tier progression.
+
+ ) : timelineModel ? (
+ <>
+
+
+ {aiEnabled && lastDecision && (
+
+
LAST AI DECISION
+ {lastDecision.response && (
+
{lastDecision.response}
+ )}
+ {lastDecision.commands && (
+
+ {lastDecision.commands}
+
+ )}
+ {lastDecision.ts && (
+
+ {new Date(lastDecision.ts).toLocaleString()}
+
+ )}
+
+ )}
+
+
+ Data sources: Crucible →{' '}
+ Access Depth panel
+ {' · '}
+ Calibrate lotl_onion_tiers
+ {' · '}
+
+ spread tier wiki
+
+
+ >
+ ) : null}
+
+ );
+}
diff --git a/server/web/src/types/index.ts b/server/web/src/types/index.ts
index b38ea5f..fb0279c 100644
--- a/server/web/src/types/index.ts
+++ b/server/web/src/types/index.ts
@@ -297,6 +297,18 @@ export interface ServerSettings {
public_builds_latest_n?: number;
/** Server-side LOTL Onion tier order pushed to agents with lotl_policy_from_server. */
lotl_onion_tiers?: string[];
+ /** Fleet adaptive strategy learns mining tier order from fleet stats (logic-gate mode). */
+ adaptive_strategy_enabled?: boolean;
+ /** When true, Calibrate uses local LLM fleet control instead of logic gates. */
+ ai_control_enabled?: boolean;
+ /** OpenAI-compatible or Ollama base URL on the control PC. */
+ ai_local_endpoint?: string;
+ /** LLM model name for fleet AI control. */
+ ai_model?: string;
+ /** Stateless per-cycle decisions — no conversation memory. */
+ ai_no_context?: boolean;
+ /** Seconds between AI decision cycles per agent. */
+ ai_interval_sec?: number;
/** Triple onion recon/deploy gates pushed to agents at auth. */
triple_onion_policy?: {
patch_first?: boolean;
@@ -420,6 +432,16 @@ export interface AIActivityEntry {
last_success?: boolean;
}
+/** Fleet AI Control decision audit row — GET /api/v1/ai/decisions */
+export interface AIDecisionRecord {
+ id: number;
+ agent_id: string;
+ prompt_hash?: string;
+ response?: string;
+ commands_executed?: string;
+ ts?: string;
+}
+
export interface EarningsEstimate {
hashrate: number;
xmr_per_day: number;