diff --git a/src/cloud-api.ts b/src/cloud-api.ts new file mode 100644 index 0000000..8330fd8 --- /dev/null +++ b/src/cloud-api.ts @@ -0,0 +1,50 @@ +// cloud-api.ts ยท C3 Cloud API v0.1.0 + +export type RecordKind = + | "project" | "session" | "event" + | "memory" | "preference"; + +export interface CloudDevice { id: string; name: string; createdAt: string } + +export interface AuthResult { + userId: string; + device: CloudDevice; + deviceToken: string; // per laptop, revoked on logout +} + +export interface CloudAuth { + signUp(input: { githubCode: string; deviceName: string }): Promise; + logIn(input: { githubCode: string; deviceName: string }): Promise; + logOut(): Promise<{ ok: true }>; // revokes only this device's token +} + +export interface SyncChange { + kind: RecordKind; + id: string; // stable ID. Events: `${sessionId}:${seq}` + version: number; + deleted?: boolean; + data: Record; // never paths, secrets or raw output +} + +export interface PushRequest { changes: SyncChange[] } +export interface PushResult { + accepted: string[]; + rejected: { id: string; reason: "too_large" | "forbidden_field" | "illegal_move" | "stale" }[]; +} + +export interface PullRequest { cursor: string | null } +export interface PullResult { + changes: SyncChange[]; + nextCursor: string; + hasMore: boolean; +} + +export interface CloudSync { + push(req: PushRequest): Promise; + pull(req: PullRequest): Promise; +} + +export interface CloudDevices { + listDevices(): Promise<{ devices: CloudDevice[] }>; + revokeDevice(id: string): Promise<{ ok: true }>; +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 3144a6a..93e4fe1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,3 +4,4 @@ export * from "./session.js"; export * from "./runner.js"; +export * from "./cloud-api.js" \ No newline at end of file