import type { ApiIntegrationInstallationSummary, CapabilityCatalogItem, ClientConfig, GitHubRepository, PersonalGitHubRepositoryCatalogItem, ReasoningEffort, ResourceRef, Session, ToolRef } from "../types.js"; import { type FirstPartyMcpToolName } from "@opengeni/contracts"; export type RepoDraft = { id: number; url: string; ref: string; expectedCommitSha?: string | undefined; attached?: boolean | undefined; /** * Workspace GitHub App identity retained from a restored resource that the * catalog could not confirm yet (still loading or unavailable). The row keeps * producing the same bound resource until catalog reconciliation selects it, * so restoring a draft never silently turns a bound repository into a bare * URL with a different mount path. */ github?: { repositoryId: number; installationId: number; } | undefined; /** * An attached row open in the editor with unsaved local changes. Catalog * reconciliation leaves it alone until the edit is attached or cancelled, so * the catalog finishing loading never discards the edit. */ editing?: true | undefined; }; export type IntelligenceEffort = ReasoningEffort; export type McpServerOption = { id: string; name: string; logoSrc?: string | null | undefined; detail?: string | undefined; connectionStatus?: "ready" | "connect" | "reconnect" | "unavailable" | "unknown" | undefined; }; /** Composer connector menus omit builtins managed by workspace tool settings. */ export declare function isComposerConnector(server: Pick): boolean; /** * Runtime infrastructure is not user policy: * - `opengeni` is the mandatory carrier for the individually selected * first-party tools. * - `files` is a real user-facing capability. It is selected by default, but * workspace admins and individual sessions may narrow it like other tools. */ export declare function isSelectableSessionMcpServerId(id: string): boolean; export declare function selectableSessionMcpServerIds(ids: Iterable): Set; /** Compare a retained draft with the current executable catalog, not saved defaults. */ export declare function unavailableSessionMcpServerIds(selectedIds: Iterable, servers: readonly McpServerOption[], catalogLoadedSuccessfully: boolean): string[]; export declare const firstPartySessionToolOptions: { id: "admin_action_call" | "admin_action_describe" | "admin_actions_search" | "artifacts_archive" | "artifacts_create" | "artifacts_get_source" | "artifacts_list" | "artifacts_prepare_upload" | "artifacts_publish" | "artifacts_restore" | "artifacts_rollback" | "atlassian_get" | "atlassian_search" | "atlassian_sources_list" | "browser_act" | "browser_auth" | "browser_clipboard" | "browser_debug" | "browser_download_save" | "browser_downloads" | "browser_identity" | "browser_lifecycle" | "browser_observe" | "browser_open" | "browser_publish" | "browser_read" | "browser_record" | "browser_screenshot" | "browser_tabs" | "capability_authorization_request" | "capability_catalog_search" | "command_read" | "command_wait" | "company_profile_confirm" | "company_profile_propose" | "computer_act" | "computer_clipboard" | "computer_lifecycle" | "computer_observe" | "computer_open" | "computer_targets" | "connected_machine_enable_screen_control" | "connected_machine_enroll_token" | "connected_machine_remove" | "custom_mcp_setup_request" | "editable_artifact_apply" | "editable_artifact_create" | "editable_artifact_export" | "editable_artifact_export_status" | "editable_artifact_get" | "editable_artifact_import" | "editable_artifact_inspect" | "editable_artifact_list" | "environment_list" | "environment_set_variable" | "excel_run" | "fiken_bank_accounts_list" | "fiken_companies_list" | "fiken_contact_create" | "fiken_contacts_list" | "fiken_invoice_draft_create" | "fiken_invoice_get" | "fiken_invoices_list" | "fiken_products_list" | "fiken_purchases_list" | "fiken_sales_list" | "github_connect_link" | "github_repositories_list" | "goal_complete" | "goal_pause" | "goal_progress" | "goal_resume" | "goal_set" | "goal_update" | "inbox_tidy" | "instruction_policy_get" | "instruction_policy_propose" | "instruction_policy_save" | "interaction_discover" | "interaction_request_human" | "knowledge_archive" | "knowledge_browse" | "knowledge_correct" | "knowledge_get" | "knowledge_prepare_save" | "knowledge_propose" | "knowledge_retain_file" | "knowledge_retain_message" | "knowledge_save" | "knowledge_search" | "memory_correct" | "memory_save" | "memory_search" | "notification_withdraw" | "notify_user" | "preference_propose" | "preference_registry_get" | "preference_registry_summary" | "project_create" | "project_delete" | "project_get" | "project_list" | "project_reorder" | "project_update" | "reddit_accounts_list" | "reddit_mentions_live" | "reddit_post_reply" | "reddit_posts_sync" | "reddit_search_live" | "reddit_thread_fetch" | "remember" | "remember_confirm" | "rig_get" | "rig_list" | "rig_promote" | "rig_propose_change" | "rig_verify" | "run_on" | "sandbox_attach" | "sandbox_file_publish" | "sandbox_provision" | "sandbox_swap" | "sandboxes_list" | "scheduled_task_runs_list" | "scheduled_tasks_create" | "scheduled_tasks_delete" | "scheduled_tasks_get" | "scheduled_tasks_list" | "scheduled_tasks_pause" | "scheduled_tasks_resume" | "scheduled_tasks_trigger" | "scheduled_tasks_update" | "secret_delete" | "secret_get" | "secret_move" | "secret_save" | "secret_search" | "session_create" | "session_events" | "session_get" | "session_human_input_respond" | "session_message_status" | "session_pause" | "session_resume" | "session_send_message" | "session_set_model" | "session_set_project" | "session_steer" | "session_target_get" | "session_target_set" | "session_wait" | "sessions_list" | "set_other_session_title" | "set_session_title" | "site_data_define_collection" | "site_data_describe" | "site_data_export" | "site_data_import" | "site_data_query" | "site_data_reset" | "site_data_write" | "site_files_delete" | "site_files_list" | "site_files_upload" | "site_hostname_check" | "site_publication_apply_fix" | "site_publication_get" | "site_publication_update" | "site_sql_define_query" | "site_sql_enable" | "site_sql_execute" | "site_sql_export" | "site_sql_import" | "site_sql_inspect" | "site_sql_migrate" | "site_sql_query" | "site_sql_reset" | "site_sql_run" | "slack_bot_channel_history" | "slack_bot_delete_message" | "slack_bot_file_content" | "slack_bot_file_info" | "slack_bot_list_channels" | "slack_bot_list_files" | "slack_bot_list_users" | "slack_bot_post_message" | "slack_bot_prepare_message" | "slack_bot_search" | "slack_bot_send_prepared_message" | "slack_bot_thread_replies" | "slack_bot_upload_file" | "social_connections_list" | "social_daily_analysis_context" | "social_mentions_live" | "social_post_reply" | "social_posts_recent" | "social_posts_sync" | "social_search_live" | "social_thread_fetch" | "task_note_archive" | "task_note_promote_instruction_policy" | "task_note_promote_knowledge" | "task_note_promote_preference" | "task_note_replace" | "task_note_save" | "task_notes_list" | "variable_set_get_variable" | "variable_set_list" | "variable_set_set_variable" | "wait_for_input" | "work_claim_release" | "work_claim_upsert" | "x_accounts_list" | "x_mentions_live" | "x_post_reply" | "x_posts_sync" | "x_search_live" | "x_thread_fetch"; name: string; }[]; export declare function clientFirstPartyMcpToolPolicy(config: Pick): { default: FirstPartyMcpToolName[]; allowed: FirstPartyMcpToolName[]; }; export declare function firstPartySessionToolOptionsFor(allowed: readonly FirstPartyMcpToolName[] | undefined): Array<{ id: FirstPartyMcpToolName; name: string; }>; export declare const reasoningEffortOrder: IntelligenceEffort[]; export declare function isIntelligenceEffort(value: unknown): value is IntelligenceEffort; export declare function labelEffort(value: IntelligenceEffort): string; export declare function effortOptionsFor(config: Pick | null): IntelligenceEffort[]; export declare function initialReasoningEffort(config: Pick): IntelligenceEffort; export declare function buildTools(existing: ToolRef[] | undefined, mcpServerIds?: string[]): ToolRef[]; /** * Materialize the exact user-facing MCP selection. The mandatory internal * `opengeni` carrier is attached server-side and never appears here. */ export declare function buildOpenGeniUiTools(existing: ToolRef[] | undefined, selectedMcpServerIds: Iterable): ToolRef[]; /** * Materialize the picker's selection only when it narrows/pins the inherited * baseline. `undefined` is the wire-level omitted-tools contract. */ export declare function toolsForPolicySelection(input: { existing?: ToolRef[] | undefined; selectedMcpServerIds: Iterable; baselineMcpServerIds: Iterable; forceExplicit?: boolean | undefined; }): ToolRef[] | undefined; /** Canonical persisted new-session policy, including the omitted/explicit bit. */ export declare function newSessionDraftToolPolicy(input: { selectedMcpServerIds: Iterable; workspaceDefaultMcpServerIds: Iterable; catalogReady: boolean; explicit: boolean; /** Header switch. Distinct from `explicit`, which pins the tool id list. */ customizing?: boolean | undefined; excludedMcpServerIds?: Iterable | undefined; }): { tools: ToolRef[]; toolsProvided: boolean; excludedMcpServerIds?: string[] | undefined; }; /** * Project the server-authoritative session policy into currently selectable * picker IDs. Workspace-default sessions follow the live capability baseline; * fixed policies use their effective IDs (or their persisted refs for rolling * compatibility). Unavailable IDs remain visible in policy truth/inspector but * cannot be selected by a picker that cannot execute them. */ export declare function sessionPolicyPickerIds(session: Pick, selectableIds: Iterable, workspaceDefaultIds: Iterable): Set; export declare function buildResources(manualRepos: RepoDraft[], repos: GitHubRepository[], selected: Set, selectedRefs: Record, personalRepositories?: PersonalGitHubRepositoryCatalogItem[], selectedPersonalRepositoryIds?: Set, selectedPersonalRepositoryRefs?: Record, personalCredentialBindingId?: string | null): ResourceRef[]; /** * Build only the repository refs pending on an existing session and prove they * can be additively merged with its already-mounted resources. Existing * resources are immutable through follow-up messages, so ref/path conflicts * fail in the composer before the turn is submitted. */ export declare function buildAdditionalRepositoryResources(input: { mountedResources: ResourceRef[]; manualRepos: RepoDraft[]; repositories: GitHubRepository[]; selectedRepoIds: Set; selectedRepoRefs: Record; personalRepositories?: PersonalGitHubRepositoryCatalogItem[] | undefined; selectedPersonalRepositoryIds?: Set | undefined; selectedPersonalRepositoryRefs?: Record | undefined; personalCredentialBindingId?: string | null | undefined; }): ResourceRef[]; export declare function gitHubRepositoryResource(repo: GitHubRepository, ref: string): Extract; export declare function isRepositoryResourceForGitHubRepo(resource: Extract, repo: GitHubRepository): boolean; export declare function sameRepositoryUri(resource: ResourceRef, uri: string): boolean; /** * Revalidate repository resources against the browser's authoritative GitHub * catalog. Private selections must retain both stable GitHub identities; * public/manual selections are URI-based and remain usable as manual refs when * the catalog no longer contains a matching public repository. */ export declare function rehydrateRepositoryResources(resources: ResourceRef[], repositories: GitHubRepository[], options?: { catalogReady?: boolean | undefined; personalRepositories?: PersonalGitHubRepositoryCatalogItem[] | undefined; personalCatalogReady?: boolean | undefined; }): ResourceRef[]; /** Project hydrated repository resources into the existing picker state. */ export declare function repositorySelectionFromResources(resources: ResourceRef[], repositories: GitHubRepository[]): { manualRepos: RepoDraft[]; selectedRepoIds: Set; selectedRepoRefs: Record; selectedPersonalRepoIds: Set; selectedPersonalRepoRefs: Record; }; /** * The workspace catalog repository an attached manual row stands for, if any. * A retained identity matches only that exact installation and repository. A * bare row matches the same way attaching a typed URL does: an exact * https://github.com URL naming the catalog repository. Other hosts never * match, so custom remotes keep their own attachment. */ export declare function manualRepositoryCatalogMatch(repo: RepoDraft, repositories: readonly GitHubRepository[]): GitHubRepository | null; export type RepositorySelectionState = { manualRepos: RepoDraft[]; selectedRepoIds: Set; selectedRepoRefs: Record; }; /** The composer's personal GitHub selection, read-only to catalog reconciliation. */ export type PersonalRepositorySelection = { repositories: readonly PersonalGitHubRepositoryCatalogItem[]; selectedRepoIds: ReadonlySet; selectedRepoRefs: Readonly>; }; /** * Fold attached manual rows that stand for a workspace catalog repository into * the catalog selection, so one repository is attached once and the picker * shows it checked. Returns null when nothing changes. * * - An unselected match becomes selected at the row's ref. * - A match already selected at the same ref is an exact duplicate and is dropped. * - A match selected at a different ref keeps its row: two refs are never * collapsed silently. * - A repository selected through personal GitHub keeps that authority: the * workspace App copy is never selected for it. A row at the ref of an * attached personal selection is an exact duplicate and is dropped; any * other row stays, including while the personal selection cannot attach yet. * - A row open in the editor is left alone until the edit ends. * - A retained identity that a ready catalog no longer contains is dropped, * exactly like draft hydration drops it when the catalog is already loaded. * - A bare row for another GitHub installation than the current selection is * left alone, matching the picker's one-installation rule. * - An unknown catalog changes nothing. */ export declare function reconcileManualRepositoriesWithCatalog(state: RepositorySelectionState, repositories: readonly GitHubRepository[], catalogReady: boolean, personal?: PersonalRepositorySelection): RepositorySelectionState | null; export declare function repositoryDisplayName(resource: Extract): string; export declare function normalizeRepositoryUrl(value: string): { host: string; repo: string; }; export type RepositoryGroup = { installationId: number; label: string; detail: string; repositories: GitHubRepository[]; }; export declare function groupRepositories(repositories: GitHubRepository[]): RepositoryGroup[]; export declare function selectableMcpServers(config: ClientConfig | null): McpServerOption[]; export declare function enabledWorkspaceCapabilityMcpServers(items: CapabilityCatalogItem[]): McpServerOption[]; /** One selectable local MCP surface per installed OpenAPI/GraphQL instance. */ export declare function installedApiIntegrationMcpServers(integrations: ReadonlyArray>): McpServerOption[]; export declare function mergeMcpServerOptions(...groups: McpServerOption[][]): McpServerOption[]; export declare function selectedAvailableCapabilityToolIds(current: Set, availableIds: string[], previouslyAvailableIds?: Set, defaultIds?: string[]): Set; export declare function isAbortError(error: unknown): boolean;