> ## Documentation Index
> Fetch the complete documentation index at: https://test-8ad8522e-feat-api-review-auto-fix.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Apps

> Apps 是 AI SRE 中管理「已授权的外部应用」的地方，每个应用以一张卡片呈现，目前是 GitHub 与 GitLab。授权后，AI SRE 能在会话里直接进入你的代码仓库：读代码、调查变更 / 提交 / PR（或 MR）、追溯 PR / MR，并在你需要时改缺陷、开 PR / MR、提 issue。它主要让云端沙箱也能安全地访问你的仓库。

<Info>
  **内测功能**：AI SRE 目前处于内测阶段，专业版及以上用户可申请免费试用。请通过 [AI SRE 内测申请表](https://c9xudyniiq.feishu.cn/share/base/form/shrcn0ngCfdoygiaHnAT80BfZiH) 提交申请，审核通过后将开通白名单；内测期间功能与界面可能调整。
</Info>

## 概述

***

**Apps** 是管理「已授权的外部应用」的地方。每个外部应用以一张**应用卡片**呈现——你在它的卡片上完成授权、管理安装、并随时启停或撤销。

Apps 下目前有 **GitHub** 与 **GitLab** 两个应用，覆盖最常见的代码托管平台。授权其中之一后，AI SRE 就能在会话里**直接进入你的代码仓库工作**：读懂并探索代码、调查最近的变更 / 提交 / PR（GitLab 里是 MR）、从一张变更工单追溯到对应 PR / MR、回答关于代码库的问题，并在你需要时改一处缺陷、开一个 PR / MR 或提一个 issue——全程用原生 `gh` / `glab` / `git`，就像一名工程师在终端里干活。

## 主要场景：让云端沙箱访问你的仓库

***

AI SRE 的会话默认运行在 **Flashduty 云端沙箱**里。沙箱是干净、隔离的临时环境，**不带你的任何 git 登录凭证**——这正是 App 要解决的问题。授权 GitHub App 或 GitLab App 后，沙箱里的 Agent 才能 clone 你的仓库、读 diff、开 PR / MR，而**你无需向它交出任何密码或 token**；它的访问被限制在你授权的那些仓库，且仅为完成任务所需的最小权限。**这是这两个 App 的主要用途。**

<Note>
  **BYOC（自托管 Runner）一般用不到它。** Runner 跑在你自己的机器上，那台机器通常**已经配好了 `gh` / `glab` / `git` 凭证**（你平时就在上面操作仓库）。这种情况下 Agent 直接用宿主机自带的凭证即可，**不需要再授权对应的 App**。（若宿主机恰好没配相应凭证，授权 App 同样能让 BYOC 会话用上。）运行环境的差异见 [运行环境（BYOC）](/zh/ai-sre/environments)。
</Note>

## 位置

***

进入 **插件 → Apps**。Apps 是插件区的**第一个、也是默认**标签页——打开插件区即落在这里。

<Note>
  查看 Apps 标签页需要相应权限；没有权限时该标签页不可见。授权、断开 / 撤销、启用 / 禁用各自还需对应的操作权限——无权限时对应按钮以禁用态显示。
</Note>

## GitHub 应用

***

下面先以 **GitHub** 为例，介绍授权、安装管理与仓库授权的调整；**GitLab** 的流程见下一节。

### 连接 GitHub 组织

在 GitHub 卡片上发起授权，整个安装在一个弹窗里、通过 GitHub 官方的安装页完成，回调后列表自动刷新。

<Steps>
  <Step title="发起授权">
    在 GitHub 卡片上点击 **去授权**（如果该 App 已有安装，按钮显示为 **更多仓库**，带一个 + 号图标）。前端随即打开一个弹窗，加载 GitHub 官方的安装页。
  </Step>

  <Step title="在 GitHub 上选择组织与仓库">
    选择要安装到的**组织**（或个人账户），并授予仓库范围——**所有仓库（All repositories）**或**仅选定仓库（Only select repositories）**。授予的仓库集合决定了 AI SRE 之后能访问哪些仓库。
  </Step>

  <Step title="确认后自动刷新">
    你在 GitHub 上确认后，弹窗自动关闭，Apps 页提示 **授权成功** 并刷新安装列表，新组织随即出现。
  </Step>
</Steps>

<Note>
  若你不是该组织的所有者，GitHub 会把请求转交给组织所有者走「请求安装」的审批流程；审批通过后该安装才会激活。安装到哪个组织、授予哪些仓库，完全由 GitHub 侧的安装页决定，Flashduty 不在中间代为选择。
</Note>

### 安装管理

每授权一个组织，就在 GitHub 卡片下多出一行安装记录。每行展示：

| 元素  | 说明                                   |
| --- | ------------------------------------ |
| 组织名 | 安装所在的 GitHub 组织 / 账户登录名              |
| 状态点 | 一个彩色小圆点 + 文案：**已连接**、**已暂停**、**已撤销** |
| 仓库数 | 该安装当前授予的仓库数量                         |

<AccordionGroup>
  <Accordion title="启用 / 禁用（暂停 / 恢复）" icon="toggle-on">
    卡片右上角的开关在「启用」与「禁用」之间切换。**禁用 = 暂停**：暂停后 Agent 无法再访问这些仓库，但 **GitHub 上的安装本身保留**，可随时一键重新启用、无需再走一遍 GitHub 授权。一个 App 只要还有至少一个**已连接**的安装，就视为「已启用」。
  </Accordion>

  <Accordion title="撤销" icon="trash">
    在某一行点击 **撤销**，确认后该安装置为 **已撤销**，AI SRE 从此不再能访问该组织的仓库。撤销后该安装从卡片上隐去，重新授权同一组织即可恢复。
  </Accordion>
</AccordionGroup>

<Note>
  **暂停**与**撤销**的区别：暂停是临时关掉、保留 GitHub 安装、可一键恢复；撤销是断开这次授权、需要重新走 GitHub 授权才能再用。
</Note>

### 新增或调整仓库授权

某个组织已经连接好了，但你想让 AI SRE 访问该组织里更多的仓库——不必撤销重连。在 **插件 → Apps** 里，对该组织再次点击 **更多仓库**（或直接打开该 App 在 GitHub 上的 **Configure** 页），GitHub 会展示 **Repository access** 选择界面；勾选你要新增的仓库并保存，AI SRE 会**自动重新同步**已授予的仓库列表，新仓库无需重建连接就能用。

<Note>
  **兜底**：如果新加的仓库在会话里仍报「无法访问 / 404 / 403」，到 GitHub 上打开该 App 的页面（如 `github.com/apps/flashduty`）→ **Configure** → 选中对应组织 → 拉到底部的 **Danger zone** → **Uninstall** 卸载该安装。然后回到 Flashduty 的 **插件 → Apps** 重新授权该组织，并在这一次里一并勾选你需要的**全部**仓库。
</Note>

## GitLab 应用

***

**GitLab** 应用连接一个 GitLab 实例——不管是 **GitLab.com**、**极狐 GitLab**（jihulab.com SaaS 或私有化发行版），还是你自己的其他**自建（Self-managed）**实例，连接方式都**完全一样**：先在该实例上注册一个 OAuth 应用，再完成授权。授权之后，AI SRE 就能在授权范围内的仓库里读代码、调查变更 / MR、并在你需要时提 issue、开 MR。和 GitHub 一样，**你不需要粘贴任何个人令牌**：Flashduty 通过 OAuth 拿到授权后，会为你的账户配置一个专属的机器人身份来完成实际访问。

### 连接 GitLab 实例

<Steps>
  <Step title="选择要连接的 GitLab 实例">
    在 GitLab 卡片上点击 **Connect**，三选一：

    * **GitLab.com**——地址固定为 `https://gitlab.com`，无需填写；
    * **极狐 GitLab**——地址固定为 `https://jihulab.com`，无需填写；
    * **自建实例 / Self-managed**——需要填写实例的根地址：浏览器地址栏里群组 / 项目路径**之前**的那部分，例如 `https://gitlab.example.com`；如果实例部署在子路径下，要带上子路径，例如 `https://example.com/gitlab`。
  </Step>

  <Step title="选择连接环境">
    连接和重新授权 GitLab 时的网络请求会从这里选择的环境发出。GitLab.com、极狐 GitLab 等公网实例可使用默认云端环境；只有内网可访问的自建实例，请选择能够访问它的 BYOC Runner。系统不会在 Runner 离线或不可达时自动切换环境，请选择可用环境后重新发起连接或授权。
  </Step>

  <Step title="在该实例上注册一个 OAuth 应用">
    连接向导会展示一个**可复制的 Redirect URI**。带着它去你填写的 GitLab 实例创建一个 OAuth 应用：group **Owner** 在 **Group Settings → Applications** 创建一个归属分组的应用；在 **GitLab.com** 上，如果你不是任何分组的 Owner，也可以在 **User Settings → Applications** 创建一个归属你个人账户的应用；实例管理员也可以在 **Admin Area → Applications** 创建。填入向导给出的 Redirect URI，勾选 **Confidential**，Scopes 只勾 **api**。创建后 GitLab 会给出一个 **Application ID** 和一个 **Secret**，回到连接向导粘贴这两项。

    <Tip>这一步对**每一个** GitLab 实例都一样——GitLab.com、极狐 GitLab（jihulab.com SaaS 及其私有化发行版）、或任何其他自建实例：地址不同，注册 OAuth 应用、粘贴 Application ID / Secret 的步骤完全相同。</Tip>
  </Step>

  <Step title="在弹出的窗口中完成 GitLab 授权">
    这一步会显示这次要用哪个实例的哪个 OAuth 应用来授权；如果想换一个应用，点击 **更换 OAuth 应用** 回到上一步重新注册。确认无误后，向导打开一个弹窗，跳转到 GitLab 的官方授权页；用你的 GitLab 账户登录并确认授权。授权完成后弹窗自动关闭，向导进入下一步。
  </Step>

  <Step title="选择要授权的分组与项目">
    AI SRE 展示一个仓库选择器，列出**你拥有 Owner 角色的分组**和**你拥有 Maintainer 角色的项目**。勾选想让 AI SRE 访问的分组 / 项目并保存——勾选一个分组即覆盖其下的所有项目，包括之后新建的项目。
  </Step>
</Steps>

<Note>
  一个账户同一时间只能连接**一个** GitLab 实例（GitLab.com 或某一个自建实例）。要换成另一个实例，需要先断开当前这个。
</Note>

### 机器人身份与权限

保存仓库选择后，Flashduty 会在这些分组 / 项目下为账户配置一个专属机器人（优先使用服务账号；实例不支持服务账号时，回退为分组 / 项目级的访问令牌），供 AI SRE 会话使用。无论哪种方式，机器人的权限都被限制在 **Developer** 级别，和你在 GitLab 里能授予的最小权限一致。令牌会在到期前**自动轮换**，无需你手动处理。

如果这个 GitLab 实例不支持服务账号，机器人会回退为分组 / 项目级令牌——这类令牌本身只能绑定单个分组或项目，因此仓库选择器会限制为最多选择**一个**分组或一个项目。若你在多选状态下勾选了多个分组 / 项目并保存，Flashduty 会提示「该 GitLab 实例不支持服务账号，请仅选择一个分组或一个项目后重试」，并把选择器切换为**单选模式**：之后再勾选新的分组或项目会自动清空其余已选项，需要重新只保留一个分组或一个项目后再次保存。

<Warning>
  **GitLab.com 上的一条限制**：GitLab 官方规定，分组 / 项目级访问令牌只在**付费（非免费、非试用）命名空间**上可用。连接 GitLab.com 本身不受影响，但如果你要授权的分组 / 项目所在命名空间是免费版或试用版，机器人配置会失败，界面上会展示一条来自 GitLab 的说明（"provisioning\_denied"）。把对应命名空间升级到付费版后重新授权即可。
</Warning>

### 管理已连接的实例

GitLab 卡片下会显示当前连接的实例地址与状态。

<AccordionGroup>
  <Accordion title="Manage repos（管理仓库）" icon="list-check">
    重新打开仓库选择器，勾选新增的分组 / 项目，或取消勾选不再需要的——保存后 AI SRE 的访问范围随即更新。
  </Accordion>

  <Accordion title="Disconnect（断开连接）" icon="trash">
    断开这次连接。Flashduty 会尽力清理为这个账户配置的机器人身份及其名下的令牌；如果某一步清理没有成功，界面会给出提示。断开后该实例的所有访问随即失效，重新连接需要再走一遍 OAuth 授权。
  </Accordion>
</AccordionGroup>

## AI SRE 如何在仓库里工作

***

授权之后你无需任何额外配置。当你在会话里让 AI SRE 处理某个仓库的任务时，它会像一名加入项目的工程师那样工作——先理解，再动手，最后验证。这套行为分别由内置的 `github` Skill 与 `gitlab` Skill 约束。

**典型动作**

* **进入仓库**：把仓库 clone 进自己的工作区，并优先阅读仓库自带的约定（`CLAUDE.md`、`AGENTS.md`、`README`、`CONTRIBUTING`）。
* **调查变更 / PR / MR**：用 `git log`，以及 GitHub 上的 `gh pr list` / `gh pr view` / `gh pr diff` / `gh search prs`，或 GitLab 上等效的 `glab mr list` / `glab mr view` / `glab mr diff`，追溯故障 / 变更工单里提到的 PR / MR、看某次发布包含了什么、在决策前读懂一段 diff。
* **改动并提交**：新建分支、用最小的 diff 改动，用 `gh pr create` 或 `glab mr create` 开一个可评审的 PR / MR，或用 `gh issue create` / `glab issue create` 提一个 issue，并把链接回报给你。

**硬性护栏**——这些规则 Agent 绝不逾越：

* **绝不强推**（`git push --force`），**绝不直接推默认分支**——一律走「分支 + PR / MR」。
* **一个 PR / MR 只装一处逻辑变更**，保持可评审；改动一旦膨胀超出聚焦的 diff，就停下把分析交回给你。
* 绝不删分支、关闭他人的 issue / PR / MR，或改动仓库设置；绝不提交密钥、凭证或构建产物。

<Note>
  如果在云会话里 Agent 报告无法访问仓库，通常是账户尚未授权对应的 App（GitHub 或 GitLab）、或没有把目标仓库 / 分组纳入授权范围——到 **插件 → Apps** 补充授权即可。Agent **不会**向你索要任何令牌。
</Note>

## 权限与范围

***

GitHub App 与 GitLab App 的**授权**与**撤销 / 断开**都是**账户级**操作。**账户是唯一的安全边界**，团队在这里只是归属 / 审计标记：账户内任何具备相应权限的成员都可以完成授权、撤销 / 断开、或启停整个 App；会话在用到某仓库时，也从账户内当前有效的安装取得访问凭证。账户内的成员共享同一套授权——这与 AI SRE 其它资源「使用 = 账户级、归属 = 团队标记」的模型一致。

两者的范围模型略有差别：**GitHub App** 允许同一账户安装多个组织，各自独立启停 / 撤销；**GitLab App** 每个账户**同一时间只能连接一个** GitLab 实例——要切换到另一个实例，需要先断开当前这个。

## 相关页面

***

<CardGroup cols={2}>
  <Card title="MCP（外部工具）" icon="plug" href="/zh/ai-sre/mcp">
    通过 Model Context Protocol 接入外部工具与数据源。
  </Card>

  <Card title="控制台" icon="comments" href="/zh/ai-sre/sessions">
    在会话中观察 Agent 如何 clone 仓库、读 diff、开 PR / MR。
  </Card>

  <Card title="运行环境（BYOC）" icon="server" href="/zh/ai-sre/environments">
    BYOC 会话用 Runner 宿主机自带的凭证，一般不需要 GitHub / GitLab App。
  </Card>

  <Card title="Skill" icon="wrench" href="/zh/ai-sre/skills">
    内置的 github / gitlab Skill 约束 Agent 在仓库里的工作方式。
  </Card>
</CardGroup>
