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:
@@ -0,0 +1,2 @@
|
||||
export * from "./ipcBootstrap.js";
|
||||
export * from "./repositoryContext.js";
|
||||
@@ -0,0 +1,98 @@
|
||||
import { registerAppHandlers } from "../ipc/appHandlers.js";
|
||||
import { registerCaptureHandlers } from "../ipc/captureHandlers.js";
|
||||
import { registerPersistenceHandlers } from "../ipc/persistenceHandlers.js";
|
||||
import type {
|
||||
BooleanResult,
|
||||
FocusGenshinResult,
|
||||
RuntimeInfo,
|
||||
LoadScannerLearningRulesResult,
|
||||
SaveScannerLearningRulesResult,
|
||||
ScannerLearningRulePayload,
|
||||
CaptureOptions,
|
||||
CaptureResult,
|
||||
CaptureSourceInfo,
|
||||
ClickResult,
|
||||
AutomationGuard,
|
||||
ScrollResult,
|
||||
SaveResultWithPath,
|
||||
SaveSnapshotResult,
|
||||
GoodDatabase,
|
||||
ScannerStatusPayload,
|
||||
} from "../../src/types/global.js";
|
||||
import type {
|
||||
ArtifactStoreRepositoryPort,
|
||||
ReviewSamplesRepositoryPort,
|
||||
ReviewSampleListResult,
|
||||
} from "../repositories/contracts.js";
|
||||
import type { AppSnapshot } from "../../src/types/domain.js";
|
||||
|
||||
interface AppHandlersDependencies {
|
||||
focusMainWindow: () => BooleanResult;
|
||||
moveMainWindowOffGenshin: () => Promise<void>;
|
||||
focusGenshinForScanStart: () => Promise<FocusGenshinResult>;
|
||||
publishScannerStatus: (status: ScannerStatusPayload) => Promise<BooleanResult>;
|
||||
readRuntimeInfo: () => Promise<RuntimeInfo>;
|
||||
loadSnapshotFromDisk: () => Promise<AppSnapshot | null>;
|
||||
saveSnapshotToDisk: (snapshot: AppSnapshot) => Promise<SaveSnapshotResult>;
|
||||
runMockScan: () => Promise<AppSnapshot | null>;
|
||||
showOverlayWindow: () => Promise<BooleanResult>;
|
||||
hideOverlayWindow: () => Promise<BooleanResult>;
|
||||
}
|
||||
|
||||
type ArtifactStoreAccessor = () => ArtifactStoreRepositoryPort;
|
||||
type ReviewSamplesAccessor = () => ReviewSamplesRepositoryPort;
|
||||
|
||||
interface PersistenceHandlersDependencies {
|
||||
getArtifactStoreRepository: ArtifactStoreAccessor;
|
||||
getReviewSamplesRepository: ReviewSamplesAccessor;
|
||||
artifactStorePath: () => string;
|
||||
reviewSamplesPath: () => string;
|
||||
loadReviewSamples: (limit?: number) => Promise<ReviewSampleListResult>;
|
||||
loadScannerLearningRules: () => Promise<LoadScannerLearningRulesResult>;
|
||||
writeScannerLearningRules: (rules: ScannerLearningRulePayload) => Promise<SaveScannerLearningRulesResult>;
|
||||
exportGood: (payload: GoodDatabase) => Promise<SaveResultWithPath>;
|
||||
}
|
||||
|
||||
interface CaptureHandlersDependencies {
|
||||
listSources: () => Promise<CaptureSourceInfo[]>;
|
||||
captureSource: (sourceId: string, delayMs?: number, focusGenshin?: boolean, options?: CaptureOptions) => Promise<CaptureResult>;
|
||||
clickScreen: (x: number, y: number) => Promise<ClickResult>;
|
||||
scrollScreen: (notches: number, anchorX?: number, anchorY?: number) => Promise<ScrollResult>;
|
||||
getAutomationGuard: () => Promise<AutomationGuard>;
|
||||
}
|
||||
|
||||
interface IpcBootstrapDependencies extends AppHandlersDependencies, PersistenceHandlersDependencies, CaptureHandlersDependencies {}
|
||||
|
||||
export function registerIpcHandlers(dependencies: IpcBootstrapDependencies) {
|
||||
registerAppHandlers({
|
||||
focusMainWindow: dependencies.focusMainWindow,
|
||||
moveMainWindowOffGenshin: dependencies.moveMainWindowOffGenshin,
|
||||
focusGenshinForScanStart: dependencies.focusGenshinForScanStart,
|
||||
publishScannerStatus: dependencies.publishScannerStatus,
|
||||
getRuntimeInfo: dependencies.readRuntimeInfo,
|
||||
loadSnapshot: dependencies.loadSnapshotFromDisk,
|
||||
saveSnapshot: dependencies.saveSnapshotToDisk,
|
||||
runMockScan: dependencies.runMockScan,
|
||||
showOverlay: dependencies.showOverlayWindow,
|
||||
hideOverlay: dependencies.hideOverlayWindow,
|
||||
});
|
||||
|
||||
registerPersistenceHandlers({
|
||||
getArtifactStoreRepository: dependencies.getArtifactStoreRepository,
|
||||
getReviewSamplesRepository: dependencies.getReviewSamplesRepository,
|
||||
artifactStorePath: dependencies.artifactStorePath,
|
||||
reviewSamplesPath: dependencies.reviewSamplesPath,
|
||||
loadReviewSamples: dependencies.loadReviewSamples,
|
||||
loadScannerLearningRules: dependencies.loadScannerLearningRules,
|
||||
writeScannerLearningRules: dependencies.writeScannerLearningRules,
|
||||
exportGood: dependencies.exportGood,
|
||||
});
|
||||
|
||||
registerCaptureHandlers({
|
||||
listSources: dependencies.listSources,
|
||||
captureSource: dependencies.captureSource,
|
||||
clickScreen: dependencies.clickScreen,
|
||||
scrollScreen: dependencies.scrollScreen,
|
||||
getAutomationGuard: dependencies.getAutomationGuard,
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
import {
|
||||
JsonArtifactStoreRepository,
|
||||
JsonSnapshotRepository,
|
||||
ReviewSamplesRepository,
|
||||
ScannerLearningRepository,
|
||||
type ArtifactStoreRepositoryPort,
|
||||
type ReviewSamplesRepositoryPort,
|
||||
type ScannerLearningRepositoryPort,
|
||||
type SnapshotRepositoryPort,
|
||||
} from "../repositories/index.js";
|
||||
|
||||
import path from "node:path";
|
||||
export interface RepositoryContext {
|
||||
artifactStorePath: string;
|
||||
reviewSamplesPath: string;
|
||||
scannerLearningPath: string;
|
||||
snapshotPath: string;
|
||||
artifactStoreRepository: ArtifactStoreRepositoryPort;
|
||||
reviewSamplesRepository: ReviewSamplesRepositoryPort;
|
||||
scannerLearningRepository: ScannerLearningRepositoryPort;
|
||||
snapshotRepository: SnapshotRepositoryPort;
|
||||
}
|
||||
|
||||
export function createRepositoryContext(userDataPath: string): RepositoryContext {
|
||||
const artifactStorePath = path.join(userDataPath, "artifact-store.json");
|
||||
const reviewSamplesPath = path.join(userDataPath, "review-samples.jsonl");
|
||||
const scannerLearningPath = path.join(userDataPath, "scanner-learning.json");
|
||||
const snapshotPath = path.join(userDataPath, "snapshot.json");
|
||||
|
||||
return {
|
||||
artifactStorePath,
|
||||
reviewSamplesPath,
|
||||
scannerLearningPath,
|
||||
snapshotPath,
|
||||
artifactStoreRepository: new JsonArtifactStoreRepository(userDataPath),
|
||||
reviewSamplesRepository: new ReviewSamplesRepository(userDataPath),
|
||||
scannerLearningRepository: new ScannerLearningRepository(userDataPath),
|
||||
snapshotRepository: new JsonSnapshotRepository(userDataPath),
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user