feat: scaffold electron orchestrator foundation

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Copilot CLI
2026-03-21 09:27:28 +01:00
co-authored by Copilot
parent 1ed3d3f652
commit 9e509593d6
46 changed files with 3870 additions and 13 deletions
@@ -0,0 +1,62 @@
import { createBuiltinPatterns } from '@shared/domain/pattern';
import type { PatternDefinition } from '@shared/domain/pattern';
import { createWorkspaceSeed, type WorkspaceState } from '@shared/domain/workspace';
import { nowIso } from '@shared/utils/ids';
import { getWorkspaceFilePath } from '@main/persistence/appPaths';
import { readJsonFile, writeJsonFile } from '@main/persistence/jsonStore';
function mergePatterns(existingPatterns: PatternDefinition[]): PatternDefinition[] {
const builtinTimestamp = nowIso();
const builtinPatterns = createBuiltinPatterns(builtinTimestamp);
const builtinIds = new Set(builtinPatterns.map((pattern) => pattern.id));
const existingMap = new Map(existingPatterns.map((pattern) => [pattern.id, pattern]));
const mergedBuiltins = builtinPatterns.map((builtin) => {
const existing = existingMap.get(builtin.id);
if (!existing) {
return builtin;
}
return {
...existing,
availability: builtin.availability,
unavailabilityReason: builtin.unavailabilityReason,
mode: builtin.mode,
};
});
const customPatterns = existingPatterns.filter((pattern) => !builtinIds.has(pattern.id));
return [...mergedBuiltins, ...customPatterns];
}
export class WorkspaceRepository {
readonly filePath = getWorkspaceFilePath();
async load(): Promise<WorkspaceState> {
const stored = await readJsonFile<WorkspaceState>(this.filePath);
if (!stored) {
const seeded = createWorkspaceSeed();
await this.save(seeded);
return seeded;
}
const workspace: WorkspaceState = {
...stored,
patterns: mergePatterns(stored.patterns ?? []),
projects: stored.projects ?? [],
sessions: stored.sessions ?? [],
lastUpdatedAt: stored.lastUpdatedAt ?? nowIso(),
};
await this.save(workspace);
return workspace;
}
async save(workspace: WorkspaceState): Promise<void> {
await writeJsonFile(this.filePath, {
...workspace,
lastUpdatedAt: nowIso(),
});
}
}