/** Public package contract. App code has access only to these mediated services. */ export type Capability = 'storage' | 'files.read' | 'models.invoke' | 'browser.read' | 'github.read' | 'github.private.read' | 'coding.read' | 'coding.run' | 'coding.commit' | 'browser.control'; export interface AppManifest { schemaVersion: 'hay.app/1'; id: string; name: string; version: string; description: string; author: string; entrypoint: 'index.html'; icon: string; color: string; capabilities: Capability[]; views: { id: string; title: string; description: string }[]; intents: { id: string; label: string; prompt: string; viewId: string }[]; defaultTask?: { title: string; viewId?: string }; agent?: { instructions: string }; } export interface InitialPluginData { state?: Record; documents?: { id:string; name:string; text:string }[] } export interface PluginBundle { schemaVersion:'hay.bundle/1'; manifest:AppManifest; html:string; initialData?:InitialPluginData } export interface AppContext { viewId: string; pinned: boolean; taskId: string } export interface DocumentRecord { id: string; name: string; text: string; importedAt: string; sample?: boolean } export interface SourceRecord { id: string; title: string; url: string; text: string; capturedAt: string } export interface PullRequestSnapshot { url: string; title: string; body: string; headSha: string; baseSha: string; capturedAt: string; files: { filename: string; previousFilename?: string; status: string; additions: number; deletions: number; patch?: string }[]; } export interface CodingCheck {id:string;command:string;argv:string[]} export interface CodingProject {root:string;name:string;branch:string;head:string;dirty:boolean;checks:string[];sandboxAvailable:boolean} export interface CodingSpec {title:string;goal:string;acceptance:string;decisions:string;paths:string[];commands:string[]} export interface CodingEvent {at:string;kind:'status'|'text'|'tool'|'output'|'error';text:string} export interface CodingCheckResult {id:string;command:string;exitCode:number;output:string;durationMs:number;revision:string} export interface CodingDiff {revision:string;head:string;text:string;files:string[];truncated:boolean} export interface CodingJob { id:string;workspaceId:string;repository:string;spec:CodingSpec;specRevision:string; status:'draft'|'approved'|'running'|'checking'|'review'|'committing'|'committed'|'cancelled'|'failed'|'interrupted'; createdAt:string;updatedAt:string;worktree?:string;branch?:string;baseHead?:string; events:CodingEvent[];checks:CodingCheckResult[];diff?:CodingDiff;summary?:string;error?:string;commit?:string;integratedAt?:string; ownerAppId?:string;ownerTaskId?:string; } export type CodingJobSummary=Pick&{title:string;createdAt?:string;goal?:string;files?:string[];checksPassed?:number;checksTotal?:number;commit?:string;integratedAt?:string}; export interface CodingSnapshot {project?:CodingProject;jobs:CodingJobSummary[];job?:CodingJob;activeJobId?:string} export interface CodingChange {workspaceId:string;jobId?:string;ownerAppId?:string;ownerTaskId?:string} export interface OutputInput {title:string;format:'text'|'json'|'coding-spec';text?:string;data?:unknown} export interface OutputRecord extends OutputInput {id:string;appId:string;taskId:string;createdAt:string;sharedFrom?:{appId:string;taskId:string;outputId:string}} export type OutputSummary=Pick; export type OutputTarget = {kind:'task';taskId:string}|{kind:'coding'}; export interface ModelOutput {text:string;json?:unknown} export interface InteractionElement {id:string;role:string;label:string;value?:string;url?:string;actions:('click'|'fill'|'key'|'scroll')[];bounds?:{x:number;y:number;width:number;height:number}} export interface InteractionAction {snapshotId:string;kind:'click'|'fill'|'key'|'scroll';target?:string;text?:string;key?:'Enter'|'Tab'|'Escape'|'ArrowUp'|'ArrowDown'|'ArrowLeft'|'ArrowRight'|'Backspace'|'Space';direction?:'up'|'down'} export interface BrowserSession {id:string;url:string;title:string} export interface BrowserSnapshot {sessionId:string;snapshotId:string;url:string;title:string;text:string;elements:InteractionElement[];capturedAt:string;truncated:boolean} export interface ToolImage {dataUrl:string;width:number;height:number;capturedAt:string} export interface ToolChange {workspaceId:string;appId:string;taskId:string;kind:'browser';sessionId?:string} export interface HayClient { readonly ready: Promise; readonly context: AppContext | undefined; onContext(listener: (context: AppContext) => void): () => void; call(method: string, args?: Record): Promise; storage: { get(key: string): Promise; set(key: string, value: T): Promise }; documents: { list(): Promise }; sources: { list(): Promise }; agent: { run(prompt: string): Promise }; models: {generate(input:{prompt:string;format?:'text'|'json'}):Promise}; outputs: { create(input:OutputInput):Promise; list():Promise; read(id:string):Promise; targets():Promise<{taskId:string;title:string;appName:string}[]>; handoff(id:string,target:{kind:'coding'}):Promise; handoff(id:string,target:{kind:'task';taskId:string}):Promise; handoff(id:string,target:OutputTarget):Promise; onChange(listener:()=>void):()=>void; }; coding: { project():Promise<{project?:CodingProject;files:string[]}>; readFile(path:string):Promise<{path:string;text:string;truncated:boolean}>; wait(id:string):Promise; preview(id:string):Promise; integrate(id:string):Promise; list():Promise; createSpec(spec:CodingSpec):Promise; get(id:string):Promise; run(id:string,specRevision:string,feedback?:string):Promise; stop(id:string):Promise; review(id:string):Promise; commit(id:string,revision:string,message:string):Promise; onChange(listener:(change:CodingChange)=>void):()=>void; }; github: { readPullRequest(url: string, options?: { authenticated?: boolean }): Promise }; browser: { open(url:string):Promise; create(url:string):Promise; sessions():Promise; observe(id:string):Promise; act(id:string,action:InteractionAction):Promise<{performed:true;observeRequired:true}>; screenshot(id:string):Promise; close(id:string):Promise; onChange(listener:(change:ToolChange)=>void):()=>void; }; } // Use this declaration in sandbox app projects. Do not import the desktop preload API. declare global { interface Window { Hay: HayClient } }