import type { AgentMessage } from "./agent"; import type { GatewayModelSelection, JsonValue } from "./llms/gateway"; import type { ReasoningEffort } from "./llms/reasoning-options"; import type { RuntimeConfigExtensionKind } from "./session/runtime-config"; import type { AgendaAutomationPolicy, AgendaTaskCreateInput, AgendaTaskListInput, AgendaTaskRecord, AgendaTaskRunRecord, AgendaTaskUpdateInput } from "./tasks"; export type HubProtocolVersion = "v1"; export declare const CURRENT_HUB_PROTOCOL_VERSION: HubProtocolVersion; export declare const MIN_CLIENT_HUB_PROTOCOL_VERSION: HubProtocolVersion; export declare const MAX_CLIENT_HUB_PROTOCOL_VERSION: HubProtocolVersion; export type HubCapabilityName = "client.register" | "client.list" | "session.create" | "session.list" | "session.get" | "session.run" | "session.abort" | "schedule.create" | "schedule.list" | "task.create" | "task.list" | "task.get" | "task.update" | "task.approve" | "task.cancel" | "task.run" | "task.automation.get" | "task.automation.set" | "settings.get" | "settings.set" | "connector.start" | "connector.stop" | "connector.supervised" | "run.enqueue" | "run.list" | "hub.drain" | "hub.status" | "stream.replay"; export declare const HUB_CAPABILITIES: readonly HubCapabilityName[]; export interface HubProtocolMetadata { protocolVersion: string; minClientProtocolVersion?: string; maxClientProtocolVersion?: string; capabilities?: readonly string[]; } export type HubCompatibilityResult = { compatible: true; } | { compatible: false; reason: "missing_protocol" | "unsupported_protocol"; }; export declare function isHubProtocolCompatible(hub: HubProtocolMetadata, clientProtocolVersion?: HubProtocolVersion): HubCompatibilityResult; export type HubActorKind = "client" | "peerHub"; export type HubTransportKind = "native" | "browser" | "remote" | "native-grpc" | "browser-ws" | "browser-grpc-web" | "peer-grpc"; export type HubRuntimeStatus = "idle" | "running" | "pending" | "completed" | "aborted" | "failed"; export type HubSpokeStatus = "starting" | "ready" | "busy" | "stopping" | "stopped" | "failed"; export interface ClientCapability { name: string; description?: string; scopes?: string[]; payloadSchema?: Record; } /** Client capability advertised by a live user surface that can answer tool approvals. */ export declare const HUB_CLIENT_TOOL_APPROVAL_CAPABILITY = "approval.respond"; export interface HubClientRegistration { clientId?: string; clientType: string; displayName?: string; actorKind?: HubActorKind; transport: HubTransportKind; capabilities?: ClientCapability[]; metadata?: Record; workspaceContext?: { workspaceRoot?: string; cwd?: string; }; protocolVersion?: HubProtocolVersion; } export interface HubClientRecord { clientId: string; clientType: string; displayName?: string; actorKind: HubActorKind; connectedAt: number; lastSeenAt: number; transport: HubTransportKind; capabilities: ClientCapability[]; metadata?: Record; workspaceContext?: { workspaceRoot?: string; cwd?: string; }; } export interface SessionParticipant { clientId: string; attachedAt: number; role?: "creator" | "participant" | "observer"; metadata?: Record; } export interface SessionMetrics { inputTokens?: number; outputTokens?: number; cacheReadTokens?: number; cacheWriteTokens?: number; totalCost?: number; } export interface HubTeamMembership { teamId: string; role?: "lead" | "teammate" | "contractor"; } export interface HubSessionRuntimeSnapshot { runId?: string; status?: HubRuntimeStatus; iteration?: number; messages?: AgentMessage[]; pendingToolCalls?: unknown[]; usage?: SessionMetrics; aggregateUsage?: SessionMetrics; lastError?: string; } export interface SessionRecord { sessionId: string; workspaceRoot: string; cwd?: string; createdAt: number; updatedAt: number; createdByClientId: string; assignedSpokeId?: string; status: HubRuntimeStatus; /** * Clients currently observing or attached to this session. Participants do not * own client-local capabilities; capability routing is owned by the client that * created/restored the runtime session and advertised those capabilities. */ participants: SessionParticipant[]; activeRunId?: string; runtimeOptions?: HubSessionRuntimeOptions; metadata?: Record; runtimeSession?: { agentId: string; agentRole?: string; team?: HubTeamMembership; }; usage?: SessionMetrics; aggregateUsage?: SessionMetrics; } export interface HubSessionSnapshot { sessionId: string; agentId: string; agentRole?: string; workspacePath: string; rootPath?: string; createdAt: number; updatedAt: number; messages: AgentMessage[]; runCount: number; lastRunId?: string; status: HubRuntimeStatus; metadata?: Record; team?: HubTeamMembership; runtime?: HubSessionRuntimeSnapshot; } export interface SpokeRecord { spokeId: string; kind: "subprocess"; status: HubSpokeStatus; workspaceRoots: string[]; sessionIds: string[]; startedAt: number; lastSeenAt: number; metadata?: Record; } export type ApprovalStatus = "pending" | "approved" | "rejected" | "cancelled"; export interface ApprovalRequestRecord { approvalId: string; sessionId: string; requestedByClientId: string; targetClientId?: string; status: ApprovalStatus; requestedAt: number; resolvedAt?: number; payload: Record; response?: { approved: boolean; respondedByClientId: string; payload?: Record; }; } export type CapabilityRequestStatus = "pending" | "resolved" | "rejected" | "cancelled"; export interface CapabilityRequestRecord { requestId: string; sessionId: string; requestedByClientId: string; targetClientId?: string; capabilityName: string; status: CapabilityRequestStatus; requestedAt: number; resolvedAt?: number; payload?: Record; response?: { ok: boolean; respondedByClientId: string; payload?: Record; error?: string; }; } export interface PeerHubRecord { peerHubId: string; status: "connecting" | "ready" | "disconnected" | "failed"; connectedAt: number; lastSeenAt: number; transport: Extract; metadata?: Record; } export interface ScheduleRecord { scheduleId: string; name: string; cronPattern: string; timezone?: string; prompt: string; workspaceRoot: string; cwd?: string; modelSelection?: GatewayModelSelection; enabled: boolean; mode?: "act" | "plan" | "yolo"; systemPrompt?: string; maxIterations?: number; timeoutSeconds?: number; maxParallel?: number; createdAt: number; updatedAt: number; nextRunAt?: number; lastRunAt?: number; createdBy?: string; tags?: string[]; runtimeOptions?: HubSessionRuntimeOptions; metadata?: Record; } export type ScheduleExecutionStatus = "pending" | "running" | "success" | "completed" | "failed" | "timeout" | "aborted"; export interface ScheduleExecutionRecord { executionId: string; scheduleId: string; sessionId?: string; triggeredAt: number; startedAt?: number; endedAt?: number; status: ScheduleExecutionStatus; exitCode?: number; errorMessage?: string; iterations?: number; tokensUsed?: number; costUsd?: number; } export declare const ONE_TIME_SCHEDULE_CRON_PATTERN = "0"; export declare const ONE_TIME_SCHEDULE_RUN_AT_METADATA_KEY = "__hubScheduleRunAt"; export declare const HUB_SCHEDULE_MODES: readonly ["act", "plan", "yolo"]; export type HubScheduleMode = (typeof HUB_SCHEDULE_MODES)[number]; export declare function isHubScheduleMode(value: unknown): value is HubScheduleMode; export declare function readHubScheduleMode(payload: Record | undefined, defaultWhenAbsent: HubScheduleMode): HubScheduleMode; export declare function readHubScheduleMode(payload: Record | undefined): HubScheduleMode | undefined; export interface HubScheduleCreateInput { name: string; cronPattern: string; timezone?: string; prompt: string; workspaceRoot: string; cwd?: string; modelSelection?: GatewayModelSelection; enabled?: boolean; mode?: HubScheduleMode; systemPrompt?: string; maxIterations?: number; timeoutSeconds?: number; maxParallel?: number; createdBy?: string; tags?: string[]; runtimeOptions?: HubSessionRuntimeOptions; metadata?: Record; } export interface HubScheduleUpdateInput { scheduleId: string; name?: string; cronPattern?: string; timezone?: string | null; prompt?: string; workspaceRoot?: string; cwd?: string; modelSelection?: GatewayModelSelection; enabled?: boolean; mode?: HubScheduleMode; systemPrompt?: string | null; maxIterations?: number | null; timeoutSeconds?: number | null; maxParallel?: number; createdBy?: string | null; tags?: string[]; runtimeOptions?: HubSessionRuntimeOptions; metadata?: Record; } export interface HubTaskIdInput { taskId: string; } export type HubTaskCreateInput = Omit; export type HubTaskUpdateInput = Omit; export interface HubTaskRevisionInput extends HubTaskIdInput { expectedRevision: number; } export interface HubTaskCancelInput extends HubTaskRevisionInput { reason?: string; } export interface HubTaskAutomationSetInput { policy: Omit; } /** * Strongly typed task command payloads. This map is intentionally extensible so * other Hub command families can adopt typed payloads without changing the wire * envelope. */ export interface HubCommandInputMap { "task.create": HubTaskCreateInput; "task.list": AgendaTaskListInput; "task.get": HubTaskIdInput; "task.update": HubTaskUpdateInput; "task.approve": HubTaskRevisionInput; "task.cancel": HubTaskCancelInput; "task.run": HubTaskRevisionInput; "task.automation.get": Record; "task.automation.set": HubTaskAutomationSetInput; } /** Typed task command results returned in {@link HubReplyEnvelope.payload}. */ export interface HubCommandOutputMap { "task.create": { task: AgendaTaskRecord; }; "task.list": { tasks: AgendaTaskRecord[]; }; "task.get": { task?: AgendaTaskRecord; }; "task.update": { task: AgendaTaskRecord; }; "task.approve": { task: AgendaTaskRecord; }; "task.cancel": { task: AgendaTaskRecord; }; "task.run": { task: AgendaTaskRecord; run?: AgendaTaskRunRecord; }; "task.automation.get": { policy: AgendaAutomationPolicy; }; "task.automation.set": { policy: AgendaAutomationPolicy; }; } export type HubTypedCommandName = keyof HubCommandInputMap & HubCommandName; export type HubCommandInput = HubCommandInputMap[TCommand]; export type HubCommandOutput = HubCommandOutputMap[TCommand]; export type HubCommandName = "client.register" | "client.update" | "client.unregister" | "client.list" | "cline.account.get_current" | "prompt_commands.list" | "prompt_commands.execute" | "mention_files.search" | "catalog.list" | "session.list" | "session.create" | "session.attach" | "session.detach" | "session.get" | "session.messages" | "session.restore" | "session.delete" | "session.update" | "session.update_connection" | "session.compaction.get" | "session.compaction.update" | "session.pending_prompts" | "session.update_pending_prompt" | "session.remove_pending_prompt" | "session.fork" | "session.hook" | "run.start" | "session.send_input" | "run.enqueue" | "run.list" | "run.abort" | "run.proceed_while_running" | "hub.drain" | "hub.status" | "approval.request" | "approval.respond" | "capability.request" | "capability.progress" | "capability.respond" | "peer.register" | "peer.list_sessions" | "peer.attach_session" | "peer.detach_session" | "peer.proxy_command" | "schedule.create" | "schedule.list" | "schedule.get" | "schedule.update" | "schedule.delete" | "schedule.enable" | "schedule.disable" | "schedule.trigger" | "schedule.list_executions" | "schedule.stats" | "schedule.active" | "schedule.upcoming" | "task.create" | "task.list" | "task.get" | "task.update" | "task.approve" | "task.cancel" | "task.run" | "task.automation.get" | "task.automation.set" | "settings.list" | "settings.get" | "settings.patch" | "settings.toggle" | "connector.channels" | "connector.configure" | "connector.delete_config" | "connector.start" | "connector.stop" | "connector.supervised" | "cron.event.ingest" | "cron.event.list" | "cron.event.get" | "ui.notify" | "ui.show_window"; export declare const HUB_DEFAULT_COMMAND_TIMEOUT_MS = 30000; export declare const HUB_COMMAND_SLOW_LOG_MS = 5000; export declare function getDefaultHubCommandTimeoutMs(command: HubCommandName): number | null; export declare function resolveHubCommandTimeoutMs(command: HubCommandName, timeoutMs?: number | null): number | null; export interface HubCommandEnvelope { version: HubProtocolVersion; command: HubCommandName; requestId?: string; clientId?: string; sessionId?: string; timeoutMs?: number | null; payload?: Record; } export interface HubReplyEnvelope { version: HubProtocolVersion; requestId?: string; ok: boolean; payload?: Record; error?: { code: string; message: string; details?: Record; }; } export type HubEventName = "hub.client.registered" | "hub.client.disconnected" | "session.created" | "session.updated" | "session.attached" | "session.detached" | "session.forked" | "session.pending_prompts" | "session.pending_prompt_submitted" | "run.started" | "run.heartbeat" | "run.aborted" | "run.completed" | "run.failed" | "run.enqueued" | "run.interrupted" | "hub.drain_changed" | "iteration.started" | "iteration.finished" | "assistant.delta" | "assistant.media" | "assistant.finished" | "session.notice" | "reasoning.delta" | "reasoning.finished" | "agent.done" | "usage.updated" | "tool.started" | "tool.updated" | "tool.finished" | "approval.requested" | "approval.resolved" | "capability.requested" | "capability.resolved" | "team.progress" | "artifact.created" | "diff.created" | "spoke.started" | "spoke.failed" | "spoke.stopped" | "peer.registered" | "peer.session_attached" | "peer.session_detached" | "schedule.created" | "schedule.updated" | "schedule.deleted" | "schedule.triggered" | "schedule.execution_completed" | "schedule.execution_failed" | "task.created" | "task.updated" | "task.deleted" | "task.run.started" | "task.run.completed" | "task.run.failed" | "task.automation.updated" | "settings.changed" | "ui.notify" | "ui.show_window" | "hub.client.updated"; export interface HubEventEnvelope { version: HubProtocolVersion; event: HubEventName; eventId?: string; /** * Monotonic global sequence assigned by the Hub's durable event log. * A client can resume delivery exactly where it left off by passing the * last observed sequence as `sinceSequence` on `stream.subscribe`. * Absent on hubs (or events) without a durable log. */ sequence?: number; sessionId?: string; clientId?: string; sourceHubId?: string; timestamp?: number; payload?: Record; } export interface HubCapabilityRequestedPayload { requestId: string; targetClientId: string; capabilityName: string; payload?: Record; } export interface HubCapabilityResolvedPayload { requestId: string; targetClientId: string; respondedByClientId?: string; capabilityName: string; ok: boolean; cancelled?: boolean; payload?: Record; error?: string; } export type HubToolExecutorName = "readFile" | "search" | "bash" | "webFetch" | "editor" | "applyPatch" | "skills" | "askQuestion" | "submit"; export declare const HUB_TOOL_EXECUTOR_NAMES: readonly ["readFile", "search", "bash", "webFetch", "editor", "applyPatch", "skills", "askQuestion", "submit"]; export declare function isHubToolExecutorName(value: unknown): value is HubToolExecutorName; export declare const HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX = "tool_executor."; export declare const HUB_CUSTOM_TOOL_CAPABILITY_PREFIX = "custom_tool."; export declare const HUB_HOOK_CAPABILITY_PREFIX = "hook."; export declare const HUB_COMPACTION_CAPABILITY = "compaction.compact"; export declare const HUB_CHECKPOINT_CAPABILITY = "checkpoint.create"; export declare const HUB_MISTAKE_LIMIT_CAPABILITY = "mistake_limit.decide"; export declare const HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY = "user_instructions.snapshot"; export type HubClientContributionKind = "toolExecutor" | "tool" | "hook" | "compaction" | "checkpoint" | "mistakeLimit" | "userInstructionService"; export interface HubClientContributionBase { kind: HubClientContributionKind; capabilityName: string; } export interface HubClientToolExecutorContribution extends HubClientContributionBase { kind: "toolExecutor"; executor: HubToolExecutorName; } export interface HubClientToolContribution extends HubClientContributionBase { kind: "tool"; name: string; description: string; inputSchema: Record; lifecycle?: Record; } export interface HubClientHookContribution extends HubClientContributionBase { kind: "hook"; name: string; } export interface HubClientCompactionContribution extends HubClientContributionBase { kind: "compaction"; config?: Record; } export interface HubClientCheckpointContribution extends HubClientContributionBase { kind: "checkpoint"; config?: Record; } export interface HubClientMistakeLimitContribution extends HubClientContributionBase { kind: "mistakeLimit"; } export interface HubClientUserInstructionServiceContribution extends HubClientContributionBase { kind: "userInstructionService"; } export type HubClientContribution = HubClientToolExecutorContribution | HubClientToolContribution | HubClientHookContribution | HubClientCompactionContribution | HubClientCheckpointContribution | HubClientMistakeLimitContribution | HubClientUserInstructionServiceContribution; export interface HubSessionRuntimeOptions { mode?: "act" | "plan" | "yolo"; systemPrompt?: string; maxIterations?: number; timeoutSeconds?: number; thinking?: boolean; reasoningEffort?: ReasoningEffort; thinkingBudgetTokens?: number; checkpointEnabled?: boolean; enableTools?: boolean; enableSpawn?: boolean; enableTeams?: boolean; autoApproveTools?: boolean; configExtensions?: RuntimeConfigExtensionKind[]; clientContributions?: HubClientContribution[]; } export interface HubSessionCreateInput { workspaceRoot: string; cwd?: string; sessionConfig?: Record; metadata?: Record; toolPolicies?: Record; initialMessages?: AgentMessage[]; agentId?: string; agentRole?: string; team?: HubTeamMembership; modelSelection?: GatewayModelSelection; runtimeOptions?: HubSessionRuntimeOptions; } export interface HubModelCatalogProvider { id: string; name: string; enabled: boolean; defaultModelId?: string; } export interface HubModelCatalogModel { id: string; name?: string; supportsThinking?: boolean; } export interface HubModelCatalog { providers: HubModelCatalogProvider[]; modelsByProvider: Record; defaultSelection?: GatewayModelSelection; defaultWorkspaceRoot?: string; } export interface HubSessionAttachInput { sessionId: string; metadata?: Record; role?: SessionParticipant["role"]; } export interface HubSessionUpdateInput { sessionId: string; metadata?: Record; } export interface HubSessionDeleteInput { sessionId: string; deleteCheckpointRefs?: boolean; } export interface HubRunStartInput { sessionId: string; input?: string | AgentMessage | AgentMessage[]; } export interface HubApprovalRequestInput { sessionId: string; targetClientId?: string; payload: Record; } export interface HubApprovalRespondInput { approvalId: string; approved: boolean; payload?: Record; } export interface HubCapabilityRequestInput { sessionId: string; capabilityName: string; targetClientId?: string; payload?: Record; } export interface HubCapabilityRespondInput { requestId: string; ok: boolean; payload?: Record; error?: string; } export interface HubPeerRegisterInput { peerHubId?: string; transport?: Extract; metadata?: Record; } export interface HubPeerAttachSessionInput { peerHubId: string; sessionId: string; } export interface HubStateSnapshot { hubId: string; protocolVersion: HubProtocolVersion; sessions: SessionRecord[]; spokes: SpokeRecord[]; approvals: ApprovalRequestRecord[]; capabilityRequests: CapabilityRequestRecord[]; peers: PeerHubRecord[]; schedules?: ScheduleRecord[]; scheduleExecutions?: ScheduleExecutionRecord[]; } export type HubTransportFrame = { kind: "command"; envelope: HubCommandEnvelope; } | { kind: "reply"; envelope: HubReplyEnvelope; } | { kind: "stream.subscribe"; clientId: string; sessionId?: string; /** * Replay cursor: when set, the Hub first replays durable events with * `sequence > sinceSequence` (scoped to `sessionId` when given), then * live-tails. Omit for live-only delivery (legacy behavior). */ sinceSequence?: number; } | { kind: "stream.unsubscribe"; clientId: string; sessionId?: string; } | { kind: "event"; envelope: HubEventEnvelope; }; export interface HubUINotifyPayload { title: string; body: string; severity?: "info" | "warning" | "error"; sessionId?: string; clientId?: string; } export interface HubUIShowWindowPayload { windowId?: string; focus?: boolean; }