# @arbidocs/react 中文文档

规范地址：https://npmcn.com/package/%40arbidocs/react/

版本：0\.5\.133
npm 元数据更新时间：2026-11-06T20:06:25.818Z
中文译文更新时间：2026-11-06T13:47:18.942Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40arbidocs/react
原文对照：https://npmcn.com/package/%40arbidocs/react/?lang=original
项目主页：https://github.com/arbicity/ARBI-frontend#readme
源码仓库：https://github.com/arbicity/ARBI-frontend

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：12.4 MB，1035 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- 运行依赖：51 个
- peer 依赖：xlsx \*，react \>=18，pdf-lib ^1\.17\.1，react-dom \>=18，react-pdf ^11\.0\.0，pdfjs-dist ^6\.0\.0，docx-preview ^0\.3\.0
- 首次发布：2026-02-11T12:28:49.539Z
- 最新版本发布：2026-11-06T20:06:25.610Z
- 近 30 天下载量：50995（2026-10-07 至 2026-11-05，npm 官方下载统计）
- 已发布版本数：487（近 12 个月 487 个）

## 中文简介

ARBI SDK 的反应钩和提供者

## 安装

```sh
npm install @arbidocs/react
```

也可以使用：`pnpm add @arbidocs/react`、`yarn add @arbidocs/react`、`bun add @arbidocs/react`

## README

# @ arbidocs/ 反应

用于构建ARBI动力应用软件的反钩和提供商. 包括 `@arbidocs/sdk` 财务报告和审定财务报表 `@tanstack/react-query` -一个装置就能让你得到一切.

## 快速启动

```bash
npm install @arbidocs/react
```

### 1\. 设立东道机构

```tsx
import { QueryClientProvider } from '@tanstack/react-query'
import { ArbiHost, createArbiQueryClient } from '@arbidocs/react'
import { Arbi } from '@arbidocs/sdk/browser'

const { queryClient } = createArbiQueryClient()
const arbi = new Arbi({ url: 'https://www.arbidocs.com' })

function App() {
  return (
    <QueryClientProvider client={queryClient}>
      <ArbiHost config={{ arbi }}>
        <Chat />
      </ArbiHost>
    </QueryClientProvider>
  )
}
```

`<ArbiHost config>` 是主机将配置交给钩子的地方: `arbi`,以及 可选择 `session`, (中文(简体) ), `documents`, (中文(简体) ), `calendar`, (中文(简体) ), `mail`, (中文(简体) ), `account` 财务报告和审定财务报表 `dictate` (每个加一个) 默认). `@arbidocs/blocks` 与块域一起再导出; 块址使用该块域 (见其研究).

`assistantName` 人们在聊天时称助理为: `@<name>` 在引用菜单中,一个共享线程的草稿开始,一个消息的名称被路由到 助理人员`useAssistantName()`) (中文(简体) ). 它默认为"ARBI". 以另一个名称键入 `@ARBI` 仍可联系助理(`assistantLabels`),并提及以更早的名字存储 仍然显示为筹码.

### 2\. 建立流畅的聊天

```tsx
import { useState, useRef } from 'react'
import { useArbi, useDocuments, useAssistantQuery } from '@arbidocs/react'

function Chat() {
  const arbi = useArbi()
  const [workspaceId, setWorkspaceId] = useState<string>()

  if (!workspaceId) {
    return (
      <button
        onClick={async () => {
          await arbi.login('user@example.com', 'password')
          const ws = await arbi.workspaces.list()
          await arbi.selectWorkspace(ws[0].external_id)
          setWorkspaceId(ws[0].external_id)
        }}
      >
        Connect
      </button>
    )
  }

  return <ChatWindow workspaceId={workspaceId} />
}

function ChatWindow({ workspaceId }: { workspaceId: string }) {
  const { data: docs } = useDocuments(workspaceId)
  const mutation = useAssistantQuery()
  const [input, setInput] = useState('')
  const [response, setResponse] = useState('')
  const lastId = useRef<string | null>(null)

  return (
    <div>
      <div>{response}</div>
      <form
        onSubmit={(e) => {
          e.preventDefault()
          setResponse('')
          mutation.mutate({
            question: input,
            docIds: docs?.map((d) => d.external_id) ?? [],
            previousResponseId: lastId.current,
            onToken: (t) => setResponse((r) => r + t),
            onStreamStart: ({ assistant_message_ext_id }) => {
              lastId.current = assistant_message_ext_id
            },
          })
          setInput('')
        }}
      >
        <input value={input} onChange={(e) => setInput(e.target.value)} />
        <button type="submit" disabled={mutation.isPending}>
          Send
        </button>
      </form>
    </div>
  )
}
```

