chore: initialize repository baseline

Import the existing Electron + React + TypeScript app as the version-control
baseline before the scanner rework (C# input/capture sidecar, resolution-anchored
layout profiles, OCR preprocessing, eval harness, rescan-merge, GOOD interop).

Housekeeping in this commit:
- Remove orphaned temp_inputhelper_block.ts (duplicate of the input-helper script).
- Ignore .claude/scheduled_tasks.lock local session state.
- Add .gitattributes to normalize line endings (LF in repo).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
AzuTear
2026-07-05 20:31:01 +02:00
commit e76d88e0c7
147 changed files with 26220 additions and 0 deletions
+98
View File
@@ -0,0 +1,98 @@
import type {
CaptureOptions,
CaptureResult,
CaptureSourceInfo,
ArtifactStoreLoadResult,
ArtifactStoreSaveResult,
BooleanResult,
ReviewSampleListResult,
ReviewSamplePayload,
SaveResultWithPath,
FocusGenshinResult,
LoadScannerLearningRulesResult,
ScrollResult,
RuntimeInfo,
SaveScannerLearningRulesResult,
SaveSnapshotResult,
GoodDatabase,
ScannerStatusPayload,
ScannerLearningRulePayload,
} from "../types/global";
import type { AppSnapshot } from "../types/domain";
import type { StoredArtifactRecord } from "../types/storage";
import type { AutomationGuard, ClickResult } from "../types/global";
export interface AssistantBridge {
isAvailable: boolean;
canExportGood: boolean;
canShowOverlay: boolean;
canAutoScan: boolean;
canReviewSamples: boolean;
loadSnapshot: () => Promise<AppSnapshot | null>;
saveSnapshot: (snapshot: AppSnapshot) => Promise<SaveSnapshotResult>;
runMockScan: () => Promise<AppSnapshot | null>;
listCaptureSources: () => Promise<CaptureSourceInfo[]>;
captureSource: (
sourceId: string,
delayMs?: number,
focusGenshin?: boolean,
options?: CaptureOptions,
) => Promise<CaptureResult>;
exportGood: (payload: GoodDatabase) => Promise<SaveResultWithPath>;
showOverlay: () => Promise<BooleanResult>;
loadArtifacts: () => Promise<ArtifactStoreLoadResult>;
saveArtifacts: (records: StoredArtifactRecord[]) => Promise<ArtifactStoreSaveResult>;
loadReviewSamples: (limit?: number) => Promise<ReviewSampleListResult>;
saveReviewSample: (sample: ReviewSamplePayload) => Promise<SaveResultWithPath>;
loadScannerLearningRules: () => Promise<LoadScannerLearningRulesResult>;
saveScannerLearningRules: (rules: ScannerLearningRulePayload) => Promise<SaveScannerLearningRulesResult>;
getRuntimeInfo: () => Promise<RuntimeInfo>;
getAutomationGuard: () => Promise<AutomationGuard>;
publishScannerStatus: (status: ScannerStatusPayload) => Promise<BooleanResult>;
focusMainWindow: () => Promise<BooleanResult>;
focusGenshin: () => Promise<FocusGenshinResult>;
clickScreen: (x: number, y: number) => Promise<ClickResult>;
scrollScreen: (notches: number, anchorX?: number, anchorY?: number) => Promise<ScrollResult>;
onScannerCommand: (callback: (command: "start-auto" | "stop") => void) => () => void;
}
function hasFunction(api: Record<string, unknown>, key: string): boolean {
return typeof api[key] === "function";
}
export function getAssistantBridge(): AssistantBridge | null {
const api = window.assistantApi;
if (!api) return null;
const apiRecord = api as unknown as Record<string, unknown>;
const canAutoScan = hasFunction(apiRecord, "clickScreen") && hasFunction(apiRecord, "scrollScreen");
const canReviewSamples = hasFunction(apiRecord, "loadReviewSamples") && hasFunction(apiRecord, "saveReviewSample");
return {
isAvailable: true,
canExportGood: Boolean(api.exportGood),
canShowOverlay: Boolean(api.showOverlay),
canAutoScan,
canReviewSamples,
loadSnapshot: () => api.loadSnapshot(),
saveSnapshot: (snapshot: AppSnapshot) => api.saveSnapshot(snapshot),
runMockScan: () => api.runMockScan(),
listCaptureSources: () => api.listCaptureSources(),
captureSource: (sourceId, delayMs, focusGenshin, options) => api.captureSource(sourceId, delayMs, focusGenshin, options),
exportGood: (payload) => api.exportGood(payload),
loadArtifacts: () => api.loadArtifacts(),
saveArtifacts: (records) => api.saveArtifacts(records),
loadReviewSamples: (limit = 50) => api.loadReviewSamples(limit),
saveReviewSample: (sample) => api.saveReviewSample(sample),
loadScannerLearningRules: () => api.loadScannerLearningRules(),
saveScannerLearningRules: (rules) => api.saveScannerLearningRules(rules),
getRuntimeInfo: () => api.getRuntimeInfo(),
getAutomationGuard: () => api.getAutomationGuard(),
publishScannerStatus: (status) => api.publishScannerStatus(status),
focusMainWindow: () => api.focusMainWindow(),
focusGenshin: () => api.focusGenshin(),
clickScreen: (x: number, y: number) => api.clickScreen(x, y),
scrollScreen: (notches: number, anchorX?: number, anchorY?: number) => api.scrollScreen(notches, anchorX, anchorY),
showOverlay: () => api.showOverlay(),
onScannerCommand: (callback) => api.onScannerCommand(callback),
};
}