-
Notifications
You must be signed in to change notification settings - Fork 762
Expand file tree
/
Copy pathconfig.example.toml
More file actions
1678 lines (1549 loc) · 81.2 KB
/
config.example.toml
File metadata and controls
1678 lines (1549 loc) · 81.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# cc-connect configuration
# cc-connect 配置文件
#
# Copy this file to config.toml and fill in your credentials.
# 复制此文件为 config.toml,填入你的凭证信息。
#
# String values support ${VAR_NAME} environment variable substitution.
# Example: token = "${TELEGRAM_BOT_TOKEN}" / 所有字符串值都支持 ${VAR_NAME} 环境变量替换。
# 例如:token = "${TELEGRAM_BOT_TOKEN}"
#
# Each [[projects]] entry binds one code directory to its own agent + platforms.
# A single cc-connect process can manage multiple projects simultaneously.
# 每个 [[projects]] 将一个代码目录绑定到独立的 agent 和平台。
# 单个 cc-connect 进程可以同时管理多个项目。
# =============================================================================
# Global Settings / 全局设置
# =============================================================================
# Language for bot messages / 机器人消息语言
# - "en": English
# - "zh": 中文
# - "" (empty/not set): Auto-detect from user's first message / 留空自动检测
# language = "en"
# Session data storage directory (default: ~/.cc-connect)
# Stores conversation history and session state as JSON files.
# 会话数据存储目录(默认 ~/.cc-connect),以 JSON 文件保存对话历史和会话状态。
# data_dir = "/path/to/custom/dir"
# Attachment send-back switch for `cc-connect send --image/--file`.
# Independent from the agent's /mode. Set to "off" to block IM image/file send-back.
# `cc-connect send --message` without attachments is unaffected.
# 附件回传开关,用于控制 `cc-connect send --image/--file`。
# 它与 agent 的 /mode 独立;设为 "off" 会禁用通过 IM 回传图片/文件。
# 不带附件的 `cc-connect send --message` 不受影响。
# attachment_send = "on"
[log]
level = "info" # debug, info, warn, error
# =============================================================================
# Global Providers / 全局服务商
# =============================================================================
# Define providers once globally; projects reference them by name via provider_refs.
# 在此统一定义服务商,项目通过 provider_refs 按名称引用。
# This avoids duplicating API keys across projects.
# 避免在多个项目中重复配置 API Key。
#
# Remote presets URL (fetches recommended providers list from GitHub/Gitee)
# 远程预设列表 URL(从 GitHub/Gitee 拉取推荐服务商)
# provider_presets_url = "https://raw.githubusercontent.com/chenhg5/cc-connect/main/provider-presets.json"
# [[providers]]
# name = "anthropic"
# api_key = "${ANTHROPIC_API_KEY}"
# agent_types = ["claudecode"] # only for Claude Code projects
# [[providers]]
# name = "minimaxi-claude"
# api_key = "${MINIMAXI_API_KEY}"
# base_url = "https://api.minimaxi.chat/v1"
# agent_types = ["claudecode"]
# model = "claude-sonnet-4-20250514"
# [[providers]]
# name = "minimaxi-codex"
# api_key = "${MINIMAXI_API_KEY}"
# base_url = "https://api.minimaxi.chat/v1"
# agent_types = ["codex"]
# model = "MiniMax-M2.7"
# [[providers]]
# name = "dashscope"
# api_key = "${DASHSCOPE_API_KEY}"
# base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1"
# model = "glm-5.1"
# thinking = "disabled"
# =============================================================================
# Display Settings / 显示设置
# =============================================================================
# Controls how intermediate messages (thinking, tool use) are shown in chat.
# 控制中间消息(思考过程、工具调用)在聊天中的显示方式。
#
# Set to 0 to disable truncation (show full content).
# 设为 0 表示不截断(显示完整内容)。
# [display]
# mode = "full" # Display mode: "full" (default), "compact", or "quiet"
# # full: show thinking + tool messages as separate messages
# # 显示思考和工具消息,每条单独发送
# # compact: hide thinking/tool, each text segment sent separately
# # 隐藏思考和工具消息,每段文本独立发送
# # quiet: hide thinking/tool, all text in one card, done emoji at end
# # 隐藏思考和工具消息,所有文本合并到同一张卡片,完成后发送 done emoji
# thinking_messages = true # Show/hide thinking messages (default: true) / 是否显示思考消息(默认 true)
# thinking_max_len = 300 # Max chars for thinking messages (default: 300) / 思考消息最大字符数(默认 300)
# tool_max_len = 500 # Max chars for tool use messages (default: 500) / 工具调用消息最大字符数(默认 500)
# tool_messages = true # Show/hide tool progress messages (default: true) / 是否显示工具进度消息(默认 true)
# Per-project override: each [[projects]] entry may have its own [projects.display]
# block that overrides individual fields of the global [display] block above.
# Resolution order is per-field — set fields win, unset fields fall back to global,
# then to built-in defaults. Useful when one project should be quiet while others
# stay verbose, or vice versa.
# 每个 [[projects]] 条目可以有自己的 [projects.display] 块,逐字段覆盖全局
# [display]。已设字段优先,未设字段回落到全局值,再回落到默认值。
#
# [[projects]]
# name = "noisy-project"
# [projects.display]
# thinking_messages = false # Override only this field; others inherit from global
# tool_messages = false
# Agent idle timeout: max minutes between consecutive agent events before
# considering the session stuck. Set to 0 to disable the timeout entirely.
# Agent 空闲超时:两次 agent 事件之间的最大等待分钟数,超时则认为会话卡住。设为 0 禁用。
# idle_timeout_mins = 120 # default: 120 (2 hours) / 默认 120(2 小时)
# Auto-reset the active session after the user has been inactive for a while.
# Unlike idle_timeout_mins, this does not detect stuck agent execution. It
# rotates to a fresh cc-connect session when the user comes back after being idle.
# This avoids "context drift", where stale chat history (failed commands,
# debugging noise, abandoned tangents) gets re-ingested via --continue every
# time the workspace pool evicts the session, and starts to dominate the model's
# attention. The previous session is preserved and remains accessible via
# /list and /switch.
#
# Default: 30 minutes when unset. Set to 0 to opt out and always continue the
# previous session (the pre-default behavior).
# 用户长时间未发消息后,自动切换到一个新的活跃会话。
# 这与 idle_timeout_mins 不同:它不是检测 agent 卡住,而是用户回来后自动开始新会话。
# 默认值为 30 分钟(未设置时)。设为 0 可以禁用此行为,恢复始终继续上次会话。
# [[projects]]
# reset_on_idle_mins = 30 # default when unset / 未设置时的默认值;设为 0 表示禁用
# =============================================================================
# OS-user isolation via run_as_user (Linux/macOS only)
# 通过 run_as_user 实现 OS 用户隔离(仅限 Linux/macOS)
# =============================================================================
#
# Spawn a project's agent command under a different Unix user via
# `sudo -n -iu <user>`. This provides OS-level file-system isolation from
# the supervisor user that runs cc-connect itself, so a misbehaving agent
# cannot read files outside the target user's permission scope.
#
# Currently supported by: claudecode.
# Other agents use the supervisor user until migrated in a follow-up PR.
#
# Setup (one-time):
# 1. Create the target Unix user and install their tooling:
# sudo useradd -m -s /bin/bash partseeker-coder
# sudo -iu partseeker-coder
# # install claude CLI, set up ~/.claude/settings.json, PGSSL certs,
# # ~/.pgpass, plugin state, anything the agent needs.
# 2. Grant the supervisor user passwordless sudo to the target:
# # /etc/sudoers.d/cc-connect
# partseeker-orchestrator ALL=(partseeker-coder) NOPASSWD: ALL
# 3. Ensure the target user does NOT have passwordless sudo to anywhere
# else. `sudo -n -iu partseeker-coder -- sudo -n true` must fail.
# 4. Ensure the target user can read AND write the project's work_dir.
# 5. Run `cc-connect doctor user-isolation` to audit the setup before
# starting cc-connect.
#
# cc-connect refuses to start if any preflight gate fails (missing sudo,
# target can escalate, work_dir inaccessible) or if the isolation probe
# detects that the target user can read another user's secrets.
#
# [[projects]]
# name = "claude-sandboxed"
# run_as_user = "partseeker-coder"
# # Extra env vars to forward across the sudo boundary. The default
# # allowlist (PATH, LANG, LC_*, TERM) is always included; only list
# # names that the target user cannot reasonably set in their own shell
# # profile. Secrets belong in the target user's ~/.claude/settings.json
# # env block, NOT here.
# run_as_env = ["PGSSLROOTCERT", "PGSSLMODE"]
# =============================================================================
# Streaming Preview / 流式预览
# =============================================================================
# Real-time message preview: shows agent output as it streams, updating the
# message in-place (like a "typing" indicator). Supported on Telegram, Discord,
# and Feishu. The message is edited periodically until the final response is sent.
# 实时流式预览:Agent 输出时实时更新消息(类似"正在输入"效果)。
# 支持 Telegram、Discord 和飞书。消息会定期编辑,直到最终回复发送。
# [stream_preview]
# enabled = true # Enable/disable streaming preview (default: true) / 启用/禁用流式预览(默认 true)
# interval_ms = 1500 # Min ms between updates (default: 1500) / 更新最小间隔毫秒数(默认 1500)
# min_delta_chars = 30 # Min new chars before sending update (default: 30) / 发送更新前最少新增字符数(默认 30)
# max_chars = 2000 # Max preview length (default: 2000) / 预览最大长度(默认 2000)
# =============================================================================
# Rate Limiting / 速率限制
# =============================================================================
# Per-session sliding-window rate limiter. Prevents users from flooding the bot
# with too many messages. When exceeded, a friendly "slow down" message is sent.
# 每会话滑动窗口速率限制。防止用户刷消息。超限时返回友好的提示。
# [rate_limit]
# max_messages = 20 # Max messages per window; 0 = disabled (default: 20) / 窗口内最大消息数;0 = 禁用(默认 20)
# window_secs = 60 # Window size in seconds (default: 60) / 窗口时间秒数(默认 60)
# =============================================================================
# Outgoing Rate Limit / 出站速率限制
# Throttle how fast messages are sent TO platforms.
# Prevents account bans on platforms with strict API rate limits (e.g. WeChat Work).
# 限制向平台发送消息的速率,防止因频率过高被封号(如企业微信)。
# =============================================================================
# [outgoing_rate_limit]
# max_per_second = 0 # Global default msgs/sec; 0 = unlimited (default) / 全局默认每秒消息数;0 = 无限制
# burst = 3 # Max burst size; default = ceil(max_per_second) / 最大突发数量
# # For fractional rates (e.g. 0.2), default burst becomes ceil(max_per_second).
# Per-platform overrides / 每平台覆盖配置:
# [outgoing_rate_limit.platforms.wecom]
# max_per_second = 1
# [outgoing_rate_limit.platforms.telegram]
# max_per_second = 25
# [outgoing_rate_limit.platforms.feishu]
# max_per_second = 5
# =============================================================================
# Relay Settings / Relay 设置
# =============================================================================
# Bot-to-bot relay timeout. Controls how long cc-connect waits for the target
# bot to finish responding during `cc-connect relay send`.
# Bot 间 relay 超时。控制 `cc-connect relay send` 时等待目标 bot 完成回复的最长时间。
# [relay]
# timeout_secs = 120 # Max relay wait in seconds; 0 = disabled (default: 120) / relay 最大等待秒数;0 = 禁用(默认 120)
# =============================================================================
# Auto-Compress / 自动压缩
# =============================================================================
# Automatically trigger /compress when estimated token usage exceeds threshold.
# 当估算 token 超过阈值时自动触发 /compress。
#
# [projects.auto_compress]
# enabled = true
# max_tokens = 12000 # estimated token threshold to trigger compression
# min_gap_mins = 30 # minimum minutes between auto-compress runs (default 30)
# [projects.observe]
# enabled = true # Forward native terminal sessions to Slack
# channel = "C0AL13PN4BG" # Slack channel ID to post observations to
# =============================================================================
# Cron Settings / 定时任务设置
# =============================================================================
# Controls cron job behavior.
# 控制定时任务行为。
# [cron]
# silent = false # Suppress "⏰ task name" notification when cron starts (default: false)
# # 静默模式:不发送定时任务开始执行的通知消息(默认 false)
# session_mode = "reuse" # Default session mode for all cron jobs: "reuse" (default) or "new_per_run"
# # 定时任务默认会话模式:"reuse"(复用活跃会话)或 "new_per_run"(每次新建会话)
# =============================================================================
# Webhook / 外部 Webhook 端点
# =============================================================================
# Exposes an HTTP endpoint for external systems (git hooks, CI/CD, file watchers)
# to trigger agent prompts or shell commands.
# 暴露一个 HTTP 端点,供外部系统(git hook、CI/CD、文件监听)触发 agent 或 shell 命令。
#
# [webhook]
# enabled = true
# port = 9111 # Listen port (default: 9111) / 监听端口(默认 9111)
# token = "your-secret-token" # Shared secret for auth; empty = no auth / 认证密钥;为空则不验证
# path = "/hook" # URL path (default: "/hook") / URL 路径(默认 "/hook")
#
# Usage / 使用方式:
#
# # Trigger an agent prompt / 触发 agent 执行
# curl -X POST http://localhost:9111/hook \
# -H "Authorization: Bearer your-secret-token" \
# -H "Content-Type: application/json" \
# -d '{"session_key":"telegram:123:123","prompt":"review latest commit","event":"git:commit"}'
#
# # Execute a shell command / 执行 shell 命令
# curl -X POST http://localhost:9111/hook \
# -H "Authorization: Bearer your-secret-token" \
# -H "Content-Type: application/json" \
# -d '{"session_key":"telegram:123:123","exec":"git log -3 --oneline","event":"git:push"}'
#
# # Git post-commit hook example (.git/hooks/post-commit):
# # #!/bin/sh
# # MSG=$(git log -1 --pretty=format:"%s")
# # curl -sX POST http://localhost:9111/hook \
# # -H "Authorization: Bearer your-secret-token" \
# # -H "Content-Type: application/json" \
# # -d "{\"session_key\":\"telegram:123:123\",\"event\":\"git:commit\",\"prompt\":\"New commit: $MSG. Review it briefly.\"}"
# =============================================================================
# Bridge Platform (External Adapters via WebSocket)
# Bridge 平台(通过 WebSocket 接入外部适配器)
# =============================================================================
# Allow external adapters written in any language to connect at runtime.
# 允许使用任何语言编写的外部适配器在运行时动态接入。
# See docs/bridge-protocol.md for the full protocol specification.
# 完整协议规范请参阅 docs/bridge-protocol.md。
#
# [bridge]
# enabled = true
# port = 9810 # WebSocket listen port (default: 9810) / 监听端口
# token = "your-bridge-secret" # Auth token (required) / 认证密钥(必填)
# path = "/bridge/ws" # URL path (default: "/bridge/ws") / URL 路径
# =============================================================================
# Management API (External Management Tools)
# 管理 API(外部管理工具)
# =============================================================================
# HTTP REST API for external apps (web dashboards, TUI, GUI, Mac tray apps).
# 为外部应用(Web 管理面板、TUI、GUI、Mac 托盘应用)提供 HTTP REST API。
# See docs/management-api.md for the full API specification.
# 完整 API 规范请参阅 docs/management-api.md。
#
# [management]
# enabled = true
# port = 9820 # HTTP listen port (default: 9820) / 监听端口
# token = "your-mgmt-secret" # Auth token (required) / 认证密钥(必填)
# cors_origins = ["http://localhost:3000"] # Allowed CORS origins / 允许的 CORS 来源
# =============================================================================
# Hooks (Event Triggers / 事件钩子)
# =============================================================================
# Execute shell commands or send HTTP requests when lifecycle events occur.
# 在生命周期事件发生时执行 Shell 命令或发送 HTTP 请求。
#
# Supported events / 支持的事件:
# message.received — user message arrives / 用户消息到达
# message.sent — agent reply sent / Agent 回复发送完成
# session.started — agent session spawned / Agent 会话启动
# session.ended — agent session stopped / Agent 会话结束
# cron.triggered — cron job fires / 定时任务触发
# permission.requested — agent asks for permission / Agent 请求权限
# error — an error occurs / 发生错误
# * — match all events / 匹配所有事件
#
# Handler types / 处理器类型:
# command — run a shell command; event context in CC_HOOK_* env vars
# — 执行 Shell 命令;事件上下文通过 CC_HOOK_* 环境变量传递
# http — POST JSON to a URL with event payload
# — 向 URL 发送 POST JSON 请求,包含事件数据
#
# [[hooks]]
# event = "message.received"
# type = "command"
# command = "echo $CC_HOOK_USER_NAME >> /tmp/cc-messages.log"
# async = true # default true; set false to block until done
# timeout = 10 # seconds; default 10s for command, 5s for http
#
# [[hooks]]
# event = "error"
# type = "http"
# url = "https://my-server.com/cc-connect/on-error"
#
# [[hooks]]
# event = "*"
# type = "http"
# url = "https://my-server.com/cc-connect/events"
# =============================================================================
# Speech-to-Text (Voice Messages) / 语音转文字(语音消息)
# =============================================================================
# Enable to transcribe voice messages to text before sending to agents.
# 启用后,语音消息会先转为文字再发送给 Agent。
#
# Requires ffmpeg for audio format conversion (AMR/OGG → MP3).
# 需要安装 ffmpeg 进行音频格式转换(AMR/OGG → MP3)。
# [speech]
# enabled = true
# provider = "openai" # "openai", "groq", or "qwen" / "openai"、"groq" 或 "qwen"
# language = "" # e.g. "zh", "en"; empty = auto-detect / 如 "zh"、"en";留空自动检测
#
# [speech.openai]
# api_key = "sk-xxx" # OpenAI API key
# base_url = "" # optional: custom endpoint (OpenAI-compatible) / 可选:自定义端点(兼容 OpenAI 接口)
# model = "whisper-1" # default model / 默认模型
#
# # Alternative: Groq (faster, free tier available)
# # 备选:Groq(更快,有免费额度)
# [speech.groq]
# api_key = "gsk_xxx"
# model = "whisper-large-v3-turbo"
# =============================================================================
# Text-to-Speech (Voice Reply) / 文字转语音(语音回复)
# =============================================================================
# Enable to synthesize AI replies into voice messages sent back to users.
# 启用后,AI 的文字回复会合成为语音消息发送给用户。
#
# tts_mode:
# "voice_only" (default) - only reply with voice when user sends a voice message
# 仅当用户发送语音消息时,AI 才用语音回复
# "always" - always send a voice reply regardless of input type
# 无论用户发文字还是语音,AI 始终额外发一条语音回复
#
# Runtime command: /tts [always|voice_only]
# 运行时命令:/tts [always|voice_only]
#
# Requires ffmpeg for WAV → Opus conversion (needed by Feishu audio messages).
# 需要安装 ffmpeg 进行 WAV → Opus 转换(飞书语音消息要求 Opus 格式)。
# [tts]
# enabled = true
# provider = "qwen" # "qwen" | "openai" | "minimax"
# voice = "Cherry" # default voice / 默认音色(千问支持:Cherry/Serena/Ethan/Chelsie 等)
# tts_mode = "voice_only" # "voice_only" (default) | "always"
# max_text_len = 0 # max rune count before skipping TTS; 0 = no limit
# # 超过此长度则跳过 TTS;0 表示不限制
# # Qwen TTS 建议参考官方文档:https://help.aliyun.com/zh/model-studio/qwen-tts
# # OpenAI TTS 限制请参考:https://platform.openai.com/docs/guides/text-to-speech
#
# # Qwen TTS (Alibaba DashScope / 阿里百炼)
# [tts.qwen]
# api_key = "sk-xxx" # DashScope API key / 阿里百炼 API Key
# base_url = "" # optional: leave empty for default endpoint / 留空使用默认地址
# model = "qwen3-tts-flash" # "qwen3-tts-flash" | "qwen3-tts-instruct-flash"
#
# # Alternative: OpenAI TTS (OpenAI-compatible)
# # 备选:OpenAI TTS(兼容 OpenAI 接口)
# [tts.openai]
# api_key = "sk-xxx"
# base_url = "" # optional: custom endpoint / 可选:自定义端点
# model = "tts-1" # "tts-1" | "tts-1-hd"
#
# # Alternative: MiniMax TTS (T2A v2 streaming API)
# # 备选:MiniMax TTS(T2A v2 流式 API)
# # Docs: https://platform.minimaxi.com/document/T2A%20V2
# [tts.minimax]
# api_key = "your-minimax-api-key"
# base_url = "" # optional: default "https://api.minimax.io" / 留空使用默认地址
# model = "speech-2.8-hd" # "speech-2.8-hd" | "speech-2.8"
# =============================================================================
# Daemon Mode / 守护进程模式
# =============================================================================
# Run cc-connect as a background service (systemd user / launchd LaunchAgent).
# 将 cc-connect 作为后台服务运行(systemd 用户服务 / launchd LaunchAgent)。
#
# CLI: cc-connect daemon install|uninstall|start|stop|restart|status|logs
# Install: --log-file PATH, --log-max-size N (MB), --work-dir DIR, --force
# Logs: -f/--follow, -n N, --log-file PATH
# 配置均通过 CLI 参数,无需在此文件中设置。
# =============================================================================
# Custom Skills (Slash Commands) / 自定义命令
# =============================================================================
# Define reusable prompt templates as global slash commands (available in all projects).
# 定义可复用的 prompt 模板作为全局 slash 命令(所有项目通用)。
#
# Two types of commands are supported / 支持两种类型的命令:
# 1. Prompt commands — expand template and send to AI agent
# Prompt 命令 — 展开模板后发送给 AI Agent
# 2. Exec commands — execute shell command directly
# Exec 命令 — 直接执行 shell 命令
#
# Placeholders (for both prompt and exec) / 占位符(prompt 和 exec 都支持):
# {{1}}, {{2}} — positional argument / 位置参数
# {{1:default}} — positional with default value / 带默认值的位置参数
# {{2*}} — argument N and everything after / 第 N 个及之后所有参数
# {{2*:default}} — same, with default / 同上,带默认值
# {{args}} — all arguments / 所有参数
# {{args:default}} — all arguments, with default if none / 所有参数,无参数时使用默认值
# (no placeholder — args appended to end / 无占位符则参数追加到末尾)
#
# Default values are used when the corresponding argument is not provided.
# 当对应参数未提供时,使用默认值替代。
#
# Usage / 用法:
# /finduser 张三 → expands prompt with "张三" and sends to agent
# /push → executes "git push" directly
# [[commands]]
# name = "finduser"
# description = "Look up user info by name / 按姓名查找用户信息"
# prompt = "Search the database for user「{{1}}」and return details including registration time, last login, and permissions."
# [[commands]]
# name = "review"
# description = "Code review with focus area / 代码审查(可指定关注点)"
# prompt = "Please review {{1}} focusing on: {{2*:code quality and potential bugs}}"
# [[commands]]
# name = "translate"
# description = "Translate text to specified language / 翻译文本到指定语言"
# prompt = "Translate the following text to {{1:English}}:\n{{2*}}"
# [[commands]]
# name = "daily"
# description = "Generate daily progress report / 生成每日进度报告"
# prompt = "Summarize today's code changes and project progress. Generate a concise daily report."
# Exec commands - execute shell commands directly
# Exec 命令 — 直接执行 shell 命令
# [[commands]]
# name = "push"
# description = "Push to remote / 推送到远程"
# exec = "git push"
# [[commands]]
# name = "status"
# description = "Show git status / 显示 git 状态"
# exec = "git status {{args}}"
# [[commands]]
# name = "branch"
# description = "Create and checkout new branch / 创建并切换到新分支"
# exec = "git checkout -b {{1}}"
# [[commands]]
# name = "build"
# description = "Build the project / 构建项目"
# exec = "npm run build"
# work_dir = "/path/to/project" # Optional: override working directory / 可选:指定工作目录
#
# You can also add/remove commands at runtime via chat:
# 也可以在聊天中动态添加/删除命令:
# /commands add finduser Search the database for user「{{1}}」
# /commands addexec push git push
# /commands addexec --work-dir /path/to/project build npm run build
# /commands del finduser
# /commands — list all custom commands
#
# In addition, cc-connect auto-discovers .md files from the agent's commands
# directory (e.g. .claude/commands/*.md, .gemini/commands/*.md).
# 此外,cc-connect 还会自动发现 Agent 的 commands 目录下的 .md 文件。
# =============================================================================
# Banned Words / 违禁词
# =============================================================================
#
# Messages containing any of these words will be blocked and NOT forwarded to
# the AI agent. Matching is case-insensitive.
# 消息中包含以下任一违禁词时,将被拦截,不会转发给 AI Agent。匹配不区分大小写。
# banned_words = ["违禁词1", "违禁词2", "secret_project"]
# =============================================================================
# Command Aliases / 命令别名
# =============================================================================
#
# Create aliases for commands — like Linux shell aliases.
# 为命令创建别名,类似 Linux shell 的 alias。
#
# When a user sends a message matching the alias trigger (exact match on first
# word), it is automatically replaced with the target command.
# 当用户发送的消息首词匹配别名触发词时,自动替换为目标命令。
#
# Example: typing "帮助" triggers "/help", typing "新建 测试" triggers "/new 测试".
# 示例:输入"帮助"触发 "/help",输入"新建 测试"触发 "/new 测试"。
# [[aliases]]
# name = "帮助"
# command = "/help"
# [[aliases]]
# name = "新建"
# command = "/new"
# [[aliases]]
# name = "列表"
# command = "/list"
#
# You can also add/remove aliases at runtime via chat:
# 也可以在聊天中动态添加/删除别名:
# /alias add 帮助 /help
# /alias del 帮助
# /alias — list all aliases
#
# =============================================================================
# Multi-workspace Mode / 多工作区模式
# =============================================================================
# Single bot, multiple workspaces. Channel name maps to ~/workspace/<channel-name>
# automatically. Use /workspace init <url> to clone and bind a new repo.
# 单个 bot 服务多个工作区。频道名称自动映射到 ~/workspace/<频道名>。
# 使用 /workspace init <url> 克隆并绑定新仓库。
#
# [[projects]]
# name = "claude-multi"
# mode = "multi-workspace"
# base_dir = "~/workspace"
#
# [projects.agent]
# type = "claudecode"
#
# [projects.agent.options]
# mode = "yolo" # "default" | "acceptEdits" (edit) | "plan" | "auto" | "bypassPermissions" (yolo)
#
# [[projects.platforms]]
# type = "slack"
# [projects.platforms.options]
# bot_token = "xoxb-..."
# app_token = "xapp-..."
# =============================================================================
# Project 1 / 项目 1
# =============================================================================
[[projects]]
name = "my-backend"
# show_context_indicator = false # Hide the “[ctx: ~N%]” suffix on assistant replies (default: true / show)
# # 不在助手回复末尾显示「[ctx: ~N%]」上下文占用提示(默认 true 显示)
# reply_footer = false # Hide the Codex-like footer on assistant replies (default: true / show)
# # 不在助手回复底部显示类似 Codex 的状态行(默认 true 显示)
# disabled_commands = ["restart", "upgrade", "cron"] # Disable specific commands for this project
# # 禁用该项目的指定命令
#
# filter_external_sessions: when true, /list /switch /delete only show sessions
# created by cc-connect, hiding sessions from direct CLI usage in the same work_dir.
# Default false = show all sessions from the agent.
# filter_external_sessions = false
# filter_external_sessions:为 true 时,/list /switch /delete 仅显示由 cc-connect 创建的会话,
# 隐藏在相同 work_dir 下通过直接 CLI 创建的会话。默认 false = 显示 agent 的全部会话。
#
# admin_from controls who can run privileged commands (/dir, /shell, /restart, /upgrade, /commands addexec).
# admin_from 控制谁可以执行特权命令(/dir, /shell, /restart, /upgrade, /commands addexec)。
#
# 💡 TIP: Send /whoami or /status to the bot to get your User ID for allow_from / admin_from.
# 💡 提示:向机器人发送 /whoami 或者 /status 即可获取你的 User ID,用于填写 allow_from / admin_from。
#
# Not set (default): privileged commands are blocked for all users.
# 未设置(默认):所有用户均无法使用特权命令。
#
# Explicit user list: only these users can run privileged commands.
# 指定用户列表:仅这些用户可执行特权命令。
# admin_from = "user_id_1,user_id_2"
#
# ⚠️ RISK WARNING / 风险提示:
# Setting admin_from = "*" grants ALL allowed users full shell access to the host machine.
# Only use this for personal single-user deployments where you trust every allowed user.
# 设置 admin_from = "*" 将授予所有已允许的用户对主机的完整 shell 访问权限。
# 仅在个人单用户部署中使用此配置,确保所有允许的用户均可信任。
# admin_from = "*"
# Multi-user mode — per-user rate limits and role-based command ACL
# 多用户模式 — 按用户速率限制和基于角色的命令权限控制
#
# When [projects.users] is configured, each user is matched to a role.
# Roles control which commands are available and the rate limit for that user.
# If not configured, behavior is unchanged (backward compatible).
#
# 配置 [projects.users] 后,每个用户会被分配到一个角色。
# 角色控制该用户可用的命令和速率限制。未配置时行为不变(向后兼容)。
#
# [projects.users]
# default_role = "member"
#
# [projects.users.roles.admin]
# user_ids = ["platform_user_id_1", "platform_user_id_2"]
# disabled_commands = [] # no restrictions
# rate_limit = { max_messages = 50, window_secs = 60 }
#
# [projects.users.roles.member]
# user_ids = ["*"] # matches all unassigned users
# disabled_commands = ["*"] # disable all built-in commands
# rate_limit = { max_messages = 10, window_secs = 60 }
# Heartbeat — periodic awareness check / 心跳 — 周期性巡检
# The agent wakes up at a fixed interval to check the environment.
# Agent 会按固定间隔唤醒,检查环境状态。
#
# Unlike cron (precise scheduling, isolated tasks), heartbeat runs in the
# main session with full context — ideal for status monitoring and continuing
# unfinished work.
# 与 cron(精确调度、独立任务)不同,heartbeat 在主会话中运行并共享上下文
# —— 适合状态监控和继续未完成的工作。
#
# [projects.heartbeat]
# enabled = true
# interval_mins = 30 # Interval in minutes (default: 30) / 间隔分钟数(默认 30)
# session_key = "telegram:123:123" # Target session key (required) / 目标会话 key(必填)
# only_when_idle = true # Skip if session is busy (default: true) / 会话忙碌时跳过(默认 true)
# silent = true # Suppress "💓" notification (default: true) / 不发送心跳通知(默认 true)
# timeout_mins = 30 # Max execution time (default: 30) / 最大执行时间(默认 30 分钟)
# prompt = "check inbox and tasks" # Explicit prompt; if empty, reads HEARTBEAT.md from work_dir
# # 显式提示词;为空时从 work_dir 读取 HEARTBEAT.md
#
# HEARTBEAT.md example / HEARTBEAT.md 示例:
# On heartbeat:
# - check inbox
# - check background tasks
# - continue unfinished work
[projects.agent]
type = "claudecode"
[projects.agent.options]
work_dir = "/path/to/backend"
mode = "default" # "default" | "acceptEdits" (edit) | "plan" | "auto" | "bypassPermissions" (yolo)
# Mode options / 模式说明:
# - "default": Every tool call requires user approval. / 每次工具调用都需要用户确认。
# - "acceptEdits" (edit): File edit tools auto-approved; other tools still ask. / 文件编辑自动通过,其他仍需确认。
# - "plan": Claude only plans — no execution until you approve. / 只做规划不执行,审批后再执行。
# - "auto": Claude automatically decides when a permission prompt is needed. / Claude 自动判断何时需要确认。
# - "bypassPermissions" (yolo): All tool calls auto-approved. Use with caution. / 全部自动通过,请谨慎使用。
# - "dontAsk" (dont-ask): Auto-deny tools unless pre-approved via allowed_tools or settings allow rules. / 未预授权的工具自动拒绝,安全推荐。
#
# When using IM platforms, you can reply "允许"/"allow" to grant permission.
# 在 IM 平台中,可回复"允许"或"allow"来授权操作。
# Optional: set reasoning effort level (passed to claude --effort)
# 可选:设置推理强度等级(传递给 claude --effort)
# reasoning_effort = "high" # "low" | "medium" | "high" | "max"
# In default/acceptEdits mode, you can pre-approve specific tools:
# 在 default/acceptEdits 模式下,可预授权特定工具:
# allowed_tools = ["Read", "Grep", "Glob", "Bash", "Edit", "Write"]
# You can also disallow specific tools (passed to --disallowedTools):
# 也可以禁用特定工具(传递给 --disallowedTools):
# disallowed_tools = ["WebSearch", "WebFetch"]
# Optional: specify a custom system prompt / 可选:指定自定义系统提示
# system_prompt = "You are a helpful AI assistant that specializes in Python development."
# Optional: specify a model / 可选:指定模型
# model = "claude-sonnet-4-20250514"
# Optional: per-project environment variables injected into Claude Code sessions.
# This allows different projects to use different model providers (Kimi, Mimo, DeepSeek, etc.)
# without modifying global ~/.claude/settings.json.
# 可选:为每个项目单独配置环境变量,注入到 Claude Code 会话中。
# 这样不同项目可以使用不同的模型供应商,无需修改全局的 ~/.claude/settings.json。
#
# [projects.agent.options.env]
# ANTHROPIC_BASE_URL = "https://api.kimi.com/coding"
# ANTHROPIC_AUTH_TOKEN = "sk-kimi-xxx"
# ANTHROPIC_MODEL = "K2.6"
# ANTHROPIC_REASONING_MODEL = "K2.6"
# ANTHROPIC_DEFAULT_HAIKU_MODEL = "K2.6"
# ANTHROPIC_DEFAULT_SONNET_MODEL = "K2.6"
# ANTHROPIC_DEFAULT_OPUS_MODEL = "K2.6"
# Claude Code Router Integration / Claude Code Router 集成
# Route Claude Code requests through Claude Code Router to use different model providers.
# 通过 Claude Code Router 路由 Claude Code 请求,使用不同的模型提供商。
# See: https://github.com/musistudio/claude-code-router
#
# router_url = "http://127.0.0.1:3456" # Claude Code Router URL (default: http://127.0.0.1:3456)
# router_api_key = "your-router-api-key" # Optional: API key if router requires authentication / 可选:如果 router 需要认证
#
# When router_url is set, cc-connect will automatically:
# 设置 router_url 后,cc-connect 会自动:
# - Set ANTHROPIC_BASE_URL to router_url
# - Set NO_PROXY=127.0.0.1 to prevent proxy interference
# - Disable telemetry and cost warnings for cleaner integration
#
# Note: When using router, provider settings below are ignored as the router handles model selection.
# 注意:使用 router 时,下方的 provider 设置将被忽略,因为 router 负责模型选择。
# Active provider (matches a name in [[projects.agent.providers]] or provider_refs)
# 当前激活的 provider(对应下方 providers 或 provider_refs 中的 name)
# provider = "anthropic"
# Reference global [[providers]] by name — avoids duplicating keys per project
# 引用全局 [[providers]] — 避免每个项目重复配置
# provider_refs = ["minimaxi", "dashscope"]
# API Providers — switch between them via /provider command in chat
# or via CLI: cc-connect provider add --project my-backend --name relay --api-key sk-xxx
# API Provider 管理 — 可通过聊天命令 /provider 或 CLI 命令切换
#
# [[projects.agent.providers]]
# name = "anthropic"
# api_key = "sk-ant-xxx"
#
# [[projects.agent.providers]]
# name = "relay"
# api_key = "sk-xxx"
# base_url = "https://api.relay-service.com"
# model = "claude-sonnet-4-20250514"
# # Optional: pre-configure available models shown by /model command (alias - model)
# # /model switch [alias] switches to the model; omit to auto-fetch from the API.
# # 可选:预先配置 /model 命令显示的可用模型列表,格式为 alias - model
# # 使用 /model switch [alias] 切换模型;留空则自动从 API 获取
# [[projects.agent.providers.models]]
# model = "claude-sonnet-4-20250514"
# alias = "sonnet"
# [[projects.agent.providers.models]]
# model = "claude-opus-4-20250514"
# alias = "opus"
# [[projects.agent.providers.models]]
# model = "claude-haiku-3-5-20241022"
# alias = "haiku"
#
# # Third-party provider with thinking override / 第三方 Provider 并覆盖 thinking 参数
# # Some providers (e.g. SiliconFlow) don't support Claude's adaptive thinking.
# # Set thinking = "disabled" to auto-rewrite via a local proxy.
# # 部分第三方 Provider(如硅基流动)不支持 Claude 的 adaptive thinking,
# # 设置 thinking = "disabled" 后 cc-connect 会通过本地代理自动改写请求。
# [[projects.agent.providers]]
# name = "siliconflow"
# api_key = "sk-xxx"
# base_url = "https://api.siliconflow.cn"
# model = "deepseek-ai/DeepSeek-V3"
# thinking = "disabled"
#
# # MiniMax — OpenAI-compatible provider with 1M context window
# # MiniMax — 兼容 OpenAI 接口的大模型,支持 1M 超长上下文
# # Models: MiniMax-M2.7 (flagship, 1M context), MiniMax-M2.7-highspeed, MiniMax-M2.5, MiniMax-M2.5-highspeed
# # Docs: https://platform.minimaxi.com
# [[projects.agent.providers]]
# name = "minimax"
# api_key = "your-minimax-api-key"
# base_url = "https://api.minimax.io/v1"
# model = "MiniMax-M2.7"
# thinking = "disabled"
# [[projects.agent.providers.models]]
# model = "MiniMax-M2.7"
# alias = "m27"
# [[projects.agent.providers.models]]
# model = "MiniMax-M2.7-highspeed"
# alias = "m27fast"
# [[projects.agent.providers.models]]
# model = "MiniMax-M2.5"
# alias = "m25"
# [[projects.agent.providers.models]]
# model = "MiniMax-M2.5-highspeed"
# alias = "m25fast"
#
# # For special setups (Bedrock, Vertex, etc.), use the env map:
# # 特殊环境(Bedrock、Vertex 等)使用 env 字段:
# [[projects.agent.providers]]
# name = "bedrock"
# env = { CLAUDE_CODE_USE_BEDROCK = "1", AWS_PROFILE = "bedrock" }
# Reference normalization and rendering / 本地引用标准化与展示优化
# Disabled by default. When enabled, cc-connect can normalize Codex / Claude Code
# local file references (paths, line refs, markdown file links) and re-render them
# into a more readable platform-friendly form before sending to supported IMs.
# 默认关闭。启用后,cc-connect 可对 Codex / Claude Code 的本地文件引用
# (路径、行号引用、Markdown 文件链接)做标准化,并在发送到支持的平台前
# 重新渲染为更易读的展示形式。
#
# Supported today / 当前已支持:
# normalize_agents: codex | claudecode | all
# render_platforms: feishu | weixin | all
# Note: render depends on normalize. If normalize_agents is empty, render_platforms
# alone has no effect.
# 注意:render 依赖 normalize。若 normalize_agents 为空,仅设置 render_platforms 不生效。
#
# [projects.references]
# normalize_agents = ["codex", "claudecode"]
# render_platforms = ["feishu", "weixin"]
# display_path = "dirname_basename" # absolute | relative | basename | dirname_basename | smart
# marker_style = "emoji" # none | ascii | emoji
# enclosure_style = "code" # none | bracket | angle | fullwidth | code
# Feishu / Lark / 飞书
# 1. Create an app at https://open.feishu.cn / 在 https://open.feishu.cn 创建应用
# 2. Enable Bot capability / 开启机器人能力
# 3. Add im.message.receive_v1 event, select WebSocket long-connection mode
# 添加 im.message.receive_v1 事件,选择 WebSocket 长连接模式
# 4. Fill in app_id and app_secret below / 填入下方 app_id 和 app_secret
# Quick setup via CLI:
# cc-connect feishu setup --project <project_name>
# (可通过 CLI 快速配置:cc-connect feishu setup --project <project_name>)
# Note: No WebSocket URL needed — the SDK auto-negotiates the connection.
# 注意:无需配置 WebSocket URL,SDK 会自动通过凭证建立连接。
[[projects.platforms]]
type = "feishu"
[projects.platforms.options]
app_id = "your-feishu-app-id"
app_secret = "your-feishu-app-secret"
# domain = "https://open.feishu.cn" # Optional runtime API/WebSocket base URL override / 可选:运行时 API/WebSocket 域名覆盖
# enable_feishu_card = true # Enable Feishu interactive cards (default: true); set false to force plain-text replies
# # 启用飞书交互式卡片(默认 true);设为 false 时强制回退纯文本回复
# allow_from = "*" # Allowed user open_ids, comma-separated; "*" = all (default). Use /whoami to get your open_id.
# # 允许的用户 open_id,逗号分隔;"*" 表示所有(默认)。发送 /whoami 获取你的 open_id。
# allow_chat = "*" # Allowed group chat_ids, comma-separated; "*" = all (default). Find chat_id in group settings.
# # 允许的群聊 chat_id,逗号分隔;"*" 表示所有(默认)。在群设置中查看 chat_id。
# group_only = false # If true, only respond to group chat messages; ignore private (P2P) messages (default: false)
# # 设为 true 时,仅响应群聊消息,忽略私聊(P2P)消息(默认 false)
# reaction_emoji = "OnIt" # Emoji reaction on incoming messages (default: "OnIt"); set to "none" to disable
# # 收到消息时添加的表情回复(默认 "OnIt");设为 "none" 可禁用
# done_emoji = "none" # Emoji reaction when agent finishes a reply (e.g. "Done"); set to "none" to disable
# # Agent 完成回复后添加的表情回复(如 "Done");设为 "none" 可禁用
# group_reply_all = false # If true, respond to ALL group messages without requiring @mention
# # 设为 true 时,群聊中无需 @机器人 也会响应所有消息(默认 false)
# share_session_in_channel = false # If true, all users in a group share one agent session
# # 设为 true 时,群聊内所有用户共享同一个 Agent 会话
# thread_isolation = false # If true, group messages use Feishu reply threads as session boundaries (one thread/root = one agent session)
# # 设为 true 时,群聊按飞书话题/根消息隔离会话(一个 thread/root 对应一个 Agent 会话)
# reply_to_trigger = true # Default: bot uses “reply to message” API (quotes the user’s message). Set false to post plain chat messages instead.
# # 默认 true:用「回复消息」API(引用用户消息)。设为 false 则在会话里发普通消息、不引用触发消息。
# progress_style = "legacy" # Progress rendering style: legacy | compact | card
# # 进度消息展示风格:legacy(逐条消息)| compact(单消息持续更新)| card(结构化卡片)
# resolve_mentions = false # Auto-resolve @name in outgoing messages to Feishu at tags by matching group member names
# # 自动将发出消息中的 @显示名 替换为飞书 at 标签(通过匹配群成员名称)
# Lark (International Version) / Lark 国际版
# Lark now supports WebSocket long-connection too; webhook mode is only needed
# when you explicitly configure encrypt_key.
# Lark 国际版现已支持 WebSocket 长连接;只有显式配置 encrypt_key 时才需要 Webhook 模式。
# 1. Create an app at https://open.larksuite.com / 在 https://open.larksuite.com 创建应用
# 2. Enable Bot capability / 开启机器人能力
# 3. Add im.message.receive_v1 event and enable WebSocket long-connection mode (recommended)
# 添加 im.message.receive_v1 事件,并启用 WebSocket 长连接模式(推荐)
# 4. Fill in app_id and app_secret below; port/callback_path are only used for webhook mode
# 填入下方 app_id 和 app_secret;port/callback_path 仅在 Webhook 模式下使用
# [[projects.platforms]]
# type = "lark"
#
# [projects.platforms.options]
# app_id = "your-lark-app-id"
# app_secret = "your-lark-app-secret"
# domain = "https://open.larksuite.com" # Optional runtime API base URL override / 可选:运行时 API 域名覆盖
# port = "8080" # Webhook server port / Webhook 服务器端口
# callback_path = "/feishu/webhook" # Webhook callback path / Webhook 回调路径
# encrypt_key = "" # Event encrypt key (optional) / 事件加密密钥(可选)
# enable_feishu_card = true
# allow_from = "*"
# reaction_emoji = "OnIt"
# done_emoji = "none"
# progress_style = "legacy" # legacy | compact | card
# DingTalk / 钉钉 (uncomment to enable / 取消注释以启用)
# 1. Create an app at https://open-dev.dingtalk.com / 在钉钉开放平台创建应用
# 2. Under "App Features > Bot", enable bot and select Stream mode
# 在"应用功能 > 机器人"中启用机器人并选择 Stream 模式
# 3. Fill in client_id (AppKey) and client_secret (AppSecret) below
# 填入下方 client_id (AppKey) 和 client_secret (AppSecret)
# [[projects.platforms]]
# type = "dingtalk"
#
# [projects.platforms.options]
# client_id = "your-dingtalk-client-id"
# client_secret = "your-dingtalk-client-secret"
# allow_from = "*" # Allowed staff IDs / 允许的员工 ID
# share_session_in_channel = false # If true, all users in a group share one agent session / 群聊共享会话
# Telegram (uncomment to enable / 取消注释以启用)
# 1. Message @BotFather on Telegram, send /newbot to create a bot
# 在 Telegram 中找 @BotFather,发送 /newbot 创建机器人
# 2. Copy the bot token below / 复制 token 到下方
# Connection: Long polling (no public URL needed) / 长轮询(无需公网 IP)
# [[projects.platforms]]
# type = "telegram"
#
# [projects.platforms.options]
# token = "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"
# allow_from = "*" # Allowed Telegram user IDs, e.g. "123456789,987654321"; "*" = all
# # 允许的 Telegram 用户 ID,如 "123456789,987654321";"*" 表示所有
# group_reply_all = false # If true, respond to ALL group messages without @mention / 设为 true 群聊无需 @ 也响应
# share_session_in_channel = false # If true, all users in a group share one agent session / 群聊共享会话
# enable_reactions = false # If true, add ⚡ reaction to incoming messages / 设为 true 收到消息时添加 ⚡ 表情
# MAX messenger (uncomment to enable / 取消注释以启用)
# 1. Create a bot via @MasterBot in MAX, get the access token
# 在 MAX 中通过 @MasterBot 创建机器人,获取 access token
# 2. Paste the token below / 填入下方 token
# Connection: long-poll by default; webhook supported (see docs/max-webhook.md)
# 默认长轮询;如需 webhook 模式见 docs/max-webhook.md
# [[projects.platforms]]
# type = "max"
#
# [projects.platforms.options]
# token = "your-max-bot-token"
# allow_from = "*" # Allowed MAX user IDs, e.g. "66624886,12345678"; "*" = all
# # 允许的 MAX 用户 ID,如 "66624886,12345678";"*" 表示所有
# api_base = "https://platform-api.max.ru" # optional override / 可选覆盖默认 API
#
# --- Webhook mode (optional) ---
# Set webhook_url to switch from long-poll to webhook. Required for high-traffic
# bots since MAX throttles long-poll to 2 RPS from 2026-05-11.
# 设置 webhook_url 即切换为 webhook 模式(高流量场景必需,MAX 自 2026-05-11 起限制长轮询为 2 RPS)
# Full guide with nginx/Caddy/systemd samples: docs/max-webhook.md
# webhook_url = "https://bot.example.com/webhook"
# webhook_listen = "127.0.0.1:8090" # bot binds here; reverse proxy in front
# webhook_path = "/webhook" # default; must match the path in webhook_url
# webhook_secret = "long-random-string" # optional; checked via X-Webhook-Secret header or ?s= query
# Slack (uncomment to enable / 取消注释以启用)
# 1. Create an app at https://api.slack.com/apps / 创建应用
# 2. Enable Socket Mode (Settings > Socket Mode) / 开启 Socket Mode
# 3. Subscribe to bot events: message.channels, message.im
# 订阅事件:message.channels, message.im
# 4. Install app to workspace, copy Bot Token (xoxb-...) and App Token (xapp-...)
# 安装应用到工作区,复制 Bot Token 和 App Token
# Connection: Socket Mode WebSocket (no public URL needed) / 无需公网 IP
# [[projects.platforms]]
# type = "slack"