就是这样——三个钩子,你有一个流畅的RAG聊天.

## 钩子

| 钩子 | 回返 | 自动启用时 |
| --- | --- | --- |
| `useArbi()` | `Arbi` 实例 | 永远 |
| `useWorkspaces()` | 用户的工作空间 | 登录 |
| `useCurrentWorkspace()` | 选定的工作空间( E)`workspaceId`, (中文(简体) ), `workspaceStatus`,其列表条目)和我 `role` 编号 : `isMember` 在其中( e) | 登录 |
| `useActiveConfigId()` | 配置新工作与( 所选的, 否则是回复信件的, 否则是最后一个) | 永远 |
| `useShellWorkspaces(options)` | 同样,在一个列表和 `select` 提供(不需要供应商) | 永远 |
| `useDocuments(workspaceId)` | 工作空间文件 | 选择工作空间 |
| `useConversations(workspaceId)` | 工作空间对话 | 选择工作空间 |
| `useTags(workspaceId)` | 工作空间标签 | 选择工作空间 |
| `useTags(workspaceId, { kind, parentId, ids, include: ['links'], linksLimit })` | 标记已过滤, 包含每个人的文档、 事实和线索( 表格行) | 选择工作空间 |
| `useTagKindSchema(kind)` 编号 : `useUpdateTagKindSchema()` | 工作空间中的一类字段( 表列); 设置 | 选择工作空间 |
| `useSetTagValues()` | 将标记的值合并到同类字段 | 打电话 `.mutate()` |
| `useFactsSearch({ workspaceId })` | 事实 Smart Search: 查询框,上次搜索的点击(hybrid), `search()` 财务报告和审定财务报表 `clear()`,为本届会议保留 `FACTS_SEARCH_VIEW` | 选择工作空间 |
| `useAssistantQuery()` | 流变 | 打电话 `.mutate()` |
| `useHealth()` | 后端状态 | 过 `{ enabled: true }` |
| `useProfile()` 编号 : `useUpdateProfile()` | 用户名称、图片和电子邮件; 保存名称或图片 | 登录 |
| `useRequestEmailChange()` 编号 : `useConfirmEmailChange()` | 通过校验码进行电子邮件更改 | 打电话 `.mutate()` |
| `usePasswordChange()` | 更改主密码( 一个请求: 密码只包入账户密钥) | 打电话 `.mutate()` |
| `useNotificationPreferences(keys)` | 电子邮件通知开关, 乐观保存 | 登录 |
| `useSessions()` 编号 : `useTerminateSession()` 编号 : `useLogoutAllSessions()` | 活跃的会话,一端,在任何地方签名 | 登录 |
| `useDeleteAccount()` | 关闭账户( 软删除) | 打电话 `.mutate()` |
| `useModelConnections()` 编号 : `useDirectModelUsage()` | 主代理的模型连接(box and personal)和过去30天的直接通话 | 登录 |
| `useSaveModelConnection()` 编号 : `useRemoveModelConnection()` 编号 : `useUnlockModelConnections()` | 保存个人连接( 其密钥被封入身份后, 在此会话上解锁) , 删除一个, 解锁个人密钥 | 打电话 `.mutate()` |
| `useFeature(name)` 编号 : `useFeatureSwitch(name)` | 用户是否打开一个功能( T)`<ArbiHost config={{ features }}>`; 未列出:在),以及如何切换 | 永远 |

