feishu-docs-cli 0.1.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +403 -0
  3. package/README.zh.md +402 -0
  4. package/bin/feishu-docs.js +8 -0
  5. package/dist/auth.d.ts +76 -0
  6. package/dist/auth.js +512 -0
  7. package/dist/auth.js.map +1 -0
  8. package/dist/cli.d.ts +5 -0
  9. package/dist/cli.js +197 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/client.d.ts +28 -0
  12. package/dist/client.js +256 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/commands/authorize.d.ts +12 -0
  15. package/dist/commands/authorize.js +73 -0
  16. package/dist/commands/authorize.js.map +1 -0
  17. package/dist/commands/cat.d.ts +6 -0
  18. package/dist/commands/cat.js +159 -0
  19. package/dist/commands/cat.js.map +1 -0
  20. package/dist/commands/cp.d.ts +9 -0
  21. package/dist/commands/cp.js +70 -0
  22. package/dist/commands/cp.js.map +1 -0
  23. package/dist/commands/create.d.ts +6 -0
  24. package/dist/commands/create.js +120 -0
  25. package/dist/commands/create.js.map +1 -0
  26. package/dist/commands/delete.d.ts +6 -0
  27. package/dist/commands/delete.js +91 -0
  28. package/dist/commands/delete.js.map +1 -0
  29. package/dist/commands/info.d.ts +6 -0
  30. package/dist/commands/info.js +69 -0
  31. package/dist/commands/info.js.map +1 -0
  32. package/dist/commands/install-skill.d.ts +5 -0
  33. package/dist/commands/install-skill.js +28 -0
  34. package/dist/commands/install-skill.js.map +1 -0
  35. package/dist/commands/login.d.ts +10 -0
  36. package/dist/commands/login.js +93 -0
  37. package/dist/commands/login.js.map +1 -0
  38. package/dist/commands/ls.d.ts +6 -0
  39. package/dist/commands/ls.js +79 -0
  40. package/dist/commands/ls.js.map +1 -0
  41. package/dist/commands/mkdir.d.ts +6 -0
  42. package/dist/commands/mkdir.js +49 -0
  43. package/dist/commands/mkdir.js.map +1 -0
  44. package/dist/commands/mv.d.ts +9 -0
  45. package/dist/commands/mv.js +72 -0
  46. package/dist/commands/mv.js.map +1 -0
  47. package/dist/commands/read.d.ts +6 -0
  48. package/dist/commands/read.js +439 -0
  49. package/dist/commands/read.js.map +1 -0
  50. package/dist/commands/search.d.ts +7 -0
  51. package/dist/commands/search.js +92 -0
  52. package/dist/commands/search.js.map +1 -0
  53. package/dist/commands/share.d.ts +13 -0
  54. package/dist/commands/share.js +266 -0
  55. package/dist/commands/share.js.map +1 -0
  56. package/dist/commands/spaces.d.ts +6 -0
  57. package/dist/commands/spaces.js +43 -0
  58. package/dist/commands/spaces.js.map +1 -0
  59. package/dist/commands/tree.d.ts +6 -0
  60. package/dist/commands/tree.js +101 -0
  61. package/dist/commands/tree.js.map +1 -0
  62. package/dist/commands/update.d.ts +9 -0
  63. package/dist/commands/update.js +217 -0
  64. package/dist/commands/update.js.map +1 -0
  65. package/dist/commands/wiki.d.ts +6 -0
  66. package/dist/commands/wiki.js +286 -0
  67. package/dist/commands/wiki.js.map +1 -0
  68. package/dist/parser/block-types.d.ts +141 -0
  69. package/dist/parser/block-types.js +167 -0
  70. package/dist/parser/block-types.js.map +1 -0
  71. package/dist/parser/blocks-to-md.d.ts +26 -0
  72. package/dist/parser/blocks-to-md.js +666 -0
  73. package/dist/parser/blocks-to-md.js.map +1 -0
  74. package/dist/parser/text-elements.d.ts +13 -0
  75. package/dist/parser/text-elements.js +91 -0
  76. package/dist/parser/text-elements.js.map +1 -0
  77. package/dist/scopes.d.ts +21 -0
  78. package/dist/scopes.js +48 -0
  79. package/dist/scopes.js.map +1 -0
  80. package/dist/services/block-writer.d.ts +29 -0
  81. package/dist/services/block-writer.js +131 -0
  82. package/dist/services/block-writer.js.map +1 -0
  83. package/dist/services/doc-blocks.d.ts +8 -0
  84. package/dist/services/doc-blocks.js +26 -0
  85. package/dist/services/doc-blocks.js.map +1 -0
  86. package/dist/services/markdown-convert.d.ts +68 -0
  87. package/dist/services/markdown-convert.js +217 -0
  88. package/dist/services/markdown-convert.js.map +1 -0
  89. package/dist/services/wiki-nodes.d.ts +20 -0
  90. package/dist/services/wiki-nodes.js +46 -0
  91. package/dist/services/wiki-nodes.js.map +1 -0
  92. package/dist/types/index.d.ts +236 -0
  93. package/dist/types/index.js +5 -0
  94. package/dist/types/index.js.map +1 -0
  95. package/dist/utils/document-resolver.d.ts +26 -0
  96. package/dist/utils/document-resolver.js +46 -0
  97. package/dist/utils/document-resolver.js.map +1 -0
  98. package/dist/utils/drive-types.d.ts +4 -0
  99. package/dist/utils/drive-types.js +16 -0
  100. package/dist/utils/drive-types.js.map +1 -0
  101. package/dist/utils/errors.d.ts +23 -0
  102. package/dist/utils/errors.js +114 -0
  103. package/dist/utils/errors.js.map +1 -0
  104. package/dist/utils/member.d.ts +11 -0
  105. package/dist/utils/member.js +30 -0
  106. package/dist/utils/member.js.map +1 -0
  107. package/dist/utils/scope-prompt.d.ts +39 -0
  108. package/dist/utils/scope-prompt.js +134 -0
  109. package/dist/utils/scope-prompt.js.map +1 -0
  110. package/dist/utils/url-parser.d.ts +5 -0
  111. package/dist/utils/url-parser.js +55 -0
  112. package/dist/utils/url-parser.js.map +1 -0
  113. package/dist/utils/validate.d.ts +8 -0
  114. package/dist/utils/validate.js +15 -0
  115. package/dist/utils/validate.js.map +1 -0
  116. package/dist/utils/version.d.ts +12 -0
  117. package/dist/utils/version.js +128 -0
  118. package/dist/utils/version.js.map +1 -0
  119. package/package.json +53 -0
  120. package/skills/feishu-docs/SKILL.md +194 -0
