feat(k1): complete primary acquisition lifecycle

This commit is contained in:
DCCONSTRUCTIONS
2026-07-17 23:03:59 +03:00
parent 9d51080d2e
commit aa3680948f
66 changed files with 6093 additions and 544 deletions
@@ -17,6 +17,7 @@ import {
liveStartPlan,
operationByIdempotencyKey,
operationNeedsReconciliation,
isSoftwareCommandedAcquisition,
} from "./lifecycle";
import { localizeRuntimeMessage } from "./messages";
import { selectMonotonicXgridsState } from "./stateOrdering";
@@ -65,6 +66,7 @@ export function useXgridsK1Runtime(enabled: boolean) {
const [error, setError] = useState<string | null>(null);
const [latencyHistory, setLatencyHistory] = useState<number[]>([]);
const mounted = useRef(true);
const actionInFlight = useRef(false);
const acceptState = useCallback((nextState: XgridsK1State) => {
setState((currentState) => selectMonotonicXgridsState(currentState, nextState));
@@ -101,6 +103,8 @@ export function useXgridsK1Runtime(enabled: boolean) {
const run = useCallback(
async (action: PendingAction, operation: () => Promise<XgridsK1State>) => {
if (!enabled) return false;
if (actionInFlight.current) return false;
actionInFlight.current = true;
setPendingAction(action);
setError(null);
@@ -117,6 +121,7 @@ export function useXgridsK1Runtime(enabled: boolean) {
}
return false;
} finally {
actionInFlight.current = false;
if (mounted.current) setPendingAction(null);
}
},
@@ -202,13 +207,13 @@ export function useXgridsK1Runtime(enabled: boolean) {
if (acquisition && !acquisitionTerminal) {
return xgridsK1Api.stopAcquisition({
acquisition_id: acquisition.acquisition_id,
mode: "capture-only",
mode: isSoftwareCommandedAcquisition(state) ? "graceful" : "capture-only",
});
}
// Replay and pre-v1alpha2 sessions remain a compatibility-only path.
return xgridsK1Api.stopSessionCompatibility();
}),
[run, state?.acquisition],
[run, state],
);
const abort = useCallback(() => {