账户钩子对没有主机的SDK无控制器 `arbi` (单位:千美元)`useNameEditor`, (中文(简体) ), `useEmailChange`, (中文(简体) ), `usePasswordChangeForm`, (中文(简体) ), `useDeleteAccountFlow`, (中文(简体) ), `useAvatarCrop`, (中文(简体) ), `toNotificationPreferences`:他们拥有表态,并将保存作为函数. 块 `/connect` 条目将批量编成设置页面(见设置页面配方 `docs/design/blocks-package.md`) (中文(简体) ).

**特征.** 主机列出用户可以切换的产品部分,以及每个切换器在哪里 保存 : 用户设置的布尔字段( 跟着用户) 或此设备 (单位:千美元)`createLocalFeatureStore({ key, migrate })`,同步读取 `localStorage`· ; `migrate` 将一个早期的建筑的值带入一次). `useFeature(name)` 任意读取; 主机特性 因此,没有列出任何内容的网站.

```tsx
const device = createLocalFeatureStore({ key: 'my-site-features' })
<ArbiHost config={{ features: {
  skills: { userSetting: 'show_skills', default: false },
  calls: { local: device, default: false },
} }}>
```

**选中的工作空间 .** 会议 `workspaceId` 财务报告和审定财务报表 `workspaceStatus` 住在工作区 存储; `useSwitchWorkspace` 移动它们 `useOpenSelectedWorkspace` 选择后重新打开 重装 给每分页保存的会话一个, 重新装入保留在工作区 (单位:千美元)`createArbiSessionStore({}, { workspace: createArbiWorkspaceStore({ storage: browserWorkspaceStorage() }) })`(三); `reset()` 签到后,下一个人开始 工作空间列表. `readWorkspaceLastOpened()` 命令“最近的工作空间”列表.

**线索分页.** 公开对话是布局的 `tabs.threads` (按打开的顺序,于 多数 `MAX_THREAD_TABS`),与 `tabs.activeThread` 屏幕上的那个`threadTabId`它的对话, 或者说 `new`) (中文(简体) ). 每个标签都保留它留给的作曲家(`ArbiThreadTabView`:它的行,编辑,模型 和卷轴位置,它的草稿是聊天的,每对话一次) `selectThreadTab` 把它带回来 财务报告和审定财务报表 `openThreadTab` 打开最新消息的线索。 他们被保存在交叉 重装与 版式为 `persist`从来没有用什么打字.

**说吧.** 公开对话及其作曲家 每次对话的转折 上下文文档和事实,以及代理栏的队列和运行控制在聊天店中直播 (单位:千美元)`createArbiChatStore({ layout, persist, draftStorage })`),它随布局线条标签移动 并告诉读者每个标签更改一次。 与一个 `persist` (单位:千美元)`createStoragePersist({ parse: parseSavedChat })`公开对话及其台词、上下文、每个代理聊天的代理和 被选中的模型在重新装入后幸存下来; 草稿被分开保存, 被密封到个人身上 (单位:千美元)`createSealedDraftStorage`),并且只用于打开标签. `createArbiSessionStore` 在记忆中使用。 A 类 东道主自有状态的会话由各部分组成(`composeArbiSessionStore({ layout, workspace, chat, documents })`) (中文(简体) ).

**文档.** 正在查看的文档和查看者自己的状态(其标签、比较、标签) 请求的文本大小、 要打开的文字注释、 未保存的编辑、 弹出窗口、 文档 选中并选择一旦列出的文档、 粘贴在聊天上的文档、 草稿开始于 客户端( e)`startDraftDocument(kind)`, (中文(简体) ), `updateDraftDocument`, (中文(简体) ), `setDraftDocumentKind`, (中文(简体) ), `clearDraftDocument`),取景器中取取出段落的引文("取取取取")`setPassageCitation`)和 相关文档在文档存储处(`createArbiDocumentSessionStore({ persist, showViewer })`) (中文(简体) ). `showViewer` 是主机如何显示会议刚刚获得的文件的查看器(一个新的 草案, `showNewDocument` )),用于聊天文档. 与一个 `persist` (单位:千美元)`load` 是同步的,从 `localStorage` 例如,与 `parseSavedDocuments`),视图文件及其 页面、 被绑定的文档、 查看器的标签和文本大小会在任何内容之前重新装入 使。 。 .

