export interface PermissionManifest { id: string; name: string; version: string; tier: "core-owned" | "audited-fork" | "local-experimental" | "blocked"; provides: { tools: string[]; commands: string[]; hooks: string[] }; permissions: { filesystem: { read: string[]; write: string[] }; subprocess: string[]; network: string[]; browser: boolean; models: boolean; ui: string[]; }; risk: "low" | "medium" | "high" | "critical"; review: { status: "draft" | "in-review" | "reviewed" | "blocked"; source: "write-from-scratch" | "rewrite-first" | "fork-after-audit" | "wrapper-first" | "copy-after-audit"; reviewedBy: string | null; reviewedAt: string | null; }; } export type AuditDecision = "allow" | "block" | "ask"; export interface AuditEvent { timestamp: string; extensionId: string; actionType: string; toolOrCommand: string; target: string; decision: AuditDecision; userDecision?: string; args?: string; } export const OUTPUT_DEFAULTS = { maxBytes: 64 * 1024, maxLines: 2000, astMatches: 500, astMaxBytes: 50 * 1024, browserSnapshotBytes: 100 * 1024, subagentSummaryBytes: 16 * 1024, } as const; export interface PlanTask { index: number; text: string; status: "pending" | "in_progress" | "done" | "blocked" } export interface ExtractedPlan { tasks: PlanTask[]; raw: string } export interface AgentDefinition { name: string; description: string; allowedTools: string[]; modelOverride?: string; risk: "low" | "medium" | "high"; readOnly: boolean } export type CatalogKind = "skill" | "prompt" | "extension" | "mcp"; export interface CatalogEntry { kind: CatalogKind; id: string; manifest: CatalogManifest; sourcePath: string; hash: string } export interface CatalogManifest { name: string; version: string; description: string; permissions: PermissionManifest["permissions"]; risk: "low" | "medium" | "high" | "critical"; reviewedBy: string | null; reviewedAt: string | null; enabled: boolean; }