import { BaseProgram } from './BaseProgram.js';
import { Address, Account } from 'gill';
import { NosanaClient } from '../index.js';
import * as programClient from "../generated_clients/jobs/index.js";
import { ConvertTypesForDb } from '../utils/index.js';
export declare enum JobState {
    QUEUED = 0,
    RUNNING = 1,
    COMPLETED = 2,
    STOPPED = 3
}
export declare enum MarketQueueType {
    JOB_QUEUE = 0,
    NODE_QUEUE = 1
}
export type Job = Omit<ConvertTypesForDb<programClient.JobAccountArgs>, 'state'> & {
    address: Address;
    state: JobState;
};
export type Market = Omit<ConvertTypesForDb<programClient.MarketAccountArgs>, 'queueType'> & {
    address: Address;
    queueType: MarketQueueType;
};
export type Run = ConvertTypesForDb<programClient.RunAccountArgs> & {
    address: Address;
};
export declare class JobsProgram extends BaseProgram {
    readonly client: typeof programClient;
    constructor(sdk: NosanaClient);
    protected getProgramId(): Address;
    /**
     * Fetch a job account by address
     */
    get(addr: Address, checkRun?: boolean): Promise<Job>;
    /**
     * Fetch a run account by address
     */
    run(addr: Address): Promise<Run>;
    /**
   * Fetch a run account by address
   */
    market(addr: Address): Promise<Market>;
    /**
   * Fetch multiple job accounts by address
   */
    multiple(addresses: Address[], checkRuns?: boolean): Promise<Job[]>;
    /**
    * Fetch all job accounts
    */
    all(filters?: {
        state?: JobState;
        market?: Address;
        node?: Address;
        project?: Address;
    }, checkRuns?: boolean): Promise<Job[]>;
    /**
    * Fetch all run accounts
    */
    runs(filters?: {
        node?: Address;
        job?: Address;
    }): Promise<Run[]>;
    /**
    * Fetch all market accounts
    */
    markets(): Promise<Market[]>;
    /**
     * Post a new job to the marketplace
     * @param params Parameters for listing a job
     * @returns The transaction signature
     */
    post(params: {
        market: Address;
        timeout: number | bigint;
        ipfsHash: string;
        node?: Address;
    }): Promise<ReturnType<typeof this.client.getListInstruction>>;
    /**
   * Monitor program account updates using callback functions
   * Uses WebSocket subscriptions with automatic restart on failure
   *
   * @example
   * ```typescript
   * // Example: Monitor job accounts and save to file
   * const stopMonitoring = await jobsProgram.monitor({
   *   onJobAccount: async (jobAccount) => {
   *     console.log('Job updated:', jobAccount.address.toString());
   *     // Save to database, file, or process as needed
   *   },
   *   onRunAccount: async (runAccount) => {
   *     console.log('Run updated:', runAccount.address.toString());
   *   },
   *   onError: async (error, accountType) => {
   *     console.error('Error processing account:', error, accountType);
   *   }
   * });
   *
   * // Stop monitoring when done
   * stopMonitoring();
   * ```
   *
   * @param options Configuration options for monitoring
   * @returns A function to stop monitoring
   */
    monitor(options?: {
        onJobAccount?: (jobAccount: Job) => Promise<void> | void;
        onMarketAccount?: (marketAccount: Market) => Promise<void> | void;
        onRunAccount?: (runAccount: Run) => Promise<void> | void;
        onError?: (error: Error, accountType?: string) => Promise<void> | void;
    }): Promise<() => void>;
    /**
     * Set up WebSocket subscription for program notifications
     */
    private setupSubscription;
    /**
     * Process subscription notifications
     */
    private processSubscriptionNotifications;
    transformJobAccount(jobAccount: Account<programClient.JobAccount>): Job;
    transformRunAccount(runAccount: Account<programClient.RunAccount>): Run;
    transformMarketAccount(marketAccount: Account<programClient.MarketAccount>): Market;
    /**
     * Handle account update using callback functions
     */
    private handleAccountUpdate;
    private handleJobAccount;
    private handleMarketAccount;
    private handleRunAccount;
}