**对话设置.** `useConversationSettings()` 是公开对话的标题和分享 (单位:千美元)`saveTitle`, (中文(简体) ), `share`, (中文(简体) ), `unshare`页:1 `PATCH` 中,服务器从 对话的工作空间)和配置模型的下个回合运行(`resetToDefaults` 滴数 被选中的那个).

## 人工活性编辑( I)`@arbidocs/react/artifacts`(中文(简体) )

`useArtifactSession({ workspaceId, docId })` 装入一个文物, 持有编辑缓冲器, 保存为 新的不可更改版本(儿童文件通过 `parent_ext_id`),列出版本行并比较 有音轨变化的任何两个版本。 它返回道具为 `@arbidocs/blocks/artifacts` 组件 : `view` (计: `ArtifactEditor`, (中文(简体) ), `editorProps` 财务报告和审定财务报表 `redlineProps`。下面的碎片是 SDK自由并可以自行使用: `useArtifactEditSession` (缓冲、基线、下流、拯救、), 比较), `useRedline` (用可插接的、有能力工作的) `RedlineEngine`, (中文(简体) ), `buildVersionChain` 财务报告和审定财务报表 `versionLabel`。 。 。 . `useArtifactText`, (中文(简体) ), `useArtifactVersions` 财务报告和审定财务报表 `useSaveArtifactVersion` 这是 SDK装订.

`useArtifactText(docId)` 返回干净的标记下和 a `status` (单位:千美元)`loading`, (中文(简体) ), `parsing`, (中文(简体) ), `ready`, (中文(简体) ), `error`:新鲜上传被解析了几秒钟,其间后端回答404,422或 500,所以它以越来越大的延后(限制)进行回击 并且无法逃脱后端的被击倒 (单位:千美元)`unescapeMarkdown`;只用于从马克下沉储存的文物). `useStreamedArtifact({ artifacts, workspaceId, settled })` 覆盖代理草稿的流、持久性和编辑寿命(`phase`数字 : `streaming`, (中文(简体) ), `persisting`, (中文(简体) ), `parsing`, (中文(简体) ), `ready`, (中文(简体) ), `error`),将草案与 `cleanDraftMarkdown` (单位:千美元)`unwrapCitationLinks`, (中文(简体) ), `stripAgentPreamble`, (中文(简体) ), `promoteBoldTitle`在此之前 存储.

## PDF 文档工具`@arbidocs/react/document-tools`(中文(简体) )

注释、标记、冻结、电子签名、签名检查和制作套件的数据方面: `DocumentToolsProvider` (主机的API客户端,用户和回调; `deploymentDomain` 默认为 主机 `arbi`因为, `useDeploymentDomain()`, (中文(简体) ), `fetchDocumentPdf` (一个版本的) `/view` PDF , (中文(简体) ), `useDocumentMarkup`, (中文(简体) ), `createMarkupStore` (单位:千美元) `AnnotationStore` 在服务器上标记 409合并),,, `fetchMarkupPdf`, (中文(简体) ), `useDocumentSignatures`, (中文(简体) ), `useSignDocument`, (中文(简体) ), `useSignatureVerification` 财务报告和审定财务报表 `buildProduction` 编号 : `saveProductionFiles`。UI是 `@arbidocs/blocks/document-tools`; 见 “在另一个前端使用文档工具” `@arbidocs/blocks` 读取.

## 流回调

把这些递给 `mutation.mutate()` 并行 `question` 财务报告和审定财务报表 `docIds`数字 :

| 回电 | 说明 |
| --- | --- |
| `onToken(token)` | 每个文本随其流而块化 |
| `onStreamStart({ assistant_message_ext_id })` | Stream 开始 —— 保存ID 用于后续查询 |
| `onAgentStep(step)` | 代理工具的使用(搜索、阅读等) |
| `onError(message)` | 流出时出错 |
| `onComplete()` | 流线完成 |

## 查询客户端

`createArbiQueryClient()` 是每个ARBI主机股票的客户端(ARBI前端,以及块站点) 结束 `defaultHost`: 读取新鲜5分钟并保留了30个,用后退重试了两次,但从未 4xx(除408/429外)或读出退出; 写作从未重审; 写作被拒绝时 账户的删除正在等待,或者被客户端的设置断开器删除,告诉用户. 签了字就空了 `queryClient.clear()` (同一个例子,所以每个钩子都留着).

