diff --git a/src/types/index.ts b/src/types/index.ts
index 903f821c..1124a7a8 100644
--- a/src/types/index.ts
+++ b/src/types/index.ts
@@ -1,177 +1,193 @@
export interface Platform {
- id: string;
- company: string;
- name: string;
- filename: string;
- description: string;
- isUpdated: boolean;
- logoURL: string;
- needsConnection: boolean;
- connectURL: string | null;
- connectSelector: string | null;
- exportFrequency: string | null;
- vectorize_config: Record | null;
+ id: string
+ company: string
+ name: string
+ filename: string
+ description: string
+ isUpdated: boolean
+ logoURL: string
+ needsConnection: boolean
+ connectURL: string | null
+ connectSelector: string | null
+ exportFrequency: string | null
+ vectorize_config: Record | null
/** Runtime type: "vanilla" (default) or "network-capture" (uses network interception) */
- runtime?: string | null;
+ runtime?: string | null
/** Scopes this connector can export (e.g. ["chatgpt.conversations", "chatgpt.memories"]) */
- scopes?: string[] | null;
+ scopes?: string[] | null
+ /** Exact static-secret setup shape currently supported for chatgpt-pdpp. */
+ setup?: PdppStaticSecretSetup | null
+}
+
+export interface PdppStaticSecretSetup {
+ modality: "static_secret"
+ credentialCapture: {
+ fields: Array<{
+ name: "username" | "password"
+ label?: string | null
+ type?: "email" | "password" | string | null
+ required: true
+ secret: true
+ autocomplete?: string | null
+ }>
+ }
}
export interface ProgressPhase {
- step: number;
- total: number;
- label: string;
+ step: number
+ total: number
+ label: string
}
export interface Run {
- id: string;
- platformId: string;
- filename: string;
- runtime?: string | null;
- isConnected: boolean;
- startDate: string;
- endDate?: string;
- status: 'pending' | 'running' | 'success' | 'partial' | 'error' | 'stopped';
- url: string;
- exportSize?: number;
- exportPath?: string;
- company: string;
- name: string;
- currentStep?: string;
- logs?: string;
- statusMessage?: string;
- itemsExported?: number;
- itemLabel?: string; // e.g., "posts", "conversations"
- exportData?: ExportedData;
+ id: string
+ platformId: string
+ filename: string
+ runtime?: string | null
+ isConnected: boolean
+ startDate: string
+ endDate?: string
+ status: "pending" | "running" | "success" | "partial" | "error" | "stopped"
+ url: string
+ exportSize?: number
+ exportPath?: string
+ company: string
+ name: string
+ currentStep?: string
+ logs?: string
+ statusMessage?: string
+ itemsExported?: number
+ itemLabel?: string // e.g., "posts", "conversations"
+ exportData?: ExportedData
// Progress tracking
- phase?: ProgressPhase;
- itemCount?: number; // Real-time count during collection
+ phase?: ProgressPhase
+ itemCount?: number // Real-time count during collection
// Sync status
- syncedToPersonalServer?: boolean;
- scope?: string;
+ syncedToPersonalServer?: boolean
+ scope?: string
}
export interface ExportedData {
- platform: string;
- company: string;
- exportedAt: string;
- userInfo?: { name?: string; email?: string };
+ platform: string
+ company: string
+ exportedAt: string
+ userInfo?: { name?: string; email?: string }
conversations?: Array<{
- id: string;
- title: string;
- url: string;
- scrapedAt: string;
- }>;
- totalConversations?: number;
+ id: string
+ title: string
+ url: string
+ scrapedAt: string
+ }>
+ totalConversations?: number
}
export interface AppState {
- route: string;
- activeRunIndex: number;
- isFullScreen: boolean;
- isMac: boolean;
- isRunLayerVisible: boolean;
- breadcrumb: { text: string; link: string }[];
- runs: Run[];
- platforms: Platform[];
- connectedPlatforms: Record;
- connectorUpdates: ConnectorUpdateInfo[];
- lastUpdateCheck: string | null;
- isCheckingUpdates: boolean;
- auth: AuthState;
- connectedApps: ConnectedApp[];
- appConfig: AppConfig;
+ route: string
+ activeRunIndex: number
+ isFullScreen: boolean
+ isMac: boolean
+ isRunLayerVisible: boolean
+ breadcrumb: { text: string; link: string }[]
+ runs: Run[]
+ platforms: Platform[]
+ connectedPlatforms: Record
+ connectorUpdates: ConnectorUpdateInfo[]
+ lastUpdateCheck: string | null
+ isCheckingUpdates: boolean
+ auth: AuthState
+ connectedApps: ConnectedApp[]
+ appConfig: AppConfig
}
export interface RootState {
- app: AppState;
+ app: AppState
}
export interface ConnectorLogEvent {
- runId: string;
- message: string;
- timestamp: number;
+ runId: string
+ message: string
+ timestamp: number
}
export interface ConnectorStatusPayload {
- type: string;
- message: string;
- phase?: ProgressPhase;
- count?: number;
- data?: unknown;
- outcome?: 'success' | 'partial' | 'failure' | 'cancelled';
- errorClass?: string;
- recordCount?: number;
+ type: string
+ message: string
+ phase?: ProgressPhase
+ count?: number
+ data?: unknown
+ outcome?: "success" | "partial" | "failure" | "cancelled"
+ errorClass?: string
+ recordCount?: number
scopeSummary?: {
- requested: number;
- produced: number;
- degraded: number;
- omitted: number;
- };
+ requested: number
+ produced: number
+ degraded: number
+ omitted: number
+ }
}
export interface ConnectorStatusEvent {
- runId: string;
- status: ConnectorStatusPayload;
- timestamp: number;
+ runId: string
+ status: ConnectorStatusPayload
+ timestamp: number
}
export interface DownloadProgressEvent {
- run_id: string;
- filename: string;
- percent: number;
- bytes_downloaded: number;
- total_bytes: number | null;
+ run_id: string
+ filename: string
+ percent: number
+ bytes_downloaded: number
+ total_bytes: number | null
}
export interface ExportCompleteEvent {
- company: string;
- name: string;
- run_id: string;
- export_path: string;
- export_size: number;
+ company: string
+ name: string
+ run_id: string
+ export_path: string
+ export_size: number
}
export interface ConnectorUpdateInfo {
- id: string;
- name: string;
- description: string;
- company: string;
- currentVersion: string | null;
- latestVersion: string;
- hasUpdate: boolean;
- isNew: boolean;
+ id: string
+ name: string
+ description: string
+ company: string
+ currentVersion: string | null
+ latestVersion: string
+ hasUpdate: boolean
+ isNew: boolean
}
export interface AuthState {
- isAuthenticated: boolean;
- isLoading: boolean;
- user: AuthUser | null;
- walletAddress: string | null;
- masterKeySignature: string | null;
- accountRole: 'standard' | 'debug';
+ isAuthenticated: boolean
+ isLoading: boolean
+ user: AuthUser | null
+ walletAddress: string | null
+ masterKeySignature: string | null
+ accountRole: "standard" | "debug"
}
export interface AuthUser {
- id: string;
- email?: string;
+ id: string
+ email?: string
wallet?: {
- address: string;
- walletClientType: string;
- };
+ address: string
+ walletClientType: string
+ }
}
export interface ConnectedApp {
- id: string;
- name: string;
- icon?: string;
- permissions: string[];
- connectedAt: string;
- externalUrl?: string;
+ id: string
+ name: string
+ icon?: string
+ permissions: string[]
+ connectedAt: string
+ externalUrl?: string
}
export interface AppConfig {
- storageProvider: 'local' | 'vana' | 'gdrive' | 'dropbox';
+ storageProvider: "local" | "vana" | "gdrive" | "dropbox"
/**
* - `local-only` (default): no backend provider is configured. Exports
* land on local disk only (`write_export_data`, always unconditional)
@@ -186,18 +202,18 @@ export interface AppConfig {
* user obtains the access token via the "Connect with Vana" Hydra
* device-code flow.
*/
- serverMode: 'local-only' | 'local' | 'remote';
+ serverMode: "local-only" | "local" | "remote"
/** Required when `serverMode === 'remote'`. e.g. `https://0xabc….myvana.app`. */
- remoteServerUrl?: string;
+ remoteServerUrl?: string
/**
* Vana session access token for the remote PS. Stored in plaintext for
* dev simplicity; production should move to Tauri Stronghold or OS
* Keychain. Refreshed on demand via the refresh token at
* `vanaRefreshToken`.
*/
- vanaAccessToken?: string;
+ vanaAccessToken?: string
/** Vana session refresh token. */
- vanaRefreshToken?: string;
+ vanaRefreshToken?: string
/** Unix epoch (seconds) when `vanaAccessToken` expires. */
- vanaAccessTokenExpiresAt?: number;
+ vanaAccessTokenExpiresAt?: number
}
diff --git a/vite.config.ts b/vite.config.ts
index b5da2f7b..418880da 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -22,7 +22,10 @@ export default defineConfig({
"src-tauri/**/*.test.ts",
"scripts/is-main-module.test.mjs",
"scripts/create-macos-dmg.test.mjs",
+ "scripts/ensure-pdpp-runtime.test.mjs",
+ "scripts/release-github.test.mjs",
"scripts/release-workflow.test.ts",
+ "scripts/stage-pdpp-node.test.mjs",
"scripts/resolve-connectors.test.mjs",
"scripts/verify-release-ref.test.mjs",
"scripts/verify-bundled-personal-server.test.mjs",