{"_id":"@azhonglee/lark-symphony","name":"@azhonglee/lark-symphony","dist-tags":{"latest":"0.3.5"},"versions":{"0.3.5":{"name":"@azhonglee/lark-symphony","version":"0.3.5","description":"Bridge Feishu/Lark messenger with local Codex via app-server (project=group, thread=session)","type":"module","bin":{"lark-symphony":"bin/lark-symphony.mjs"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","test":"vitest run","start":"node bin/lark-symphony.mjs run","prepare":"npm run build","release":"bash scripts/release.sh"},"dependencies":{"@larksuiteoapi/node-sdk":"^1.65.0","commander":"^12.1.0","cross-spawn":"^7.0.6","qrcode-terminal":"^0.12.0"},"devDependencies":{"@types/cross-spawn":"^6.0.6","@types/node":"^22.10.0","@types/qrcode-terminal":"^0.12.2","tsup":"^8.3.5","typescript":"^5.6.3","vitest":"^2.1.8"},"engines":{"node":">=20.0.0"},"keywords":["feishu","lark","codex","app-server","cli","bridge","bot"],"author":{"name":"modelzen"},"license":"MIT","homepage":"https://github.com/azhonglee/lark-symphony#readme","repository":{"type":"git","url":"git+https://github.com/azhonglee/lark-symphony.git"},"bugs":{"url":"https://github.com/azhonglee/lark-symphony/issues"},"publishConfig":{"access":"public"},"gitHead":"a053e4d1434cdaac5f3b363b26b2640d5535ad6c","_id":"@azhonglee/lark-symphony@0.3.5","_nodeVersion":"25.9.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-Rkvsy1w2klwpVYBFksAP6dXT8nFbFn+3Z5ILSBKRLe0bI4+2T9RmU08gz92QZyqQw2luQaKUToT7Z9Qs2pX+Lg==","shasum":"6fe41a89b464699e427c7b358c42425b0c108204","tarball":"https://registry.npmjs.org/@azhonglee/lark-symphony/-/lark-symphony-0.3.5.tgz","fileCount":7,"unpackedSize":363315,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD3KZhYzMuD5IrD3KpEbpRFj9ReQ1Ter/LX2dh8WLEycAIhAMj2aW86ds23nHFS3Bg82AkgmlCB9rRyhR0PyApLQ/xi"}]},"_npmUser":{"name":"azhonglee","email":"azhonglee@gmail.com"},"directories":{},"maintainers":[{"name":"azhonglee","email":"azhonglee@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/lark-symphony_0.3.5_1780991155637_0.6241107764299121"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-09T07:45:55.462Z","0.3.5":"2026-06-09T07:45:55.816Z","modified":"2026-06-09T07:45:56.105Z"},"maintainers":[{"name":"azhonglee","email":"azhonglee@gmail.com"}],"description":"Bridge Feishu/Lark messenger with local Codex via app-server (project=group, thread=session)","homepage":"https://github.com/azhonglee/lark-symphony#readme","keywords":["feishu","lark","codex","app-server","cli","bridge","bot"],"repository":{"type":"git","url":"git+https://github.com/azhonglee/lark-symphony.git"},"author":{"name":"modelzen"},"bugs":{"url":"https://github.com/azhonglee/lark-symphony/issues"},"license":"MIT","readme":"# lark-symphony\nWork base on https://github.com/modelzen/feishu-codex-bridge;\n\n## Features\n\n```\n飞书群消息 ──长连接(WSClient)──▶ bridge ──JSON-RPC/stdio──▶ codex app-server (每会话一进程)\n   ▲                                  │\n   └──────── 流式 Markdown 卡片 ◀──────┘\n```\n\n---\n- **群 = 项目**：每个群绑定一个本地目录与默认参数；@ 机器人即在该目录跑 Codex。\n- **话题 = 会话**：在群里对某条消息开话题，话题内是一条连续的 Codex 会话（自动 resume）。\n- **流式卡片**：推理 / 命令 / 文件改动 / 结果实时刷新到一张可折叠卡片。\n- **免 @ 对话**：项目群话题内可直接说话、不必每次 @（可逐群开关）。\n- **文档评论回复（可选）**：在飞书云文档（doc/docx/sheet/file，含知识库 wiki）的评论里 **@机器人**，它会读评论、跑 Codex、把答案回到同一条评论线程里；每篇文档一条连续会话。需额外开通文档评论权限并订阅评论事件（见下方配置）。\n- **私聊控制台**：私聊机器人弹交互菜单 —— 新建项目、项目列表、设置、用量、诊断、重连。\n- **📊 Codex 用量**：5 小时 / 7 天限额进度（剩余 % + 重置时间）、lifetime tokens、连续使用天数、GitHub 风格每日用量热力图；一键生成**战绩分享卡**，可原生转发给任何人或群（数据来自 Codex 个人资料页同款接口，需 ChatGPT 登录）。\n- **稳定隔离**：每会话独立 app-server 进程；卡死有 watchdog（默认 120s）→ 终止 → 回收，异常不波及其他群。\n- **本地加密密钥库**：飞书应用密钥用 AES-256-GCM 存在 `~/.lark-symphony/`，不入仓库、不进环境变量。\n- **跨平台常驻**：macOS / Windows / Linux·WSL 均可注册成后台服务、开机或登录自启（分别走 launchd / 登录自启免管理员 / systemd）。注：跨平台指进程运行与后台自启；「项目内只读/读写」隐私沙箱仅 macOS / 原生 Windows 可强制（见[安全须知](#-安全须知)）。\n\n---\n\n---\n\n## 📦 前置条件\n\n| 依赖 | 说明 | 获取方式 |\n|------|------|----------|\n| **操作系统** | 运行/后台常驻：**macOS / Windows** 均支持，Linux·WSL 为 best-effort（已实现 systemd，未广泛实测）。注意：「项目内只读 / 读写」隐私档的沙箱强制仅 **macOS / 原生 Windows**，Linux·WSL 上这两档会 fail-closed 拒绝启动（见下方[安全须知](#-安全须知)） | — |\n| **Node.js ≥ 20** | 运行时 | <https://nodejs.org> 或 `nvm install 20` |\n| **Codex CLI** | 后端，bridge 会 spawn `codex app-server` | `npm i -g @openai/codex`，或装 Codex.app，或用 `CODEX_BIN` 指向已有二进制 |\n| **Codex 已登录** | app-server 需要 `~/.codex/auth.json` | `codex login` |\n| **飞书 / Lark 账号** | 租户需允许「扫码创建应用」（个人/开发者租户一般可以） | 首次 `run` 时扫码创建 |\n| **lark-cli**（可选） | 仅「文档评论回复」需读文档正文时用到；不装也能跑，只是读不到正文 | `lark-cli auth login`，确保在 PATH 上 |\n\n> 收发消息、回卡片、发评论回复均走 `@larksuiteoapi/node-sdk` 长连接，**不依赖** `lark-cli`。⚠️ `lark-cli` 以**你的身份**登录，仅供 Codex **读**文档；prompt 已禁止用它发评论（否则评论会署你本人）。\n\n---\n\n\n```bash\nlark-symphony run\n```\n\n`run` 没配置时会**先扫码 init**：检查 codex → 扫码创建/授权飞书应用（密钥进本地加密库）→ 校验凭据并**自动打开浏览器到「一键开通全部权限」页**（同时打印链接）→ 起长连接。**Ctrl+C 优雅退出**（关掉所有 codex 子进程，无孤儿）。支持 npx。\n\n> 权限即时生效：`run` 跑着时直接在浏览器开通权限即可，无需重启。另外还要去飞书后台**订阅事件 + 发布版本**（见下节）。\n\n### 3. 后台 daemon（`start` —— 日常这么跑）\n\n```bash\nlark-symphony start      # 装系统后台服务并启动：开机/登录自启、崩溃自动拉起、关终端照跑\nlark-symphony status     # 状态 / pid / 日志路径 / 上次退出码\nlark-symphony logs -f    # 跟踪日志\nlark-symphony restart    # 重启\nlark-symphony stop       # 停止并关闭开机自启\nlark-symphony update     # 更新到最新版（npm i -g）并自动重启 daemon（--check 只查不装）\n```\n\n> 💡 升级很省事：装了后台 daemon 的，直接 `lark-symphony update` 一条命令 = 拉最新版 + 自动 `restart`；也可在**私聊管理台**点 **⬆️ 版本更新** 按钮，机器人自更新后重启服务。\n\n`start` 会**先在当前终端完成 init**（没配置则扫码），并**阻塞到授权完成**——权限全部开通、且你确认已订阅事件/发布版本——才真正装服务，绝不会装一个收不到消息的空壳。daemon 体跑的就是 `run`。\n\n> 🖥 **各平台后台机制**：macOS = launchd 用户服务；**Windows = 登录自启（写 `HKCU\\…\\Run`，隐藏启动，全程免管理员）**；Linux·WSL = systemd 用户单元（`systemctl --user`，需要 `loginctl enable-linger` 才能登出后续跑；WSL 还需在 `/etc/wsl.conf` 开 `[boot] systemd=true`，否则用前台 `run`）。三者命令一致（`start`/`status`/`stop`/`restart`/`logs`），状态/日志路径统一。\n\n> ⚠️ **后台服务必须全局安装（`npm i -g`），不要用 npx**：服务里硬编码了 CLI 路径，而 npx 的临时缓存（`~/.npm/_npx/...`）会被清理，缓存一没服务就起不来。前台 `run` 用 npx 没问题（单次进程）。\n\n### 4. 多飞书机器人（可选）\n\n一台机器可保存多个机器人配置，运行时只用「当前」一个：\n\n```bash\nlark-symphony bot init [名]   # 再注册一个飞书应用并授权（额外机器人）\nlark-symphony bot list        # 列出已注册机器人（👉 标当前）\nlark-symphony bot use <名>    # 切换 run / start 启动时使用的机器人\nlark-symphony bot rm <名>     # 移除一个机器人配置\n```\n\n每个机器人的 projects / sessions 各自独立（`~/.lark-symphony/bots/<appId>/`）。切换后前台 `run` 直接生效，后台 `restart` 生效。\n\n自检随时可用：`lark-symphony doctor`。\n\n---\n\n## 🔧 飞书开放平台后台配置（关键，必须手动一次）\n\n扫码向导只负责**创建应用 + 拿到凭据**。下面这些飞书**没有开放 API**，必须你在[开发者后台](https://open.feishu.cn/app)手动配一次（Lark 为 <https://open.larksuite.com/app>）：\n\n### 1）开通权限（Scope）\n\n启动时若有缺失权限，会**自动打开浏览器**到形如 `https://open.feishu.cn/app/<app_id>/auth?q=...` 的页面（同时在终端打印链接），**一次性勾选全部 → 确认**即可（即时生效、无需重启）。`start`（后台 daemon）会阻塞到这步开通完成才装服务。\n\n本桥需要的全部权限以 [`src/config/scopes.ts`](src/config/scopes.ts) 的 `REQUIRED_SCOPES` 为权威清单，包含：收群 @ 消息 / 全量群消息（免 @）/ 私聊消息、以机器人身份发消息与回话题、消息置顶、表情回复、上传下载资源、建群 / 转让群主 / 设群管理员、群公告读写、置顶横幅、群标签页、交互卡片。**这些都在首次开通链接里一并申请，正常用不会再遇到「权限不足」。**\n\n> 「**文档评论回复**」功能另需 `docs:document.comment:read`、`docs:document.comment:create`、`wiki:wiki:readonly` 三项（见 `COMMENT_SCOPES`）。它们**已预勾选进同一个开通链接**，但**不属于** `REQUIRED_SCOPES` —— 不开通也不会卡住后台服务安装，只是该功能静默关闭。\n\n> 「**把我加进已有群**」功能另需 `im:chat:readonly`（读群名）、`im:chat.members:write_only`（解绑时机器人退群）两项（见 `JOIN_GROUP_SCOPES`）。同样**已预勾选进同一个开通链接**、**不属于** `REQUIRED_SCOPES`，不开通只是该功能静默关闭。\n\n### 2）订阅事件 + 回调（长连接模式）\n\n`run` / `start` 初始化到这步会**自动打开**「**事件与回调**」页（`https://open.feishu.cn/app/<app_id>/event`）。这页顶部有「**事件配置**」「**回调配置**」两个独立标签，要分别配（飞书对事件/回调**既无开通 API、也无预选深链、连查询订阅状态的接口都没有**，只能手点）：\n\n**「事件配置」标签** → 「订阅方式」改**长连接** → 点「添加事件」：\n\n- `im.message.receive_v1` —— 收群/私聊消息\n- `application.bot.menu_v6` —— 机器人菜单点击\n- `drive.notice.comment_add_v1` —— 云文档新增评论（**仅「文档评论回复」功能需要**；不加则该功能静默关闭，其余照常）\n- `im.chat.member.bot.added_v1` —— 机器人被加入群（**仅「把我加进已有群」功能需要**；触发私聊推送绑定卡，不加则拉我进群没反应）\n- `im.chat.member.bot.deleted_v1` —— 机器人被移出群（同上；触发自动解绑项目，不加则被踢后项目不会自动清理）\n\n**「回调配置」标签** → 「订阅方式」改**长连接** → 点「添加回调」：\n\n- `card.action.trigger`（卡片回传交互）—— 卡片按钮回调\n\n> ⚠️ `card.action.trigger` 是**回调**不是事件，在「添加事件」里**搜不到**，必须切到「**回调配置**」这个标签去加。\n> ⚠️ 不订阅事件 → @ 机器人没反应；不订阅回调 → 卡片按钮点了没反应（长连接照样能连上，但都收不到）。\n> 保存「长连接」订阅方式时要求长连接**在线**；若提示连接未建立，先开个终端跑 `lark-symphony run` 连上，再回这页保存。\n\n### 3）（可选）机器人自定义菜单\n\n后台「**机器人能力 → 机器人自定义菜单**」配置菜单项（如：新建项目 / 项目列表 / 设置 / 诊断 / 重连），各设一个推送事件的 `event_key`，发布版本生效。不配也能用 —— 私聊机器人发任意消息同样会弹出交互菜单。\n\n### 4）发布版本\n\n在后台发布应用版本，机器人才真正上线。\n\n---\n\n## 💬 使用\n\n- **建项目**：私聊机器人 → 弹出控制台菜单 → 「新建项目」→ 绑定一个本地目录（或新建空白项目）→ 选群类型 → 机器人建好群、置顶命令说明、把你拉进去。\n- **两种群按场景选**：\n  - **👥 多话题群**：主群区 @ 机器人开话题，每个话题是一条**独立会话**（上下文隔离、可 `/resume`、话题间并行）。适合**多人协作**——一个项目群里各人 / 各任务开各自话题、上下文互不串味；也适合一人并行多任务。\n  - **💬 单会话群**：整群就是**一条连续会话**（全程**免 @**、消息按序排队、无 `/resume`）。适合**个人单线深入**、像私聊一样直接聊。\n- **干活**：在项目群里 **@机器人** 描述需求；机器人在该群绑定的目录里跑 Codex，流式卡片回结果。\n- **话题 = 会话**：对某条消息开话题后，话题内可**免 @** 连续对话，是一条连贯的 Codex 会话。\n- **发图 / 发附件**：直接在消息里**发图片**，Codex 能看到（多模态读图）；**发文件附件**（日志 / PDF / 代码等），桥会把它下载到本地并把**绝对路径**告诉 Codex，让它用工具直接打开分析。⚠️ 附件落在桥的全局临时目录（`~/.lark-symphony/inbound`，1h 后自动清），**只有「完全访问」档**能读到——「项目内只读 / 读写」档的沙箱把读取锁在项目目录内，读不到该目录。单文件上限 50MB、单条消息最多 9 个；合并转发里的附件飞书官方不支持取，故不支持。\n- **文档评论 @机器人**：在飞书文档评论里 @ 它就回（前提：已开通文档评论权限 + 订阅 `drive.notice.comment_add_v1`，且机器人对该文档有访问权限）。只支持 doc/docx/sheet/file；评论框不渲染 markdown，回复为纯文本，超长会截断。\n- **终止**：卡片上的 **⏹** 随时终止当前轮；卡死超过 watchdog 阈值（默认 120s）自动中止并回收进程。\n- **私聊控制台**：项目列表、设置（模型 / 推理强度 / 免 @ / watchdog / 管理员）、用量、诊断、重连，全在私聊菜单里。\n- **📊 用量**：点「用量」看 5h/7d 限额（剩余 % + 重置时间）与 Codex 个人统计（lifetime tokens / streak / 每日热力图）；点「📤 生成分享卡」得到一张可转发的战绩卡——长按（手机）或右键（电脑）即可转发，数据定格在生成时刻。\n\n---\n\n## ⚙️ 配置与数据位置\n\n所有本地状态在 `~/.lark-symphony/`：\n\n| 文件 | 内容 |\n|------|------|\n| `bots.json` | 已注册机器人列表 + 当前选中（`current`） |\n| `bots/<appId>/config.json` | 该机器人的 id / 租户 / 偏好（**不含明文密钥**） |\n| `bots/<appId>/projects.json` | 群 → 目录 + 默认参数 注册表（**按机器人隔离**） |\n| `bots/<appId>/sessions.json` | 话题 → Codex thread_id + cwd（**按机器人隔离**） |\n| `secrets.enc` + `.keystore.salt` | AES-256-GCM 加密的应用密钥（按 appId 存，多机器人共用一库；密钥由机器 + 用户派生） |\n| `media/` | 临时媒体 |\n\n> 旧版单机器人布局（顶层 `config.json` / `projects.json` / `sessions.json`）会在首次运行时**自动迁移**为名为 `default` 的机器人。\n\n环境变量：\n\n| 变量 | 作用 |\n|------|------|\n| `CODEX_BIN` | 显式指定 codex 二进制路径 |\n| `CODEX_HOME` | codex 配置/登录目录（默认 `~/.codex`） |\n| `LARK_SYMPHONY_CWD` | 未注册群的兜底工作目录（默认进程 cwd；常驻服务建议显式设置） |\n\n> 群里那张「👈 使用说明」标签页指向的命令手册文档，可在 [`src/project/onboarding.ts`](src/project/onboarding.ts) 的 `HELP_DOC_URL` 改成你自己发布的飞书文档；设为空串则不挂该标签页。\n\n---\n\n## 🛠 CLI 一览\n\n```\nlark-symphony run                前台启动（没配置先扫码 init；Ctrl+C 优雅退出）\nlark-symphony start              后台 daemon 启动（装系统后台服务、开机/登录自启；阻塞到授权完成）\nlark-symphony stop|restart|status|logs   后台 daemon 生命周期\nlark-symphony update             更新到最新版并自动重启 daemon（--check 只查不装）\nlark-symphony bot init|list|use|rm       多飞书机器人：注册 / 列表 / 切当前 / 移除\nlark-symphony doctor             本地自检：codex / 登录 / lark-cli / 当前机器人\n```\n\n---\n\n## 🧑‍💻 开发\n\n```bash\nnpm run typecheck     # tsc --noEmit\nnpm run build         # tsup → dist/\nnpm test              # vitest\nnpm run dev           # tsup --watch\n```\n\n本地开发：`git clone https://github.com/azhonglee/lark-symphony.git && cd lark-symphony && npm i`（`prepare` 自动构建），前台跑 `npm start` 或 `./scripts/dev-run.sh`。\n\n目录结构：\n\n```\nsrc/\n  bot/        长连接 bridge、消息处理、私聊控制台、扫码向导\n  card/       流式运行卡片、命令卡、回调分发\n  agent/      Codex app-server 后端（进程生命周期、JSON-RPC、事件映射、协议类型）\n  project/    项目注册表、建群/公告/标签页 onboarding、生命周期\n  config/     加密密钥库、密钥解析、配置存储、多机器人注册表、scope 清单、路径\n  core/       watchdog、单实例锁、日志\n  cli/        commander 命令（run / start / stop / restart / status / logs / update / bot / doctor / secrets）\n  service/    后台服务适配器（launchd / Windows 登录自启 / systemd）+ 跨平台 spawn\n```\n\n架构与实现细节见 [`docs/design/lark-symphony-design.md`](docs/design/lark-symphony-design.md) 与 [`docs/design/implementation-plan.md`](docs/design/implementation-plan.md)。\n\n---\n\n## ⚠️ 安全须知\n\n机器人调用 Codex 始终是 **`approvalPolicy: \"never\"`**（无人工逐条审批），**沙箱就是唯一的安全闸门**。每个项目有一档**权限**，在私聊控制台「📁 项目列表 → ⚙️ 设置 → 🔐 权限」里用下拉框选择后提交：\n\n| 档位 | 能读 | 能写 | 适用 |\n|------|------|------|------|\n| 🔒 **项目内只读** | 仅项目文件夹 | ✗ | 外部群 / 不可信场景的问答机器人 |\n| ✏️ **项目内读写** | 仅项目文件夹 | 仅项目文件夹 | 自己的编码项目，但禁止它碰机器其余部分 |\n| ⚠️ **完全访问** | 整台电脑 | 整台电脑 | 完全信任、你自己掌控的机器 |\n\n- **管理员 / 普通用户可分设**：🔐 权限里有「管理员档」和「普通用户档」两个下拉。两档**不同**时，管理员与群里其他人**各用独立的 Codex 线程**（互不串沙箱、也互不串对话历史）——典型：外部群里管理员 `完全访问`、其他人 `项目内只读`。两档**相同** = 所有人一致（默认）。\n- **默认值**：你自己新建的项目群 = `完全访问`（与历史行为一致）；**别人把机器人拉进的存量/外部群** = `项目内只读`；普通用户档默认**同管理员档**（不分档）。**升级前没有 `mode` 字段的老项目按 `完全访问` 处理**，行为不变。\n- 🔒/✏️ 靠 Codex 的自定义 permissions 档把读写都**锁死在项目文件夹内**（读不到 `~/.ssh`、`/etc` 等），由操作系统沙箱强制：**macOS（Seatbelt）与原生 Windows（restricted token）可强制**，其中 Windows 需 Codex 以 elevated 沙箱运行、否则它会**拒绝执行**（仍不泄漏）。**Linux / WSL 无法强制读限定**（沙箱只挡写、不限读，Landlock 读限制尚未实现，WSL 等同 Linux）——在这些平台选 🔒/✏️ 会被**直接拒绝启动（fail-closed），绝不静默降级为完全访问**；要在 Linux/WSL 用，请把 Codex 跑在容器/隔离环境里。\n  > Windows 上的强制是 Codex 自己做的，请先在真机自测一次（让机器人读项目文件夹外的文件，应被拒）再用于真实外部群。\n- ⚠️ `完全访问` 档意味着：**任何能给机器人发消息的人，都能在你这台机器上、以你的身份执行任意命令（读写文件、联网、跑脚本）**。这一档只把**你信任的人**拉进群，在**你自己掌控的隔离机器**上跑，目录里别放不愿被读写的敏感数据。\n- 「联网」是档位之外的独立开关，只影响它执行的 shell 命令能否上网，不影响模型本身和 Codex 自带的联网搜索。\n- 它不是多租户托管服务，是给你（和你信任的小团队）自用的桥。\n\n> 把机器人拉进**外部群**做只读问答前，先在飞书开发者后台开启应用的「可被添加到外部群 / 外部可用范围」，再由群里的真人手动把机器人加进群（机器人无法自行加入）。\n\n---\n\n## ❓ 故障排查\n\n| 现象 | 排查 |\n|------|------|\n| `✗ 未找到 codex CLI` | 装 Codex 并 `codex login`；或设 `CODEX_BIN`。`doctor` 会显示解析到的路径 |\n| `应用凭据校验失败` | 应用可能被禁用/未发布；重跑 `run` 重新校验，或 `bot rm <名>` 后 `bot init` 重新扫码 |\n| @ 机器人没反应 | 多半是**事件未订阅**（长连接模式）或**版本未发布**；按上面「后台配置」检查 |\n| 提示某项「权限不足」 | 点 `run`/`start` 打印（或自动打开）的一键开通链接补齐权限（即时生效） |\n| 按钮「时灵时不灵」 | 检查是否**重复启动了两个 bridge 进程**抢回调；本桥有单实例锁，正常会拒绝第二个 |\n| 点 ⏹ 没反应 / 卡片不收尾 | 同群另一话题在跑长任务占住了串行队列；稍候或重连 |\n\n---","readmeFilename":"README.md","_rev":"1-32c27b763b64387b0cf128f4d5eb763f"}