`createArbiQueryClient({ persist: true })` ưμ㼯a `persistOptions` 页:1 `<PersistQueryClientProvider>` (单位:千美元)`@tanstack/react-query-persist-client`:文档元数据, 工作空间列表、设置、项目和应享权利都保存在这个设备上,用于离线启动 (从不包含文档内容),已排队下线(`registerArbiMutationDefaults`) (中文(简体) ). 打电话 `claimOfflineQueue(userExtId)` 在每个登录时, 所以一个前一个账户的队列里不会重播 .

`ArbiWebSocketProvider` 继续回放查询 `onlineManager` 与浏览器的网络同步 现场连接( 启动后一个空投的套接字计数) 和该人的“ 工作离线” 选择(`useWorkOffline`,一个短暂的会话视图, `WORK_OFFLINE_VIEW`) (中文(简体) ). `useReconnect` 拿着 最便宜的回路:它清除了"工作下线",说没有网络,或者重新装入.

## 离线邮件和日历

邮件保存在设备上, 封存到用户的密钥上, 绑入账户 只能由他们读取:在线阅读和搜索最近的信件(默认为最后7天); 每个设备,关闭 / 1 / 7 / 30 / 90天, `useOfflineMailSettings`),一个发送信号的收发箱 完全一次并按顺序重接(每个都保留其 `request_id`),稿件下线,以及 已下线的更改( 读取、 标记、 移动、 回收站、 删除) : `queueMailChange`, (中文(简体) ), `usePendingMailChanges`, (中文(简体) ), 重新连接时按顺序应用。 在"工作离线"下面什么也没有 默认邮件客户端( 无) 东道主 `mail`(已读取) `offlineMailReads`,以及 `defaultHost` 内 `@arbidocs/blocks` 挂载运行时间, 并在签出时擦除邮件 。 一个拥有自己客户端和会话的主机添加 三块:

```tsx
import { createMailClient, offlineMailReads, useOfflineMailRuntime, wipeOfflineMail } from '@arbidocs/react'

const client = createMailClient((path, init) => getArbi().mail.fetch(path, init), {
  ...offlineMailReads(getArbi), // reads answer from the device offline
})
useOfflineMailRuntime({ openOutbox }) // mounted once: sends the Outbox, applies changes, syncs
await wipeOfflineMail() // at sign-out
```

