import { OnModuleInit } from '@nestjs/common';
import type { AgentPlanMode, AgentPermissionMode } from '@prisma/client';
import type { AgentTool, ToolDescriptor, ToolInvocation, ToolResult } from './tool.types';
import { type HostCapability } from './host-capability.types';
import { ProjectQueryTool } from './project-query.tool';
import { KnowledgeQueryTool } from './knowledge-query.tool';
import { WebSearchTool } from './web-search.tool';
import { WebFetchTool } from './web-fetch.tool';
import { TodoWriteTool } from './todo-write.tool';
import { TaskCreateTool, TaskUpdateTool, TaskListTool, TaskStopTool } from './task-tracker.tools';
import { CronCreateTool, CronListTool, CronUpdateTool, CronDeleteTool } from './cron.tools';
import { ApprovalSubmitTool } from './approval-submit.tool';
import { EnterPlanModeTool, ExitPlanModeTool, SetPermissionModeTool } from './mode-control.tools';
import { DelegateTaskTool } from './delegate-task.tool';
import { SendMessageTool } from './send-message.tool';
import { FileSaveTool } from './file-save.tool';
import { ScratchpadReadTool, ScratchpadWriteTool } from './scratchpad.tools';
import { AskUserTool } from './ask-user.tool';
import { FileReadTool, FileWriteTool, FileListTool, ClipboardReadTool, ClipboardWriteTool, NotifyPushTool, ShellOpenExternalTool, ShellExecTool } from './client-executor.tools';
export interface ListToolsContext {
    surface?: 'web' | 'desktop' | 'mobile' | 'teams' | 'cli';
    permissions?: string[];
    planMode?: AgentPlanMode;
    permissionMode?: AgentPermissionMode;
    capabilities?: readonly HostCapability[];
}
export declare class ToolRegistry implements OnModuleInit {
    private readonly projectQuery;
    private readonly knowledgeQuery;
    private readonly webSearch;
    private readonly webFetch;
    private readonly todoWrite;
    private readonly taskCreate;
    private readonly taskUpdate;
    private readonly taskList;
    private readonly taskStop;
    private readonly cronCreate;
    private readonly cronList;
    private readonly cronUpdate;
    private readonly cronDelete;
    private readonly approvalSubmit;
    private readonly enterPlan;
    private readonly exitPlan;
    private readonly setPermission;
    private readonly delegateTask;
    private readonly sendMessage;
    private readonly fileSave;
    private readonly scratchpadRead;
    private readonly scratchpadWrite;
    private readonly askUser;
    private readonly fileRead;
    private readonly fileWrite;
    private readonly fileList;
    private readonly clipboardRead;
    private readonly clipboardWrite;
    private readonly notifyPush;
    private readonly shellOpenExternal;
    private readonly shellExec;
    private readonly tools;
    constructor(projectQuery: ProjectQueryTool, knowledgeQuery: KnowledgeQueryTool, webSearch: WebSearchTool, webFetch: WebFetchTool, todoWrite: TodoWriteTool, taskCreate: TaskCreateTool, taskUpdate: TaskUpdateTool, taskList: TaskListTool, taskStop: TaskStopTool, cronCreate: CronCreateTool, cronList: CronListTool, cronUpdate: CronUpdateTool, cronDelete: CronDeleteTool, approvalSubmit: ApprovalSubmitTool, enterPlan: EnterPlanModeTool, exitPlan: ExitPlanModeTool, setPermission: SetPermissionModeTool, delegateTask: DelegateTaskTool, sendMessage: SendMessageTool, fileSave: FileSaveTool, scratchpadRead: ScratchpadReadTool, scratchpadWrite: ScratchpadWriteTool, askUser: AskUserTool, fileRead: FileReadTool, fileWrite: FileWriteTool, fileList: FileListTool, clipboardRead: ClipboardReadTool, clipboardWrite: ClipboardWriteTool, notifyPush: NotifyPushTool, shellOpenExternal: ShellOpenExternalTool, shellExec: ShellExecTool);
    onModuleInit(): void;
    register(tool: AgentTool): void;
    unregisterPrefix(prefix: string): number;
    list(ctx?: ListToolsContext): ToolDescriptor[];
    invoke(name: string, invocation: ToolInvocation): Promise<ToolResult>;
    assertAvailable(name: string, ctx: ListToolsContext): AgentTool;
    private isAvailable;
    listAsProviderTools(ctx?: ListToolsContext): Array<{
        type: 'function';
        function: {
            name: string;
            description: string;
            parameters: {
                type: 'object';
                properties: Record<string, {
                    type: string;
                    description?: string;
                }>;
                required?: string[];
            };
        };
    }>;
    private basicAvailable;
}