package/README.zh.md ADDED
@@ -0,0 +1,402 @@
1
+ # feishu-docs-cli
2
+
3
+ [English](./README.md)
4
+
5
+ 让 AI Agent(Claude Code、Codex、Trae 等)通过 shell 命令读写飞书云文档和知识库。
6
+
7
+ ## 为什么选 feishu-docs-cli?
8
+
9
+ 飞书官方已有 [lark-mcp](https://github.com/larksuite/lark-openapi-mcp) MCP 服务。以下是本项目的差异化能力:
10
+
11
+ | 能力 | feishu-docs-cli | lark-mcp |
12
+ |------|:-:|:-:|
13
+ | 读取文档输出 Markdown | **支持** — 30+ 种 block 类型渲染 | 不支持 — 返回原始 Block JSON |
14
+ | 从 Markdown 写入文档 | **支持** — 自动转换、大文档自动分批(>1000 blocks) | 不支持 |
15
+ | 知识库目录树浏览 | **支持** — `spaces` → `tree` → `cat` 完整工作流 | 仅搜索/获取单个节点 |
16
+ | 批量读取知识库子树 | **支持** — `cat` 递归导出为 Markdown | 不支持 |
17
+ | 写入安全(备份/恢复) | **支持** — 覆盖前自动备份,失败自动恢复 | 不支持 |
18
+ | OAuth 用户登录 | **支持** — 完整 OAuth v2 + token 自动刷新 + 分级权限管理 + 交互式权限恢复 | 支持 — 基础 OAuth 登录 |
19
+ | 兼容任意 AI Agent | **支持** — 标准 CLI,支持管道和脚本 | 仅 MCP 协议 |
20
+ | 即时消息 | 不支持 | 支持 |
21
+ | 多维表格 CRUD | 只读(渲染为表格) | 支持 |
22
+ | 通讯录查询 | 仅 `share add` 时使用 | 支持 |
23
+
24
+ **一句话总结**:lark-mcp 是飞书 API 的薄封装,覆盖面广但每个功能都是原始 API 级别。feishu-docs-cli 专注于**文档工作流**,让 AI Agent 能以 Markdown 为媒介真正读懂和编写飞书文档,并提供原始 API 没有的安全保障。
25
+
26
+ ## 功能
27
+
28
+ - **读取** 文档,输出 Markdown、纯文本或原始 Block JSON
29
+ - **创建** 文档到知识库或云空间文件夹
30
+ - **更新** 文档,支持覆盖写入或追加模式(大文档自动分批)
31
+ - **删除** 文档(移至回收站)
32
+ - **详情** — 查看文档元信息(标题、类型、URL、版本号)
33
+ - **浏览** 知识库结构(空间列表、目录树、批量读取)
34
+ - **搜索** 按关键词搜索文档
35
+ - **分享** — 管理协作者(列表、添加、设置公开权限)
36
+ - **文件列表** — 浏览云空间文件夹
37
+ - 使用 TypeScript 编写,严格模式
38
+ - 零运行时依赖 — 使用原生 `fetch` 调用所有 API
39
+ - Agent 友好输出 — 纯文本或 JSON,无交互式 UI
40
+
41
+ ## 安装
42
+
43
+ ```bash
44
+ npm install -g feishu-docs-cli
45
+ ```
46
+
47
+ 或通过 npx 直接运行:
48
+
49
+ ```bash
50
+ npx feishu-docs-cli read <url>
51
+ ```
52
+
53
+ 也可以从 GitHub 安装:
54
+
55
+ ```bash
56
+ npm install -g github:cliff-byte/feishu-docs-cli
57
+ ```
58
+
59
+ 需要 Node.js >= 18.3。
60
+
61
+ ## 配置
62
+
63
+ ### 1. 创建飞书应用
64
+
65
+ 1. 前往[飞书开放平台](https://open.feishu.cn/app),点击 **创建企业自建应用**,填写应用名称和描述
66
+ 2. 创建完成后,进入应用的 **凭证与基础信息** 页面,复制 **App ID**(`cli_xxx`)和 **App Secret** — 后续配置环境变量需要用到
67
+ 3. 进入 **权限管理**,搜索并添加以下权限:
68
+
69
+ **基础权限**(免审核 — 执行 `feishu-docs login` 时自动申请):
70
+
71
+ | 权限 | 说明 |
72
+ |------|------|
73
+ | `wiki:wiki` | 知识库读写 |
74
+ | `docx:document` | 文档读写 |
75
+ | `docx:document.block:convert` | Markdown 转 Block(创建/更新需要) |
76
+ | `sheets:spreadsheet:readonly` | 嵌入式电子表格只读(read 命令) |
77
+ | `board:whiteboard:node:read` | 画板导出为图片(read 命令) |
78
+ | `bitable:app:readonly` | 嵌入式多维表格只读(read 命令) |
79
+
80
+ **额外权限**会按需自动提示 — 当 API 调用需要你未授权的权限时,CLI 会从 API 错误响应中检测并提示你授权。常见权限:
81
+
82
+ | 权限 | 说明 |
83
+ |------|------|
84
+ | `drive:drive` | 云空间文件管理(ls、delete、share、mv、cp、mkdir) |
85
+ | `contact:contact.base:readonly` | 通过邮件/手机号查找用户 |
86
+ | `drive:drive.search:readonly` | 搜索云文档 |
87
+
88
+ 4. 进入 **安全设置**,在 **重定向 URL** 白名单中添加 OAuth 回调地址:
89
+ - 默认值:`http://127.0.0.1:3456/callback`
90
+ - 该地址必须与 `feishu-docs login` 使用的值完全一致
91
+
92
+ 5. **发布应用版本**:进入 **应用发布** → **创建版本** → 提交审核 → 审核通过(企业自建应用通常自动通过)
93
+
94
+ > **提示**:使用 tenant(应用)身份访问文档时(如 CI/CD 场景),需要将应用添加为文档或知识库的协作者,或通过管理后台授权文档范围。
95
+
96
+ ### 2. 设置环境变量
97
+
98
+ ```bash
99
+ export FEISHU_APP_ID="cli_xxx" # 上面第 2 步获取的 App ID
100
+ export FEISHU_APP_SECRET="xxx" # 上面第 2 步获取的 App Secret
101
+ ```
102
+
103
+ ### 3. 登录(获取用户级别访问权限)
104
+
105
+ 用户级别访问支持个人文档、搜索和协作等功能。
106
+
107
+ ```bash
108
+ feishu-docs login
109
+ ```
110
+
111
+ 执行后会打开浏览器进行 OAuth 授权,token 加密保存到 `~/.feishu-docs/auth.json`。
112
+
113
+ 如果应用注册的重定向 URL 与默认值(`http://127.0.0.1:3456/callback`)不同,需要传入完全一致的值:
114
+
115
+ ```bash
116
+ # 使用与飞书开放平台注册的完全一致的重定向 URI
117
+ feishu-docs login --redirect-uri http://127.0.0.1:3456/callback
118
+
119
+ # 或仅更改端口,保持默认的 localhost 路径
120
+ feishu-docs login --port 4567
121
+ ```
122
+
123
+ ## 使用
124
+
125
+ ### 读取
126
+
127
+ ```bash
128
+ # 读取文档,输出 Markdown
129
+ feishu-docs read https://xxx.feishu.cn/wiki/wikcnXXX
130
+
131
+ # 通过 token 读取
132
+ feishu-docs read wikcnXXX
133
+
134
+ # 原始 Block JSON(无损)
135
+ feishu-docs read <url> --blocks
136
+
137
+ # 纯文本
138
+ feishu-docs read <url> --raw
139
+
140
+ # 带元信息头
141
+ feishu-docs read <url> --with-meta
142
+ ```
143
+
144
+ ### 知识库
145
+
146
+ ```bash
147
+ # 列出所有知识库
148
+ feishu-docs spaces
149
+
150
+ # 查看目录树
151
+ feishu-docs tree <space_id>
152
+ feishu-docs tree <space_id> --depth 2
153
+
154
+ # 递归读取所有文档
155
+ feishu-docs cat <space_id> --max-docs 20
156
+ feishu-docs cat <space_id> --node <token> --title-only
157
+ ```
158
+
159
+ ### 搜索
160
+
161
+ ```bash
162
+ feishu-docs search "API 设计" --type docx --limit 10
163
+ ```
164
+
165
+ 需要用户级别 token,请先执行 `feishu-docs login`。
166
+
167
+ ### 创建
168
+
169
+ ```bash
170
+ # 在知识库中创建
171
+ feishu-docs create "API 文档" --wiki <space_id> --body ./api.md
172
+
173
+ # 在云空间文件夹中创建
174
+ feishu-docs create "API 文档" --folder <folder_token> --body ./api.md
175
+
176
+ # 创建空文档
177
+ feishu-docs create "API 文档"
178
+
179
+ # 从标准输入读取
180
+ cat design.md | feishu-docs create "设计文档" --wiki <space_id> --body -
181
+ ```
182
+
183
+ ### 更新
184
+
185
+ ```bash
186
+ # 覆盖写入(自动备份)
187
+ feishu-docs update <url> --body ./updated.md
188
+
189
+ # 追加内容
190
+ feishu-docs update <url> --body ./extra.md --append
191
+
192
+ # 从标准输入读取
193
+ echo "## 新章节" | feishu-docs update <url> --body - --append
194
+
195
+ # 从备份恢复
196
+ feishu-docs update <url> --restore ~/.feishu-docs/backups/xxx.json
197
+ ```
198
+
199
+ ### 删除
200
+
201
+ ```bash
202
+ feishu-docs delete <url> --confirm
203
+ ```
204
+
205
+ 将文档移至回收站(30 天内可恢复)。
206
+
207
+ ### 详情
208
+
209
+ ```bash
210
+ feishu-docs info <url|token>
211
+ feishu-docs info <url> --json
212
+ ```
213
+
214
+ ### 文件列表
215
+
216
+ ```bash
217
+ # 列出根目录
218
+ feishu-docs ls
219
+
220
+ # 列出指定文件夹
221
+ feishu-docs ls <folder_token>
222
+
223
+ # 按类型筛选
224
+ feishu-docs ls --type docx --limit 20
225
+ ```
226
+
227
+ ### 文件操作
228
+
229
+ ```bash
230
+ # 移动文件到指定文件夹
231
+ feishu-docs mv <url|token> <target_folder_token>
232
+
233
+ # 复制文件(自动命名为"标题 - 副本")
234
+ feishu-docs cp <url|token> <target_folder_token>
235
+
236
+ # 指定副本名称
237
+ feishu-docs cp <url|token> <target_folder_token> --name "我的副本"
238
+
239
+ # 创建文件夹
240
+ feishu-docs mkdir "新文件夹" --parent <parent_folder_token>
241
+ ```
242
+
243
+ ### 分享
244
+
245
+ ```bash
246
+ # 查看协作者
247
+ feishu-docs share list <url>
248
+
249
+ # 添加协作者
250
+ feishu-docs share add <url> user@example.com --role view
251
+ feishu-docs share add <url> ou_xxx --role edit
252
+
253
+ # 移除协作者
254
+ feishu-docs share remove <url> user@example.com
255
+
256
+ # 修改协作者权限
257
+ feishu-docs share update <url> ou_xxx --role manage
258
+
259
+ # 设置公开分享模式
260
+ feishu-docs share set <url> --public tenant # 组织内可读
261
+ feishu-docs share set <url> --public tenant:edit # 组织内可编辑
262
+ feishu-docs share set <url> --public open # 互联网可读
263
+ feishu-docs share set <url> --public closed # 关闭链接分享
264
+ ```
265
+
266
+ 角色:`view`(查看)、`edit`(编辑)、`manage`(管理)。成员类型自动识别(邮箱、openid、unionid、openchat、userid)。
267
+
268
+ ### 认证
269
+
270
+ ```bash
271
+ feishu-docs login # OAuth 登录(默认回调:http://127.0.0.1:3456/callback)
272
+ feishu-docs logout # 清除保存的凭证
273
+ feishu-docs whoami # 查看当前认证状态
274
+ ```
275
+
276
+ ## 全局选项
277
+
278
+ | 选项 | 说明 |
279
+ |------|------|
280
+ | `--auth <user\|tenant\|auto>` | 认证模式(默认:auto) |
281
+ | `--json` | JSON 格式输出 |
282
+ | `--lark` | 使用 Lark(国际版)域名 |
283
+ | `--help` | 显示帮助 |
284
+ | `-v, --version` | 显示版本号 |
285
+
286
+ ## 认证模式
287
+
288
+ | 模式 | Token 类型 | 适用场景 |
289
+ |------|-----------|----------|
290
+ | `user` | user_access_token | 个人文档、协作、搜索 |
291
+ | `tenant` | tenant_access_token | 应用管理的文档、CI/CD |
292
+ | `auto` | 自动选择最佳 | 默认 — 优先用户 token,回退到租户 token |
293
+
294
+ ## AI Agent 集成
295
+
296
+ ### Claude Code
297
+
298
+ 通过 [skills.sh](https://skills.sh) 安装 Skill(支持 Claude Code、Cursor、Codex 等 40+ Agent):
299
+
300
+ ```bash
301
+ npx skills add cliff-byte/feishu-docs-cli
302
+ ```
303
+
304
+ 或通过 CLI 直接安装:
305
+
306
+ ```bash
307
+ feishu-docs install-skill
308
+ ```
309
+
310
+ 安装后在 Claude Code 中使用 `/feishu-docs` 即可激活。
311
+
312
+ ### 其他 Agent
313
+
314
+ 将以下指令添加到 Agent 的系统提示词或配置中:
315
+
316
+ ```
317
+ 读取文档: feishu-docs read <url>
318
+ 搜索文档: feishu-docs search <关键词>
319
+ 浏览知识库: feishu-docs tree <space_id>
320
+ 批量读取: feishu-docs cat <space_id> --max-docs 10
321
+ 创建文档: feishu-docs create <标题> --wiki <space_id> --body <文件>
322
+ 更新文档: feishu-docs update <url> --body <文件>
323
+ 使用 --json 获取结构化输出。运行 feishu-docs --help 查看所有命令。
324
+ ```
325
+
326
+ ### 程序化调用
327
+
328
+ 所有命令输出到 stdout(结果)和 stderr(错误/警告)。退出码:
329
+
330
+ | 退出码 | 含义 |
331
+ |--------|------|
332
+ | 0 | 成功 |
333
+ | 1 | 参数错误 |
334
+ | 2 | 认证失败 |
335
+ | 3 | API 错误 |
336
+
337
+ 使用 `--json` 获取结构化输出,便于 Agent 解析。
338
+
339
+ ## 写入安全
340
+
341
+ 覆盖写入(`update` 不带 `--append`)自动执行:
342
+
343
+ 1. **备份** 当前文档到 `~/.feishu-docs/backups/`
344
+ 2. **清空** 后 **重写** 文档
345
+ 3. 写入失败时 **自动恢复** 备份
346
+ 4. **轮转** 备份文件(保留最近 10 份)
347
+
348
+ 飞书本身也维护版本历史 — 你随时可以在飞书客户端中回滚。
349
+
350
+ ## 开发
351
+
352
+ ```bash
353
+ git clone https://github.com/cliff-byte/feishu-docs-cli.git
354
+ cd feishu-docs-cli
355
+ npm install
356
+
357
+ # 类型检查
358
+ npm run build:check
359
+
360
+ # 构建(输出到 dist/)
361
+ npm run build
362
+
363
+ # 运行测试
364
+ npm test
365
+
366
+ # 从源码运行
367
+ npm run build && node bin/feishu-docs.js --help
368
+ ```
369
+
370
+ ### 项目结构
371
+
372
+ ```
373
+ src/
374
+ types/ # 共享 TypeScript 类型定义
375
+ commands/ # CLI 命令处理器
376
+ services/ # API 服务层
377
+ parser/ # Block 转 Markdown 解析器
378
+ utils/ # 校验、错误处理、URL 解析
379
+ test/ # 单元测试(node:test)
380
+ bin/ # CLI 入口(JS shim → dist/)
381
+ dist/ # 编译输出(不提交到 git)
382
+ ```
383
+
384
+ ## 路线图
385
+
386
+ - [x] 飞书云文档操作(读取、创建、更新、删除、详情)
387
+ - [x] 知识库操作(空间列表、目录树、批量读取、Wiki 管理、分享、搜索)
388
+ - [ ] 飞书多维表格操作
389
+ - [ ] 飞书电子表格操作
390
+
391
+ ## 限制
392
+
393
+ - **支持**:docx(新版文档)
394
+ - **嵌入内容**:电子表格(渲染为表格)、多维表格(渲染为表格)、画板/白板(导出为图片)
395
+ - **仅链接**:思维笔记(mindnote)
396
+ - **不支持**:doc(旧版格式)
397
+ - Markdown 转换有损(颜色、合并单元格、布局会丢失)。使用 `--blocks` 获取无损 JSON。
398
+ - 不支持图片写入(读取返回约 24 小时有效的临时 URL)
399
+
400
+ ## 许可证
401
+
402
+ MIT
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { run } from "../dist/cli.js";
4
+
5
+ run(process.argv.slice(2)).catch((err) => {
6
+ process.stderr.write(`feishu-docs: fatal: ${err.message}\n`);
7
+ process.exit(err.exitCode ?? 1);
8
+ });
package/dist/auth.d.ts ADDED
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Authentication module: OAuth login, token persistence, auto-refresh.
3
+ */
4
+ import type { AuthMode, AuthInfo, TokenData } from "./types/index.js";
5
+ interface StoredTokens {
6
+ appId: string;
7
+ tokens: TokenData & {
8
+ scope?: string;
9
+ };
10
+ }
11
+ interface OauthLoginOptions {
12
+ appSecret?: string;
13
+ scope?: string;
14
+ port?: number | string;
15
+ redirectUri?: string;
16
+ useLark?: boolean;
17
+ }
18
+ interface OAuthCallbackConfig {
19
+ redirectUri: string;
20
+ callbackHost: string;
21
+ callbackPath: string;
22
+ callbackPort: number;
23
+ }
24
+ interface BuildAuthorizationUrlOptions {
25
+ appId: string;
26
+ redirectUri: string;
27
+ state: string;
28
+ scope?: string;
29
+ useLark?: boolean;
30
+ codeChallenge?: string;
31
+ }
32
+ /**
33
+ * Save auth tokens to encrypted config file.
34
+ */
35
+ export declare function saveTokens(appId: string, tokenData: TokenData & {
36
+ scope?: string;
37
+ }): Promise<void>;
38
+ /**
39
+ * Load auth tokens from encrypted config file.
40
+ * Returns null if not found.
41
+ */
42
+ export declare function loadTokens(): Promise<StoredTokens | null>;
43
+ /**
44
+ * Clear saved auth tokens.
45
+ */
46
+ export declare function clearTokens(): Promise<void>;
47
+ /**
48
+ * Resolve credentials based on auth mode.
49
+ * Returns { mode, appId, appSecret, userToken }
50
+ */
51
+ export declare function resolveAuth(authMode?: AuthMode | string): Promise<AuthInfo>;
52
+ export declare function resolveOAuthCallbackConfig(options?: OauthLoginOptions): OAuthCallbackConfig;
53
+ /**
54
+ * Generate PKCE code_verifier and code_challenge (S256).
55
+ */
56
+ export declare function generatePkce(): {
57
+ codeVerifier: string;
58
+ codeChallenge: string;
59
+ };
60
+ export declare function buildAuthorizationUrl({ appId, redirectUri, state, scope, useLark, codeChallenge, }: BuildAuthorizationUrlOptions): string;
61
+ /**
62
+ * Run OAuth login flow (v2 OAuth with PKCE S256).
63
+ */
64
+ export declare function oauthLogin(appId: string, options?: OauthLoginOptions): Promise<TokenData>;
65
+ /**
66
+ * Acquire an exclusive file lock for token refresh.
67
+ * Returns a release function, or null if lock is held by another process.
68
+ */
69
+ export declare function acquireRefreshLock(): Promise<(() => Promise<void>) | null>;
70
+ /**
71
+ * Refresh user_access_token using refresh_token (v2 OAuth).
72
+ */
73
+ export declare function refreshUserToken(appId: string, appSecret: string, refreshToken: string, { useLark }?: {
74
+ useLark?: boolean;
75
+ }): Promise<TokenData>;
76
+ export {};