谈话(`useMailConversations`, (中文(简体) ), `useMailThread`设备上的逐行组合为 服务器是`groupMailConversations`, (中文(简体) ), `mailConversationKey`(三); `useNativeThreadKeys` 旧密钥 在背景中将本地邮件输入对话 .

邮箱用到 `offlineMailSupport` (单位:千美元)`@arbidocs/blocks/connect`作为设备存储器 默认; 每设备设置为 `ConnectedMailOfflineSettings`。 。 。 .

日历保存方式相同(它自己的被封存的数据库):读取由设备解答 离线, 和事件写出离线 等待在一个发件箱中, 重新播放一次 回到网上.

```tsx
import { calendarOfflineSupport, useCalendarOfflineRuntime, wipeCalendarOffline } from '@arbidocs/react'

<ArbiHost config={{ calendar: { offline: calendarOfflineSupport } }}>…</ArbiHost>
useCalendarOfflineRuntime() // mounted once: replays the outbox on reconnect
await wipeCalendarOffline() // at sign-out
```

## 实时连接

`<ArbiWebSocketProvider>` 持有重新连接的套接字并应用每个站点的应用:

-   任务和存在;
-   聊天和打电话;
-   通知行;
-   完成运行( e)`response_complete`:对话停止产生,后续离开 队列框, 背景运行被保存的文档被再次读取, 运行失败的 AI 使用 转到聊天主机 `onQuotaExceeded`· ;
-   对话、邮件草稿和技能活动.

转动后的信件会从服务器到达该人的其他标签(`conversation.message_posted`) (中文(简体) ).

主机处理其他信件类型 `handlers`类型,在 `useArbiWebSocket` 订阅者 :

```tsx
<ArbiWebSocketProvider enabled={signedIn} handlers={useRemoteControlHandlers()}>
```

**遥控.** 一个 `agt-…` 请求驱动 UI 的助手( E)`remote_control`)是经同意的. 它的状态是一个会话瞬间视图( E)`REMOTE_CONTROL_VIEW`,从未保存;块的远程控制 在每次登录、签出、到期和用户变更时重新发送: `useRemoteControl(selector)` 读取 这, `remoteControlActions(session)` 改变它(`reset()` 回到开始, 财务报告和审定财务报表 `toRemoteControlRequest(message, isSequenceId)` 将信件缩小为可运行的请求。 这个 操作者、迅速同意和引导光标是 `@arbidocs/blocks`' (单位:千美元)`useRemoteControlHandlers`, (中文(简体) ), `ConnectedRemoteControlConsent`) (中文(简体) ).

## 缓存无效

```tsx
import { arbiQueryKeys } from '@arbidocs/react'
import { useQueryClient } from '@tanstack/react-query'

const queryClient = useQueryClient()
queryClient.invalidateQueries({ queryKey: arbiQueryKeys.documents(workspaceId) })
```

## 同伴依赖关系

-   `react` 第18条

## 任务、代理、技能、联系人和人工智能的使用

Hooks for a "AI workers" and a message screen. 虎克为"AI 劳动力"和一条信息屏. 写入无效通过 `arbiQueryKeys`这样 `useTasks`, (中文(简体) ), `useAgents`, (中文(简体) ), `useConfigs` 财务报告和审定财务报表 `useChats` 自己来刷新.

```tsx
const create = useCreateTask() // mutateAsync(CreateTaskRequest) -> TaskResponse
const run = useRunTask() // approves a run parked for access (temporary grant), then runs
const runs = useTaskRuns(taskId) // polls while a run is in flight
const save = useSaveAgentConfig() // { agentExtId, sections: { Agents: { PERSONA, ... } } }
const grant = useGrantAgentAccess() // { agentExtId, workspaceId, mode?: { kind: 'standing' | 'temporary' } }
const contacts = useContacts() // + useInviteContacts(), useCreateContact(), useUpdateContact(), useDeleteContact()
```

表格对请求绘图`taskComposerToCreateRequest`, (中文(简体) ), `composePersona`, ) 属于 `@arbidocs/blocks/agents`. AI的使用报告于 **英镑** (按增值税计算),不是美元:使用 `formatGbp(n)` (单位:千美元)`£0.47`, (中文(简体) ), `£12.40`,整磅为 `£10`)和 `metered` 打开旗子 `useProjectUsage` (单位:千美元)`false` = 此部署不记录使用。 信使(a) 边面板,或信件页面上的列表和线程部分)是 `ConnectedMessenger` 内 `@arbidocs/blocks/connect`。见 `docs/design/blocks-package.md` ("hooks and maping a host 不应重写").

`useSessionPageTab(page, fallback)` 读取和写入主机会话中选中的页面标签 `views.tabs`保存在导航和再装入中 主机提供默认标签 . 使用 `useSessionView(key, fallback)` 持续页面首选项和 `useTransientView` 页:1 只有会话过滤器或一拍请求 。 三者都使用与工具包相同的会话布局.

## 常见问题

### @arbidocs/react 是什么？

ARBI SDK 的反应钩和提供者

### 如何安装 @arbidocs/react？

在项目目录运行 npm install @arbidocs/react，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：react（\>=18）、react-dom（\>=18）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @arbidocs/react 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @arbidocs/react 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### @arbidocs/react 可以商用吗？

@arbidocs/react 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @arbidocs/react 的下载量有多少？

根据 npm 官方下载统计，@arbidocs/react 在 2026/10/07 – 2026/11/05 这 30 天内被下载 50,995 次，日均约 1,700 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @arbidocs/react 还在维护吗？

最新版本 0\.5\.133 发布于 2026/11/07（今天）；至今共发布 487 个版本，其中过去 12 个月发布了 487 个；首次发布于 2026/02/11。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

