openapi: 3.1.0
info:
  title: Bossanova Orchestrator API
  version: '2026-07-11'
  description: >-
    OpenAPI reference for the bossanova.v1 OrchestratorService, the Connect API
    served by bosso. Callers select a date-based API version with the
    Bossanova-Version request header; see the API changelog for version history.
  license:
    name: Proprietary
paths:
  /bossanova.v1.OrchestratorService/CompleteGitHubAppSetup:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: CompleteGitHubAppSetup
      operationId: bossanova.v1.OrchestratorService.CompleteGitHubAppSetup
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.CompleteGitHubAppSetupRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/bossanova.v1.CompleteGitHubAppSetupResponse
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/CreateBillingPortalSession:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: CreateBillingPortalSession
      operationId: bossanova.v1.OrchestratorService.CreateBillingPortalSession
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/bossanova.v1.CreateBillingPortalSessionRequest
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/bossanova.v1.CreateBillingPortalSessionResponse
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/CreateCheckoutSession:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: CreateCheckoutSession
      operationId: bossanova.v1.OrchestratorService.CreateCheckoutSession
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.CreateCheckoutSessionRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/bossanova.v1.CreateCheckoutSessionResponse
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/CreateWebhookConfig:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: CreateWebhookConfig
      description: Webhook configuration management
      operationId: bossanova.v1.OrchestratorService.CreateWebhookConfig
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.CreateWebhookConfigRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.CreateWebhookConfigResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/DaemonStream: {}
  /bossanova.v1.OrchestratorService/DeleteWebhookConfig:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: DeleteWebhookConfig
      operationId: bossanova.v1.OrchestratorService.DeleteWebhookConfig
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.DeleteWebhookConfigRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.DeleteWebhookConfigResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/DisconnectGitHubAppRepo:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: DisconnectGitHubAppRepo
      operationId: bossanova.v1.OrchestratorService.DisconnectGitHubAppRepo
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.DisconnectGitHubAppRepoRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/bossanova.v1.DisconnectGitHubAppRepoResponse
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/GetCloudAccessStatus:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: GetCloudAccessStatus
      description: Cloud billing and access. User-authenticated.
      operationId: bossanova.v1.OrchestratorService.GetCloudAccessStatus
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.GetCloudAccessStatusRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.GetCloudAccessStatusResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/GetGitHubAppInstallURL:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: GetGitHubAppInstallURL
      description: GitHub App repository registration. User-authenticated.
      operationId: bossanova.v1.OrchestratorService.GetGitHubAppInstallURL
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.GetGitHubAppInstallURLRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/bossanova.v1.GetGitHubAppInstallURLResponse
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/IssueAttachToken:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: IssueAttachToken
      description: |-
        IssueAttachToken returns a short-lived JWT bound to (user, session,
         chat, scope) that the browser uses to authenticate the /ws/attach
         WebSocket handshake. TTL ~5 minutes.
      operationId: bossanova.v1.OrchestratorService.IssueAttachToken
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.IssueAttachTokenRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.IssueAttachTokenResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ListDaemons:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ListDaemons
      operationId: bossanova.v1.OrchestratorService.ListDaemons
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ListDaemonsRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ListDaemonsResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ListGitHubAppRepos:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ListGitHubAppRepos
      operationId: bossanova.v1.OrchestratorService.ListGitHubAppRepos
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ListGitHubAppReposRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ListGitHubAppReposResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ListWebhookConfigs:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ListWebhookConfigs
      operationId: bossanova.v1.OrchestratorService.ListWebhookConfigs
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ListWebhookConfigsRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ListWebhookConfigsResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxyArchiveSession:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxyArchiveSession
      description: Archives a session via the owning daemon's reverse stream.
      operationId: bossanova.v1.OrchestratorService.ProxyArchiveSession
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ProxyArchiveSessionRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ProxyArchiveSessionResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxyAttachSession: {}
  /bossanova.v1.OrchestratorService/ProxyCreateSession: {}
  /bossanova.v1.OrchestratorService/ProxyDeleteChat:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxyDeleteChat
      description: Deletes a chat via the owning daemon's reverse stream.
      operationId: bossanova.v1.OrchestratorService.ProxyDeleteChat
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ProxyDeleteChatRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ProxyDeleteChatResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxyGetChatTranscript:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxyGetChatTranscript
      description: >-
        Reads a chat's transcript via the owning daemon's reverse stream. Routes
        by
         session_id (FindSessionDaemon) with a GetChat authz check, like ProxyWakeChat.
      operationId: bossanova.v1.OrchestratorService.ProxyGetChatTranscript
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ProxyGetChatTranscriptRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/bossanova.v1.ProxyGetChatTranscriptResponse
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxyGetSession:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxyGetSession
      operationId: bossanova.v1.OrchestratorService.ProxyGetSession
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ProxyGetSessionRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ProxyGetSessionResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxyListAccounts:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxyListAccounts
      description: |-
        Lists the rotation accounts on the daemon owning session_id (web
         account-switch picker). Routes by session_id (FindSessionDaemon) for authz
         scope, like ProxySwitchSessionAccount. Accounts are metadata only — never
         credentials. Optional provider filter ("" = all).
      operationId: bossanova.v1.OrchestratorService.ProxyListAccounts
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ProxyListAccountsRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ProxyListAccountsResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxyListAgents:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxyListAgents
      description: >-
        Lists the installed agents on a single named daemon via its reverse
        stream.
      operationId: bossanova.v1.OrchestratorService.ProxyListAgents
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ProxyListAgentsRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ProxyListAgentsResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxyListRepoPRs:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxyListRepoPRs
      operationId: bossanova.v1.OrchestratorService.ProxyListRepoPRs
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ProxyListRepoPRsRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ProxyListRepoPRsResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxyListReposAggregated:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxyListReposAggregated
      description: |-
        Aggregates repos across all of the caller's live daemons, deduped by
         origin URL, with the serving daemon IDs unioned per repo.
      operationId: bossanova.v1.OrchestratorService.ProxyListReposAggregated
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/bossanova.v1.ProxyListReposAggregatedRequest
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/bossanova.v1.ProxyListReposAggregatedResponse
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxyListSessions:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxyListSessions
      description: Proxied daemon RPCs (remote CLI → orchestrator → daemon)
      operationId: bossanova.v1.OrchestratorService.ProxyListSessions
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ProxyListSessionsRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ProxyListSessionsResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxyListTrackerIssues:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxyListTrackerIssues
      operationId: bossanova.v1.OrchestratorService.ProxyListTrackerIssues
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ProxyListTrackerIssuesRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/bossanova.v1.ProxyListTrackerIssuesResponse
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxyMergeSession:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxyMergeSession
      description: Merges a session's PR via the owning daemon's reverse stream.
      operationId: bossanova.v1.OrchestratorService.ProxyMergeSession
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ProxyMergeSessionRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ProxyMergeSessionResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxyPauseSession:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxyPauseSession
      operationId: bossanova.v1.OrchestratorService.ProxyPauseSession
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ProxyPauseSessionRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ProxyPauseSessionResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxyRecordChat:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxyRecordChat
      description: Records or resumes a chat via the owning daemon's reverse stream.
      operationId: bossanova.v1.OrchestratorService.ProxyRecordChat
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ProxyRecordChatRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ProxyRecordChatResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxyResumeSession:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxyResumeSession
      operationId: bossanova.v1.OrchestratorService.ProxyResumeSession
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ProxyResumeSessionRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ProxyResumeSessionResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxySendChatMessage:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxySendChatMessage
      description: |-
        Sends a user message into a chat via the owning daemon's reverse stream.
         Routes by agent_session_id (FindDaemonForChat) since the MCP send tool
         carries no session_id.
      operationId: bossanova.v1.OrchestratorService.ProxySendChatMessage
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ProxySendChatMessageRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ProxySendChatMessageResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxyStopSession:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxyStopSession
      operationId: bossanova.v1.OrchestratorService.ProxyStopSession
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ProxyStopSessionRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ProxyStopSessionResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxyStreamChats: {}
  /bossanova.v1.OrchestratorService/ProxySwitchSessionAccount:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxySwitchSessionAccount
      description: |-
        Switches a session's live chat to a different account (stop+swap+resume)
         via the owning daemon's reverse stream. Routes by session_id
         (FindSessionDaemon) with an optional GetChat authz check, like ProxyWakeChat.
      operationId: bossanova.v1.OrchestratorService.ProxySwitchSessionAccount
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/bossanova.v1.ProxySwitchSessionAccountRequest
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/bossanova.v1.ProxySwitchSessionAccountResponse
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ProxyWakeChat:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ProxyWakeChat
      description: |-
        Wakes a stopped chat's tmux+claude. Routes to the owning daemon via the
         reverse stream and waits for CommandResult{WakeChatResult}.
      operationId: bossanova.v1.OrchestratorService.ProxyWakeChat
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ProxyWakeChatRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ProxyWakeChatResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/PublishDaemonSnapshot:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: PublishDaemonSnapshot
      description: |-
        PublishDaemonSnapshot is a unary fallback for networks that proxy normal
         HTTPS but do not support Connect bidirectional streaming end-to-end.
         Daemons authenticate with their RegisterDaemon session token and publish
         the same snapshot shape used as the first DaemonStream event.
      operationId: bossanova.v1.OrchestratorService.PublishDaemonSnapshot
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.PublishDaemonSnapshotRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/bossanova.v1.PublishDaemonSnapshotResponse
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/RefreshCloudEntitlements:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: RefreshCloudEntitlements
      operationId: bossanova.v1.OrchestratorService.RefreshCloudEntitlements
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/bossanova.v1.RefreshCloudEntitlementsRequest
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/bossanova.v1.RefreshCloudEntitlementsResponse
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/RegisterDaemon:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: RegisterDaemon
      description: Daemon registry
      operationId: bossanova.v1.OrchestratorService.RegisterDaemon
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.RegisterDaemonRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.RegisterDaemonResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/ReportBug:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: ReportBug
      description: |-
        Bug reporting (easter-egg ctrl+b in TUI). Unauthenticated; optionally
         resolves the caller's identity when a bearer token is present.
      operationId: bossanova.v1.OrchestratorService.ReportBug
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.ReportBugRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.ReportBugResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
  /bossanova.v1.OrchestratorService/TerminalStream: {}
  /bossanova.v1.OrchestratorService/TransferSession:
    post:
      tags:
        - bossanova.v1.OrchestratorService
      summary: TransferSession
      description: Session transfer between daemons
      operationId: bossanova.v1.OrchestratorService.TransferSession
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bossanova.v1.TransferSessionRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bossanova.v1.TransferSessionResponse'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
components:
  schemas:
    bossanova.v1.Account:
      type: object
      properties:
        id:
          type: string
          title: id
        provider:
          type: string
          title: provider
          description: '"claude" | "codex"'
        label:
          type: string
          title: label
        status:
          type: string
          title: status
          description: '"active" | "disabled"'
        priority:
          type: integer
          title: priority
          format: int32
          description: sort order; lower = preferred
        cooldownUntil:
          title: cooldown_until
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        lastUsedAt:
          title: last_used_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        health:
          type: string
          title: health
          description: '"ok" | "failed"'
        tier:
          type: string
          title: tier
          description: plan/tier metadata, free-form
        allowedModels:
          type: array
          items:
            type: string
          title: allowed_models
        lastTestOkAt:
          title: last_test_ok_at
          description: last time a credential test passed
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        lastTestError:
          type: string
          title: last_test_error
          description: most recent test failure detail; "" = none
        createdAt:
          title: created_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        updatedAt:
          title: updated_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        usage:
          title: usage
          description: >-
            Cached per-account rate-limit usage snapshot (BOS-297). METADATA
            ONLY —
             never a credential. Absent = never probed. NO credential field. Ever.
          $ref: '#/components/schemas/bossanova.v1.UsageSnapshot'
      title: Account
      additionalProperties: false
      description: |-
        Account is registry metadata for one provider login used by account
         rotation (BOS-157). It carries METADATA ONLY — the credential blob is never
         a field here and never crosses this message (locked decision D3); secrets
         live only in the OS keyring on the daemon host.
    bossanova.v1.AddAccountRequest:
      type: object
      properties:
        provider:
          type: string
          title: provider
          description: '"claude" | "codex"'
        label:
          type: string
          title: label
        priority:
          type: integer
          title: priority
          format: int32
          description: sort order; lower = preferred
        credential:
          type: string
          title: credential
          format: byte
          description: |-
            Credential blob (Claude setup-token string; Codex auth.json bytes).
             Inbound only — consumed straight into the keyring, NEVER echoed back.
      title: AddAccountRequest
      additionalProperties: false
    bossanova.v1.AddAccountResponse:
      type: object
      properties:
        account:
          title: account
          description: metadata only; never the credential
          $ref: '#/components/schemas/bossanova.v1.Account'
      title: AddAccountResponse
      additionalProperties: false
    bossanova.v1.AgentExitStatusRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
      title: AgentExitStatusRequest
      additionalProperties: false
    bossanova.v1.AgentExitStatusResponse:
      type: object
      properties:
        isComplete:
          type: boolean
          title: is_complete
        exitError:
          type: string
          title: exit_error
          description: empty on clean exit
        failureClass:
          type:
            - string
            - 'null'
          title: failure_class
          description: |-
            failure_class is the shared agenterr taxonomy string (e.g.
             "usage_exhausted", "auth_invalidated") when the plugin classified the
             exit as a known cap/auth failure; unset otherwise. Read-only signal —
             the daemon logs it and (later) reacts, but exit_error is untouched.
        resetAt:
          oneOf:
            - $ref: '#/components/schemas/google.protobuf.Timestamp'
            - type: 'null'
          title: reset_at
          description: |-
            reset_at is the parsed usage-cap reset time, set only alongside a
             "usage_exhausted" failure_class when the banner carried a parseable
             reset. Unset when unknown.
      title: AgentExitStatusResponse
      additionalProperties: false
    bossanova.v1.AgentInfo:
      type: object
      properties:
        name:
          type: string
          title: name
        version:
          type: string
          title: version
        userSettings:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.UserSetting'
          title: user_settings
          description: user_settings imported from plugin.proto.
      title: AgentInfo
      additionalProperties: false
    bossanova.v1.AgentRunnerServiceGetInfoRequest:
      type: object
      title: AgentRunnerServiceGetInfoRequest
      additionalProperties: false
    bossanova.v1.AgentRunnerServiceGetInfoResponse:
      type: object
      properties:
        info:
          title: info
          $ref: '#/components/schemas/bossanova.v1.PluginInfo'
      title: AgentRunnerServiceGetInfoResponse
      additionalProperties: false
    bossanova.v1.AggregatedRepo:
      type: object
      properties:
        originUrl:
          type: string
          title: origin_url
        displayName:
          type: string
          title: display_name
        defaultBaseBranch:
          type: string
          title: default_base_branch
        daemons:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.DaemonRepoRef'
          title: daemons
      title: AggregatedRepo
      additionalProperties: false
      description: >-
        AggregatedRepo is one logical repo (deduped by origin URL) plus a ref
        for
         every live daemon that serves it. Web-safe: carries no Repo and no API keys.
    bossanova.v1.ArchiveSessionCommand:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
      title: ArchiveSessionCommand
      additionalProperties: false
      description: |-
        ArchiveSessionCommand asks the daemon to archive a session.
         Replies with CommandResult carrying the updated Session.
    bossanova.v1.ArchiveSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: ArchiveSessionRequest
      additionalProperties: false
    bossanova.v1.ArchiveSessionResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: ArchiveSessionResponse
      additionalProperties: false
    bossanova.v1.AttachScope:
      type: string
      title: AttachScope
      enum:
        - ATTACH_SCOPE_UNSPECIFIED
        - ATTACH_SCOPE_EDITOR
        - ATTACH_SCOPE_VIEWER
      description: |-
        AttachScope distinguishes editor (input allowed) from viewer (read-only)
         attach modes. v1 ships only EDITOR semantics; VIEWER is wire-reserved.
    bossanova.v1.AttachSessionCommand:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
      title: AttachSessionCommand
      additionalProperties: false
      description: >-
        AttachSessionCommand asks the daemon to start streaming stdout/stderr
        for
         a session. Replies flow as SessionAttachChunk events carrying the same
         command_id.
    bossanova.v1.AttachSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: AttachSessionRequest
      additionalProperties: false
    bossanova.v1.AttachSessionResponse:
      type: object
      oneOf:
        - type: object
          properties:
            outputLine:
              title: output_line
              description: A line of Claude output.
              $ref: '#/components/schemas/bossanova.v1.OutputLine'
          title: output_line
          required:
            - outputLine
        - type: object
          properties:
            sessionEnded:
              title: session_ended
              description: Session ended (merged, closed, or blocked).
              $ref: '#/components/schemas/bossanova.v1.SessionEnded'
          title: session_ended
          required:
            - sessionEnded
        - type: object
          properties:
            stateChange:
              title: state_change
              description: Session state changed.
              $ref: '#/components/schemas/bossanova.v1.StateChange'
          title: state_change
          required:
            - stateChange
      title: AttachSessionResponse
      additionalProperties: false
      description: >-
        AttachSessionResponse is streamed to the CLI while attached to a
        session.
    bossanova.v1.Attempt:
      type: object
      properties:
        id:
          type: string
          title: id
        sessionId:
          type: string
          title: session_id
        trigger:
          title: trigger
          $ref: '#/components/schemas/bossanova.v1.AttemptTrigger'
        result:
          title: result
          $ref: '#/components/schemas/bossanova.v1.AttemptResult'
        error:
          type:
            - string
            - 'null'
          title: error
        createdAt:
          title: created_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        updatedAt:
          title: updated_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
      title: Attempt
      additionalProperties: false
      description: Attempt represents a fix attempt within a session.
    bossanova.v1.AttemptResult:
      type: string
      title: AttemptResult
      enum:
        - ATTEMPT_RESULT_UNSPECIFIED
        - ATTEMPT_RESULT_SUCCESS
        - ATTEMPT_RESULT_FAILED
        - ATTEMPT_RESULT_INCOMPLETE
      description: AttemptResult represents the outcome of a fix attempt.
    bossanova.v1.AttemptTrigger:
      type: string
      title: AttemptTrigger
      enum:
        - ATTEMPT_TRIGGER_UNSPECIFIED
        - ATTEMPT_TRIGGER_CHECK_FAILURE
        - ATTEMPT_TRIGGER_CONFLICT
        - ATTEMPT_TRIGGER_REVIEW_FEEDBACK
      description: AttemptTrigger represents what triggered a fix attempt.
    bossanova.v1.AttentionReason:
      type: string
      title: AttentionReason
      enum:
        - ATTENTION_REASON_UNSPECIFIED
        - ATTENTION_REASON_BLOCKED_MAX_ATTEMPTS
        - ATTENTION_REASON_AWAITING_HUMAN_INPUT
        - ATTENTION_REASON_REVIEW_REQUESTED
        - ATTENTION_REASON_MERGE_CONFLICT_UNRESOLVABLE
        - ATTENTION_REASON_AGENT_AUTH_FAILED
      description: AttentionReason represents why a session needs human attention.
    bossanova.v1.AttentionStatus:
      type: object
      properties:
        needsAttention:
          type: boolean
          title: needs_attention
        reason:
          title: reason
          $ref: '#/components/schemas/bossanova.v1.AttentionReason'
        summary:
          type: string
          title: summary
        since:
          title: since
          $ref: '#/components/schemas/google.protobuf.Timestamp'
      title: AttentionStatus
      additionalProperties: false
      description: >-
        AttentionStatus represents whether and why a session needs human
        attention.
    bossanova.v1.AuthKind:
      type: string
      title: AuthKind
      enum:
        - AUTH_KIND_UNSPECIFIED
        - AUTH_KIND_NONE
        - AUTH_KIND_ENV_TOKEN
        - AUTH_KIND_HOME_DIR
      description: >-
        AuthKind identifies how an agent's per-account credential is injected
        into a
         spawned process. Reported by RotationCapability.
    bossanova.v1.BuildInteractiveCommandRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        resume:
          type: boolean
          title: resume
        logPath:
          type: string
          title: log_path
          description: argv MUST tee output here
        initialPrompt:
          type: string
          title: initial_prompt
          description: raw user prompt to submit at startup
        initialCommand:
          type: string
          title: initial_command
          description: boss command name without agent prefix
        worktreePath:
          type: string
          title: worktree_path
          description: directory where the interactive pane launches
        appendSystemPrompt:
          type: string
          title: append_system_prompt
          description: >-
            append_system_prompt, when non-empty, is appended to the agent's
            system
             prompt (e.g. Claude Code's --append-system-prompt). bossd uses it to carry
             the chat's boss session context (session/chat/repo identifiers) for every
             chat, plus the cron autonomy directive for scheduler-spawned runs.
        model:
          type: string
          title: model
          description: opaque agent model id; "" = plugin default.
        mcpConfigPath:
          type: string
          title: mcp_config_path
          description: |-
            mcp_config_path, when non-empty, is an absolute path to a JSON file
             describing MCP servers to expose to the interactive agent (e.g. Claude
             Code's --mcp-config). bossd writes it into the boss app-data dir (NEVER
             the worktree) per spawn so the agent can reach the boss MCP server's
             mcp__boss__* tools in-session. Empty means no boss MCP wiring.
        strictMcpConfig:
          type: boolean
          title: strict_mcp_config
          description: >-
            strict_mcp_config, when true, tells the agent to load ONLY the
            servers in
             mcp_config_path and ignore project .mcp.json / settings MCP servers (Claude
             Code's --strict-mcp-config). bossd sets it for cron/fleet spawns so the
             curated set (boss + Linear) is the whole surface; absent/false preserves the
             pre-existing merge behavior for interactive and any un-updated caller.
      title: BuildInteractiveCommandRequest
      additionalProperties: false
    bossanova.v1.BuildInteractiveCommandResponse:
      type: object
      properties:
        argv:
          type: array
          items:
            type: string
          title: argv
        readyMarker:
          type: string
          title: ready_marker
          description: |-
            Prompt marker rendered by the interactive agent when it is ready for
             pasted input. Empty means the daemon uses its legacy Claude marker.
        commandPrefix:
          type: string
          title: command_prefix
          description: >-
            Prefix used to invoke boss-provided commands in the interactive
            agent.
             Examples: "/" for Claude Code, "$" for Codex. Empty preserves the
             legacy Claude slash prefix.
        consumesInitialInput:
          type: boolean
          title: consumes_initial_input
          description: >-
            True when argv embeds initial_prompt/initial_command so the daemon
            must
             not inject input into the tmux pane after launch.
      title: BuildInteractiveCommandResponse
      additionalProperties: false
    bossanova.v1.CancelWorkflowRequest:
      type: object
      properties:
        workflowId:
          type: string
          title: workflow_id
      title: CancelWorkflowRequest
      additionalProperties: false
    bossanova.v1.CancelWorkflowResponse:
      type: object
      properties:
        status:
          title: status
          $ref: '#/components/schemas/bossanova.v1.WorkflowStatusInfo'
      title: CancelWorkflowResponse
      additionalProperties: false
    bossanova.v1.ChatDelta:
      type: object
      properties:
        kind:
          title: kind
          $ref: '#/components/schemas/bossanova.v1.ChatDelta.Kind'
        chat:
          title: chat
          description: 'On CREATE/UPDATE: full metadata. On DELETE: id only.'
          $ref: '#/components/schemas/bossanova.v1.ClaudeChatMetadata'
      title: ChatDelta
      additionalProperties: false
      description: ChatDelta is a single ClaudeChatMetadata lifecycle change.
    bossanova.v1.ChatDelta.Kind:
      type: string
      title: Kind
      enum:
        - KIND_UNSPECIFIED
        - KIND_CREATED
        - KIND_UPDATED
        - KIND_DELETED
      description: Kind names are prefixed with KIND_ to satisfy buf STANDARD lint.
    bossanova.v1.ChatMessage:
      type: object
      properties:
        role:
          type: string
          title: role
          description: user | assistant | system | tool
        text:
          type: string
          title: text
          description: flattened text content of the turn
        timestamp:
          type: string
          title: timestamp
          description: RFC3339, best-effort from the transcript ("" if unknown)
        kind:
          type: string
          title: kind
          description: 'optional: text | tool_use | tool_result'
      title: ChatMessage
      additionalProperties: false
      description: >-
        ChatMessage is a transport-neutral, single turn of an agent chat
        transcript,
         flattened from the agent's on-disk JSONL by the owning plugin. It carries
         enough to render a conversation and to derive the "final result" without the
         daemon needing to understand any agent-specific transcript format.
    bossanova.v1.ChatStatus:
      type: string
      title: ChatStatus
      enum:
        - CHAT_STATUS_UNSPECIFIED
        - CHAT_STATUS_WORKING
        - CHAT_STATUS_IDLE
        - CHAT_STATUS_STOPPED
        - CHAT_STATUS_QUESTION
        - CHAT_STATUS_LIMITED
      description: ChatStatus represents the live status of a Claude Code chat process.
    bossanova.v1.ChatStatusDelta:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        status:
          title: status
          $ref: '#/components/schemas/bossanova.v1.ChatStatus'
        lastOutputAt:
          title: last_output_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        agentSessionId:
          type: string
          title: agent_session_id
          description: Per-chat key. Empty for legacy daemons; new daemons MUST set this.
      title: ChatStatusDelta
      additionalProperties: false
      description: |-
        ChatStatusDelta reports the live status of a Claude Code chat process.
         Named *Delta to avoid collision with the ChatStatus enum in models.proto.
         Coalesced by the daemon in a ~100ms window (decision #11).
    bossanova.v1.ChatStatusEntry:
      type: object
      properties:
        agentSessionId:
          type: string
          title: agent_session_id
        status:
          title: status
          $ref: '#/components/schemas/bossanova.v1.ChatStatus'
        lastOutputAt:
          title: last_output_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
      title: ChatStatusEntry
      additionalProperties: false
      description: ChatStatusEntry is a single chat's cached status.
    bossanova.v1.ChatStatusReport:
      type: object
      properties:
        agentSessionId:
          type: string
          title: agent_session_id
          description: Agent session UUID
        status:
          title: status
          description: Current process status
          $ref: '#/components/schemas/bossanova.v1.ChatStatus'
        lastOutputAt:
          title: last_output_at
          description: Last PTY output time
          $ref: '#/components/schemas/google.protobuf.Timestamp'
      title: ChatStatusReport
      additionalProperties: false
      description: ChatStatusReport is a single heartbeat from an owning client.
    bossanova.v1.CheckConclusion:
      type: string
      title: CheckConclusion
      enum:
        - CHECK_CONCLUSION_UNSPECIFIED
        - CHECK_CONCLUSION_SUCCESS
        - CHECK_CONCLUSION_FAILURE
        - CHECK_CONCLUSION_NEUTRAL
        - CHECK_CONCLUSION_CANCELLED
        - CHECK_CONCLUSION_SKIPPED
        - CHECK_CONCLUSION_TIMED_OUT
      description: CheckConclusion represents the conclusion of a completed CI check.
    bossanova.v1.CheckResult:
      type: object
      properties:
        id:
          type: string
          title: id
        name:
          type: string
          title: name
        status:
          title: status
          $ref: '#/components/schemas/bossanova.v1.CheckStatus'
        conclusion:
          oneOf:
            - $ref: '#/components/schemas/bossanova.v1.CheckConclusion'
            - type: 'null'
          title: conclusion
      title: CheckResult
      additionalProperties: false
      description: CheckResult represents the result of a single CI check.
    bossanova.v1.CheckSnapshot:
      type: object
      properties:
        polledAt:
          title: polled_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        headSha:
          type: string
          title: head_sha
        rawJson:
          type: string
          title: raw_json
          description: |-
            Raw JSON of the parsed []vcs.CheckResult slice the DisplayPoller
             fed into ComputeDisplayStatus. The CLI renders this verbatim.
        computedStatus:
          title: computed_status
          description: The DisplayStatus enum int the poller resolved for this snapshot.
          $ref: '#/components/schemas/bossanova.v1.DisplayStatus'
      title: CheckSnapshot
      additionalProperties: false
    bossanova.v1.CheckStatus:
      type: string
      title: CheckStatus
      enum:
        - CHECK_STATUS_UNSPECIFIED
        - CHECK_STATUS_QUEUED
        - CHECK_STATUS_IN_PROGRESS
        - CHECK_STATUS_COMPLETED
      description: CheckStatus represents the status of a CI check run.
    bossanova.v1.ChecksFailedEvent:
      type: object
      properties:
        prId:
          type: integer
          title: pr_id
          format: int32
        failedChecks:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.CheckResult'
          title: failed_checks
      title: ChecksFailedEvent
      additionalProperties: false
    bossanova.v1.ChecksOverall:
      type: string
      title: ChecksOverall
      enum:
        - CHECKS_OVERALL_UNSPECIFIED
        - CHECKS_OVERALL_PENDING
        - CHECKS_OVERALL_PASSED
        - CHECKS_OVERALL_FAILED
      description: ChecksOverall represents the aggregate status of all checks on a PR.
    bossanova.v1.ChecksPassedEvent:
      type: object
      properties:
        prId:
          type: integer
          title: pr_id
          format: int32
      title: ChecksPassedEvent
      additionalProperties: false
    bossanova.v1.ClaudeChat:
      type: object
      properties:
        id:
          type: string
          title: id
        sessionId:
          type: string
          title: session_id
        agentSessionId:
          type: string
          title: agent_session_id
          description: Agent session UUID
        title:
          type: string
          title: title
          description: First user prompt or "New chat"
        daemonId:
          type: string
          title: daemon_id
          description: Originating daemon (empty = local)
        createdAt:
          title: created_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        tmuxSessionName:
          type: string
          title: tmux_session_name
          description: Empty if no tmux session is hosting this chat
        agentName:
          type: string
          title: agent_name
          description: Agent plugin name (e.g. "claude", "opencode"). Empty in legacy data.
        providerSessionId:
          type: string
          title: provider_session_id
          description: >-
            Provider-owned resume/session UUID. Empty when provider uses
            agent_session_id
             directly or the value has not been discovered yet.
        startError:
          type: string
          title: start_error
          description: |-
            Short human-readable reason the agent never came up for this chat
             (e.g. "send plan failed: ready marker ❯ not seen within 5s").
             Empty on the happy path; non-empty rows are preserved as
             "attempted but never came up" entries so the chat list can show a
             (failed to start) badge instead of silently swallowing the
             attempt.
      title: ClaudeChat
      additionalProperties: false
      description: >-
        ClaudeChat represents a Claude Code conversation associated with a
        session.
    bossanova.v1.ClaudeChatMetadata:
      type: object
      properties:
        id:
          type: string
          title: id
        sessionId:
          type: string
          title: session_id
        agentSessionId:
          type: string
          title: agent_session_id
        title:
          type: string
          title: title
        daemonId:
          type: string
          title: daemon_id
        createdAt:
          title: created_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        updatedAt:
          title: updated_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        lastMessagePreview:
          type: string
          title: last_message_preview
          description: First ~200 characters of the last message. NOT the full message.
        agentName:
          type: string
          title: agent_name
          description: Agent plugin name (e.g. "claude", "opencode"). Empty in legacy data.
      title: ClaudeChatMetadata
      additionalProperties: false
      description: |-
        ClaudeChatMetadata is the slim, snapshot-sized view of a Claude chat.
         NO full transcripts — last_message_preview is a short summary only.
         Full transcripts are fetched on demand via AttachSessionCommand.
    bossanova.v1.ClaudeTurn:
      type: object
      properties:
        role:
          type: string
          title: role
          description: '"user" or "assistant".'
        content:
          type: string
          title: content
        timestamp:
          title: timestamp
          $ref: '#/components/schemas/google.protobuf.Timestamp'
      title: ClaudeTurn
      additionalProperties: false
      description: ClaudeTurn is a single turn from a recent Claude conversation.
    bossanova.v1.CloneAndRegisterRepoRequest:
      type: object
      properties:
        cloneUrl:
          type: string
          title: clone_url
        localPath:
          type: string
          title: local_path
        displayName:
          type: string
          title: display_name
        defaultBaseBranch:
          type: string
          title: default_base_branch
        worktreeBaseDir:
          type: string
          title: worktree_base_dir
        setupScript:
          type:
            - string
            - 'null'
          title: setup_script
      title: CloneAndRegisterRepoRequest
      additionalProperties: false
    bossanova.v1.CloneAndRegisterRepoResponse:
      type: object
      properties:
        repo:
          title: repo
          $ref: '#/components/schemas/bossanova.v1.Repo'
      title: CloneAndRegisterRepoResponse
      additionalProperties: false
    bossanova.v1.CloseSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: CloseSessionRequest
      additionalProperties: false
    bossanova.v1.CloseSessionResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: CloseSessionResponse
      additionalProperties: false
    bossanova.v1.CloudAccessState:
      type: string
      title: CloudAccessState
      enum:
        - CLOUD_ACCESS_STATE_UNSPECIFIED
        - CLOUD_ACCESS_STATE_ACTIVE
        - CLOUD_ACCESS_STATE_NEEDS_SUBSCRIPTION
        - CLOUD_ACCESS_STATE_PENDING_ENTITLEMENT_REFRESH
        - CLOUD_ACCESS_STATE_PAST_DUE
        - CLOUD_ACCESS_STATE_CANCELED
        - CLOUD_ACCESS_STATE_BILLING_UNAVAILABLE
    bossanova.v1.CloudAccessStatus:
      type: object
      properties:
        state:
          title: state
          $ref: '#/components/schemas/bossanova.v1.CloudAccessState'
        accountId:
          type: string
          title: account_id
        workosOrgId:
          type: string
          title: workos_org_id
        message:
          type: string
          title: message
        canRetry:
          type: boolean
          title: can_retry
        canCreateCheckout:
          type: boolean
          title: can_create_checkout
          description: >-
            True when the client should call CreateCheckoutSession to open
            Stripe Checkout.
        checkoutStarted:
          type: boolean
          title: checkout_started
          description: >-
            True when checkout has already been started and the client should
            poll
             RefreshCloudEntitlements instead of creating another checkout.
        denialReason:
          type: string
          title: denial_reason
          description: Short machine-readable reason for inactive cloud access.
      title: CloudAccessStatus
      additionalProperties: false
    bossanova.v1.CommandResult:
      type: object
      allOf:
        - properties:
            commandId:
              type: string
              title: command_id
            ok:
              type: boolean
              title: ok
            error:
              type: string
              title: error
              description: >-
                Populated when ok == false. Human-readable; do NOT match on it
                for
                 routing — use error_code instead.
            errorCode:
              title: error_code
              description: |-
                Populated when ok == false. Lets bosso map structured failures
                 (CodeNotFound, CodeFailedPrecondition, …) without string-prefix games.
              $ref: '#/components/schemas/bossanova.v1.CommandResult.ErrorCode'
        - oneOf:
            - type: object
              properties:
                getChatTranscript:
                  title: get_chat_transcript
                  description: >-
                    GetChatTranscript returns the chat's transcript (reuses
                    daemon.proto type).
                  $ref: '#/components/schemas/bossanova.v1.GetChatTranscriptResponse'
              title: get_chat_transcript
              required:
                - getChatTranscript
            - type: object
              properties:
                listAccounts:
                  title: list_accounts
                  description: >-
                    ListAccounts returns the daemon's rotation accounts (reuses
                    daemon.proto
                     type; metadata only — never credentials).
                  $ref: '#/components/schemas/bossanova.v1.ListAccountsResponse'
              title: list_accounts
              required:
                - listAccounts
            - type: object
              properties:
                listAgents:
                  title: list_agents
                  description: >-
                    ListAgents returns the daemon's installed agents (reuses
                    daemon.proto type).
                  $ref: '#/components/schemas/bossanova.v1.ListAgentsResponse'
              title: list_agents
              required:
                - listAgents
            - type: object
              properties:
                listRepoPrs:
                  title: list_repo_prs
                  description: >-
                    ListRepoPRs returns the repo's open PRs (reuses daemon.proto
                    type).
                  $ref: '#/components/schemas/bossanova.v1.ListRepoPRsResponse'
              title: list_repo_prs
              required:
                - listRepoPrs
            - type: object
              properties:
                listRepos:
                  title: list_repos
                  description: >-
                    ListRepos returns the daemon's full Repo set (reuses
                    daemon.proto type).
                  $ref: '#/components/schemas/bossanova.v1.ListReposResponse'
              title: list_repos
              required:
                - listRepos
            - type: object
              properties:
                listTrackerIssues:
                  title: list_tracker_issues
                  description: >-
                    ListTrackerIssues returns the repo's tracker issues (reuses
                    daemon.proto type).
                  $ref: '#/components/schemas/bossanova.v1.ListTrackerIssuesResponse'
              title: list_tracker_issues
              required:
                - listTrackerIssues
            - type: object
              properties:
                recordChat:
                  title: record_chat
                  description: RecordChat returns the created/resumed chat.
                  $ref: '#/components/schemas/bossanova.v1.ClaudeChat'
              title: record_chat
              required:
                - recordChat
            - type: object
              properties:
                sendChatMessage:
                  title: send_chat_message
                  description: >-
                    SendChatMessage returns the delivery outcome (reuses
                    daemon.proto type).
                  $ref: '#/components/schemas/bossanova.v1.SendChatMessageResponse'
              title: send_chat_message
              required:
                - sendChatMessage
            - type: object
              properties:
                session:
                  title: session
                  description: Stop/Pause/Resume return the updated Session.
                  $ref: '#/components/schemas/bossanova.v1.Session'
              title: session
              required:
                - session
            - type: object
              properties:
                switchAccount:
                  title: switch_account
                  description: >-
                    SwitchAccount returns the resumed flag + target label +
                    notice text.
                  $ref: '#/components/schemas/bossanova.v1.SwitchAccountResult'
              title: switch_account
              required:
                - switchAccount
            - type: object
              properties:
                transferConfirmed:
                  title: transfer_confirmed
                  description: >-
                    Transfer target confirms RESUME with this payload (decision
                    #14).
                  $ref: '#/components/schemas/bossanova.v1.TransferConfirmed'
              title: transfer_confirmed
              required:
                - transferConfirmed
            - type: object
              properties:
                wakeChat:
                  title: wake_chat
                  description: >-
                    WakeChat returns the Outcome enum + the persisted tmux
                    session name.
                  $ref: '#/components/schemas/bossanova.v1.WakeChatResult'
              title: wake_chat
              required:
                - wakeChat
      title: CommandResult
      additionalProperties: false
      description: |-
        CommandResult is the daemon's response to Stop/Pause/Resume/Transfer
         commands. command_id correlates back to the originating OrchestratorCommand.
    bossanova.v1.CommandResult.ErrorCode:
      type: string
      title: ErrorCode
      enum:
        - ERROR_CODE_UNSPECIFIED
        - ERROR_CODE_NOT_FOUND
        - ERROR_CODE_FAILED_PRECONDITION
      description: |-
        ErrorCode is a typed channel for failure-mode signalling so bosso can
         map daemon errors back to ConnectRPC codes without parsing the human-
         readable `error` string. Append-only — old daemons emit
         ERROR_CODE_UNSPECIFIED, which bosso treats as CodeAborted (the
         historical default before this field existed).
    bossanova.v1.CompleteGitHubAppSetupRequest:
      type: object
      properties:
        installationId:
          type:
            - integer
            - string
          title: installation_id
          format: int64
        state:
          type: string
          title: state
          description: Server-issued setup state returned by GetGitHubAppInstallURL.
        githubCode:
          type: string
          title: github_code
          description: >-
            GitHub OAuth code returned by the GitHub App setup callback.
            Exchanged once
             for a user access token to verify the caller can access installation_id.
      title: CompleteGitHubAppSetupRequest
      additionalProperties: false
    bossanova.v1.CompleteGitHubAppSetupResponse:
      type: object
      properties:
        repos:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.GitHubAppRepoStatus'
          title: repos
      title: CompleteGitHubAppSetupResponse
      additionalProperties: false
    bossanova.v1.ConfigureFinalizeHookRequest:
      type: object
      properties:
        workDir:
          type: string
          title: work_dir
        sessionId:
          type: string
          title: session_id
        hookToken:
          type: string
          title: hook_token
        hookPort:
          type: integer
          title: hook_port
          format: int32
        agentSessionId:
          type: string
          title: agent_session_id
          description: >-
            When non-empty, the plugin installs a run-scoped Stop-hook entry
            that POSTs
             to /hooks/agent-run-complete/{agent_session_id} alongside (not replacing)
             any existing session-keyed entry. Empty means legacy session-keyed
             behaviour: POST to /hooks/finalize/{session_id}.
      title: ConfigureFinalizeHookRequest
      additionalProperties: false
    bossanova.v1.ConfigureFinalizeHookResponse:
      type: object
      properties:
        isSupported:
          type: boolean
          title: is_supported
      title: ConfigureFinalizeHookResponse
      additionalProperties: false
    bossanova.v1.ConflictDetectedEvent:
      type: object
      properties:
        prId:
          type: integer
          title: pr_id
          format: int32
      title: ConflictDetectedEvent
      additionalProperties: false
    bossanova.v1.CreateBillingPortalSessionRequest:
      type: object
      properties:
        returnUrl:
          type: string
          title: return_url
      title: CreateBillingPortalSessionRequest
      additionalProperties: false
    bossanova.v1.CreateBillingPortalSessionResponse:
      type: object
      properties:
        url:
          type: string
          title: url
      title: CreateBillingPortalSessionResponse
      additionalProperties: false
    bossanova.v1.CreateCheckoutSessionRequest:
      type: object
      properties:
        returnUrl:
          type: string
          title: return_url
        cancelUrl:
          type: string
          title: cancel_url
      title: CreateCheckoutSessionRequest
      additionalProperties: false
    bossanova.v1.CreateCheckoutSessionResponse:
      type: object
      properties:
        url:
          type: string
          title: url
        status:
          title: status
          $ref: '#/components/schemas/bossanova.v1.CloudAccessStatus'
      title: CreateCheckoutSessionResponse
      additionalProperties: false
    bossanova.v1.CreateCronJobRequest:
      type: object
      properties:
        repoId:
          type: string
          title: repo_id
        name:
          type: string
          title: name
        prompt:
          type: string
          title: prompt
        schedule:
          type: string
          title: schedule
        timezone:
          type: string
          title: timezone
          description: optional IANA tz; empty = daemon-local
        enabled:
          type: boolean
          title: enabled
        agentName:
          type: string
          title: agent_name
          description: optional agent runner plugin name; empty = claude
        model:
          type: string
          title: model
          description: >-
            opaque agent model id; "" = plugin default. Never enumerated by
            bossd.
        gateCommand:
          type: string
          title: gate_command
          description: optional gate command run before each fire; empty = no gate
        runSetupCommand:
          type:
            - boolean
            - 'null'
          title: run_setup_command
          description: >-
            run the repo setup script before the agent. optional so the server
            can
             default it to true when a client omits it (a plain bool can't tell
             "omitted" from "explicit false").
      title: CreateCronJobRequest
      additionalProperties: false
    bossanova.v1.CreateCronJobResponse:
      type: object
      properties:
        cronJob:
          title: cron_job
          $ref: '#/components/schemas/bossanova.v1.CronJob'
      title: CreateCronJobResponse
      additionalProperties: false
    bossanova.v1.CreateError:
      type: object
      properties:
        message:
          type: string
          title: message
      title: CreateError
      additionalProperties: false
      description: >-
        CreateError carries a human-readable failure reason for a CreateSession
        that
         could not complete. It is the terminal frame on the error path.
    bossanova.v1.CreatePROpts:
      type: object
      properties:
        repoPath:
          type: string
          title: repo_path
        headBranch:
          type: string
          title: head_branch
        baseBranch:
          type: string
          title: base_branch
        title:
          type: string
          title: title
        body:
          type: string
          title: body
        draft:
          type: boolean
          title: draft
      title: CreatePROpts
      additionalProperties: false
      description: CreatePROpts contains options for creating a new pull request.
    bossanova.v1.CreateSessionAction:
      type: object
      properties:
        title:
          type: string
          title: title
        plan:
          type: string
          title: plan
        repoOriginUrl:
          type: string
          title: repo_origin_url
        baseBranch:
          type: string
          title: base_branch
      title: CreateSessionAction
      additionalProperties: false
      description: CreateSessionAction tells the daemon to create a new session.
    bossanova.v1.CreateSessionCommand:
      type: object
      properties:
        repoId:
          type: string
          title: repo_id
        title:
          type: string
          title: title
        plan:
          type: string
          title: plan
        baseBranch:
          type: string
          title: base_branch
        quickChat:
          type: boolean
          title: quick_chat
        agentName:
          type: string
          title: agent_name
        prNumber:
          type:
            - integer
            - 'null'
          title: pr_number
          format: int32
          description: >-
            PR/tracker fields (wizard "existing PR" / "Linear" / "Sentry"
            flows).
        branchName:
          type:
            - string
            - 'null'
          title: branch_name
        trackerId:
          type:
            - string
            - 'null'
          title: tracker_id
        trackerUrl:
          type:
            - string
            - 'null'
          title: tracker_url
        trackerIssue:
          oneOf:
            - $ref: '#/components/schemas/bossanova.v1.TrackerIssue'
            - type: 'null'
          title: tracker_issue
          description: >-
            Full selected issue + source, so the daemon can format the plan
            (D3).
        trackerSource:
          type:
            - string
            - 'null'
          title: tracker_source
        force:
          type: boolean
          title: force
          description: |-
            Bypass the BOS-236 tracker-issue dedup guard (mirrors
             CreateSessionRequest.force) so the reverse-stream create path carries the
             same escape hatch as the direct socket create.
        detach:
          type: boolean
          title: detach
          description: >-
            Unattended-session fields carried over the reverse stream so a
            hosted
             create (bosso → daemon) reproduces the local socket create. Mirror
             CreateSessionRequest.{detach,model,tmux_unattended}; without them the
             daemon builds an interactive/default-model session and skips the
             unattended prompt.
        model:
          type:
            - string
            - 'null'
          title: model
        tmuxUnattended:
          type: boolean
          title: tmux_unattended
        accountId:
          type:
            - string
            - 'null'
          title: account_id
        forceBranch:
          type: boolean
          title: force_branch
          description: >-
            Mirror CreateSessionRequest.force_branch so reverse-stream hosted
            creates
             preserve the local socket path's branch replacement behavior.
      title: CreateSessionCommand
      additionalProperties: false
      description: |-
        CreateSessionCommand asks the daemon to create a new session. The daemon
         replies with a STREAM of SessionCreateChunk events (live setup output, then
         a terminal created/error) correlated by command_id — mirroring
         AttachSessionCommand/SessionAttachChunk. Fields are a wizard-relevant subset
         of daemon.proto's CreateSessionRequest.
    bossanova.v1.CreateSessionRequest:
      type: object
      properties:
        repoId:
          type: string
          title: repo_id
        title:
          type: string
          title: title
        plan:
          type: string
          title: plan
        baseBranch:
          type: string
          title: base_branch
        prNumber:
          type:
            - integer
            - 'null'
          title: pr_number
          format: int32
          description: If set, attach to an existing PR instead of creating a new one.
        forceBranch:
          type: boolean
          title: force_branch
          description: >-
            If true, remove any existing branch with the same name before
            creating.
        quickChat:
          type: boolean
          title: quick_chat
          description: >-
            If true, run as a quick chat session (no worktree, no branch, no
            PR).
        branchName:
          type:
            - string
            - 'null'
          title: branch_name
          description: Optional branch name (eg. from Linear's suggested branch name).
        trackerId:
          type:
            - string
            - 'null'
          title: tracker_id
          description: External issue tracker fields. External issue ID (eg. "FRE-1176")
        trackerUrl:
          type:
            - string
            - 'null'
          title: tracker_url
          description: URL to issue in external tracker
        agentName:
          type:
            - string
            - 'null'
          title: agent_name
          description: >-
            Agent plugin to run this session under. Empty → server-chosen
            default agent.
        trackerIssue:
          oneOf:
            - $ref: '#/components/schemas/bossanova.v1.TrackerIssue'
            - type: 'null'
          title: tracker_issue
          description: >-
            Full selected tracker issue + source, used to format the session
            plan
             server-side when plan is empty (web new-session tracker flows).
        trackerSource:
          type:
            - string
            - 'null'
          title: tracker_source
          description: '"linear" | "sentry"'
        detach:
          type: boolean
          title: detach
          description: >-
            If true, run the session's initial agent pass headlessly (codex exec
            /
             claude --print) instead of leaving it idle to start interactively on
             first attach. Set by `boss new --detach`. Default false = interactive:
             no headless run fires, the agent starts when the user attaches.
        model:
          type:
            - string
            - 'null'
          title: model
          description: |-
            Opaque agent model id to run this session under (e.g. an Opus id).
             Empty → the agent plugin's default model. Mirrors `boss cron add --model`;
             set by `boss new --model` and the MCP create_session tool.
        tmuxUnattended:
          type: boolean
          title: tmux_unattended
        force:
          type: boolean
          title: force
          description: >-
            If true, bypass the tracker-issue dedup guard and create a second
            session
             for a tracker/PR/branch that already has an active one (BOS-236 escape hatch).
        accountId:
          type:
            - string
            - 'null'
          title: account_id
          description: >-
            account_id binds the session to a rotation account. Presence
            matters: absent
             applies the default-account policy; present-and-empty ("") is an explicit
             system-default account 0 opt-out (no injected env, D9); present-and-non-empty
             binds that account.
      title: CreateSessionRequest
      additionalProperties: false
    bossanova.v1.CreateSessionResponse:
      type: object
      oneOf:
        - type: object
          properties:
            sessionCreated:
              title: session_created
              $ref: '#/components/schemas/bossanova.v1.SessionCreated'
          title: session_created
          required:
            - sessionCreated
        - type: object
          properties:
            setupOutput:
              title: setup_output
              $ref: '#/components/schemas/bossanova.v1.SetupScriptOutput'
          title: setup_output
          required:
            - setupOutput
      title: CreateSessionResponse
      additionalProperties: false
    bossanova.v1.CreateWebhookConfigRequest:
      type: object
      properties:
        repoOriginUrl:
          type: string
          title: repo_origin_url
        provider:
          type: string
          title: provider
        secret:
          type: string
          title: secret
          description: If empty, a random secret will be generated.
      title: CreateWebhookConfigRequest
      additionalProperties: false
    bossanova.v1.CreateWebhookConfigResponse:
      type: object
      properties:
        config:
          title: config
          $ref: '#/components/schemas/bossanova.v1.WebhookConfig'
      title: CreateWebhookConfigResponse
      additionalProperties: false
    bossanova.v1.CronJob:
      type: object
      properties:
        id:
          type: string
          title: id
        repoId:
          type: string
          title: repo_id
        name:
          type: string
          title: name
        prompt:
          type: string
          title: prompt
        schedule:
          type: string
          title: schedule
          description: 5-field cron expression (or @daily, @hourly, etc.)
        timezone:
          type: string
          title: timezone
          description: optional IANA tz name; empty = daemon-local
        enabled:
          type: boolean
          title: enabled
        lastRunSessionId:
          type: string
          title: last_run_session_id
          description: empty if never run
        lastRunAt:
          title: last_run_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        lastRunOutcome:
          type: string
          title: last_run_outcome
          description: 'one of: deleted_no_changes, pr_created,'
        nextRunAt:
          title: next_run_at
          description: |-
            pr_skipped_no_github, pr_failed,
             chat_spawn_failed, cleanup_failed,
             failed_recovered, fire_failed
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        createdAt:
          title: created_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        updatedAt:
          title: updated_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        lastRunStatus:
          title: last_run_status
          description: derived; not persisted
          $ref: '#/components/schemas/bossanova.v1.CronJobStatus'
        agentName:
          type: string
          title: agent_name
          description: agent runner plugin name; empty legacy data defaults to claude
        model:
          type: string
          title: model
          description: >-
            opaque agent model id; "" = plugin default. Never enumerated by
            bossd.
        gateCommand:
          type: string
          title: gate_command
          description: optional gate command run before each fire; empty = no gate
        runSetupCommand:
          type: boolean
          title: run_setup_command
          description: run the repo setup script before the agent; default true
      title: CronJob
      additionalProperties: false
      description: |-
        CronJob represents a scheduled prompt that fires on a cron expression.

         At fire time, bossd spawns a new session in a fresh worktree with
         PR creation deferred. When Claude's Stop hook fires, the daemon
         finalizes the run: empty diff -> delete worktree; non-empty diff +
         GitHub origin -> push and open PR; otherwise preserve the worktree.
    bossanova.v1.CronJobStatus:
      type: string
      title: CronJobStatus
      enum:
        - CRON_JOB_STATUS_UNSPECIFIED
        - CRON_JOB_STATUS_IDLE
        - CRON_JOB_STATUS_RUNNING
        - CRON_JOB_STATUS_FAILED
        - CRON_JOB_STATUS_GATED
        - CRON_JOB_STATUS_GATING
      description: |-
        CronJobStatus is the derived run-status for a cron job, computed from
         the previous run's session state and recorded outcome. Not persisted —
         `last_run_outcome` (string) remains the audit field on disk.
    bossanova.v1.CustomEvent:
      type: object
      properties:
        eventType:
          type: string
          title: event_type
        payload:
          type: string
          title: payload
          description: JSON-encoded payload.
      title: CustomEvent
      additionalProperties: false
      description: CustomEvent is an extensibility point for plugin-specific events.
    bossanova.v1.DaemonEvent:
      type: object
      oneOf:
        - type: object
          properties:
            ack:
              title: ack
              description: Response to a WebhookEvent command from the orchestrator.
              $ref: '#/components/schemas/bossanova.v1.WebhookAck'
          title: ack
          required:
            - ack
        - type: object
          properties:
            attachChunk:
              title: attach_chunk
              description: Stdout/stderr chunk from an active AttachSession.
              $ref: '#/components/schemas/bossanova.v1.SessionAttachChunk'
          title: attach_chunk
          required:
            - attachChunk
        - type: object
          properties:
            chat:
              title: chat
              $ref: '#/components/schemas/bossanova.v1.ChatDelta'
          title: chat
          required:
            - chat
        - type: object
          properties:
            createChunk:
              title: create_chunk
              description: >-
                Streaming frame from an in-flight CreateSession (setup output,
                then a
                 terminal created/error).
              $ref: '#/components/schemas/bossanova.v1.SessionCreateChunk'
          title: create_chunk
          required:
            - createChunk
        - type: object
          properties:
            result:
              title: result
              description: Response to Stop/Pause/Resume/Transfer/Attach commands.
              $ref: '#/components/schemas/bossanova.v1.CommandResult'
          title: result
          required:
            - result
        - type: object
          properties:
            session:
              title: session
              $ref: '#/components/schemas/bossanova.v1.SessionDelta'
          title: session
          required:
            - session
        - type: object
          properties:
            snapshot:
              title: snapshot
              description: >-
                Required first event on every connect; bosso replaces any prior
                snapshot.
              $ref: '#/components/schemas/bossanova.v1.DaemonSnapshot'
          title: snapshot
          required:
            - snapshot
        - type: object
          properties:
            status:
              title: status
              description: >-
                Coalesced ~100ms on the daemon (decision #11). Named *Delta to
                avoid
                 collision with the ChatStatus enum in models.proto.
              $ref: '#/components/schemas/bossanova.v1.ChatStatusDelta'
          title: status
          required:
            - status
        - type: object
          properties:
            tokenRefresh:
              title: token_refresh
              description: >-
                In-band WorkOS JWT refresh. Bosso re-verifies against WorkOS
                JWKS.
              $ref: '#/components/schemas/bossanova.v1.TokenRefresh'
          title: token_refresh
          required:
            - tokenRefresh
      title: DaemonEvent
      additionalProperties: false
      description: >-
        DaemonEvent is the oneof envelope for every message a daemon pushes up
        the
         stream. Unknown oneof cases are logged and skipped by the orchestrator for
         forward compatibility.
    bossanova.v1.DaemonInfo:
      type: object
      properties:
        daemonId:
          type: string
          title: daemon_id
        hostname:
          type: string
          title: hostname
        repoIds:
          type: array
          items:
            type: string
          title: repo_ids
        activeSessions:
          type: integer
          title: active_sessions
          format: int32
        connectedAt:
          title: connected_at
          description: |-
            Timestamp the current bidirectional stream from the daemon was
             established. Resets on every reconnect — the reverse-stream model
             has no separate heartbeat; the live stream IS the liveness signal.
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        online:
          type: boolean
          title: online
      title: DaemonInfo
      additionalProperties: false
    bossanova.v1.DaemonOffline:
      type: object
      properties:
        daemonId:
          type: string
          title: daemon_id
        reason:
          type: string
          title: reason
          description: Optional reason for logs/diagnostics.
      title: DaemonOffline
      additionalProperties: false
      description: |-
        DaemonOffline is the terminal event emitted by the orchestrator when the
         owning daemon's stream goes offline mid-subscription. The client should
         treat this as a signal to retry later.
    bossanova.v1.DaemonRepoRef:
      type: object
      properties:
        daemonId:
          type: string
          title: daemon_id
        repoId:
          type: string
          title: repo_id
        hasLinearKey:
          type: boolean
          title: has_linear_key
        hasSentryKey:
          type: boolean
          title: has_sentry_key
      title: DaemonRepoRef
      additionalProperties: false
      description: >-
        DaemonRepoRef ties a logical repo to one serving daemon: that daemon's
        local
         repo_id plus its per-daemon tracker capability (Linear/Sentry creds present).
    bossanova.v1.DaemonSnapshot:
      type: object
      properties:
        daemonId:
          type: string
          title: daemon_id
        hostname:
          type: string
          title: hostname
        repoIds:
          type: array
          items:
            type: string
          title: repo_ids
        sessions:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.Session'
          title: sessions
          description: 'Slim: no full transcripts, just session state + display fields.'
        chats:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.ClaudeChatMetadata'
          title: chats
          description: Metadata only — see ClaudeChatMetadata.
        statuses:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.ChatStatusEntry'
          title: statuses
          description: >-
            Live chat statuses keyed by agent_session_id (reuses ChatStatusEntry
            from daemon.proto).
      title: DaemonSnapshot
      additionalProperties: false
      description: |-
        DaemonSnapshot is the required first event on every stream connect. It
         carries slim metadata only (IDs, state, timestamps, preview strings) — full
         chat transcripts are fetched on demand via AttachSessionCommand (decision #5).
    bossanova.v1.DeleteChatCommand:
      type: object
      properties:
        agentSessionId:
          type: string
          title: agent_session_id
        sessionId:
          type: string
          title: session_id
          description: >-
            session_id scopes the delete to a session the caller owns. The
            daemon
             rejects the delete when the chat does not belong to this session, so the
             bosso-side authz scoping (FindSessionDaemon) is enforced end-to-end rather
             than being advisory. Empty session_id skips the check (backward compat for
             callers that predate scoping).
      title: DeleteChatCommand
      additionalProperties: false
      description: |-
        DeleteChatCommand asks the daemon to delete a chat.
         Replies with CommandResult{ok:true} and no payload.
    bossanova.v1.DeleteChatRequest:
      type: object
      properties:
        agentSessionId:
          type: string
          title: agent_session_id
          description: Agent session UUID
        sessionId:
          type: string
          title: session_id
          description: >-
            session_id, when set, scopes the delete: the daemon rejects the
            request
             (NotFound) if the chat does not belong to this session. Empty skips the
             check for backward-compatible callers.
      title: DeleteChatRequest
      additionalProperties: false
    bossanova.v1.DeleteChatResponse:
      type: object
      title: DeleteChatResponse
      additionalProperties: false
    bossanova.v1.DeleteCronJobRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: DeleteCronJobRequest
      additionalProperties: false
    bossanova.v1.DeleteCronJobResponse:
      type: object
      title: DeleteCronJobResponse
      additionalProperties: false
    bossanova.v1.DeleteWebhookConfigRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: DeleteWebhookConfigRequest
      additionalProperties: false
    bossanova.v1.DeleteWebhookConfigResponse:
      type: object
      title: DeleteWebhookConfigResponse
      additionalProperties: false
    bossanova.v1.DeliverVCSEventRequest:
      type: object
      properties:
        repoOriginUrl:
          type: string
          title: repo_origin_url
          description: The repo this event pertains to (origin URL for matching).
        event:
          title: event
          description: The parsed VCS event.
          $ref: '#/components/schemas/bossanova.v1.VCSEvent'
      title: DeliverVCSEventRequest
      additionalProperties: false
    bossanova.v1.DeliverVCSEventResponse:
      type: object
      title: DeliverVCSEventResponse
      additionalProperties: false
    bossanova.v1.DescribeChatLaunchRequest:
      type: object
      properties:
        agentSessionId:
          type: string
          title: agent_session_id
          description: chat to describe
      title: DescribeChatLaunchRequest
      additionalProperties: false
    bossanova.v1.DescribeChatLaunchResponse:
      type: object
      properties:
        argv:
          type: array
          items:
            type: string
          title: argv
          description: >-
            argv is the launch command bossd runs in the worktree, already
            wrapped in
             the user's login shell (e.g. fish -l -i -c 'exec $argv' claude …). Empty
             when the agent or session could not be resolved. The boss session-context
             system prompt and MCP config flags are intentionally omitted so the command
             stays readable; they do not affect whether the agent binary resolves, which
             is the failure this command helps diagnose.
        worktreePath:
          type: string
          title: worktree_path
          description: working directory bossd launches it in
        host:
          type: string
          title: host
          description: daemon hostname — where to run argv
        agentName:
          type: string
          title: agent_name
          description: resolved agent (claude, codex, …)
      title: DescribeChatLaunchResponse
      additionalProperties: false
    bossanova.v1.DetectUsageLimitRequest:
      type: object
      properties:
        paneContent:
          type: string
          title: pane_content
          format: byte
      title: DetectUsageLimitRequest
      additionalProperties: false
    bossanova.v1.DetectUsageLimitResponse:
      type: object
      properties:
        limited:
          type: boolean
          title: limited
        resetAt:
          oneOf:
            - $ref: '#/components/schemas/google.protobuf.Timestamp'
            - type: 'null'
          title: reset_at
      title: DetectUsageLimitResponse
      additionalProperties: false
    bossanova.v1.DisconnectGitHubAppRepoRequest:
      type: object
      properties:
        repoOriginUrl:
          type: string
          title: repo_origin_url
      title: DisconnectGitHubAppRepoRequest
      additionalProperties: false
    bossanova.v1.DisconnectGitHubAppRepoResponse:
      type: object
      title: DisconnectGitHubAppRepoResponse
      additionalProperties: false
    bossanova.v1.DisplayIntent:
      type: string
      title: DisplayIntent
      enum:
        - DISPLAY_INTENT_UNSPECIFIED
        - DISPLAY_INTENT_SUCCESS
        - DISPLAY_INTENT_WARNING
        - DISPLAY_INTENT_DANGER
        - DISPLAY_INTENT_MUTED
        - DISPLAY_INTENT_INFO
      description: |-
        DisplayIntent represents the semantic meaning of a session's display
         status. Clients map intent to styling (color, weight, etc.) — the proto
         itself stays presentation-agnostic.
    bossanova.v1.DisplayStatus:
      type: string
      title: DisplayStatus
      enum:
        - DISPLAY_STATUS_UNSPECIFIED
        - DISPLAY_STATUS_IDLE
        - DISPLAY_STATUS_CHECKING
        - DISPLAY_STATUS_FAILING
        - DISPLAY_STATUS_CONFLICT
        - DISPLAY_STATUS_REJECTED
        - DISPLAY_STATUS_PASSING
        - DISPLAY_STATUS_MERGED
        - DISPLAY_STATUS_CLOSED
        - DISPLAY_STATUS_DRAFT
        - DISPLAY_STATUS_APPROVED
        - DISPLAY_STATUS_REVIEW
      description: >-
        DisplayStatus represents the unified display status for a session in the
        TUI.
    bossanova.v1.EmptyTrashRequest:
      type: object
      properties:
        olderThan:
          oneOf:
            - $ref: '#/components/schemas/google.protobuf.Timestamp'
            - type: 'null'
          title: older_than
          description: Only empty sessions archived before this timestamp.
      title: EmptyTrashRequest
      additionalProperties: false
    bossanova.v1.EmptyTrashResponse:
      type: object
      properties:
        deletedCount:
          type: integer
          title: deleted_count
          format: int32
          description: Number of archived sessions permanently deleted.
      title: EmptyTrashResponse
      additionalProperties: false
    bossanova.v1.EventNotification:
      type: object
      allOf:
        - properties:
            timestamp:
              title: timestamp
              description: When this event occurred.
              $ref: '#/components/schemas/google.protobuf.Timestamp'
            source:
              type: string
              title: source
              description: The source plugin name.
        - oneOf:
            - type: object
              properties:
                custom:
                  title: custom
                  $ref: '#/components/schemas/bossanova.v1.CustomEvent'
              title: custom
              required:
                - custom
            - type: object
              properties:
                externalCheck:
                  title: external_check
                  $ref: '#/components/schemas/bossanova.v1.ExternalCheckEvent'
              title: external_check
              required:
                - externalCheck
            - type: object
              properties:
                taskReady:
                  title: task_ready
                  $ref: '#/components/schemas/bossanova.v1.TaskReadyEvent'
              title: task_ready
              required:
                - taskReady
            - type: object
              properties:
                taskUpdated:
                  title: task_updated
                  $ref: '#/components/schemas/bossanova.v1.TaskUpdatedEvent'
              title: task_updated
              required:
                - taskUpdated
      title: EventNotification
      additionalProperties: false
      description: EventNotification wraps all possible plugin events in a oneof.
    bossanova.v1.EventSourceServiceGetInfoRequest:
      type: object
      title: EventSourceServiceGetInfoRequest
      additionalProperties: false
    bossanova.v1.EventSourceServiceGetInfoResponse:
      type: object
      properties:
        info:
          title: info
          $ref: '#/components/schemas/bossanova.v1.PluginInfo'
      title: EventSourceServiceGetInfoResponse
      additionalProperties: false
    bossanova.v1.ExecuteJobRequest:
      type: object
      properties:
        jobId:
          type: string
          title: job_id
          description: The job ID to execute.
      title: ExecuteJobRequest
      additionalProperties: false
    bossanova.v1.ExecuteJobResponse:
      type: object
      properties:
        action:
          title: action
          description: The action the daemon should take.
          $ref: '#/components/schemas/bossanova.v1.JobAction'
      title: ExecuteJobResponse
      additionalProperties: false
    bossanova.v1.ExternalCheckEvent:
      type: object
      properties:
        repoOriginUrl:
          type: string
          title: repo_origin_url
        prId:
          type: integer
          title: pr_id
          format: int32
        checkName:
          type: string
          title: check_name
        passed:
          type: boolean
          title: passed
        details:
          type: string
          title: details
      title: ExternalCheckEvent
      additionalProperties: false
      description: >-
        ExternalCheckEvent signals an external check result (eg. from a
        non-GitHub CI).
    bossanova.v1.FireSessionEventRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
          description: Session ID to fire event on.
        event:
          title: event
          description: Event to fire.
          $ref: '#/components/schemas/bossanova.v1.SessionEvent'
      title: FireSessionEventRequest
      additionalProperties: false
    bossanova.v1.FireSessionEventResponse:
      type: object
      properties:
        newState:
          type: string
          title: new_state
          description: New state after firing the event.
      title: FireSessionEventResponse
      additionalProperties: false
    bossanova.v1.GetChatStatusesRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
          description: Fetch statuses for chats in this session
      title: GetChatStatusesRequest
      additionalProperties: false
    bossanova.v1.GetChatStatusesResponse:
      type: object
      properties:
        statuses:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.ChatStatusEntry'
          title: statuses
      title: GetChatStatusesResponse
      additionalProperties: false
    bossanova.v1.GetChatTitleRequest:
      type: object
      properties:
        workDir:
          type: string
          title: work_dir
        sessionId:
          type: string
          title: session_id
      title: GetChatTitleRequest
      additionalProperties: false
    bossanova.v1.GetChatTitleResponse:
      type: object
      properties:
        supported:
          type: boolean
          title: supported
        title:
          type: string
          title: title
        explicit:
          type: boolean
          title: explicit
          description: >-
            explicit is true when title came from an agent-side rename signal
            rather
             than the first-user-message fallback.
      title: GetChatTitleResponse
      additionalProperties: false
    bossanova.v1.GetChatTranscriptCommand:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        agentSessionId:
          type: string
          title: agent_session_id
        maxMessages:
          type: integer
          title: max_messages
          format: int32
      title: GetChatTranscriptCommand
      additionalProperties: false
      description: >-
        GetChatTranscriptCommand asks the daemon for a chat's transcript.
        Replies with
         CommandResult carrying a GetChatTranscriptResponse (get_chat_transcript = 13).
         session_id scopes the read for authz, mirroring DeleteChatCommand.
    bossanova.v1.GetChatTranscriptRequest:
      type: object
      properties:
        agentSessionId:
          type: string
          title: agent_session_id
          description: chat to read
        sessionId:
          type: string
          title: session_id
          description: >-
            session_id, when set, scopes the read: the daemon rejects the
            request
             (NotFound) if the chat does not belong to this session. Empty skips the
             check, like DeleteChatRequest.
        maxMessages:
          type: integer
          title: max_messages
          format: int32
          description: 0 = all; otherwise the most recent N
      title: GetChatTranscriptRequest
      additionalProperties: false
    bossanova.v1.GetChatTranscriptResponse:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.ChatMessage'
          title: messages
        finalAssistantText:
          type: string
          title: final_assistant_text
        exists:
          type: boolean
          title: exists
        reason:
          type: string
          title: reason
          description: >-
            reason explains a miss (exists=false): why the transcript could not
            be
             read (e.g. codex rollout not yet discovered, or not found on disk). Empty
             on a hit. Never a bare {} on a genuine miss.
      title: GetChatTranscriptResponse
      additionalProperties: false
    bossanova.v1.GetCheckResultsRequest:
      type: object
      properties:
        repoOriginUrl:
          type: string
          title: repo_origin_url
          description: Repository origin URL.
        prNumber:
          type: integer
          title: pr_number
          format: int32
          description: Pull request number.
      title: GetCheckResultsRequest
      additionalProperties: false
    bossanova.v1.GetCheckResultsResponse:
      type: object
      properties:
        checks:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.CheckResult'
          title: checks
      title: GetCheckResultsResponse
      additionalProperties: false
    bossanova.v1.GetCloudAccessStatusRequest:
      type: object
      title: GetCloudAccessStatusRequest
      additionalProperties: false
    bossanova.v1.GetCloudAccessStatusResponse:
      type: object
      properties:
        status:
          title: status
          $ref: '#/components/schemas/bossanova.v1.CloudAccessStatus'
      title: GetCloudAccessStatusResponse
      additionalProperties: false
    bossanova.v1.GetCronJobRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: GetCronJobRequest
      additionalProperties: false
    bossanova.v1.GetCronJobResponse:
      type: object
      properties:
        cronJob:
          title: cron_job
          $ref: '#/components/schemas/bossanova.v1.CronJob'
      title: GetCronJobResponse
      additionalProperties: false
    bossanova.v1.GetGitHubAppInstallURLRequest:
      type: object
      properties:
        returnUrl:
          type: string
          title: return_url
          description: >-
            Optional absolute URL to return to after GitHub setup. Empty uses
            bosso default.
      title: GetGitHubAppInstallURLRequest
      additionalProperties: false
    bossanova.v1.GetGitHubAppInstallURLResponse:
      type: object
      properties:
        installUrl:
          type: string
          title: install_url
      title: GetGitHubAppInstallURLResponse
      additionalProperties: false
    bossanova.v1.GetPRStatusRequest:
      type: object
      properties:
        repoOriginUrl:
          type: string
          title: repo_origin_url
          description: Repository origin URL.
        prNumber:
          type: integer
          title: pr_number
          format: int32
          description: Pull request number.
      title: GetPRStatusRequest
      additionalProperties: false
    bossanova.v1.GetPRStatusResponse:
      type: object
      properties:
        status:
          title: status
          $ref: '#/components/schemas/bossanova.v1.PRStatus'
      title: GetPRStatusResponse
      additionalProperties: false
    bossanova.v1.GetReviewCommentsRequest:
      type: object
      properties:
        repoOriginUrl:
          type: string
          title: repo_origin_url
          description: Repository origin URL.
        prNumber:
          type: integer
          title: pr_number
          format: int32
          description: Pull request number.
      title: GetReviewCommentsRequest
      additionalProperties: false
    bossanova.v1.GetReviewCommentsResponse:
      type: object
      properties:
        comments:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.ReviewComment'
          title: comments
      title: GetReviewCommentsResponse
      additionalProperties: false
    bossanova.v1.GetScheduleRequest:
      type: object
      title: GetScheduleRequest
      additionalProperties: false
    bossanova.v1.GetScheduleResponse:
      type: object
      properties:
        jobs:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.ScheduledJob'
          title: jobs
      title: GetScheduleResponse
      additionalProperties: false
    bossanova.v1.GetSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: GetSessionRequest
      additionalProperties: false
    bossanova.v1.GetSessionResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: GetSessionResponse
      additionalProperties: false
    bossanova.v1.GetSessionStatusesRequest:
      type: object
      properties:
        sessionIds:
          type: array
          items:
            type: string
          title: session_ids
      title: GetSessionStatusesRequest
      additionalProperties: false
    bossanova.v1.GetSessionStatusesResponse:
      type: object
      properties:
        statuses:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.SessionStatusEntry'
          title: statuses
      title: GetSessionStatusesResponse
      additionalProperties: false
    bossanova.v1.GetWorkflowStatusRequest:
      type: object
      properties:
        workflowId:
          type: string
          title: workflow_id
      title: GetWorkflowStatusRequest
      additionalProperties: false
    bossanova.v1.GetWorkflowStatusResponse:
      type: object
      properties:
        status:
          title: status
          $ref: '#/components/schemas/bossanova.v1.WorkflowStatusInfo'
      title: GetWorkflowStatusResponse
      additionalProperties: false
    bossanova.v1.GitHubAppRepoStatus:
      type: object
      properties:
        repoOriginUrl:
          type: string
          title: repo_origin_url
        owner:
          type: string
          title: owner
        name:
          type: string
          title: name
        installationId:
          type:
            - integer
            - string
          title: installation_id
          format: int64
        installed:
          type: boolean
          title: installed
        webhookHealthy:
          type: boolean
          title: webhook_healthy
        lastDeliveryAt:
          title: last_delivery_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        lastDeliveryStatus:
          type: string
          title: last_delivery_status
        lastError:
          type: string
          title: last_error
      title: GitHubAppRepoStatus
      additionalProperties: false
    bossanova.v1.HasQuestionPromptRequest:
      type: object
      properties:
        paneContent:
          type: string
          title: pane_content
          format: byte
      title: HasQuestionPromptRequest
      additionalProperties: false
    bossanova.v1.HasQuestionPromptResponse:
      type: object
      properties:
        hasPrompt:
          type: boolean
          title: has_prompt
      title: HasQuestionPromptResponse
      additionalProperties: false
    bossanova.v1.HasWorkingIndicatorRequest:
      type: object
      properties:
        paneContent:
          type: string
          title: pane_content
          format: byte
      title: HasWorkingIndicatorRequest
      additionalProperties: false
    bossanova.v1.HasWorkingIndicatorResponse:
      type: object
      properties:
        isWorking:
          type: boolean
          title: is_working
      title: HasWorkingIndicatorResponse
      additionalProperties: false
    bossanova.v1.HostServiceListSessionsRequest:
      type: object
      title: HostServiceListSessionsRequest
      additionalProperties: false
      description: >-
        HostServiceListSessionsRequest is currently empty as it lists all
        sessions.
    bossanova.v1.HostServiceListSessionsResponse:
      type: object
      properties:
        sessions:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.Session'
          title: sessions
      title: HostServiceListSessionsResponse
      additionalProperties: false
    bossanova.v1.InstalledPlugin:
      type: object
      properties:
        name:
          type: string
          title: name
        path:
          type: string
          title: path
        enabled:
          type: boolean
          title: enabled
        status:
          title: status
          $ref: '#/components/schemas/bossanova.v1.InstalledPlugin.Status'
        capabilities:
          type: array
          items:
            type: string
          title: capabilities
          description: |-
            capabilities is the set of plugin interfaces the daemon dispensed
             for this plugin: "agent", "workflow", "task_source". Empty for
             disabled or failed plugins.
        error:
          type: string
          title: error
          description: |-
            error is populated when status == STATUS_LOAD_FAILED and carries
             the underlying go-plugin handshake / spawn error.
      title: InstalledPlugin
      additionalProperties: false
      description: |-
        InstalledPlugin describes a single entry from the daemon's plugin
         configuration along with its current load state. Both successfully
         loaded and failed plugins are returned so operators can see typos in
         `path` (load_failed) or accidental disables (status=disabled).
    bossanova.v1.InstalledPlugin.Status:
      type: string
      title: Status
      enum:
        - STATUS_UNSPECIFIED
        - STATUS_LOADED
        - STATUS_DISABLED
        - STATUS_LOAD_FAILED
    bossanova.v1.IsAgentRunningRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
      title: IsAgentRunningRequest
      additionalProperties: false
    bossanova.v1.IsAgentRunningResponse:
      type: object
      properties:
        running:
          type: boolean
          title: running
      title: IsAgentRunningResponse
      additionalProperties: false
    bossanova.v1.IssueAttachTokenRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        chatId:
          type: string
          title: chat_id
        scope:
          title: scope
          description: |-
            EDITOR or VIEWER. Only EDITOR is used in v1 — VIEWER is accepted and
             behaves identically for now (see the plan's deferred items).
          $ref: '#/components/schemas/bossanova.v1.AttachScope'
      title: IssueAttachTokenRequest
      additionalProperties: false
      description: |-
        IssueAttachTokenRequest asks bosso for a short-lived JWT bound to the
         triple (session_id, chat_id, scope). Bosso validates that
         chat ∈ session ∈ caller-user before signing the token.
    bossanova.v1.IssueAttachTokenResponse:
      type: object
      properties:
        token:
          type: string
          title: token
        expiresAt:
          title: expires_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
      title: IssueAttachTokenResponse
      additionalProperties: false
      description: |-
        IssueAttachTokenResponse carries the freshly-minted attach JWT and its
         expiry. The browser sends `token` as the second value of the
         `Sec-WebSocket-Protocol` header on the /ws/attach handshake.
    bossanova.v1.JobAction:
      type: object
      oneOf:
        - type: object
          properties:
            createSession:
              title: create_session
              $ref: '#/components/schemas/bossanova.v1.CreateSessionAction'
          title: create_session
          required:
            - createSession
        - type: object
          properties:
            noOp:
              title: no_op
              $ref: '#/components/schemas/bossanova.v1.NoOpAction'
          title: no_op
          required:
            - noOp
      title: JobAction
      additionalProperties: false
      description: JobAction wraps the possible outcomes of a scheduled job execution.
    bossanova.v1.LastTurnIsUserRequest:
      type: object
      properties:
        workDir:
          type: string
          title: work_dir
        agentSessionId:
          type: string
          title: agent_session_id
      title: LastTurnIsUserRequest
      additionalProperties: false
    bossanova.v1.LastTurnIsUserResponse:
      type: object
      properties:
        isUser:
          type: boolean
          title: is_user
      title: LastTurnIsUserResponse
      additionalProperties: false
    bossanova.v1.LinkSessionPRRequest:
      type: object
      properties:
        id:
          type: string
          title: id
        pr:
          type: string
          title: pr
      title: LinkSessionPRRequest
      additionalProperties: false
    bossanova.v1.LinkSessionPRResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: LinkSessionPRResponse
      additionalProperties: false
    bossanova.v1.ListAccountsCommand:
      type: object
      properties:
        provider:
          type: string
          title: provider
      title: ListAccountsCommand
      additionalProperties: false
      description: >-
        bosso → daemon: list the daemon's rotation accounts, optionally filtered
        by
         provider (empty = all). Reuses daemon.proto's ListAccountsResponse (metadata
         only — never credentials). Replies with CommandResult carrying a
         ListAccountsResponse (list_accounts = 16).
    bossanova.v1.ListAccountsRequest:
      type: object
      properties:
        provider:
          type:
            - string
            - 'null'
          title: provider
          description: >-
            Optional provider filter ("claude" | "codex"). Empty returns all
            accounts.
        refresh:
          type:
            - boolean
            - 'null'
          title: refresh
          description: Force a live usage probe of each returned account before responding.
      title: ListAccountsRequest
      additionalProperties: false
    bossanova.v1.ListAccountsResponse:
      type: object
      properties:
        accounts:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.Account'
          title: accounts
      title: ListAccountsResponse
      additionalProperties: false
    bossanova.v1.ListAgentsCommand:
      type: object
      title: ListAgentsCommand
      additionalProperties: false
      description: |-
        bosso → daemon: list the daemon's installed agents.
         Replies with CommandResult carrying a ListAgentsResponse (list_agents = 10).
    bossanova.v1.ListAgentsRequest:
      type: object
      title: ListAgentsRequest
      additionalProperties: false
    bossanova.v1.ListAgentsResponse:
      type: object
      properties:
        agents:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.AgentInfo'
          title: agents
      title: ListAgentsResponse
      additionalProperties: false
    bossanova.v1.ListAvailableIssuesRequest:
      type: object
      properties:
        repoOriginUrl:
          type: string
          title: repo_origin_url
        config:
          type: object
          title: config
          additionalProperties:
            type: string
            title: value
        query:
          type: string
          title: query
      title: ListAvailableIssuesRequest
      additionalProperties: false
    bossanova.v1.ListAvailableIssuesRequest.ConfigEntry:
      type: object
      properties:
        key:
          type: string
          title: key
        value:
          type: string
          title: value
      title: ConfigEntry
      additionalProperties: false
    bossanova.v1.ListAvailableIssuesResponse:
      type: object
      properties:
        issues:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.TrackerIssue'
          title: issues
      title: ListAvailableIssuesResponse
      additionalProperties: false
    bossanova.v1.ListChatsRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
      title: ListChatsRequest
      additionalProperties: false
    bossanova.v1.ListChatsResponse:
      type: object
      properties:
        chats:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.ClaudeChat'
          title: chats
      title: ListChatsResponse
      additionalProperties: false
    bossanova.v1.ListCheckSnapshotsRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        limit:
          type: integer
          title: limit
          format: int32
          description: |-
            Number of snapshots to return, newest-first. Defaults to 10 when
             unset or zero.
      title: ListCheckSnapshotsRequest
      additionalProperties: false
    bossanova.v1.ListCheckSnapshotsResponse:
      type: object
      properties:
        snapshots:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.CheckSnapshot'
          title: snapshots
      title: ListCheckSnapshotsResponse
      additionalProperties: false
    bossanova.v1.ListClosedPRsRequest:
      type: object
      properties:
        repoOriginUrl:
          type: string
          title: repo_origin_url
          description: Repository origin URL (eg. "https://github.com/owner/repo").
      title: ListClosedPRsRequest
      additionalProperties: false
    bossanova.v1.ListClosedPRsResponse:
      type: object
      properties:
        prs:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.PRSummary'
          title: prs
      title: ListClosedPRsResponse
      additionalProperties: false
    bossanova.v1.ListCronJobsRequest:
      type: object
      properties:
        repoId:
          type:
            - string
            - 'null'
          title: repo_id
          description: Optional repo filter. Empty returns all cron jobs across all repos.
      title: ListCronJobsRequest
      additionalProperties: false
    bossanova.v1.ListCronJobsResponse:
      type: object
      properties:
        cronJobs:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.CronJob'
          title: cron_jobs
      title: ListCronJobsResponse
      additionalProperties: false
    bossanova.v1.ListDaemonsRequest:
      type: object
      title: ListDaemonsRequest
      additionalProperties: false
    bossanova.v1.ListDaemonsResponse:
      type: object
      properties:
        daemons:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.DaemonInfo'
          title: daemons
      title: ListDaemonsResponse
      additionalProperties: false
    bossanova.v1.ListGitHubAppReposRequest:
      type: object
      title: ListGitHubAppReposRequest
      additionalProperties: false
    bossanova.v1.ListGitHubAppReposResponse:
      type: object
      properties:
        repos:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.GitHubAppRepoStatus'
          title: repos
      title: ListGitHubAppReposResponse
      additionalProperties: false
    bossanova.v1.ListIgnoredDirtyFilesRequest:
      type: object
      properties:
        workDir:
          type: string
          title: work_dir
      title: ListIgnoredDirtyFilesRequest
      additionalProperties: false
    bossanova.v1.ListIgnoredDirtyFilesResponse:
      type: object
      properties:
        paths:
          type: array
          items:
            type: string
          title: paths
          description: relative to work_dir
      title: ListIgnoredDirtyFilesResponse
      additionalProperties: false
    bossanova.v1.ListOpenPRsRequest:
      type: object
      properties:
        repoOriginUrl:
          type: string
          title: repo_origin_url
          description: Repository origin URL (eg. "https://github.com/owner/repo").
      title: ListOpenPRsRequest
      additionalProperties: false
    bossanova.v1.ListOpenPRsResponse:
      type: object
      properties:
        prs:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.PRSummary'
          title: prs
      title: ListOpenPRsResponse
      additionalProperties: false
    bossanova.v1.ListPluginsRequest:
      type: object
      title: ListPluginsRequest
      additionalProperties: false
    bossanova.v1.ListPluginsResponse:
      type: object
      properties:
        plugins:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.InstalledPlugin'
          title: plugins
      title: ListPluginsResponse
      additionalProperties: false
    bossanova.v1.ListRepoPRsCommand:
      type: object
      properties:
        repoId:
          type: string
          title: repo_id
      title: ListRepoPRsCommand
      additionalProperties: false
      description: |-
        ListRepoPRsCommand asks the daemon for a repo's open PRs (new-session
         "existing PR" picker). Reuses daemon.proto's ListRepoPRsResponse.
    bossanova.v1.ListRepoPRsRequest:
      type: object
      properties:
        repoId:
          type: string
          title: repo_id
      title: ListRepoPRsRequest
      additionalProperties: false
    bossanova.v1.ListRepoPRsResponse:
      type: object
      properties:
        pullRequests:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.PRSummary'
          title: pull_requests
      title: ListRepoPRsResponse
      additionalProperties: false
    bossanova.v1.ListReposCommand:
      type: object
      title: ListReposCommand
      additionalProperties: false
      description: |-
        bosso → daemon: list the daemon's managed repos.
         Replies with CommandResult carrying a ListReposResponse (list_repos = 9).
    bossanova.v1.ListReposRequest:
      type: object
      title: ListReposRequest
      additionalProperties: false
    bossanova.v1.ListReposResponse:
      type: object
      properties:
        repos:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.Repo'
          title: repos
      title: ListReposResponse
      additionalProperties: false
    bossanova.v1.ListSessionsRequest:
      type: object
      properties:
        repoId:
          type:
            - string
            - 'null'
          title: repo_id
          description: Filter by repo.
        states:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.SessionState'
          title: states
          description: Filter by state.
        includeArchived:
          type: boolean
          title: include_archived
          description: Include archived sessions.
      title: ListSessionsRequest
      additionalProperties: false
    bossanova.v1.ListSessionsResponse:
      type: object
      properties:
        sessions:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.Session'
          title: sessions
      title: ListSessionsResponse
      additionalProperties: false
    bossanova.v1.ListTrackerIssuesCommand:
      type: object
      properties:
        repoId:
          type: string
          title: repo_id
        query:
          type: string
          title: query
        source:
          type:
            - string
            - 'null'
          title: source
      title: ListTrackerIssuesCommand
      additionalProperties: false
      description: >-
        ListTrackerIssuesCommand asks the daemon for a repo's tracker issues,
        with an
         optional server-side search query and source ("linear"|"sentry"). Reuses
         daemon.proto's ListTrackerIssuesResponse.
    bossanova.v1.ListTrackerIssuesRequest:
      type: object
      properties:
        repoId:
          type: string
          title: repo_id
        query:
          type: string
          title: query
        source:
          type:
            - string
            - 'null'
          title: source
          description: >-
            Which task source to query. "linear" (default for back-compat) |
            "sentry".
      title: ListTrackerIssuesRequest
      additionalProperties: false
    bossanova.v1.ListTrackerIssuesResponse:
      type: object
      properties:
        issues:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.TrackerIssue'
          title: issues
      title: ListTrackerIssuesResponse
      additionalProperties: false
    bossanova.v1.ListWebhookConfigsRequest:
      type: object
      title: ListWebhookConfigsRequest
      additionalProperties: false
    bossanova.v1.ListWebhookConfigsResponse:
      type: object
      properties:
        configs:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.WebhookConfig'
          title: configs
      title: ListWebhookConfigsResponse
      additionalProperties: false
    bossanova.v1.MaterializeAccountRequest:
      type: object
      properties:
        credentialBlob:
          type: string
          title: credential_blob
          format: byte
          description: >-
            Opaque, provider-specific credential blob. Only the owning plugin
            can
             interpret it. NEVER logged.
      title: MaterializeAccountRequest
      additionalProperties: false
    bossanova.v1.MaterializeAccountResponse:
      type: object
      properties:
        env:
          type: object
          title: env
          additionalProperties:
            type: string
            title: value
          description: |-
            Environment overlay applied to the spawned agent (e.g.
             CLAUDE_CODE_OAUTH_TOKEN=<token>). Values are secret-bearing, never logged.
        files:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.MaterializedFile'
          title: files
          description: Files to write into the per-account home dir (e.g. codex auth.json).
        homeDirEnvKey:
          type: string
          title: home_dir_env_key
          description: >-
            Env key that must point at the per-account home dir (e.g.
            "CODEX_HOME").
             Empty for env-token agents (claude).
      title: MaterializeAccountResponse
      additionalProperties: false
    bossanova.v1.MaterializeAccountResponse.EnvEntry:
      type: object
      properties:
        key:
          type: string
          title: key
        value:
          type: string
          title: value
      title: EnvEntry
      additionalProperties: false
    bossanova.v1.MaterializedFile:
      type: object
      properties:
        relativePath:
          type: string
          title: relative_path
          description: path relative to the home dir, e.g. "auth.json"
        content:
          type: string
          title: content
          format: byte
          description: file bytes; secret-bearing, never logged
        mode:
          type: integer
          title: mode
          description: unix file mode, e.g. 0600
      title: MaterializedFile
      additionalProperties: false
      description: |-
        MaterializedFile is one file the daemon must write into the agent's
         per-account home directory. content is secret-bearing and NEVER logged.
    bossanova.v1.MergeBlock:
      type: object
      properties:
        gate:
          title: gate
          $ref: '#/components/schemas/bossanova.v1.MergeBlock.Gate'
        detail:
          type: string
          title: detail
          description: human-readable one-liner
        blockingReviewers:
          type: array
          items:
            type: string
          title: blocking_reviewers
          description: logins whose latest review is CHANGES_REQUESTED
        displayStatus:
          title: display_status
          description: the DisplayStatus this derives from
          $ref: '#/components/schemas/bossanova.v1.DisplayStatus'
      title: MergeBlock
      additionalProperties: false
      description: |-
        MergeBlock explains why a session's PR cannot currently be merged, so an
         unattended driver (boss-epic) can decide repair-vs-proceed without scraping tmux.
    bossanova.v1.MergeBlock.Gate:
      type: string
      title: Gate
      enum:
        - GATE_UNSPECIFIED
        - GATE_NONE
        - GATE_REVIEW
        - GATE_CI
        - GATE_PENDING
        - GATE_CONFLICT
        - GATE_BASE_SYNC
        - GATE_DRAFT
    bossanova.v1.MergeSessionCommand:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
      title: MergeSessionCommand
      additionalProperties: false
      description: |-
        MergeSessionCommand asks the daemon to merge a session's PR.
         Replies with CommandResult carrying the updated Session.
    bossanova.v1.MergeSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: MergeSessionRequest
      additionalProperties: false
    bossanova.v1.MergeSessionResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: MergeSessionResponse
      additionalProperties: false
    bossanova.v1.NoOpAction:
      type: object
      properties:
        reason:
          type: string
          title: reason
      title: NoOpAction
      additionalProperties: false
      description: NoOpAction indicates the job ran but no action is needed.
    bossanova.v1.NotifyAuthChangeRequest:
      type: object
      properties:
        action:
          type: string
          title: action
          description: '"login" or "logout"'
      title: NotifyAuthChangeRequest
      additionalProperties: false
    bossanova.v1.NotifyAuthChangeResponse:
      type: object
      title: NotifyAuthChangeResponse
      additionalProperties: false
    bossanova.v1.NotifyStatusChangeRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
          description: Session ID whose PR status changed.
        displayStatus:
          title: display_status
          description: New display status.
          $ref: '#/components/schemas/bossanova.v1.DisplayStatus'
        hasFailures:
          type: boolean
          title: has_failures
          description: Whether the PR has failing checks.
      title: NotifyStatusChangeRequest
      additionalProperties: false
    bossanova.v1.NotifyStatusChangeResponse:
      type: object
      title: NotifyStatusChangeResponse
      additionalProperties: false
    bossanova.v1.OrchestratorCommand:
      type: object
      allOf:
        - properties:
            commandId:
              type: string
              title: command_id
              description: >-
                Correlates with CommandResult/WebhookAck/SessionAttachChunk
                responses.
        - oneOf:
            - type: object
              properties:
                archive:
                  title: archive
                  description: >-
                    bosso → daemon: archive a session. Replies
                    CommandResult{Session}.
                  $ref: '#/components/schemas/bossanova.v1.ArchiveSessionCommand'
              title: archive
              required:
                - archive
            - type: object
              properties:
                attach:
                  title: attach
                  description: >-
                    bosso → daemon: start streaming stdout for a session.
                    Replies flow as
                     SessionAttachChunk events on the daemon→orchestrator side.
                  $ref: '#/components/schemas/bossanova.v1.AttachSessionCommand'
              title: attach
              required:
                - attach
            - type: object
              properties:
                createSession:
                  title: create_session
                  description: >-
                    bosso → daemon: create a new session. The daemon replies
                    with a STREAM of
                     SessionCreateChunk events (live setup output, then a terminal
                     created/error) correlated by command_id.
                  $ref: '#/components/schemas/bossanova.v1.CreateSessionCommand'
              title: create_session
              required:
                - createSession
            - type: object
              properties:
                deleteChat:
                  title: delete_chat
                  description: >-
                    bosso → daemon: delete a chat. Replies CommandResult{Ok}
                    with no payload.
                  $ref: '#/components/schemas/bossanova.v1.DeleteChatCommand'
              title: delete_chat
              required:
                - deleteChat
            - type: object
              properties:
                getChatTranscript:
                  title: get_chat_transcript
                  description: >-
                    bosso → daemon: read a chat's transcript. Replies
                    CommandResult{get_chat_transcript}.
                  $ref: '#/components/schemas/bossanova.v1.GetChatTranscriptCommand'
              title: get_chat_transcript
              required:
                - getChatTranscript
            - type: object
              properties:
                listAccounts:
                  title: list_accounts
                  description: >-
                    bosso → daemon: list the daemon's rotation accounts (web
                    account-switch
                     picker). Optional provider filter. Replies CommandResult{list_accounts}.
                  $ref: '#/components/schemas/bossanova.v1.ListAccountsCommand'
              title: list_accounts
              required:
                - listAccounts
            - type: object
              properties:
                listAgents:
                  title: list_agents
                  description: >-
                    bosso → daemon: list the daemon's agents. Replies
                    CommandResult{list_agents}.
                  $ref: '#/components/schemas/bossanova.v1.ListAgentsCommand'
              title: list_agents
              required:
                - listAgents
            - type: object
              properties:
                listRepoPrs:
                  title: list_repo_prs
                  description: >-
                    bosso → daemon: list a repo's open PRs. Replies
                    CommandResult{list_repo_prs}.
                  $ref: '#/components/schemas/bossanova.v1.ListRepoPRsCommand'
              title: list_repo_prs
              required:
                - listRepoPrs
            - type: object
              properties:
                listRepos:
                  title: list_repos
                  description: >-
                    bosso → daemon: list the daemon's repos. Replies
                    CommandResult{list_repos}.
                  $ref: '#/components/schemas/bossanova.v1.ListReposCommand'
              title: list_repos
              required:
                - listRepos
            - type: object
              properties:
                listTrackerIssues:
                  title: list_tracker_issues
                  description: >-
                    bosso → daemon: list a repo's tracker issues. Replies
                    CommandResult{list_tracker_issues}.
                  $ref: '#/components/schemas/bossanova.v1.ListTrackerIssuesCommand'
              title: list_tracker_issues
              required:
                - listTrackerIssues
            - type: object
              properties:
                merge:
                  title: merge
                  description: >-
                    bosso → daemon: merge a session's PR. Replies
                    CommandResult{Session}.
                  $ref: '#/components/schemas/bossanova.v1.MergeSessionCommand'
              title: merge
              required:
                - merge
            - type: object
              properties:
                pause:
                  title: pause
                  $ref: '#/components/schemas/bossanova.v1.PauseSessionCommand'
              title: pause
              required:
                - pause
            - type: object
              properties:
                recordChat:
                  title: record_chat
                  description: >-
                    bosso → daemon: record/resume a chat. Replies
                    CommandResult{record_chat}.
                  $ref: '#/components/schemas/bossanova.v1.RecordChatCommand'
              title: record_chat
              required:
                - recordChat
            - type: object
              properties:
                resume:
                  title: resume
                  $ref: '#/components/schemas/bossanova.v1.ResumeSessionCommand'
              title: resume
              required:
                - resume
            - type: object
              properties:
                sendChatMessage:
                  title: send_chat_message
                  description: >-
                    bosso → daemon: send a user message into a chat. Replies
                    CommandResult{send_chat_message}.
                  $ref: '#/components/schemas/bossanova.v1.SendChatMessageCommand'
              title: send_chat_message
              required:
                - sendChatMessage
            - type: object
              properties:
                stop:
                  title: stop
                  $ref: '#/components/schemas/bossanova.v1.StopSessionCommand'
              title: stop
              required:
                - stop
            - type: object
              properties:
                switchAccount:
                  title: switch_account
                  description: >-
                    bosso → daemon: switch a session's live chat to a different
                    account
                     (stop+swap+resume). Replies CommandResult{SwitchAccountResult}.
                  $ref: '#/components/schemas/bossanova.v1.SwitchAccountCommand'
              title: switch_account
              required:
                - switchAccount
            - type: object
              properties:
                transfer:
                  title: transfer
                  description: >-
                    Coordinated transfer protocol (decision #14 in the design
                    doc).
                  $ref: '#/components/schemas/bossanova.v1.TransferSessionCommand'
              title: transfer
              required:
                - transfer
            - type: object
              properties:
                transferCancel:
                  title: transfer_cancel
                  description: >-
                    Rollback leg of the coordinated transfer protocol (decision
                    #14).
                     Sent by bosso to EITHER the source (clear transferring_to → session
                     reappears) or the target (if it already CREATEd → delete the copy)
                     when any earlier step fails. Idempotent: a daemon that never saw a
                     matching transferring_to / transferring_from ACKs Ok:true with
                     no-op.
                  $ref: '#/components/schemas/bossanova.v1.TransferCancel'
              title: transfer_cancel
              required:
                - transferCancel
            - type: object
              properties:
                transferConfirmed:
                  title: transfer_confirmed
                  description: >-
                    Second half of the coordinated transfer protocol (decision
                    #14). Sent
                     by bosso to the SOURCE daemon after the target's CommandResult has
                     confirmed a successful resume. The source DELETEs its copy and ACKs
                     with CommandResult{Ok:true}; this is the only place the UI's "one
                     copy visible" invariant transitions the visible session from source
                     to target.
                  $ref: '#/components/schemas/bossanova.v1.TransferConfirmed'
              title: transfer_confirmed
              required:
                - transferConfirmed
            - type: object
              properties:
                wakeChat:
                  title: wake_chat
                  description: >-
                    bosso → daemon: bring a chat's tmux+claude back to life.
                    Replies
                     with CommandResult{WakeChatResult} carrying the Outcome enum.
                  $ref: '#/components/schemas/bossanova.v1.WakeChatCommand'
              title: wake_chat
              required:
                - wakeChat
            - type: object
              properties:
                webhook:
                  title: webhook
                  $ref: '#/components/schemas/bossanova.v1.WebhookEvent'
              title: webhook
              required:
                - webhook
      title: OrchestratorCommand
      additionalProperties: false
      description: >-
        OrchestratorCommand is the envelope for every command bosso sends down
        the
         stream. command_id is echoed back in the matching CommandResult, WebhookAck,
         or SessionAttachChunk.
    bossanova.v1.OutputLine:
      type: object
      properties:
        text:
          type: string
          title: text
        timestamp:
          title: timestamp
          $ref: '#/components/schemas/google.protobuf.Timestamp'
      title: OutputLine
      additionalProperties: false
    bossanova.v1.PRClosedEvent:
      type: object
      properties:
        prId:
          type: integer
          title: pr_id
          format: int32
      title: PRClosedEvent
      additionalProperties: false
    bossanova.v1.PRInfo:
      type: object
      properties:
        number:
          type: integer
          title: number
          format: int32
        url:
          type: string
          title: url
      title: PRInfo
      additionalProperties: false
      description: PRInfo is the result of creating a pull request.
    bossanova.v1.PRMergedEvent:
      type: object
      properties:
        prId:
          type: integer
          title: pr_id
          format: int32
      title: PRMergedEvent
      additionalProperties: false
    bossanova.v1.PRState:
      type: string
      title: PRState
      enum:
        - PR_STATE_UNSPECIFIED
        - PR_STATE_OPEN
        - PR_STATE_CLOSED
        - PR_STATE_MERGED
      description: PRState represents the state of a pull request.
    bossanova.v1.PRStatus:
      type: object
      properties:
        state:
          title: state
          $ref: '#/components/schemas/bossanova.v1.PRState'
        mergeable:
          type:
            - boolean
            - 'null'
          title: mergeable
        title:
          type: string
          title: title
        headBranch:
          type: string
          title: head_branch
        baseBranch:
          type: string
          title: base_branch
      title: PRStatus
      additionalProperties: false
      description: PRStatus represents the current status of a pull request.
    bossanova.v1.PRSummary:
      type: object
      properties:
        number:
          type: integer
          title: number
          format: int32
        title:
          type: string
          title: title
        headBranch:
          type: string
          title: head_branch
        state:
          title: state
          $ref: '#/components/schemas/bossanova.v1.PRState'
        author:
          type: string
          title: author
      title: PRSummary
      additionalProperties: false
      description: PRSummary is a lightweight representation of a PR for listing.
    bossanova.v1.PauseSessionCommand:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
      title: PauseSessionCommand
      additionalProperties: false
      description: |-
        PauseSessionCommand asks the daemon to pause a session and emit a
         CommandResult with the updated Session in the payload.
    bossanova.v1.PauseSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: PauseSessionRequest
      additionalProperties: false
    bossanova.v1.PauseSessionResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: PauseSessionResponse
      additionalProperties: false
    bossanova.v1.PauseWorkflowRequest:
      type: object
      properties:
        workflowId:
          type: string
          title: workflow_id
      title: PauseWorkflowRequest
      additionalProperties: false
    bossanova.v1.PauseWorkflowResponse:
      type: object
      properties:
        status:
          title: status
          $ref: '#/components/schemas/bossanova.v1.WorkflowStatusInfo'
      title: PauseWorkflowResponse
      additionalProperties: false
    bossanova.v1.PluginInfo:
      type: object
      properties:
        name:
          type: string
          title: name
        version:
          type: string
          title: version
        capabilities:
          type: array
          items:
            type: string
          title: capabilities
        userSettings:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.UserSetting'
          title: user_settings
          description: |-
            user_settings describes plugin-tunable settings that the boss TUI
             renders as a section in the settings page. Empty list = no user-
             facing settings for this plugin.
        userInitiated:
          type: boolean
          title: user_initiated
          description: >-
            user_initiated marks a task source that is driven on-demand rather
            than
             polled. When true, the task orchestrator skips PollTasks for this plugin.
      title: PluginInfo
      additionalProperties: false
      description: PluginInfo describes a plugin's identity and capabilities.
    bossanova.v1.PollTasksRequest:
      type: object
      properties:
        repoOriginUrl:
          type:
            - string
            - 'null'
          title: repo_origin_url
          description: Optional filter by repo origin URL.
      title: PollTasksRequest
      additionalProperties: false
    bossanova.v1.PollTasksResponse:
      type: object
      properties:
        tasks:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.TaskItem'
          title: tasks
      title: PollTasksResponse
      additionalProperties: false
    bossanova.v1.ProbeRateLimitRequest:
      type: object
      properties:
        credentialEnv:
          type: object
          title: credential_env
          additionalProperties:
            type: string
            title: value
          description: |-
            Materialized credential env overlay for the TARGET account (e.g.
             CLAUDE_CODE_OAUTH_TOKEN=<token> for claude, CODEX_HOME=<dir> for codex).
             Secret-bearing; NEVER logged.
      title: ProbeRateLimitRequest
      additionalProperties: false
    bossanova.v1.ProbeRateLimitRequest.CredentialEnvEntry:
      type: object
      properties:
        key:
          type: string
          title: key
        value:
          type: string
          title: value
      title: CredentialEnvEntry
      additionalProperties: false
    bossanova.v1.ProbeRateLimitResponse:
      type: object
      properties:
        status:
          title: status
          $ref: '#/components/schemas/bossanova.v1.RateLimitStatus'
      title: ProbeRateLimitResponse
      additionalProperties: false
    bossanova.v1.ProxyArchiveSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: ProxyArchiveSessionRequest
      additionalProperties: false
    bossanova.v1.ProxyArchiveSessionResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: ProxyArchiveSessionResponse
      additionalProperties: false
    bossanova.v1.ProxyAttachSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: ProxyAttachSessionRequest
      additionalProperties: false
    bossanova.v1.ProxyAttachSessionResponse:
      type: object
      oneOf:
        - type: object
          properties:
            outputLine:
              title: output_line
              $ref: '#/components/schemas/bossanova.v1.OutputLine'
          title: output_line
          required:
            - outputLine
        - type: object
          properties:
            sessionEnded:
              title: session_ended
              $ref: '#/components/schemas/bossanova.v1.SessionEnded'
          title: session_ended
          required:
            - sessionEnded
        - type: object
          properties:
            stateChange:
              title: state_change
              $ref: '#/components/schemas/bossanova.v1.StateChange'
          title: state_change
          required:
            - stateChange
      title: ProxyAttachSessionResponse
      additionalProperties: false
      description: |-
        ProxyAttachSessionResponse is streamed from orchestrator to remote CLI.
         Reuses the streaming event types defined in daemon.proto.
    bossanova.v1.ProxyChatListEvent:
      type: object
      oneOf:
        - type: object
          properties:
            chatDelta:
              title: chat_delta
              description: Forwarded verbatim from the daemon (defined in stream.proto).
              $ref: '#/components/schemas/bossanova.v1.ChatDelta'
          title: chat_delta
          required:
            - chatDelta
        - type: object
          properties:
            daemonOffline:
              title: daemon_offline
              description: Terminal event when the owning daemon disconnects.
              $ref: '#/components/schemas/bossanova.v1.DaemonOffline'
          title: daemon_offline
          required:
            - daemonOffline
        - type: object
          properties:
            sessionDelta:
              title: session_delta
              description: >-
                Forwarded only on KIND_DELETED for the watched session — signals
                the
                 session itself was removed and the stream should close.
              $ref: '#/components/schemas/bossanova.v1.SessionDelta'
          title: session_delta
          required:
            - sessionDelta
        - type: object
          properties:
            snapshot:
              title: snapshot
              description: First event on every connect. Replaces any prior client state.
              $ref: '#/components/schemas/bossanova.v1.ProxyChatListSnapshot'
          title: snapshot
          required:
            - snapshot
        - type: object
          properties:
            statusDelta:
              title: status_delta
              description: Forwarded verbatim from the daemon (defined in stream.proto).
              $ref: '#/components/schemas/bossanova.v1.ChatStatusDelta'
          title: status_delta
          required:
            - statusDelta
      title: ProxyChatListEvent
      additionalProperties: false
      description: |-
        ProxyChatListEvent is a single event in the proxied chat-list stream.
         Bosso sends a ProxyChatListSnapshot first, then forwards live deltas, and
         finally a DaemonOffline (or a SessionDelta with KIND_DELETED for the
         watched session) as a terminal event.
    bossanova.v1.ProxyChatListSnapshot:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        daemonId:
          type: string
          title: daemon_id
        chats:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.ClaudeChatMetadata'
          title: chats
        statuses:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.ChatStatusEntry'
          title: statuses
      title: ProxyChatListSnapshot
      additionalProperties: false
      description: |-
        ProxyChatListSnapshot is the required first event on every
         ProxyStreamChats connection. It carries the current chat list and live
         per-chat statuses for the requested session.
    bossanova.v1.ProxyCreateSessionRequest:
      type: object
      properties:
        daemonId:
          type: string
          title: daemon_id
        repoId:
          type: string
          title: repo_id
        title:
          type: string
          title: title
        plan:
          type: string
          title: plan
        baseBranch:
          type: string
          title: base_branch
        agentName:
          type: string
          title: agent_name
        quickChat:
          type: boolean
          title: quick_chat
        prNumber:
          type:
            - integer
            - 'null'
          title: pr_number
          format: int32
        branchName:
          type:
            - string
            - 'null'
          title: branch_name
        trackerId:
          type:
            - string
            - 'null'
          title: tracker_id
        trackerUrl:
          type:
            - string
            - 'null'
          title: tracker_url
        trackerIssue:
          oneOf:
            - $ref: '#/components/schemas/bossanova.v1.TrackerIssue'
            - type: 'null'
          title: tracker_issue
        trackerSource:
          type:
            - string
            - 'null'
          title: tracker_source
        force:
          type: boolean
          title: force
          description: >-
            Bypass the BOS-236 tracker-issue dedup guard so a caller can
            intentionally
             create a second session for a tracker/PR/branch that already has an active
             one. Mirrors CreateSessionRequest.force so the hosted MCP gateway path has
             the same escape hatch as the local socket backend.
        detach:
          type: boolean
          title: detach
          description: >-
            Unattended-session fields carried through the hosted gateway so a
            hosted
             MCP client (e.g. /boss-epic) gets the same create_session behavior as the
             local socket backend. Mirror CreateSessionRequest.{detach,model,
             tmux_unattended}; without them a hosted create silently runs interactively
             on the daemon's default model and never fires the unattended prompt.
        model:
          type:
            - string
            - 'null'
          title: model
        tmuxUnattended:
          type: boolean
          title: tmux_unattended
        accountId:
          type:
            - string
            - 'null'
          title: account_id
        forceBranch:
          type: boolean
          title: force_branch
          description: >-
            Mirror CreateSessionRequest.force_branch so hosted MCP
            create_session can
             intentionally replace an existing branch, matching the local socket path.
      title: ProxyCreateSessionRequest
      additionalProperties: false
      description: |-
        ProxyCreateSessionRequest names the daemon to create the session on plus
         the creation parameters (mirrors CreateSessionCommand in stream.proto).
    bossanova.v1.ProxyCreateSessionResponse:
      type: object
      allOf:
        - properties:
            attachedExisting:
              type: boolean
              title: attached_existing
              description: >-
                True when the terminal `created` frame reports an EXISTING
                active session
                 the daemon attached to (dedup) rather than a freshly created one. Carries
                 SessionCreateChunk.attached_existing through the hosted create path so the
                 MCP gateway can surface it; only meaningful alongside `created`.
        - oneOf:
            - type: object
              properties:
                created:
                  title: created
                  $ref: '#/components/schemas/bossanova.v1.Session'
              title: created
              required:
                - created
            - type: object
              properties:
                error:
                  type: string
                  title: error
              title: error
              required:
                - error
            - type: object
              properties:
                setupOutput:
                  type: string
                  title: setup_output
              title: setup_output
              required:
                - setupOutput
      title: ProxyCreateSessionResponse
      additionalProperties: false
      description: >-
        ProxyCreateSessionResponse is streamed from orchestrator to the client
        as
         creation progresses: setup output lines, then a terminal created Session or
         an in-band error message.
    bossanova.v1.ProxyDeleteChatRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
          description: for authz scoping (mirror ProxyWakeChat)
        agentSessionId:
          type: string
          title: agent_session_id
      title: ProxyDeleteChatRequest
      additionalProperties: false
    bossanova.v1.ProxyDeleteChatResponse:
      type: object
      title: ProxyDeleteChatResponse
      additionalProperties: false
    bossanova.v1.ProxyGetChatTranscriptRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
          description: for authz scoping (mirror ProxyWakeChat)
        agentSessionId:
          type: string
          title: agent_session_id
        maxMessages:
          type: integer
          title: max_messages
          format: int32
          description: 0 = all; otherwise the most recent N
      title: ProxyGetChatTranscriptRequest
      additionalProperties: false
      description: >-
        ProxyGetChatTranscriptRequest reads a chat by agent_session_id, scoped
        to
         session_id for authz (mirror ProxyWakeChat). max_messages == 0 returns all.
    bossanova.v1.ProxyGetChatTranscriptResponse:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.ChatMessage'
          title: messages
        finalAssistantText:
          type: string
          title: final_assistant_text
        exists:
          type: boolean
          title: exists
        reason:
          type: string
          title: reason
          description: >-
            reason mirrors GetChatTranscriptResponse.reason: why a miss
            occurred.
      title: ProxyGetChatTranscriptResponse
      additionalProperties: false
      description: >-
        ProxyGetChatTranscriptResponse mirrors daemon.proto's
        GetChatTranscriptResponse
         shape so the gateway can forward it field-for-field. ChatMessage is defined in
         daemon.proto (already imported).
    bossanova.v1.ProxyGetSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: ProxyGetSessionRequest
      additionalProperties: false
    bossanova.v1.ProxyGetSessionResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: ProxyGetSessionResponse
      additionalProperties: false
    bossanova.v1.ProxyListAccountsRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        provider:
          type: string
          title: provider
      title: ProxyListAccountsRequest
      additionalProperties: false
      description: >-
        ProxyListAccountsRequest lists the rotation accounts on the daemon
        owning
         session_id. session_id locates the owning daemon (FindSessionDaemon) and
         scopes authz. provider optionally filters ("" = all). Accounts are metadata
         only — never credentials.
    bossanova.v1.ProxyListAccountsResponse:
      type: object
      properties:
        accounts:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.Account'
          title: accounts
      title: ProxyListAccountsResponse
      additionalProperties: false
    bossanova.v1.ProxyListAgentsRequest:
      type: object
      properties:
        daemonId:
          type: string
          title: daemon_id
      title: ProxyListAgentsRequest
      additionalProperties: false
    bossanova.v1.ProxyListAgentsResponse:
      type: object
      properties:
        agents:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.AgentInfo'
          title: agents
      title: ProxyListAgentsResponse
      additionalProperties: false
    bossanova.v1.ProxyListRepoPRsRequest:
      type: object
      properties:
        daemonId:
          type: string
          title: daemon_id
        repoId:
          type: string
          title: repo_id
      title: ProxyListRepoPRsRequest
      additionalProperties: false
    bossanova.v1.ProxyListRepoPRsResponse:
      type: object
      properties:
        pullRequests:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.PRSummary'
          title: pull_requests
      title: ProxyListRepoPRsResponse
      additionalProperties: false
    bossanova.v1.ProxyListReposAggregatedRequest:
      type: object
      title: ProxyListReposAggregatedRequest
      additionalProperties: false
    bossanova.v1.ProxyListReposAggregatedResponse:
      type: object
      properties:
        repos:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.AggregatedRepo'
          title: repos
      title: ProxyListReposAggregatedResponse
      additionalProperties: false
    bossanova.v1.ProxyListSessionsRequest:
      type: object
      properties:
        repoId:
          type:
            - string
            - 'null'
          title: repo_id
        states:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.SessionState'
          title: states
        includeArchived:
          type: boolean
          title: include_archived
        daemonId:
          type:
            - string
            - 'null'
          title: daemon_id
          description: Target daemon, if known. Otherwise orchestrator queries all.
      title: ProxyListSessionsRequest
      additionalProperties: false
    bossanova.v1.ProxyListSessionsResponse:
      type: object
      properties:
        sessions:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.Session'
          title: sessions
      title: ProxyListSessionsResponse
      additionalProperties: false
    bossanova.v1.ProxyListTrackerIssuesRequest:
      type: object
      properties:
        daemonId:
          type: string
          title: daemon_id
        repoId:
          type: string
          title: repo_id
        query:
          type: string
          title: query
        source:
          type:
            - string
            - 'null'
          title: source
          description: '"linear" (default) | "sentry"'
      title: ProxyListTrackerIssuesRequest
      additionalProperties: false
    bossanova.v1.ProxyListTrackerIssuesResponse:
      type: object
      properties:
        issues:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.TrackerIssue'
          title: issues
      title: ProxyListTrackerIssuesResponse
      additionalProperties: false
    bossanova.v1.ProxyMergeSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: ProxyMergeSessionRequest
      additionalProperties: false
    bossanova.v1.ProxyMergeSessionResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: ProxyMergeSessionResponse
      additionalProperties: false
    bossanova.v1.ProxyPauseSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: ProxyPauseSessionRequest
      additionalProperties: false
    bossanova.v1.ProxyPauseSessionResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: ProxyPauseSessionResponse
      additionalProperties: false
    bossanova.v1.ProxyRecordChatRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        agentSessionId:
          type: string
          title: agent_session_id
        title:
          type: string
          title: title
        resume:
          type: boolean
          title: resume
        agentName:
          type: string
          title: agent_name
      title: ProxyRecordChatRequest
      additionalProperties: false
    bossanova.v1.ProxyRecordChatResponse:
      type: object
      properties:
        chat:
          title: chat
          $ref: '#/components/schemas/bossanova.v1.ClaudeChat'
      title: ProxyRecordChatResponse
      additionalProperties: false
    bossanova.v1.ProxyResumeSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: ProxyResumeSessionRequest
      additionalProperties: false
    bossanova.v1.ProxyResumeSessionResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: ProxyResumeSessionResponse
      additionalProperties: false
    bossanova.v1.ProxySendChatMessageRequest:
      type: object
      properties:
        agentSessionId:
          type: string
          title: agent_session_id
        message:
          type: string
          title: message
        wakeIfAsleep:
          type: boolean
          title: wake_if_asleep
        submit:
          type:
            - boolean
            - 'null'
          title: submit
          description: |-
            when true, submit the message (BOS-242); when false, prefill only.
             optional so an omitting (pre-BOS-242) client is treated as submit=true
             server-side, preserving the prior always-submit proxy behavior.
      title: ProxySendChatMessageRequest
      additionalProperties: false
      description: >-
        ProxySendChatMessageRequest carries only agent_session_id (the MCP send
        tool
         has no session_id), so bosso routes via FindDaemonForChat rather than
         FindSessionDaemon.
    bossanova.v1.ProxySendChatMessageResponse:
      type: object
      properties:
        tmuxSessionName:
          type: string
          title: tmux_session_name
        delivered:
          type: boolean
          title: delivered
        noticeText:
          type: string
          title: notice_text
          description: >-
            notice_text mirrors SendChatMessageResponse.notice_text: the
            user-facing
             outcome of a message bossd handled mechanically (a "/boss switch" account
             switch intercepted before delivery) instead of forwarding to the agent. On
             that path delivered is false; callers must read notice_text. Additive,
             backward-compatible response field. Empty for an ordinary delivered message.
      title: ProxySendChatMessageResponse
      additionalProperties: false
      description: >-
        ProxySendChatMessageResponse mirrors daemon.proto's
        SendChatMessageResponse.
    bossanova.v1.ProxyStopSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: ProxyStopSessionRequest
      additionalProperties: false
    bossanova.v1.ProxyStopSessionResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: ProxyStopSessionResponse
      additionalProperties: false
    bossanova.v1.ProxyStreamChatsRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
      title: ProxyStreamChatsRequest
      additionalProperties: false
      description: >-
        ProxyStreamChatsRequest selects the session whose chat list (and
        per-chat
         statuses) the caller wants to follow. The orchestrator resolves the owning
         daemon and forwards live ChatDelta / ChatStatusDelta events.
    bossanova.v1.ProxySwitchSessionAccountRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
          description: for authz scoping (mirror ProxyWakeChat)
        agentSessionId:
          type: string
          title: agent_session_id
          description: optional; empty => session's primary live chat
        accountId:
          type: string
          title: account_id
          description: '"" = system default'
        force:
          type: boolean
          title: force
      title: ProxySwitchSessionAccountRequest
      additionalProperties: false
      description: |-
        ProxySwitchSessionAccountRequest switches a session's live chat to a
         different account. session_id is required for authz scoping (mirror
         ProxyWakeChat). agent_session_id is optional; empty => the session's
         primary live chat (resolved by the daemon).
    bossanova.v1.ProxySwitchSessionAccountResponse:
      type: object
      properties:
        resumed:
          type: boolean
          title: resumed
        targetLabel:
          type: string
          title: target_label
        noticeText:
          type: string
          title: notice_text
      title: ProxySwitchSessionAccountResponse
      additionalProperties: false
    bossanova.v1.ProxyWakeChatRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        agentSessionId:
          type: string
          title: agent_session_id
        forceFresh:
          type: boolean
          title: force_fresh
          description: >-
            If true, the daemon will skip --resume even when a transcript
            exists.
      title: ProxyWakeChatRequest
      additionalProperties: false
      description: |-
        ProxyWakeChatRequest identifies the chat to wake. Both session_id and
         agent_session_id are required: bosso scopes the chat lookup across both
         (and the authenticated user) to prevent a caller in possession of just
         an agent_session_id from waking a chat in another user's session.
    bossanova.v1.ProxyWakeChatResponse:
      type: object
      properties:
        outcome:
          title: outcome
          description: |-
            Mirrors WakeChatResult.Outcome from stream.proto so callers don't
             need to import the stream-internal type.
          $ref: '#/components/schemas/bossanova.v1.WakeChatResult.Outcome'
        tmuxSessionName:
          type: string
          title: tmux_session_name
        reason:
          type: string
          title: reason
          description: >-
            Stable machine-readable reason when outcome is
            OUTCOME_FRESH_FALLBACK.
      title: ProxyWakeChatResponse
      additionalProperties: false
    bossanova.v1.PublishDaemonSnapshotRequest:
      type: object
      properties:
        snapshot:
          title: snapshot
          $ref: '#/components/schemas/bossanova.v1.DaemonSnapshot'
      title: PublishDaemonSnapshotRequest
      additionalProperties: false
    bossanova.v1.PublishDaemonSnapshotResponse:
      type: object
      title: PublishDaemonSnapshotResponse
      additionalProperties: false
    bossanova.v1.RateLimitPlanStatus:
      type: string
      title: RateLimitPlanStatus
      enum:
        - RATE_LIMIT_PLAN_STATUS_UNSPECIFIED
        - RATE_LIMIT_PLAN_STATUS_UNSUPPORTED
        - RATE_LIMIT_PLAN_STATUS_ACTIVE
        - RATE_LIMIT_PLAN_STATUS_WARNING
        - RATE_LIMIT_PLAN_STATUS_RATE_LIMITED
      description: |-
        RateLimitPlanStatus is the normalized usage-cap posture for one account,
         derived by the owning plugin's probe. UNSUPPORTED means the provider exposes
         no probe (fail-safe default for agents without ProbeRateLimit logic).
    bossanova.v1.RateLimitStatus:
      type: object
      properties:
        limited:
          type: boolean
          title: limited
        status:
          title: status
          $ref: '#/components/schemas/bossanova.v1.RateLimitPlanStatus'
        util5h:
          type: number
          title: util_5h
          format: double
          description: fraction 0..1 of the 5-hour window consumed
        reset5h:
          oneOf:
            - $ref: '#/components/schemas/google.protobuf.Timestamp'
            - type: 'null'
          title: reset_5h
        util7d:
          type: number
          title: util_7d
          format: double
          description: fraction 0..1 of the 7-day window consumed
        reset7d:
          oneOf:
            - $ref: '#/components/schemas/google.protobuf.Timestamp'
            - type: 'null'
          title: reset_7d
        planTier:
          type: string
          title: plan_tier
      title: RateLimitStatus
      additionalProperties: false
      description: RateLimitStatus is the normalized probe result, reused by B/C/D.
    bossanova.v1.ReadTranscriptRequest:
      type: object
      properties:
        workDir:
          type: string
          title: work_dir
          description: worktree path (claude derives the project key from it)
        agentSessionId:
          type: string
          title: agent_session_id
          description: chat's agent session UUID
        maxMessages:
          type: integer
          title: max_messages
          format: int32
          description: 0 = all; otherwise return the most recent N
      title: ReadTranscriptRequest
      additionalProperties: false
    bossanova.v1.ReadTranscriptResponse:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.ChatMessage'
          title: messages
        finalAssistantText:
          type: string
          title: final_assistant_text
          description: last assistant turn, flattened — the "result"
        exists:
          type: boolean
          title: exists
          description: false when no transcript file is found
      title: ReadTranscriptResponse
      additionalProperties: false
    bossanova.v1.ReclaimRepairChatHostRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
          description: Session whose repair attempt is blocked.
        agentSessionId:
          type: string
          title: agent_session_id
          description: >-
            Existing agent session ID from the StartChatRun AlreadyExists
            message.
        reason:
          type: string
          title: reason
          description: Human-readable diagnostic stored on the reclaimed chat row.
      title: ReclaimRepairChatHostRequest
      additionalProperties: false
    bossanova.v1.ReclaimRepairChatHostResponse:
      type: object
      properties:
        reclaimed:
          type: boolean
          title: reclaimed
          description: >-
            True when a tmux session was killed or an already-dead tmux
            reference was
             detached from the chat row.
        tmuxSessionName:
          type: string
          title: tmux_session_name
          description: >-
            The tmux session name that was detached, empty when the row had
            none.
      title: ReclaimRepairChatHostResponse
      additionalProperties: false
    bossanova.v1.RecordChatCommand:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        agentSessionId:
          type: string
          title: agent_session_id
        title:
          type: string
          title: title
        resume:
          type: boolean
          title: resume
        agentName:
          type: string
          title: agent_name
      title: RecordChatCommand
      additionalProperties: false
      description: |-
        RecordChatCommand asks the daemon to record or resume a chat.
         Replies with CommandResult carrying a ClaudeChat payload (record_chat = 8).
    bossanova.v1.RecordChatRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        agentSessionId:
          type: string
          title: agent_session_id
          description: Agent session UUID
        title:
          type: string
          title: title
          description: First user prompt or "New chat"
        resume:
          type: boolean
          title: resume
          description: >-
            resume signals that agent_session_id refers to an existing agent
            session
             that should be resumed via the coding agent's --resume flag rather than
             created fresh. Used by the daemon when minting the tmux session host for
             the chat — ignored if the tmux session already exists.
        agentName:
          type:
            - string
            - 'null'
          title: agent_name
          description: >-
            agent_name overrides the per-chat agent. When unset, the chat
            inherits
             the parent session's agent_name. Honored only when the named agent
             plugin is loaded — otherwise dispatch falls back per AgentDispatcher
             resolution rules.
      title: RecordChatRequest
      additionalProperties: false
    bossanova.v1.RecordChatResponse:
      type: object
      properties:
        chat:
          title: chat
          $ref: '#/components/schemas/bossanova.v1.ClaudeChat'
      title: RecordChatResponse
      additionalProperties: false
    bossanova.v1.RecordRepairOutcomeRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        startedAtUnix:
          type:
            - integer
            - string
          title: started_at_unix
          format: int64
          description: Wall-clock time of the StartAgentRun that drove this attempt.
        runnerError:
          type: string
          title: runner_error
          description: |-
            Non-empty when the daemon's StartAgentRun / claude plugin runner
             refused to spawn (eg. "claude not on PATH"). Mutually exclusive with
             exit_error in practice.
        exitError:
          type: string
          title: exit_error
          description: Non-empty when the agent ran but exited non-zero / signalled.
        agentSessionId:
          type: string
          title: agent_session_id
          description: Agent-side session ID, useful for cross-referencing the agent log.
        headSha:
          type: string
          title: head_sha
          description: >-
            Head SHA and display status this repair attempt targeted. Used to
            avoid
             rerunning the same agent repair forever after a non-zero agent exit.
        displayStatus:
          title: display_status
          $ref: '#/components/schemas/bossanova.v1.DisplayStatus'
        reviewFingerprint:
          type:
            - string
            - 'null'
          title: review_fingerprint
          description: |-
            Fingerprint of review feedback this repair attempt targeted.
             Empty for non-review-triggered repairs.
        blockedReason:
          type: string
          title: blocked_reason
          description: |-
            Non-empty when the daemon refused to start the repair chat (a
             FailedPrecondition displace/reclaim refusal). Routes the outcome into
             the blocked lane: the reason + timestamp are recorded for operator
             visibility, but last_repair_attempt_count and the runner/exit error
             fields are left untouched, so a start-refusal never counts as a repair
             failure or feeds the exponential backoff.
      title: RecordRepairOutcomeRequest
      additionalProperties: false
    bossanova.v1.RecordRepairOutcomeResponse:
      type: object
      title: RecordRepairOutcomeResponse
      additionalProperties: false
    bossanova.v1.RefreshAccountRequest:
      type: object
      properties:
        id:
          type: string
          title: id
        credential:
          type: string
          title: credential
          format: byte
          description: >-
            New credential blob (Claude setup-token string; Codex auth.json
            bytes).
             Inbound only, consumed straight into the keyring, NEVER echoed back.
        testAfterSave:
          type: boolean
          title: test_after_save
          description: When true, run the same validation path as TestAccount after saving.
      title: RefreshAccountRequest
      additionalProperties: false
    bossanova.v1.RefreshAccountResponse:
      type: object
      properties:
        account:
          title: account
          $ref: '#/components/schemas/bossanova.v1.Account'
        liveSmokeRan:
          type: boolean
          title: live_smoke_ran
        detail:
          type: string
          title: detail
      title: RefreshAccountResponse
      additionalProperties: false
    bossanova.v1.RefreshCloudEntitlementsRequest:
      type: object
      title: RefreshCloudEntitlementsRequest
      additionalProperties: false
    bossanova.v1.RefreshCloudEntitlementsResponse:
      type: object
      properties:
        status:
          title: status
          $ref: '#/components/schemas/bossanova.v1.CloudAccessStatus'
      title: RefreshCloudEntitlementsResponse
      additionalProperties: false
    bossanova.v1.RegisterDaemonRequest:
      type: object
      properties:
        daemonId:
          type: string
          title: daemon_id
        hostname:
          type: string
          title: hostname
        repoIds:
          type: array
          items:
            type: string
          title: repo_ids
          description: Repos this daemon manages.
        endpoint:
          type:
            - string
            - 'null'
          title: endpoint
          description: |-
            Optional endpoint URL where the daemon's DaemonService is reachable.
             Required for proxy RPC support. Daemons behind NAT may omit this.
        email:
          type: string
          title: email
          description: |-
            User email from the WorkOS device code response.
             Used for JIT user creation when the user doesn't exist in the DB yet.
      title: RegisterDaemonRequest
      additionalProperties: false
    bossanova.v1.RegisterDaemonResponse:
      type: object
      properties:
        daemonId:
          type: string
          title: daemon_id
        sessionToken:
          type: string
          title: session_token
          description: Token for subsequent authenticated requests.
      title: RegisterDaemonResponse
      additionalProperties: false
    bossanova.v1.RegisterRepoRequest:
      type: object
      properties:
        localPath:
          type: string
          title: local_path
        displayName:
          type: string
          title: display_name
        defaultBaseBranch:
          type: string
          title: default_base_branch
        worktreeBaseDir:
          type: string
          title: worktree_base_dir
        setupScript:
          type:
            - string
            - 'null'
          title: setup_script
      title: RegisterRepoRequest
      additionalProperties: false
    bossanova.v1.RegisterRepoResponse:
      type: object
      properties:
        repo:
          title: repo
          $ref: '#/components/schemas/bossanova.v1.Repo'
      title: RegisterRepoResponse
      additionalProperties: false
    bossanova.v1.RemoveAccountRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: RemoveAccountRequest
      additionalProperties: false
    bossanova.v1.RemoveAccountResponse:
      type: object
      title: RemoveAccountResponse
      additionalProperties: false
    bossanova.v1.RemoveAgentRunHookRequest:
      type: object
      properties:
        workDir:
          type: string
          title: work_dir
        agentSessionId:
          type: string
          title: agent_session_id
      title: RemoveAgentRunHookRequest
      additionalProperties: false
    bossanova.v1.RemoveAgentRunHookResponse:
      type: object
      properties:
        isSupported:
          type: boolean
          title: is_supported
      title: RemoveAgentRunHookResponse
      additionalProperties: false
    bossanova.v1.RemoveRepoRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: RemoveRepoRequest
      additionalProperties: false
    bossanova.v1.RemoveRepoResponse:
      type: object
      title: RemoveRepoResponse
      additionalProperties: false
    bossanova.v1.RemoveSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: RemoveSessionRequest
      additionalProperties: false
    bossanova.v1.RemoveSessionResponse:
      type: object
      title: RemoveSessionResponse
      additionalProperties: false
    bossanova.v1.RepairDoctorCheck:
      type: object
      properties:
        name:
          type: string
          title: name
        ok:
          type: boolean
          title: ok
        detail:
          type: string
          title: detail
      title: RepairDoctorCheck
      additionalProperties: false
      description: >-
        RepairDoctorCheck is one entry in the structured health report. Each
        check
         has a stable name (so the CLI can render it in a fixed order with
         per-check formatting), a pass/fail bit, and a free-form detail string
         the operator reads to diagnose the failure.
    bossanova.v1.RepairDoctorRequest:
      type: object
      title: RepairDoctorRequest
      additionalProperties: false
    bossanova.v1.RepairDoctorResponse:
      type: object
      properties:
        checks:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.RepairDoctorCheck'
          title: checks
          description: The checks, in the order they should be displayed.
        recentLogs:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.RepairLogSnapshot'
          title: recent_logs
          description: >-
            Recent agent-log files the daemon found in the agent-logs dir,
            sorted
             newest-first. The CLI shows size, mtime and the head line so the
             operator can spot empty logs (which Phase 1a forbids) at a glance.
      title: RepairDoctorResponse
      additionalProperties: false
    bossanova.v1.RepairLogSnapshot:
      type: object
      properties:
        path:
          type: string
          title: path
        sizeBytes:
          type:
            - integer
            - string
          title: size_bytes
          format: int64
        modifiedAt:
          title: modified_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        headLine:
          type: string
          title: head_line
          description: |-
            First text line of the file, or empty if the file is 0 bytes. With
             Phase 1a this should always start with "[runner] spawning claude".
      title: RepairLogSnapshot
      additionalProperties: false
    bossanova.v1.Repo:
      type: object
      properties:
        id:
          type: string
          title: id
        displayName:
          type: string
          title: display_name
        localPath:
          type: string
          title: local_path
        originUrl:
          type: string
          title: origin_url
        defaultBaseBranch:
          type: string
          title: default_base_branch
        worktreeBaseDir:
          type: string
          title: worktree_base_dir
        setupScript:
          type:
            - string
            - 'null'
          title: setup_script
        createdAt:
          title: created_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        updatedAt:
          title: updated_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        canAutoMerge:
          type: boolean
          title: can_auto_merge
        canAutoMergeDependabot:
          type: boolean
          title: can_auto_merge_dependabot
        mergeStrategy:
          type: string
          title: merge_strategy
        canAutoRepair:
          type: boolean
          title: can_auto_repair
          description: >-
            Whether the daemon's repair plugin may automatically repair this
            repo's PRs
             (failing checks, merge conflicts, review feedback). Honored by the plugin.
             Defaults on.
        linearApiKey:
          type: string
          title: linear_api_key
        sentryApiKey:
          type: string
          title: sentry_api_key
          description: >-
            Sentry credentials. Mirrors linear_api_key: a Sentry auth token
            alone can't
             address an organization, so the org slug is stored alongside it. Issues are
             listed org-wide (across every project), so no project slug is needed.
        sentryOrg:
          type: string
          title: sentry_org
      title: Repo
      additionalProperties: false
      description: Repo represents a registered Git repository.
    bossanova.v1.ReportBugRequest:
      type: object
      properties:
        comment:
          type: string
          title: comment
        context:
          title: context
          $ref: '#/components/schemas/bossanova.v1.ReportContext'
      title: ReportBugRequest
      additionalProperties: false
    bossanova.v1.ReportBugResponse:
      type: object
      properties:
        reportId:
          type: string
          title: report_id
      title: ReportBugResponse
      additionalProperties: false
    bossanova.v1.ReportChatStatusRequest:
      type: object
      properties:
        reports:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.ChatStatusReport'
          title: reports
      title: ReportChatStatusRequest
      additionalProperties: false
    bossanova.v1.ReportChatStatusResponse:
      type: object
      title: ReportChatStatusResponse
      additionalProperties: false
    bossanova.v1.ReportContext:
      type: object
      properties:
        bossVersion:
          type: string
          title: boss_version
          description: Client identity
        bossCommit:
          type: string
          title: boss_commit
        os:
          type: string
          title: os
        arch:
          type: string
          title: arch
        terminal:
          type: string
          title: terminal
        currentSession:
          title: current_session
          description: Session state at report time.
          $ref: '#/components/schemas/bossanova.v1.Session'
        sessions:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.SessionSummary'
          title: sessions
        daemonStatuses:
          type: object
          title: daemon_statuses
          additionalProperties:
            type: string
            title: value
        bossLogTail:
          type: string
          title: boss_log_tail
          description: Tailed log contents (last N lines each).
        bossdLogTail:
          type: string
          title: bossd_log_tail
        recentTurns:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.ClaudeTurn'
          title: recent_turns
          description: Optionally populated — most recent Claude turns, if available.
      title: ReportContext
      additionalProperties: false
      description: |-
        ReportContext bundles everything the TUI attaches to a bug report.
         All fields are optional; the server tolerates empty values.
    bossanova.v1.ReportContext.DaemonStatusesEntry:
      type: object
      properties:
        key:
          type: string
          title: key
        value:
          type: string
          title: value
      title: DaemonStatusesEntry
      additionalProperties: false
    bossanova.v1.ResolveContextRequest:
      type: object
      properties:
        workingDirectory:
          type: string
          title: working_directory
          description: Working directory to resolve. If empty, uses daemon's cwd.
      title: ResolveContextRequest
      additionalProperties: false
    bossanova.v1.ResolveContextResponse:
      type: object
      properties:
        repo:
          oneOf:
            - $ref: '#/components/schemas/bossanova.v1.Repo'
            - type: 'null'
          title: repo
          description: The resolved repo, if inside a registered repo or worktree.
        session:
          oneOf:
            - $ref: '#/components/schemas/bossanova.v1.Session'
            - type: 'null'
          title: session
          description: The resolved session, if inside a session worktree.
      title: ResolveContextResponse
      additionalProperties: false
    bossanova.v1.ResolveInteractiveSessionIDRequest:
      type: object
      properties:
        workDir:
          type: string
          title: work_dir
        requestedSessionId:
          type: string
          title: requested_session_id
        launchedAfter:
          title: launched_after
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        chatCreatedAt:
          title: chat_created_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        allowLegacyBackfill:
          type: boolean
          title: allow_legacy_backfill
        panePid:
          type: integer
          title: pane_pid
          format: int32
          description: >-
            pane_pid is the tmux pane PID (the login shell) hosting this chat's
            agent
             process. When > 0 and allow_legacy_backfill is false, the codex plugin
             resolves the rollout by inspecting the open file descriptors of the codex
             process running under this pane (process-fd resolution), which binds each
             sibling chat to its OWN rollout deterministically. On a miss (process not
             up yet, fd inspection unavailable, no rollout open) the plugin falls back
             to the (work_dir, launched_after) time-window scan. Additive request-side
             field: no apiversion bump (apiversion is response-side/unary-only).
      title: ResolveInteractiveSessionIDRequest
      additionalProperties: false
    bossanova.v1.ResolveInteractiveSessionIDResponse:
      type: object
      properties:
        found:
          type: boolean
          title: found
        sessionId:
          type: string
          title: session_id
        transcriptPath:
          type: string
          title: transcript_path
        ambiguous:
          type: boolean
          title: ambiguous
        reason:
          type: string
          title: reason
      title: ResolveInteractiveSessionIDResponse
      additionalProperties: false
    bossanova.v1.ResumeSessionCommand:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
      title: ResumeSessionCommand
      additionalProperties: false
      description: |-
        ResumeSessionCommand asks the daemon to resume a session and emit a
         CommandResult with the updated Session in the payload.
    bossanova.v1.ResumeSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: ResumeSessionRequest
      additionalProperties: false
    bossanova.v1.ResumeSessionResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: ResumeSessionResponse
      additionalProperties: false
    bossanova.v1.ResumeWorkflowRequest:
      type: object
      properties:
        workflowId:
          type: string
          title: workflow_id
      title: ResumeWorkflowRequest
      additionalProperties: false
    bossanova.v1.ResumeWorkflowResponse:
      type: object
      properties:
        status:
          title: status
          $ref: '#/components/schemas/bossanova.v1.WorkflowStatusInfo'
      title: ResumeWorkflowResponse
      additionalProperties: false
    bossanova.v1.ResurrectSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: ResurrectSessionRequest
      additionalProperties: false
    bossanova.v1.ResurrectSessionResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: ResurrectSessionResponse
      additionalProperties: false
    bossanova.v1.RetrySessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: RetrySessionRequest
      additionalProperties: false
    bossanova.v1.RetrySessionResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: RetrySessionResponse
      additionalProperties: false
    bossanova.v1.ReviewComment:
      type: object
      properties:
        author:
          type: string
          title: author
        body:
          type: string
          title: body
        state:
          title: state
          $ref: '#/components/schemas/bossanova.v1.ReviewState'
        path:
          type:
            - string
            - 'null'
          title: path
        line:
          type:
            - integer
            - 'null'
          title: line
          format: int32
      title: ReviewComment
      additionalProperties: false
      description: ReviewComment represents a review comment on a PR.
    bossanova.v1.ReviewState:
      type: string
      title: ReviewState
      enum:
        - REVIEW_STATE_UNSPECIFIED
        - REVIEW_STATE_APPROVED
        - REVIEW_STATE_CHANGES_REQUESTED
        - REVIEW_STATE_COMMENTED
        - REVIEW_STATE_DISMISSED
      description: ReviewState represents the state of a PR review.
    bossanova.v1.ReviewSubmittedEvent:
      type: object
      properties:
        prId:
          type: integer
          title: pr_id
          format: int32
        comments:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.ReviewComment'
          title: comments
      title: ReviewSubmittedEvent
      additionalProperties: false
    bossanova.v1.RotationCapabilityRequest:
      type: object
      title: RotationCapabilityRequest
      additionalProperties: false
    bossanova.v1.RotationCapabilityResponse:
      type: object
      properties:
        supportsRotation:
          type: boolean
          title: supports_rotation
        authKind:
          title: auth_kind
          $ref: '#/components/schemas/bossanova.v1.AuthKind'
      title: RotationCapabilityResponse
      additionalProperties: false
    bossanova.v1.RotationEvent:
      type: object
      properties:
        id:
          type: string
          title: id
        sessionId:
          type: string
          title: session_id
        chatId:
          type: string
          title: chat_id
          description: empty for headless runs
        provider:
          type: string
          title: provider
          description: '"claude" | "codex" | …'
        trigger:
          title: trigger
          $ref: '#/components/schemas/bossanova.v1.RotationTrigger'
        fromAccount:
          type: string
          title: from_account
          description: account label (or id when label empty)
        toAccount:
          type: string
          title: to_account
          description: empty unless outcome == ROTATED
        resetAt:
          oneOf:
            - $ref: '#/components/schemas/google.protobuf.Timestamp'
            - type: 'null'
          title: reset_at
          description: parsed reset / min cooldown
        outcome:
          title: outcome
          $ref: '#/components/schemas/bossanova.v1.RotationOutcome'
        detail:
          type: string
          title: detail
          description: short human line, e.g. "resets 15:00"; no secrets
        createdAt:
          title: created_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
      title: RotationEvent
      additionalProperties: false
      description: |-
        RotationEvent is one audit record of a rotation decision (BOS-176).
         Account fields carry labels/ids only — never credentials.
    bossanova.v1.RotationOutcome:
      type: string
      title: RotationOutcome
      enum:
        - ROTATION_OUTCOME_UNSPECIFIED
        - ROTATION_OUTCOME_ROTATED
        - ROTATION_OUTCOME_STATUS_ONLY_DISABLED
        - ROTATION_OUTCOME_STATUS_ONLY_NO_CAPABILITY
        - ROTATION_OUTCOME_EXHAUSTED
        - ROTATION_OUTCOME_FAILED
        - ROTATION_OUTCOME_STATUS_ONLY_NO_ELIGIBLE_ACCOUNT
      description: RotationOutcome says what the rotation engine decided. (BOS-176)
    bossanova.v1.RotationTrigger:
      type: string
      title: RotationTrigger
      enum:
        - ROTATION_TRIGGER_UNSPECIFIED
        - ROTATION_TRIGGER_USAGE_LIMITED
        - ROTATION_TRIGGER_AUTH_INVALIDATED
        - ROTATION_TRIGGER_MANUAL
      description: RotationTrigger says why a rotation decision was evaluated. (BOS-176)
    bossanova.v1.RunCronJobNowRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: RunCronJobNowRequest
      additionalProperties: false
    bossanova.v1.RunCronJobNowResponse:
      type: object
      properties:
        session:
          oneOf:
            - $ref: '#/components/schemas/bossanova.v1.Session'
            - type: 'null'
          title: session
          description: |-
            Session spawned for this manual fire. Empty if the fire was skipped
             (overlap with a still-running session).
        skippedReason:
          type: string
          title: skipped_reason
          description: Reason the fire was skipped, when session is unset.
      title: RunCronJobNowResponse
      additionalProperties: false
    bossanova.v1.ScheduledJob:
      type: object
      properties:
        id:
          type: string
          title: id
          description: Unique ID for this job within the plugin.
        name:
          type: string
          title: name
          description: Human-readable name.
        cronExpr:
          type: string
          title: cron_expr
          description: Cron expression (eg. "0 9 * * MON").
        repoOriginUrl:
          type: string
          title: repo_origin_url
          description: Repo origin URL this job targets.
        enabled:
          type: boolean
          title: enabled
          description: Whether this job is currently enabled.
        lastRun:
          oneOf:
            - $ref: '#/components/schemas/google.protobuf.Timestamp'
            - type: 'null'
          title: last_run
          description: When this job last ran.
        nextRun:
          oneOf:
            - $ref: '#/components/schemas/google.protobuf.Timestamp'
            - type: 'null'
          title: next_run
          description: When this job is next scheduled to run.
      title: ScheduledJob
      additionalProperties: false
      description: ScheduledJob describes a recurring job managed by the scheduler plugin.
    bossanova.v1.SchedulerServiceGetInfoRequest:
      type: object
      title: SchedulerServiceGetInfoRequest
      additionalProperties: false
    bossanova.v1.SchedulerServiceGetInfoResponse:
      type: object
      properties:
        info:
          title: info
          $ref: '#/components/schemas/bossanova.v1.PluginInfo'
      title: SchedulerServiceGetInfoResponse
      additionalProperties: false
    bossanova.v1.SendChatMessageCommand:
      type: object
      properties:
        agentSessionId:
          type: string
          title: agent_session_id
        message:
          type: string
          title: message
        wakeIfAsleep:
          type: boolean
          title: wake_if_asleep
        submit:
          type: boolean
          title: submit
          description: >-
            when true, submit (press Enter + verify) a single-line command;
            default (false) prefills the composer without submitting
      title: SendChatMessageCommand
      additionalProperties: false
      description: >-
        SendChatMessageCommand asks the daemon to deliver a user message into a
        chat.
         Replies with CommandResult carrying a SendChatMessageResponse (send_chat_message = 14).
    bossanova.v1.SendChatMessageRequest:
      type: object
      properties:
        agentSessionId:
          type: string
          title: agent_session_id
          description: target chat
        message:
          type: string
          title: message
          description: text to deliver to the agent
        wakeIfAsleep:
          type: boolean
          title: wake_if_asleep
          description: when true, wake an asleep chat before pasting
        submit:
          type: boolean
          title: submit
          description: >-
            when true, submit (press Enter + verify) a single-line command;
            default (false) prefills the composer without submitting
      title: SendChatMessageRequest
      additionalProperties: false
    bossanova.v1.SendChatMessageResponse:
      type: object
      properties:
        tmuxSessionName:
          type: string
          title: tmux_session_name
        delivered:
          type: boolean
          title: delivered
        noticeText:
          type: string
          title: notice_text
          description: >-
            notice_text carries a user-facing outcome summary for a message that
            bossd
             handled mechanically instead of delivering to the agent — today, a
             single-line "/boss switch" account switch intercepted before the tmux paste
             (credit-free manual switch). On that path delivered is false and no LLM call
             is made, so callers keying on delivered to mean "handled" MUST also read
             notice_text. Empty for an ordinary delivered message.
      title: SendChatMessageResponse
      additionalProperties: false
    bossanova.v1.Session:
      type: object
      properties:
        id:
          type: string
          title: id
        repoId:
          type: string
          title: repo_id
        title:
          type: string
          title: title
        plan:
          type: string
          title: plan
        worktreePath:
          type: string
          title: worktree_path
        branchName:
          type: string
          title: branch_name
        baseBranch:
          type: string
          title: base_branch
        state:
          title: state
          $ref: '#/components/schemas/bossanova.v1.SessionState'
        agentSessionId:
          type:
            - string
            - 'null'
          title: agent_session_id
        prNumber:
          type:
            - integer
            - 'null'
          title: pr_number
          format: int32
        prUrl:
          type:
            - string
            - 'null'
          title: pr_url
        lastCheckState:
          title: last_check_state
          $ref: '#/components/schemas/bossanova.v1.ChecksOverall'
        automationEnabled:
          type: boolean
          title: automation_enabled
        attemptCount:
          type: integer
          title: attempt_count
          format: int32
        blockedReason:
          type:
            - string
            - 'null'
          title: blocked_reason
        archivedAt:
          oneOf:
            - $ref: '#/components/schemas/google.protobuf.Timestamp'
            - type: 'null'
          title: archived_at
        createdAt:
          title: created_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        updatedAt:
          title: updated_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        repoDisplayName:
          type: string
          title: repo_display_name
          description: >-
            Denormalized repo display name, populated server-side for
            convenience.
        displayStatus:
          title: display_status
          description: PR display status, hydrated server-side from the PR display tracker.
          $ref: '#/components/schemas/bossanova.v1.DisplayStatus'
        displayHasFailures:
          type: boolean
          title: display_has_failures
        displayHasChangesRequested:
          type: boolean
          title: display_has_changes_requested
        attentionStatus:
          oneOf:
            - $ref: '#/components/schemas/bossanova.v1.AttentionStatus'
            - type: 'null'
          title: attention_status
          description: Attention status, hydrated server-side from session state.
        displayIsRepairing:
          type: boolean
          title: display_is_repairing
          description: >-
            Whether this session is currently being repaired by the repair
            plugin.
        workflowDisplayStatus:
          title: workflow_display_status
          description: Workflow display fields, hydrated server-side from active workflows.
          $ref: '#/components/schemas/bossanova.v1.WorkflowStatus'
        workflowDisplayLeg:
          type: integer
          title: workflow_display_leg
          format: int32
        workflowDisplayMaxLegs:
          type: integer
          title: workflow_display_max_legs
          format: int32
        hasActiveChat:
          type: boolean
          title: has_active_chat
          description: >-
            Whether the session has an active Claude Code chat process
            (heartbeat-tracked).
        trackerId:
          type:
            - string
            - 'null'
          title: tracker_id
          description: >-
            External issue tracker fields (eg. Linear, Jira). External issue ID
            (eg. "FRE-1176")
        trackerUrl:
          type:
            - string
            - 'null'
          title: tracker_url
          description: URL to issue in external tracker
        tmuxSessionName:
          type:
            - string
            - 'null'
          title: tmux_session_name
          description: tmux session name for persistent terminal sessions.
        prDisplayHeadSha:
          type: string
          title: pr_display_head_sha
          description: >-
            Head commit SHA of the PR, used by repair plugin to skip duplicate
            repairs.
        displayLabel:
          type: string
          title: display_label
          description: >-
            Composite display fields, computed by bossd's DisplayStatusComputer
            and
             persisted so every client (TUI, web, future consumers) renders the same
             label/intent/spinner verbatim — including when bosso falls back to its
             own DB while the originating bossd is offline. eg. "working", "checking", "running 2/4", "? question", "stopped"
        displayIntent:
          title: display_intent
          description: semantic meaning; clients map to styling
          $ref: '#/components/schemas/bossanova.v1.DisplayIntent'
        displaySpinner:
          type: boolean
          title: display_spinner
          description: whether to render the spinner glyph
        transferringTo:
          type: string
          title: transferring_to
          description: >-
            Transfer coordination markers used by the coordinated
            TransferSession
             protocol (see docs/plans/2026-04-24-reverse-stream-daemon-model.md,
             decision #14). When set, the session is hidden from ListForUser on the
             orchestrator until the transfer protocol completes. empty if not transferring out
        transferringFrom:
          type: string
          title: transferring_from
          description: empty if not transferring in
        agentName:
          type: string
          title: agent_name
          description: Agent plugin name (e.g. "claude", "opencode"). Empty in legacy data.
        lastRepairStartedAt:
          oneOf:
            - $ref: '#/components/schemas/google.protobuf.Timestamp'
            - type: 'null'
          title: last_repair_started_at
          description: |-
            Last repair-attempt diagnostics, persisted by the repair plugin via
             RecordRepairOutcome so the TUI can surface "failing ⚠ repair: claude
             not in PATH (3×)" hints. Both error fields are empty for clean runs;
             runner_error means StartAgentRun never produced a process (eg. claude
             not on PATH), exit_error means the agent ran but exited non-zero.
             last_repair_attempt_count is a *consecutive-failure* counter: clean
             runs reset it to zero, failed runs increment it. Total attempts are
             not tracked.
        lastRepairRunnerError:
          type: string
          title: last_repair_runner_error
        lastRepairExitError:
          type: string
          title: last_repair_exit_error
        lastRepairAttemptCount:
          type: integer
          title: last_repair_attempt_count
          format: int32
        lastRepairHeadSha:
          type: string
          title: last_repair_head_sha
        lastRepairDisplayStatus:
          title: last_repair_display_status
          $ref: '#/components/schemas/bossanova.v1.DisplayStatus'
        lastChatActivityAt:
          oneOf:
            - $ref: '#/components/schemas/google.protobuf.Timestamp'
            - type: 'null'
          title: last_chat_activity_at
          description: |-
            Last time any of the session's live chat processes produced output.
             Populated server-side from the chat tracker — the max LastOutputAt across
             all of the session's chat tracker entries whose heartbeat is fresh
             (within StaleThreshold). Empty when no chat is live. The repair plugin
             uses this to gate auto-repair: an interactive chat that hasn't produced
             output for `idle_repair_threshold_minutes` is treated as idle, so repair
             can proceed even though the claude process is still attached.
        repoOriginUrl:
          type: string
          title: repo_origin_url
          description: >-
            Denormalized repo origin URL, populated server-side for webhook
            routing.
        lastRepairReviewFingerprint:
          type: string
          title: last_repair_review_fingerprint
          description: |-
            Fingerprint of review feedback targeted by the last repair run.
             Empty for non-review-triggered repairs and for legacy rows.
        displaySettingUp:
          type: boolean
          title: display_setting_up
          description: >-
            True while the repo's setup script is running during session
            creation
             (the "initializing" display status). Transport-only: hydrated server-side
             from the in-memory DisplayTracker and never persisted. Mirrors
             display_is_repairing (field 24).
        repoCanAutoRepair:
          type: boolean
          title: repo_can_auto_repair
          description: >-
            Denormalized repo.can_auto_repair, populated server-side so the
            repair
             plugin can honor the per-repo auto-repair toggle without a separate lookup.
        setupError:
          type: string
          title: setup_error
          description: >-
            Why the repo's configured setup script failed during worktree
            creation.
             A setup-script failure is non-fatal — the session still starts — so this
             flags the degraded state for `boss show <id>` and the TUI. Empty for clean
             runs or repos with no setup script.
        lastRepairBlockedReason:
          type: string
          title: last_repair_blocked_reason
          description: >-
            Blocked-refusal lane: set when the daemon refused to START a repair
            chat
             (a FailedPrecondition displace/reclaim refusal) rather than running one.
             Recorded for operator visibility without bumping last_repair_attempt_count
             or the runner/exit error fields. Cleared on every real repair outcome, so
             a non-empty reason IS the latest repair-related state.
        lastRepairBlockedAt:
          oneOf:
            - $ref: '#/components/schemas/google.protobuf.Timestamp'
            - type: 'null'
          title: last_repair_blocked_at
        repairActive:
          type: boolean
          title: repair_active
          description: >-
            True while a single-repairer lease is held for this session — i.e. a
            repair
             chat has started and its post-repair status has not yet been assessed.
             Transport-only: hydrated server-side from the in-memory RepairLeaseManager
             and never persisted. Distinct from display_is_repairing (field 24), which
             is a best-effort display flag; repair_active is the authoritative,
             lease-backed signal a dispatcher (boss-epic driver, /boss-repair, plugin
             sweep) reads to defer to an already-active repairer without racing.
        prMergeable:
          type:
            - boolean
            - 'null'
          title: pr_mergeable
          description: >-
            PR mergeability, hydrated server-side from the display poller's PR
            fetch so
             a conflict-after-green is detectable without attempting a merge. Unset when
             unknown/not yet polled; true = mergeable; false = conflicting. Transport-
             only, never persisted.
        mergeBlock:
          title: merge_block
          description: >-
            Structured reason a session's PR cannot currently be merged,
            hydrated on
             get_session/list_sessions from the daemon's display tracker. Lets an
             unattended driver (boss-epic) decide repair-vs-proceed without scraping tmux.
          $ref: '#/components/schemas/bossanova.v1.MergeBlock'
        lastAgentActivityAt:
          oneOf:
            - $ref: '#/components/schemas/google.protobuf.Timestamp'
            - type: 'null'
          title: last_agent_activity_at
          description: >-
            Most-recent real agent output across the session's chats; advances
            on
             genuine output, NOT pane mtime. Absent when never observed.
        accountId:
          type:
            - string
            - 'null'
          title: account_id
          description: |-
            account_id binds the session to a rotation account; empty/absent =
             system-default account 0 (no injected env, D9).
        accountLabel:
          type:
            - string
            - 'null'
          title: account_label
          description: >-
            account_label is the server-resolved human label for account_id
            ("Unmanaged
             local credentials" when unbound); read-only, non-secret.
        rotationEvents:
          type: array
          items:
            $ref: '#/components/schemas/bossanova.v1.RotationEvent'
          title: rotation_events
          description: >-
            Recent rotation audit events (newest first, capped server-side at
            10),
             hydrated by bossd like the display_* fields so TUI/web render history,
             the exhausted badge, and toasts from one field. (BOS-176)
      title: Session
      additionalProperties: false
      description: Session represents a coding-agent session.
    bossanova.v1.SessionAttachChunk:
      type: object
      allOf:
        - properties:
            sessionId:
              type: string
              title: session_id
            commandId:
              type: string
              title: command_id
              description: Correlates back to the originating AttachSessionCommand.
        - oneOf:
            - type: object
              properties:
                outputLine:
                  title: output_line
                  $ref: '#/components/schemas/bossanova.v1.OutputLine'
              title: output_line
              required:
                - outputLine
            - type: object
              properties:
                sessionEnded:
                  title: session_ended
                  $ref: '#/components/schemas/bossanova.v1.SessionEnded'
              title: session_ended
              required:
                - sessionEnded
            - type: object
              properties:
                stateChange:
                  title: state_change
                  $ref: '#/components/schemas/bossanova.v1.StateChange'
              title: state_change
              required:
                - stateChange
      title: SessionAttachChunk
      additionalProperties: false
      description: >-
        SessionAttachChunk is a single streaming event from an active
        AttachSession.
         Reuses OutputLine / StateChange / SessionEnded from daemon.proto so the
         orchestrator can forward these verbatim to the proxied AttachSession
         response.
    bossanova.v1.SessionCreateChunk:
      type: object
      allOf:
        - properties:
            commandId:
              type: string
              title: command_id
            attachedExisting:
              type: boolean
              title: attached_existing
              description: >-
                True when the terminal `created` frame reports an EXISTING
                active session
                 the daemon attached to (dedup) rather than a freshly created one. Mirrors
                 SessionCreated.attached_existing so the flag survives the daemon → bosso
                 upstream hop; only meaningful alongside `created`.
        - oneOf:
            - type: object
              properties:
                created:
                  title: created
                  $ref: '#/components/schemas/bossanova.v1.Session'
              title: created
              required:
                - created
            - type: object
              properties:
                error:
                  title: error
                  $ref: '#/components/schemas/bossanova.v1.CreateError'
              title: error
              required:
                - error
            - type: object
              properties:
                setupOutput:
                  type: string
                  title: setup_output
              title: setup_output
              required:
                - setupOutput
      title: SessionCreateChunk
      additionalProperties: false
      description: >-
        SessionCreateChunk is one streaming frame from an in-flight
        CreateSession,
         correlated to the originating CreateSessionCommand by command_id. Mirrors
         SessionAttachChunk. Terminal frame is `created` (success) or `error`.
    bossanova.v1.SessionCreated:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
        attachedExisting:
          type: boolean
          title: attached_existing
          description: >-
            True when this event reports an EXISTING active session that already
            owns
             the requested branch/PR (the create was a dedup/attach), rather than a
             newly created session. On the attach path the request's plan/prompt is NOT
             run — the caller must run it in the existing session (e.g. send_chat_message).
      title: SessionCreated
      additionalProperties: false
    bossanova.v1.SessionDelta:
      type: object
      properties:
        kind:
          title: kind
          $ref: '#/components/schemas/bossanova.v1.SessionDelta.Kind'
        session:
          title: session
          description: |-
            On CREATE/UPDATE: full Session. On DELETE: id only.
             Session.transferring_to / transferring_from (models.proto) hide the
             session from ListForUser during the coordinated transfer protocol.
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: SessionDelta
      additionalProperties: false
      description: |-
        SessionDelta is a single session lifecycle change. On DELETE, only
         session.id is populated; on CREATE/UPDATE the full Session is included.
    bossanova.v1.SessionDelta.Kind:
      type: string
      title: Kind
      enum:
        - KIND_UNSPECIFIED
        - KIND_CREATED
        - KIND_UPDATED
        - KIND_DELETED
      description: |-
        Kind names are prefixed with KIND_ to satisfy buf STANDARD lint
         (enum values must share the enum-name prefix). Wire numbers match the
         design doc spec.
    bossanova.v1.SessionEnded:
      type: object
      properties:
        finalState:
          title: final_state
          $ref: '#/components/schemas/bossanova.v1.SessionState'
        reason:
          type:
            - string
            - 'null'
          title: reason
      title: SessionEnded
      additionalProperties: false
    bossanova.v1.SessionEvent:
      type: string
      title: SessionEvent
      enum:
        - SESSION_EVENT_UNSPECIFIED
        - SESSION_EVENT_WORKTREE_CREATED
        - SESSION_EVENT_AGENT_STARTED
        - SESSION_EVENT_BRANCH_PUSHED
        - SESSION_EVENT_PR_OPENED
        - SESSION_EVENT_PLAN_COMPLETE
        - SESSION_EVENT_CHECKS_PASSED
        - SESSION_EVENT_CHECKS_FAILED
        - SESSION_EVENT_CONFLICT_DETECTED
        - SESSION_EVENT_REVIEW_SUBMITTED
        - SESSION_EVENT_FIX_COMPLETE
        - SESSION_EVENT_FIX_FAILED
        - SESSION_EVENT_BLOCK
        - SESSION_EVENT_UNBLOCK
        - SESSION_EVENT_PR_MERGED
        - SESSION_EVENT_PR_CLOSED
        - SESSION_EVENT_FINALIZE_REQUESTED
      description: SessionEvent represents the 16 events that trigger state transitions.
    bossanova.v1.SessionState:
      type: string
      title: SessionState
      enum:
        - SESSION_STATE_UNSPECIFIED
        - SESSION_STATE_CREATING_WORKTREE
        - SESSION_STATE_STARTING_AGENT
        - SESSION_STATE_PUSHING_BRANCH
        - SESSION_STATE_OPENING_DRAFT_PR
        - SESSION_STATE_IMPLEMENTING_PLAN
        - SESSION_STATE_AWAITING_CHECKS
        - SESSION_STATE_FIXING_CHECKS
        - SESSION_STATE_GREEN_DRAFT
        - SESSION_STATE_READY_FOR_REVIEW
        - SESSION_STATE_BLOCKED
        - SESSION_STATE_MERGED
        - SESSION_STATE_CLOSED
        - SESSION_STATE_FINALIZING
        - SESSION_STATE_ORPHANED
      description: SessionState represents the 14 states of the session lifecycle.
    bossanova.v1.SessionStatusEntry:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        status:
          title: status
          description: Best status across all chats (working > idle > stopped)
          $ref: '#/components/schemas/bossanova.v1.ChatStatus'
      title: SessionStatusEntry
      additionalProperties: false
      description: SessionStatusEntry is an aggregate status for a session.
    bossanova.v1.SessionSummary:
      type: object
      properties:
        id:
          type: string
          title: id
        repoId:
          type: string
          title: repo_id
        title:
          type: string
          title: title
        state:
          title: state
          $ref: '#/components/schemas/bossanova.v1.SessionState'
        prNumber:
          type:
            - integer
            - 'null'
          title: pr_number
          format: int32
        prUrl:
          type:
            - string
            - 'null'
          title: pr_url
        updatedAt:
          title: updated_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
      title: SessionSummary
      additionalProperties: false
      description: SessionSummary is a lightweight view of a Session for report context.
    bossanova.v1.SetRepairStatusRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
          description: Session ID to set repair status on.
        isRepairing:
          type: boolean
          title: is_repairing
          description: Whether the session is currently being repaired.
        dispatcherId:
          type: string
          title: dispatcher_id
          description: >-
            Stable identity of the repair dispatcher (e.g. the repair plugin
            instance).
             Used to take/release the per-session single-repairer lease: setting
             is_repairing=true acquires the lease for this dispatcher (re-entrant for the
             same id, refused with FailedPrecondition for a different one while held);
             is_repairing=false releases it. Empty for legacy callers, which then only
             toggle the advisory display flag without lease enforcement.
      title: SetRepairStatusRequest
      additionalProperties: false
    bossanova.v1.SetRepairStatusResponse:
      type: object
      title: SetRepairStatusResponse
      additionalProperties: false
    bossanova.v1.SetupScriptOutput:
      type: object
      properties:
        text:
          type: string
          title: text
      title: SetupScriptOutput
      additionalProperties: false
    bossanova.v1.StartAgentRunHostRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
          description: Session ID whose worktree should host the run.
        prompt:
          type: string
          title: prompt
          description: Prompt to feed the agent.
      title: StartAgentRunHostRequest
      additionalProperties: false
    bossanova.v1.StartAgentRunHostResponse:
      type: object
      properties:
        agentSessionId:
          type: string
          title: agent_session_id
          description: Resolved session ID returned by the loaded AgentRunner plugin.
      title: StartAgentRunHostResponse
      additionalProperties: false
    bossanova.v1.StartAgentRunRequest:
      type: object
      properties:
        workDir:
          type: string
          title: work_dir
        plan:
          type: string
          title: plan
        resumeId:
          type:
            - string
            - 'null'
          title: resume_id
        sessionId:
          type: string
          title: session_id
          description: empty = plugin generates
        logPath:
          type: string
          title: log_path
          description: bossd-owned, openat(O_NOFOLLOW)
        model:
          type: string
          title: model
          description: >-
            opaque agent model id; "" = plugin default. Never enumerated by
            bossd.
        extraEnv:
          type: object
          title: extra_env
          additionalProperties:
            type: string
            title: value
          description: >-
            extra_env is an allowlisted, daemon-resolved environment overlay
            applied to
             the spawned agent process on top of the inherited environment. It carries
             proof credentials/constants AND (for account rotation) the account's env
             overlay (e.g. CLAUDE_CODE_OAUTH_TOKEN / CODEX_HOME). Values are NEVER logged
             by bossd or the plugin — treat as secret-bearing.
      title: StartAgentRunRequest
      additionalProperties: false
    bossanova.v1.StartAgentRunRequest.ExtraEnvEntry:
      type: object
      properties:
        key:
          type: string
          title: key
        value:
          type: string
          title: value
      title: ExtraEnvEntry
      additionalProperties: false
    bossanova.v1.StartAgentRunResponse:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
          description: resolved session ID
      title: StartAgentRunResponse
      additionalProperties: false
    bossanova.v1.StartChatRunHostRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
          description: Session ID whose worktree should host the run.
        prompt:
          type: string
          title: prompt
          description: >-
            Raw prompt to feed the agent (typed as a bracketed paste into the
            tmux pane).
             Mutually exclusive with command.
        title:
          type: string
          title: title
          description: |-
            Chat title surfaced in the chat list (eg. `Repair: <session>` or
             `Run "<cron>"`).
        command:
          type: string
          title: command
          description: >-
            Boss command name without any agent-specific prefix (eg.
            "boss-repair").
             The daemon formats it using the loaded AgentRunner plugin's command_prefix.
             Mutually exclusive with prompt.
        replaceExistingChat:
          type: boolean
          title: replace_existing_chat
          description: >-
            When true, bossd may replace an existing live chat in the same
            session
             before starting this run. Used by auto-repair only after its idle gate
             has already decided the existing chat is safe to interrupt.
        replaceExistingReason:
          type: string
          title: replace_existing_reason
          description: Durable reason written to the replaced chat row.
        replaceExistingObservedLastChatActivityAt:
          title: replace_existing_observed_last_chat_activity_at
          description: |-
            Last chat activity observed by the repair plugin when it decided the
             blocking chat was idle. bossd refuses replacement if the current blocking
             chat has produced newer output since that snapshot.
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        resumeAgentSessionId:
          type: string
          title: resume_agent_session_id
          description: >-
            When set, resume this prior agent session (claude `--resume <id>`)
            instead
             of starting a fresh one, so the agent retains the history of earlier
             attempts. Used by auto-repair to make each loop iteration continue the
             previous iteration's conversation. Empty = fresh start.
      title: StartChatRunHostRequest
      additionalProperties: false
    bossanova.v1.StartChatRunHostResponse:
      type: object
      properties:
        agentSessionId:
          type: string
          title: agent_session_id
          description: Resolved agent session ID returned by the loaded AgentRunner plugin.
      title: StartChatRunHostResponse
      additionalProperties: false
    bossanova.v1.StartRepairWorkflowRequest:
      type: object
      title: StartRepairWorkflowRequest
      additionalProperties: false
    bossanova.v1.StartRepairWorkflowResponse:
      type: object
      properties:
        alreadyRunning:
          type: boolean
          title: already_running
          description: >-
            already_running is true when the workflow was RUNNING and
            StartWorkflow
             was deliberately NOT re-issued.
        detail:
          type: string
          title: detail
          description: >-
            detail is a one-line human-readable summary (prior status, action
            taken).
      title: StartRepairWorkflowResponse
      additionalProperties: false
    bossanova.v1.StartWorkflowRequest:
      type: object
      properties:
        planPath:
          type: string
          title: plan_path
          description: Path to the plan file (relative to repo root).
        sessionId:
          type: string
          title: session_id
          description: The session this workflow belongs to.
        repoId:
          type: string
          title: repo_id
          description: The repo this workflow operates on.
        maxLegs:
          type: integer
          title: max_legs
          format: int32
          description: Override max flight legs (0 = use default).
        confirmLand:
          type: boolean
          title: confirm_land
          description: Pause for user confirmation before landing.
        configJson:
          type: string
          title: config_json
          description: JSON-encoded config overrides.
      title: StartWorkflowRequest
      additionalProperties: false
    bossanova.v1.StartWorkflowResponse:
      type: object
      properties:
        workflowId:
          type: string
          title: workflow_id
        status:
          title: status
          $ref: '#/components/schemas/bossanova.v1.WorkflowStatusInfo'
      title: StartWorkflowResponse
      additionalProperties: false
    bossanova.v1.StateChange:
      type: object
      properties:
        previousState:
          title: previous_state
          $ref: '#/components/schemas/bossanova.v1.SessionState'
        newState:
          title: new_state
          $ref: '#/components/schemas/bossanova.v1.SessionState'
        trigger:
          title: trigger
          $ref: '#/components/schemas/bossanova.v1.SessionEvent'
      title: StateChange
      additionalProperties: false
    bossanova.v1.StopAgentRunRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
      title: StopAgentRunRequest
      additionalProperties: false
    bossanova.v1.StopAgentRunResponse:
      type: object
      title: StopAgentRunResponse
      additionalProperties: false
    bossanova.v1.StopSessionCommand:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
      title: StopSessionCommand
      additionalProperties: false
      description: |-
        StopSessionCommand asks the daemon to stop a session and emit a
         CommandResult with the updated Session in the payload.
    bossanova.v1.StopSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: StopSessionRequest
      additionalProperties: false
    bossanova.v1.StopSessionResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: StopSessionResponse
      additionalProperties: false
    bossanova.v1.StreamEventsRequest:
      type: object
      properties:
        repoOriginUrls:
          type: array
          items:
            type: string
          title: repo_origin_urls
          description: 'Optional filter: only stream events for these repo origin URLs.'
      title: StreamEventsRequest
      additionalProperties: false
    bossanova.v1.StreamEventsResponse:
      type: object
      properties:
        notification:
          title: notification
          $ref: '#/components/schemas/bossanova.v1.EventNotification'
      title: StreamEventsResponse
      additionalProperties: false
      description: StreamEventsResponse wraps a single event notification from a plugin.
    bossanova.v1.SuggestPRTitleRequest:
      type: object
      properties:
        workDir:
          type: string
          title: work_dir
          description: The worktree the change lives in (the agent runs read-only here).
        currentTitle:
          type: string
          title: current_title
          description: >-
            The PR's current title (set earlier, e.g. by the agent at PR
            creation).
             The agent should return this verbatim when it already fits the change.
        prBody:
          type: string
          title: pr_body
          description: The PR description / body (the human/agent-authored intent).
        gitLog:
          type: string
          title: git_log
          description: >-
            The git log of commits on the branch vs the base (subjects,
            oldest→newest).
        baseBranch:
          type: string
          title: base_branch
          description: The base branch the PR targets.
      title: SuggestPRTitleRequest
      additionalProperties: false
    bossanova.v1.SuggestPRTitleResponse:
      type: object
      properties:
        supported:
          type: boolean
          title: supported
          description: >-
            false = the agent has no suggestion (unimplemented / failed); the
            daemon
             falls back to its deterministic title heuristic.
        title:
          type: string
          title: title
          description: The suggested title (== current_title when it is already accurate).
      title: SuggestPRTitleResponse
      additionalProperties: false
    bossanova.v1.SwitchAccountCommand:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
          description: >-
            owning session (daemon resolves primary live chat if
            agent_session_id empty)
        agentSessionId:
          type: string
          title: agent_session_id
          description: optional; empty => session's primary live chat
        accountId:
          type: string
          title: account_id
          description: target; "" = system default (account 0)
        force:
          type: boolean
          title: force
          description: interrupt a mid-turn (WORKING) chat
      title: SwitchAccountCommand
      additionalProperties: false
      description: >-
        SwitchAccountCommand asks the daemon to switch a session's live chat to
        a
         different account (stop+swap+resume). The daemon replies with a
         CommandResult carrying a SwitchAccountResult payload.
    bossanova.v1.SwitchAccountResult:
      type: object
      properties:
        resumed:
          type: boolean
          title: resumed
        targetLabel:
          type: string
          title: target_label
        noticeText:
          type: string
          title: notice_text
      title: SwitchAccountResult
      additionalProperties: false
      description: >-
        SwitchAccountResult is the payload sent in a CommandResult for a
        successful
         SwitchAccountCommand. Mirrors the daemon's SwitchSessionAccountResponse.
    bossanova.v1.SwitchSessionAccountRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        accountId:
          type: string
          title: account_id
          description: target account id; "" = system default ("account 0")
        agentSessionId:
          type:
            - string
            - 'null'
          title: agent_session_id
          description: which chat to switch; if unset, the session's primary live chat
        force:
          type: boolean
          title: force
          description: interrupt a mid-turn (WORKING) chat
      title: SwitchSessionAccountRequest
      additionalProperties: false
    bossanova.v1.SwitchSessionAccountResponse:
      type: object
      properties:
        resumed:
          type: boolean
          title: resumed
        targetLabel:
          type: string
          title: target_label
        noticeText:
          type: string
          title: notice_text
      title: SwitchSessionAccountResponse
      additionalProperties: false
    bossanova.v1.TaskAction:
      type: string
      title: TaskAction
      enum:
        - TASK_ACTION_UNSPECIFIED
        - TASK_ACTION_AUTO_MERGE
        - TASK_ACTION_CREATE_SESSION
        - TASK_ACTION_NOTIFY_USER
      description: TaskAction specifies what the daemon should do with a task.
    bossanova.v1.TaskItem:
      type: object
      properties:
        externalId:
          type: string
          title: external_id
          description: External system's unique ID for this task.
        title:
          type: string
          title: title
          description: Human-readable title for the session.
        plan:
          type: string
          title: plan
          description: The plan / instructions for Claude.
        repoOriginUrl:
          type: string
          title: repo_origin_url
          description: Repo origin URL to match against registered repos.
        baseBranch:
          type: string
          title: base_branch
          description: Base branch to create the session from.
        priority:
          type: integer
          title: priority
          format: int32
          description: Priority (lower = higher priority).
        labels:
          type: array
          items:
            type: string
          title: labels
          description: Labels / tags from the external system.
        action:
          title: action
          description: What the daemon should do with this task.
          $ref: '#/components/schemas/bossanova.v1.TaskAction'
        existingBranch:
          type: string
          title: existing_branch
          description: Existing branch to check out (eg. dependabot's PR branch).
      title: TaskItem
      additionalProperties: false
      description: TaskItem is a task from an external system ready to become a session.
    bossanova.v1.TaskItemStatus:
      type: string
      title: TaskItemStatus
      enum:
        - TASK_ITEM_STATUS_UNSPECIFIED
        - TASK_ITEM_STATUS_IN_PROGRESS
        - TASK_ITEM_STATUS_COMPLETED
        - TASK_ITEM_STATUS_FAILED
      description: >-
        TaskItemStatus represents the lifecycle of a task sourced from an
        external system.
    bossanova.v1.TaskReadyEvent:
      type: object
      properties:
        task:
          title: task
          $ref: '#/components/schemas/bossanova.v1.TaskItem'
      title: TaskReadyEvent
      additionalProperties: false
      description: >-
        TaskReadyEvent signals that a new task is available for session
        creation.
    bossanova.v1.TaskSourceServiceGetInfoRequest:
      type: object
      title: TaskSourceServiceGetInfoRequest
      additionalProperties: false
    bossanova.v1.TaskSourceServiceGetInfoResponse:
      type: object
      properties:
        info:
          title: info
          $ref: '#/components/schemas/bossanova.v1.PluginInfo'
      title: TaskSourceServiceGetInfoResponse
      additionalProperties: false
    bossanova.v1.TaskUpdatedEvent:
      type: object
      properties:
        externalId:
          type: string
          title: external_id
        title:
          type:
            - string
            - 'null'
          title: title
          description: The updated fields.
        priority:
          type:
            - integer
            - 'null'
          title: priority
          format: int32
        labels:
          type: array
          items:
            type: string
          title: labels
      title: TaskUpdatedEvent
      additionalProperties: false
      description: >-
        TaskUpdatedEvent signals that an external task was updated (eg.
        re-prioritized).
    bossanova.v1.TerminalAttachCommand:
      type: object
      properties:
        attachId:
          type: string
          title: attach_id
          description: bosso-generated UUID. The daemon does NOT pick routing keys.
        chatId:
          type: string
          title: chat_id
        cols:
          type: integer
          title: cols
          description: Initial PTY size from the browser (xterm.js).
        rows:
          type: integer
          title: rows
      title: TerminalAttachCommand
      additionalProperties: false
      description: >-
        TerminalAttachCommand: bosso → daemon. Carried inside
        TerminalClientMessage.
         Asks the daemon to spawn a new tmux attach PTY for the given chat. The
         attach_id is bosso-generated (UUID); the daemon uses it to multiplex
         subsequent input/resize/close commands and to tag outbound data chunks.
    bossanova.v1.TerminalAttachExited:
      type: object
      properties:
        attachId:
          type: string
          title: attach_id
        exitCode:
          type: integer
          title: exit_code
          format: int32
        reason:
          type: string
          title: reason
      title: TerminalAttachExited
      additionalProperties: false
      description: |-
        TerminalAttachExited: daemon → bosso. Carried inside
         TerminalServerMessage. Sent when the PTY child exits (tmux session was
         killed, attach was closed, etc.). exit_code mirrors the underlying
         process; reason is a free-form string for diagnostics.
    bossanova.v1.TerminalClientMessage:
      type: object
      oneOf:
        - type: object
          properties:
            attach:
              title: attach
              $ref: '#/components/schemas/bossanova.v1.TerminalAttachCommand'
          title: attach
          required:
            - attach
        - type: object
          properties:
            close:
              title: close
              $ref: '#/components/schemas/bossanova.v1.TerminalCloseCommand'
          title: close
          required:
            - close
        - type: object
          properties:
            input:
              title: input
              $ref: '#/components/schemas/bossanova.v1.TerminalInputCommand'
          title: input
          required:
            - input
        - type: object
          properties:
            resize:
              title: resize
              $ref: '#/components/schemas/bossanova.v1.TerminalResizeCommand'
          title: resize
          required:
            - resize
      title: TerminalClientMessage
      additionalProperties: false
      description: |-
        TerminalClientMessage is the bosso → daemon envelope on the new RPC.
         Despite the name, this is the gRPC RESPONSE stream type (bosso is the
         gRPC server). Unknown oneof cases are logged and skipped by the daemon
         for forward compatibility.
    bossanova.v1.TerminalCloseCommand:
      type: object
      properties:
        attachId:
          type: string
          title: attach_id
      title: TerminalCloseCommand
      additionalProperties: false
      description: |-
        TerminalCloseCommand: bosso → daemon. Asks the daemon to tear down the
         attach (closes PTY, kills the `tmux attach` process — does NOT kill the
         underlying tmux session running Claude).
    bossanova.v1.TerminalDataChunk:
      type: object
      properties:
        attachId:
          type: string
          title: attach_id
        seq:
          type:
            - integer
            - string
          title: seq
          format: int64
          description: >-
            Monotonic per attach. Reserved for a future delta-replay upgrade;
            not
             currently used by the consumer beyond debug logging.
        data:
          type: string
          title: data
          format: byte
          description: Raw PTY output incl. VT escape codes (opaque — ready for E2E).
        lost:
          type: boolean
          title: lost
          description: |-
            True when the daemon's per-attach ringbuffer dropped bytes due to a
             slow consumer. The browser MUST treat this as a RESYNC signal: the
             daemon will follow up with `tmux refresh-client` so all attached
             clients redraw fresh state.
      title: TerminalDataChunk
      additionalProperties: false
      description: |-
        TerminalDataChunk: daemon → bosso. Carried inside TerminalServerMessage.
         Raw PTY output (including VT escape codes) tagged with the attach_id so
         bosso can route it to the correct WebSocket subscriber.
    bossanova.v1.TerminalInputCommand:
      type: object
      properties:
        attachId:
          type: string
          title: attach_id
        data:
          type: string
          title: data
          format: byte
          description: Raw PTY input (opaque — ready for E2E later).
      title: TerminalInputCommand
      additionalProperties: false
      description: |-
        TerminalInputCommand: bosso → daemon. Raw bytes typed by the browser
         client to be written to the PTY stdin. Payload is opaque to bosso so a
         future libsodium framing layer can swap in without changing the wire
         shape.
    bossanova.v1.TerminalResizeCommand:
      type: object
      properties:
        attachId:
          type: string
          title: attach_id
        cols:
          type: integer
          title: cols
        rows:
          type: integer
          title: rows
      title: TerminalResizeCommand
      additionalProperties: false
      description: |-
        TerminalResizeCommand: bosso → daemon. Forwarded from the browser when
         the xterm viewport size changes. Daemon applies the new size to the PTY
         (and tmux propagates to all attached clients per the window-size policy).
    bossanova.v1.TerminalServerMessage:
      type: object
      oneOf:
        - type: object
          properties:
            data:
              title: data
              $ref: '#/components/schemas/bossanova.v1.TerminalDataChunk'
          title: data
          required:
            - data
        - type: object
          properties:
            exited:
              title: exited
              $ref: '#/components/schemas/bossanova.v1.TerminalAttachExited'
          title: exited
          required:
            - exited
      title: TerminalServerMessage
      additionalProperties: false
      description: |-
        TerminalServerMessage is the daemon → bosso envelope on the new RPC.
         Despite the name, this is the gRPC REQUEST stream type (bossd is the
         gRPC client and initiates the stream). Unknown oneof cases are logged
         and skipped by bosso for forward compatibility.
    bossanova.v1.TestAccountRequest:
      type: object
      properties:
        id:
          type: string
          title: id
      title: TestAccountRequest
      additionalProperties: false
    bossanova.v1.TestAccountResponse:
      type: object
      properties:
        account:
          title: account
          description: updated metadata (last_test_ok_at / last_test_error)
          $ref: '#/components/schemas/bossanova.v1.Account'
        liveSmokeRan:
          type: boolean
          title: live_smoke_ran
          description: true only when provider verification executed
        detail:
          type: string
          title: detail
          description: human-readable outcome detail
      title: TestAccountResponse
      additionalProperties: false
    bossanova.v1.TokenRefresh:
      type: object
      properties:
        accessToken:
          type: string
          title: access_token
          description: Newly-obtained WorkOS JWT.
      title: TokenRefresh
      additionalProperties: false
      description: |-
        TokenRefresh carries a freshly-obtained WorkOS JWT. Bosso re-verifies it
         against WorkOS JWKS (same path as initial validation) before accepting. On
         refresh failure, the daemon closes the stream and reconnects.

         Only the access_token travels on the wire — refresh tokens never cross the
         stream.
    bossanova.v1.TrackerIssue:
      type: object
      properties:
        externalId:
          type: string
          title: external_id
          description: eg. "ENG-123"
        title:
          type: string
          title: title
        description:
          type: string
          title: description
        branchName:
          type: string
          title: branch_name
          description: Suggested branch name from tracker
        url:
          type: string
          title: url
          description: Link to issue in tracker
        state:
          type: string
          title: state
          description: eg. "In Progress", "Todo"
        prNumber:
          type: integer
          title: pr_number
          format: int32
          description: Existing PR if found (0 = none)
        existingBranch:
          type: string
          title: existing_branch
          description: Existing branch if found
      title: TrackerIssue
      additionalProperties: false
      description: >-
        TrackerIssue represents an issue from an external tracker (Linear, Jira,
        etc.).
    bossanova.v1.TranscriptExistsRequest:
      type: object
      properties:
        workDir:
          type: string
          title: work_dir
        agentSessionId:
          type: string
          title: agent_session_id
      title: TranscriptExistsRequest
      additionalProperties: false
    bossanova.v1.TranscriptExistsResponse:
      type: object
      properties:
        exists:
          type: boolean
          title: exists
      title: TranscriptExistsResponse
      additionalProperties: false
    bossanova.v1.TransferCancel:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        reason:
          type: string
          title: reason
      title: TransferCancel
      additionalProperties: false
      description: >-
        TransferCancel is emitted by the source daemon (or by bosso to the
        source)
         when any step of the coordinated transfer fails. Clears the
         transferring_to marker so the session becomes visible on the source again.
    bossanova.v1.TransferConfirmed:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        targetDaemonId:
          type: string
          title: target_daemon_id
      title: TransferConfirmed
      additionalProperties: false
      description: |-
        TransferConfirmed is the payload sent by the target daemon on successful
         resume. Bosso uses this to tell the source daemon to DELETE its copy.
    bossanova.v1.TransferSessionCommand:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        sourceDaemonId:
          type: string
          title: source_daemon_id
        targetDaemonId:
          type: string
          title: target_daemon_id
      title: TransferSessionCommand
      additionalProperties: false
      description: >-
        TransferSessionCommand asks a daemon to take part in a coordinated
        transfer
         protocol (decision #14). Source daemon receives this first, pauses, emits a
         SessionDelta with transferring_to set. Target daemon then receives it,
         creates the session with transferring_from set, resumes, and replies with
         CommandResult{TransferConfirmed}.
    bossanova.v1.TransferSessionRequest:
      type: object
      properties:
        sessionId:
          type: string
          title: session_id
        sourceDaemonId:
          type: string
          title: source_daemon_id
          description: Daemon to transfer FROM.
        targetDaemonId:
          type: string
          title: target_daemon_id
          description: Daemon to transfer TO.
      title: TransferSessionRequest
      additionalProperties: false
    bossanova.v1.TransferSessionResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
        targetDaemonId:
          type: string
          title: target_daemon_id
      title: TransferSessionResponse
      additionalProperties: false
    bossanova.v1.UpdateAccountRequest:
      type: object
      properties:
        id:
          type: string
          title: id
        label:
          type:
            - string
            - 'null'
          title: label
        priority:
          type:
            - integer
            - 'null'
          title: priority
          format: int32
        status:
          type:
            - string
            - 'null'
          title: status
          description: '"active" | "disabled"'
        allowedModels:
          type: array
          items:
            type: string
          title: allowed_models
          description: replaces the set when present
      title: UpdateAccountRequest
      additionalProperties: false
    bossanova.v1.UpdateAccountResponse:
      type: object
      properties:
        account:
          title: account
          $ref: '#/components/schemas/bossanova.v1.Account'
      title: UpdateAccountResponse
      additionalProperties: false
    bossanova.v1.UpdateChatTitleRequest:
      type: object
      properties:
        agentSessionId:
          type: string
          title: agent_session_id
          description: Agent session UUID
        title:
          type: string
          title: title
      title: UpdateChatTitleRequest
      additionalProperties: false
    bossanova.v1.UpdateChatTitleResponse:
      type: object
      title: UpdateChatTitleResponse
      additionalProperties: false
    bossanova.v1.UpdateCronJobRequest:
      type: object
      properties:
        id:
          type: string
          title: id
        name:
          type:
            - string
            - 'null'
          title: name
        prompt:
          type:
            - string
            - 'null'
          title: prompt
        schedule:
          type:
            - string
            - 'null'
          title: schedule
        timezone:
          type:
            - string
            - 'null'
          title: timezone
        enabled:
          type:
            - boolean
            - 'null'
          title: enabled
        agentName:
          type:
            - string
            - 'null'
          title: agent_name
        model:
          type:
            - string
            - 'null'
          title: model
          description: opaque agent model id; "" = plugin default.
        gateCommand:
          type:
            - string
            - 'null'
          title: gate_command
          description: optional gate command; empty = no gate
        runSetupCommand:
          type:
            - boolean
            - 'null'
          title: run_setup_command
          description: run the repo setup script before the agent
      title: UpdateCronJobRequest
      additionalProperties: false
    bossanova.v1.UpdateCronJobResponse:
      type: object
      properties:
        cronJob:
          title: cron_job
          $ref: '#/components/schemas/bossanova.v1.CronJob'
      title: UpdateCronJobResponse
      additionalProperties: false
    bossanova.v1.UpdateRepoRequest:
      type: object
      properties:
        id:
          type: string
          title: id
        displayName:
          type:
            - string
            - 'null'
          title: display_name
        canAutoMerge:
          type:
            - boolean
            - 'null'
          title: can_auto_merge
        canAutoMergeDependabot:
          type:
            - boolean
            - 'null'
          title: can_auto_merge_dependabot
        mergeStrategy:
          type:
            - string
            - 'null'
          title: merge_strategy
        setupScript:
          type:
            - string
            - 'null'
          title: setup_script
        linearApiKey:
          type:
            - string
            - 'null'
          title: linear_api_key
        sentryApiKey:
          type:
            - string
            - 'null'
          title: sentry_api_key
        sentryOrg:
          type:
            - string
            - 'null'
          title: sentry_org
        canAutoRepair:
          type:
            - boolean
            - 'null'
          title: can_auto_repair
      title: UpdateRepoRequest
      additionalProperties: false
    bossanova.v1.UpdateRepoResponse:
      type: object
      properties:
        repo:
          title: repo
          $ref: '#/components/schemas/bossanova.v1.Repo'
      title: UpdateRepoResponse
      additionalProperties: false
    bossanova.v1.UpdateSessionRequest:
      type: object
      properties:
        id:
          type: string
          title: id
        title:
          type:
            - string
            - 'null'
          title: title
        trackerUrl:
          type:
            - string
            - 'null'
          title: tracker_url
          description: URL to issue in external tracker
        trackerId:
          type:
            - string
            - 'null'
          title: tracker_id
          description: external tracker identifier (e.g. BOS-123)
      title: UpdateSessionRequest
      additionalProperties: false
    bossanova.v1.UpdateSessionResponse:
      type: object
      properties:
        session:
          title: session
          $ref: '#/components/schemas/bossanova.v1.Session'
      title: UpdateSessionResponse
      additionalProperties: false
    bossanova.v1.UpdateTaskStatusRequest:
      type: object
      properties:
        externalId:
          type: string
          title: external_id
          description: The external ID of the task to update.
        status:
          title: status
          description: The new status to report.
          $ref: '#/components/schemas/bossanova.v1.TaskItemStatus'
        details:
          type: string
          title: details
          description: Optional details (eg. PR URL, error message).
      title: UpdateTaskStatusRequest
      additionalProperties: false
    bossanova.v1.UpdateTaskStatusResponse:
      type: object
      title: UpdateTaskStatusResponse
      additionalProperties: false
    bossanova.v1.UsageSnapshot:
      type: object
      properties:
        util5h:
          type: number
          title: util_5h
          format: double
          description: 0..1 fraction of the 5h window consumed
        util7d:
          type: number
          title: util_7d
          format: double
          description: 0..1 fraction of the 7d rolling window consumed
        reset5h:
          title: reset_5h
          description: when the 5h window resets (absent = unknown)
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        reset7d:
          title: reset_7d
          description: when the 7d window resets (absent = unknown)
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        status:
          type: string
          title: status
          description: rate-limit status string from RateLimitStatus
        planTier:
          type: string
          title: plan_tier
          description: detected plan tier (free-form; e.g. "max", "pro")
        fetchedAt:
          title: fetched_at
          description: when this snapshot was probed
          $ref: '#/components/schemas/google.protobuf.Timestamp'
      title: UsageSnapshot
      additionalProperties: false
      description: >-
        UsageSnapshot is a cached rate-limit usage reading for one account. It
        is
         derived from the BOS-293 probe result and carries METADATA ONLY:
         utilization fractions, reset instants, a status string, a plan-tier string,
         and the fetch time. It NEVER contains a token or any credential.
    bossanova.v1.UserSetting:
      type: object
      properties:
        key:
          type: string
          title: key
        label:
          type: string
          title: label
        description:
          type: string
          title: description
        type:
          title: type
          $ref: '#/components/schemas/bossanova.v1.UserSettingType'
        defaultValue:
          type: string
          title: default_value
        allowedValues:
          type: array
          items:
            type: string
          title: allowed_values
      title: UserSetting
      additionalProperties: false
    bossanova.v1.UserSettingType:
      type: string
      title: UserSettingType
      enum:
        - USER_SETTING_TYPE_UNSPECIFIED
        - USER_SETTING_TYPE_BOOL
        - USER_SETTING_TYPE_STRING
        - USER_SETTING_TYPE_ENUM
    bossanova.v1.VCSEvent:
      type: object
      oneOf:
        - type: object
          properties:
            checksFailed:
              title: checks_failed
              $ref: '#/components/schemas/bossanova.v1.ChecksFailedEvent'
          title: checks_failed
          required:
            - checksFailed
        - type: object
          properties:
            checksPassed:
              title: checks_passed
              $ref: '#/components/schemas/bossanova.v1.ChecksPassedEvent'
          title: checks_passed
          required:
            - checksPassed
        - type: object
          properties:
            conflictDetected:
              title: conflict_detected
              $ref: '#/components/schemas/bossanova.v1.ConflictDetectedEvent'
          title: conflict_detected
          required:
            - conflictDetected
        - type: object
          properties:
            prClosed:
              title: pr_closed
              $ref: '#/components/schemas/bossanova.v1.PRClosedEvent'
          title: pr_closed
          required:
            - prClosed
        - type: object
          properties:
            prMerged:
              title: pr_merged
              $ref: '#/components/schemas/bossanova.v1.PRMergedEvent'
          title: pr_merged
          required:
            - prMerged
        - type: object
          properties:
            reviewSubmitted:
              title: review_submitted
              $ref: '#/components/schemas/bossanova.v1.ReviewSubmittedEvent'
          title: review_submitted
          required:
            - reviewSubmitted
      title: VCSEvent
      additionalProperties: false
      description: VCSEvent wraps all possible VCS events in a oneof.
    bossanova.v1.ValidateRepoPathRequest:
      type: object
      properties:
        localPath:
          type: string
          title: local_path
      title: ValidateRepoPathRequest
      additionalProperties: false
    bossanova.v1.ValidateRepoPathResponse:
      type: object
      properties:
        isValid:
          type: boolean
          title: is_valid
          description: path exists, is dir, is git repo
        errorMessage:
          type: string
          title: error_message
          description: human-readable error if not valid
        originUrl:
          type: string
          title: origin_url
          description: detected origin remote URL
        isGithub:
          type: boolean
          title: is_github
          description: true if origin URL is github.com
        defaultBranch:
          type: string
          title: default_branch
          description: detected default branch (HEAD ref)
      title: ValidateRepoPathResponse
      additionalProperties: false
    bossanova.v1.WaitAgentRunHostRequest:
      type: object
      properties:
        agentSessionId:
          type: string
          title: agent_session_id
          description: Session ID returned from StartAgentRun (the agent's session ID).
      title: WaitAgentRunHostRequest
      additionalProperties: false
    bossanova.v1.WaitAgentRunHostResponse:
      type: object
      properties:
        exitError:
          type: string
          title: exit_error
          description: Empty on clean exit, otherwise the agent's exit error string.
      title: WaitAgentRunHostResponse
      additionalProperties: false
    bossanova.v1.WaitChatRunHostRequest:
      type: object
      properties:
        agentSessionId:
          type: string
          title: agent_session_id
          description: Agent session ID returned from StartChatRun.
        idleFailAfterSeconds:
          type: integer
          title: idle_fail_after_seconds
          format: int32
          description: |-
            When > 0, arm an idle watchdog: if the chat tracker reports the run
             continuously idle (or a repair-owned QUESTION stuck past its window, or
             STOPPED) for this many seconds, WaitChatRun fast-fails the run and tears
             the dead pane down instead of burning the full 30m deadline.
             0 = no watchdog (legacy 30m-deadline behavior).
      title: WaitChatRunHostRequest
      additionalProperties: false
    bossanova.v1.WaitChatRunHostResponse:
      type: object
      properties:
        exitError:
          type: string
          title: exit_error
          description: |-
            Empty on clean exit, otherwise the exit error from the hook payload
             or a synthetic message when the wait deadline elapsed.
        providerSessionId:
          type: string
          title: provider_session_id
          description: >-
            Provider-owned resume/session UUID, when the agent reports one.
            Empty means
             callers should resume using agent_session_id.
      title: WaitChatRunHostResponse
      additionalProperties: false
    bossanova.v1.WakeChatCommand:
      type: object
      properties:
        agentSessionId:
          type: string
          title: agent_session_id
          description: |-
            agent_session_id of the chat to wake. The chat must already exist
             (previously started via RecordChat).
        forceFresh:
          type: boolean
          title: force_fresh
          description: If true, skip --resume even if the transcript exists. Default false.
      title: WakeChatCommand
      additionalProperties: false
      description: |-
        WakeChatCommand asks the daemon to bring a chat's tmux+claude back to
         life. The daemon replies with CommandResult carrying a WakeChatResult
         payload. Idempotent under concurrent calls (per-chat singleflight on
         the daemon).
    bossanova.v1.WakeChatRequest:
      type: object
      properties:
        agentSessionId:
          type: string
          title: agent_session_id
          description: |-
            agent_session_id of the chat to wake. Chat must already exist
             (previously started via RecordChat).
        forceFresh:
          type: boolean
          title: force_fresh
          description: If true, skip --resume even if the transcript exists. Default false.
      title: WakeChatRequest
      additionalProperties: false
    bossanova.v1.WakeChatResponse:
      type: object
      properties:
        outcome:
          title: outcome
          $ref: '#/components/schemas/bossanova.v1.WakeChatResponse.Outcome'
        tmuxSessionName:
          type: string
          title: tmux_session_name
        reason:
          type: string
          title: reason
          description: >-
            Stable machine-readable reason when outcome is
            OUTCOME_FRESH_FALLBACK.
      title: WakeChatResponse
      additionalProperties: false
    bossanova.v1.WakeChatResponse.Outcome:
      type: string
      title: Outcome
      enum:
        - OUTCOME_UNSPECIFIED
        - OUTCOME_ALREADY_LIVE
        - OUTCOME_RESUMED
        - OUTCOME_FRESH_FALLBACK
    bossanova.v1.WakeChatResult:
      type: object
      properties:
        outcome:
          title: outcome
          $ref: '#/components/schemas/bossanova.v1.WakeChatResult.Outcome'
        tmuxSessionName:
          type: string
          title: tmux_session_name
        reason:
          type: string
          title: reason
          description: >-
            Stable machine-readable reason when outcome is
            OUTCOME_FRESH_FALLBACK.
      title: WakeChatResult
      additionalProperties: false
      description: |-
        WakeChatResult is the payload sent in a CommandResult for a successful
         WakeChatCommand. Mirrors the daemon's WakeChatResponse with a stream-
         scoped Outcome enum (kept separate from daemon.proto's enum to avoid a
         cross-package import here).
    bossanova.v1.WakeChatResult.Outcome:
      type: string
      title: Outcome
      enum:
        - OUTCOME_UNSPECIFIED
        - OUTCOME_ALREADY_LIVE
        - OUTCOME_RESUMED
        - OUTCOME_FRESH_FALLBACK
    bossanova.v1.WebhookAck:
      type: object
      properties:
        commandId:
          type: string
          title: command_id
        ok:
          type: boolean
          title: ok
        error:
          type: string
          title: error
          description: Populated when ok == false.
      title: WebhookAck
      additionalProperties: false
      description: >-
        WebhookAck is the daemon's acknowledgement that it received (and
        dispatched
         or rejected) a forwarded webhook. command_id correlates to the
         OrchestratorCommand.command_id that carried the WebhookEvent.
    bossanova.v1.WebhookConfig:
      type: object
      properties:
        id:
          type: string
          title: id
        repoOriginUrl:
          type: string
          title: repo_origin_url
          description: >-
            The repository origin URL this webhook is for (e.g.
            "https://github.com/owner/repo").
        provider:
          type: string
          title: provider
          description: 'VCS provider type: "github", "gitlab", etc.'
        secret:
          type: string
          title: secret
          description: HMAC secret for signature verification.
        createdAt:
          title: created_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
      title: WebhookConfig
      additionalProperties: false
    bossanova.v1.WebhookEvent:
      type: object
      properties:
        repoOriginUrl:
          type: string
          title: repo_origin_url
          description: >-
            Origin URL of the repo the webhook fired on (e.g.
            "https://github.com/owner/repo").
        provider:
          type: string
          title: provider
          description: 'VCS provider: "github", "gitlab", etc.'
        eventType:
          type: string
          title: event_type
          description: Event type, e.g. "pull_request", "push".
        payload:
          type: string
          title: payload
          format: byte
          description: Raw webhook body. Already HMAC-verified by bosso.
        headers:
          type: object
          title: headers
          additionalProperties:
            type: string
            title: value
          description: >-
            Selected headers for replay context (e.g. X-GitHub-Delivery,
            X-GitHub-Event).
        pullRequest:
          type: integer
          title: pull_request
          format: int32
          description: >-
            Parsed by bosso for routing only. Zero means unknown or not
            PR-scoped.
        installationId:
          type:
            - integer
            - string
          title: installation_id
          format: int64
          description: GitHub App installation ID. Zero for legacy/manual webhooks.
      title: WebhookEvent
      additionalProperties: false
      description: |-
        WebhookEvent is the payload of an OrchestratorCommand that forwards a
         provider webhook (GitHub, GitLab, ...) to a daemon. Bosso has already
         HMAC-verified the payload and selected the target daemons from the
         repo_id → daemon_id index.
    bossanova.v1.WebhookEvent.HeadersEntry:
      type: object
      properties:
        key:
          type: string
          title: key
        value:
          type: string
          title: value
      title: HeadersEntry
      additionalProperties: false
    bossanova.v1.WorkflowServiceGetInfoRequest:
      type: object
      title: WorkflowServiceGetInfoRequest
      additionalProperties: false
    bossanova.v1.WorkflowServiceGetInfoResponse:
      type: object
      properties:
        info:
          title: info
          $ref: '#/components/schemas/bossanova.v1.PluginInfo'
      title: WorkflowServiceGetInfoResponse
      additionalProperties: false
    bossanova.v1.WorkflowStatus:
      type: string
      title: WorkflowStatus
      enum:
        - WORKFLOW_STATUS_UNSPECIFIED
        - WORKFLOW_STATUS_PENDING
        - WORKFLOW_STATUS_RUNNING
        - WORKFLOW_STATUS_PAUSED
        - WORKFLOW_STATUS_COMPLETED
        - WORKFLOW_STATUS_FAILED
        - WORKFLOW_STATUS_CANCELLED
      description: WorkflowStatus represents the lifecycle state of an autopilot workflow.
    bossanova.v1.WorkflowStatusInfo:
      type: object
      properties:
        id:
          type: string
          title: id
        status:
          title: status
          $ref: '#/components/schemas/bossanova.v1.WorkflowStatus'
        currentStep:
          title: current_step
          $ref: '#/components/schemas/bossanova.v1.WorkflowStep'
        flightLeg:
          type: integer
          title: flight_leg
          format: int32
        lastError:
          type: string
          title: last_error
        startedAt:
          title: started_at
          $ref: '#/components/schemas/google.protobuf.Timestamp'
      title: WorkflowStatusInfo
      additionalProperties: false
      description: WorkflowStatusInfo is the status snapshot returned by the plugin.
    bossanova.v1.WorkflowStep:
      type: string
      title: WorkflowStep
      enum:
        - WORKFLOW_STEP_UNSPECIFIED
        - WORKFLOW_STEP_PLAN
        - WORKFLOW_STEP_IMPLEMENT
        - WORKFLOW_STEP_HANDOFF
        - WORKFLOW_STEP_RESUME
        - WORKFLOW_STEP_VERIFY
        - WORKFLOW_STEP_LAND
      description: >-
        WorkflowStep represents the current step in the autopilot skill
        sequence.
    connect-protocol-version:
      type: number
      title: Connect-Protocol-Version
      enum:
        - 1
      description: Define the version of the Connect protocol
      const: 1
    connect-timeout-header:
      type: number
      title: Connect-Timeout-Ms
      description: Define the timeout, in ms
    connect.error:
      type: object
      properties:
        code:
          type: string
          examples:
            - not_found
          enum:
            - canceled
            - unknown
            - invalid_argument
            - deadline_exceeded
            - not_found
            - already_exists
            - permission_denied
            - resource_exhausted
            - failed_precondition
            - aborted
            - out_of_range
            - unimplemented
            - internal
            - unavailable
            - data_loss
            - unauthenticated
          description: >-
            The status code, which should be an enum value of
            [google.rpc.Code][google.rpc.Code].
        message:
          type: string
          description: >-
            A developer-facing error message, which should be in English. Any
            user-facing error message should be localized and sent in the
            [google.rpc.Status.details][google.rpc.Status.details] field, or
            localized by the client.
        details:
          type: array
          items:
            $ref: '#/components/schemas/connect.error_details.Any'
          description: >-
            A list of messages that carry the error details. There is no limit
            on the number of messages.
      title: Connect Error
      additionalProperties: true
      description: >-
        Error type returned by Connect:
        https://connectrpc.com/docs/go/errors/#http-representation
    connect.error_details.Any:
      type: object
      properties:
        type:
          type: string
          description: >-
            A URL that acts as a globally unique identifier for the type of the
            serialized message. For example:
            `type.googleapis.com/google.rpc.ErrorInfo`. This is used to
            determine the schema of the data in the `value` field and is the
            discriminator for the `debug` field.
        value:
          type: string
          format: binary
          description: >-
            The Protobuf message, serialized as bytes and base64-encoded. The
            specific message type is identified by the `type` field.
        debug:
          oneOf:
            - type: object
              title: Any
              additionalProperties: true
              description: Detailed error information.
          discriminator:
            propertyName: type
          title: Debug
          description: >-
            Deserialized error detail payload. The 'type' field indicates the
            schema. This field is for easier debugging and should not be relied
            upon for application logic.
      additionalProperties: true
      description: >-
        Contains an arbitrary serialized message along with a @type that
        describes the type of the serialized message, with an additional debug
        field for ConnectRPC error details.
    google.protobuf.Timestamp:
      type: string
      examples:
        - '2023-01-15T01:30:15.01Z'
        - '2024-12-25T12:00:00Z'
      format: date-time
      description: >-
        A Timestamp represents a point in time independent of any time zone or
        local
         calendar, encoded as a count of seconds and fractions of seconds at
         nanosecond resolution. The count is relative to an epoch at UTC midnight on
         January 1, 1970, in the proleptic Gregorian calendar which extends the
         Gregorian calendar backwards to year one.

         All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
         second table is needed for interpretation, using a [24-hour linear
         smear](https://developers.google.com/time/smear).

         The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
         restricting to that range, we ensure that we can convert to and from [RFC
         3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.

         # Examples

         Example 1: Compute Timestamp from POSIX `time()`.

             Timestamp timestamp;
             timestamp.set_seconds(time(NULL));
             timestamp.set_nanos(0);

         Example 2: Compute Timestamp from POSIX `gettimeofday()`.

             struct timeval tv;
             gettimeofday(&tv, NULL);

             Timestamp timestamp;
             timestamp.set_seconds(tv.tv_sec);
             timestamp.set_nanos(tv.tv_usec * 1000);

         Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.

             FILETIME ft;
             GetSystemTimeAsFileTime(&ft);
             UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;

             // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
             // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
             Timestamp timestamp;
             timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
             timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));

         Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.

             long millis = System.currentTimeMillis();

             Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
                 .setNanos((int) ((millis % 1000) * 1000000)).build();

         Example 5: Compute Timestamp from Java `Instant.now()`.

             Instant now = Instant.now();

             Timestamp timestamp =
                 Timestamp.newBuilder().setSeconds(now.getEpochSecond())
                     .setNanos(now.getNano()).build();

         Example 6: Compute Timestamp from current time in Python.

             timestamp = Timestamp()
             timestamp.GetCurrentTime()

         # JSON Mapping

         In JSON format, the Timestamp type is encoded as a string in the
         [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
         format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
         where {year} is always expressed using four digits while {month}, {day},
         {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
         seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
         are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
         is required. A proto3 JSON serializer should always use UTC (as indicated by
         "Z") when printing the Timestamp type and a proto3 JSON parser should be
         able to accept both UTC and other timezones (as indicated by an offset).

         For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
         01:30 UTC on January 15, 2017.

         In JavaScript, one can convert a Date object to this format using the
         standard
         [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
         method. In Python, a standard `datetime.datetime` object can be converted
         to this format using
         [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with
         the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
         the Joda Time's [`ISODateTimeFormat.dateTime()`](
         http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()
         ) to obtain a formatter capable of generating timestamps in this format.
security: []
tags:
  - name: bossanova.v1.OrchestratorService
    description: |-
      OrchestratorService is the cloud-hosted service that coordinates multiple
       daemons, provides remote CLI access, and handles webhook routing.
