forked from itismyfield/AgentDesk
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathagentdesk.example.yaml
More file actions
528 lines (497 loc) · 20.7 KB
/
Copy pathagentdesk.example.yaml
File metadata and controls
528 lines (497 loc) · 20.7 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
server:
port: 8791
host: "0.0.0.0"
cluster:
enabled: false
# Optional operator-owned settings per node. Keys match worker `instance_id`
# first, then hostname for dispatch caps. Authenticated session forwarding is
# fail-closed: `trusted_forward_origin` must exactly match the worker's
# advertised `cluster.api_base_url`; advertisements never become a trust root.
# Configure every node before enabling forwarding capabilities. Origins use
# HTTPS by default, have path `/`, and contain no userinfo, query, or fragment.
nodes:
example-main-node:
max_concurrent_dispatches: 4
trusted_forward_origin: "https://main.example.net:8791"
example-worker-node:
max_concurrent_dispatches: 4
# Private RFC1918, IPv6 ULA, and Tailscale CGNAT addresses require this
# node-specific opt-in. Loopback, link-local, metadata, unspecified,
# multicast, and deprecated IPv6 site-local fec0::/10 targets remain
# blocked on every transport even when the opt-in is true.
trusted_forward_origin: "https://worker.tailnet.example:8791"
allow_private_forwarding: true
# Cleartext HTTP exposes the shared bearer to the private network. Use only
# for an operator-controlled private/Tailscale development origin, and only
# together with allow_private_forwarding. HTTP to public or mixed DNS is
# always rejected. HTTPS private forwarding does not need this flag.
# allow_insecure_http_forwarding: true
blackout_windows:
example-main-node:
- start: "23:00"
end: "23:30"
reason: "maintenance"
dispatch_routing:
wait_timeout_secs: 600
wake_interval_secs: 30
# Intake routing is opt-in. Keep disabled until worker nodes advertise
# intake_worker capability and the operator is ready to test observe/enforce.
intake_routing:
enabled: false
mode: "observe"
# Raw top-level Discord channel IDs. PR-1 uses this allowlist only to tag
# planner telemetry; owner-authority enforcement remains unchanged.
owner_authority_channel_ids: []
forward_pre_claim_timeout_secs: 12
stale_claim_recovery_secs: 60
max_attempts_per_message: 5
retry_authorization_secs: 300
# #4351. The gateway node is the node every conversational tmux session runs
# on. Left unset, the Discord gateway lease is pure first-come, so restart
# ordering silently decides where sessions live. Set it to pin the gateway to
# one instance: a non-preferred node yields the lease when this node is
# online, and takes it when this node is offline (failover is unchanged).
# gateway_preferred_instance_id: "mac-book-release"
# gateway_yield_grace_secs: 90
discord:
guild_id: "YOUR_GUILD_ID"
owner_id: "YOUR_DISCORD_USER_ID"
# Optional recipients that every scheduled Discord push must mention.
# Request-specific discordMentionUserIds are preserved and appended.
# scheduled_message_required_mention_user_ids:
# - "123456789012345678"
bots:
command:
token: "YOUR_COMMAND_BOT_TOKEN"
provider: "claude"
auth:
allowed_channel_ids:
- "123456789012345678"
require_mention_channel_ids:
- "223456789012345678"
allowed_user_ids:
- "123456789012345678"
notify:
token: "YOUR_NOTIFY_BOT_TOKEN"
providers:
claude:
# Default Claude runtime for AgentDesk: `pipe` — the legacy
# `claude -p` tmux-wrapper path. Operators must explicitly opt
# into the alternative runtimes:
# - `runtime: tui` → long-running interactive Claude TUI
# inside a tmux pane (keystroke relay).
# Also enabled implicitly when only
# `tui_hosting: true` is set and no
# `runtime` field is present (back-compat).
# - `runtime: claude-e` → per-turn `claude-e` PTY adapter.
# Requires `npm install -g claude-e`
# on the host.
# See `docs/claude-e-rollout/operator-guide.md` for toggle
# mechanics and rollback contract.
runtime: pipe
tui_hosting: true
#
# NOTE: `providers.claude.runtime` is unrelated to the top-level
# `runtime:` section near the bottom of this file (which controls
# turn/stale timeouts). Always refer to this field by its full path
# `providers.<provider>.runtime` (or `agents[].channels.<kind>.runtime`
# for the per-channel override) to avoid confusion.
codex:
tui_hosting: true
qwen:
tui_hosting: false
gemini:
tui_hosting: false
opencode:
tui_hosting: false
voice:
# Enables Discord voice capture, transcription, and TTS paths.
enabled: false
# When false (default), utterance/segment wav files and transcript sidecars are
# deleted after each utterance is fully processed (STT done, transcript routing
# complete, turn dispatched), and any pre-existing wav under
# `audio.recordings_dir/{utterances,segments}` is GC-ed on startup. Set to true
# only for STT-quality debugging.
# Override precedence: env `ADK_VOICE_KEEP_WAV=1`/`0` (when set) wins over this
# YAML value, so operators can flip retention on/off without editing config.
keep_recordings: false
audio:
# Directory for captured voice clips before transcription.
recordings_dir: "~/.adk/voice/recordings"
# Directory for persisted transcription text and metadata.
transcripts_dir: "~/.adk/voice/transcripts"
# Directory for generated edge-tts audio cache files.
tts_cache_dir: "~/.adk/voice/tts-cache"
# Directory for short-lived conversion and buffering files.
temp_dir: "~/.adk/voice/tmp"
stt:
# STT mode. Default `file` preserves the existing utterance-final workflow.
# Set to `stream` to feed live PCM into whisper.cpp overlap windows while
# keeping partial transcripts internal-only.
mode: file
# ffmpeg executable name or absolute path.
ffmpeg_command: "ffmpeg"
# whisper.cpp CLI executable name or absolute path.
whisper_command: "whisper-cli"
# whisper.cpp model used for Korean STT.
model_path: "~/.adk/voice/models/ggml-large-v3-turbo.bin"
# whisper.cpp language code.
language: "ko"
stream:
# Decode cadence for overlap streaming.
step_ms: 500
# Recent audio context decoded on each step.
length_ms: 5000
# Audio retained across windows.
keep_ms: 200
tts:
# TTS backend selector. Currently supported: edge.
backend: edge
# Stable cache for short progress utterances.
progress_cache_dir: ".cache/voice-tts-progress"
edge:
# edge-tts executable name or absolute path.
command: "edge-tts"
# Korean default voice used for AgentDesk spoken responses.
voice: "ko-KR-SunHiNeural"
# edge-tts rate argument, e.g. +0%, -10%, +15%.
rate: "+0%"
thresholds:
# Mean-volume floor (dBFS) for the STT speech-vs-silence gate: utterances
# whose mean volume is below this (and whose peak is below the internal
# -12 dB max floor) are treated as silence and skipped before whisper.
# Lower it to transcribe quieter speech; raise it to drop more background
# noise. This is the effective gate default.
speech_start_db: -35.0
idle:
# Silence after a PCM burst before closing the current segment file.
segment_idle_ms: 2200
# Silence after an utterance before finalizing the transcript.
utterance_idle_ms: 4500
# Empty voice-channel duration before disconnecting.
channel_idle_disconnect_secs: 300
# Time to keep listening for a command after a wake word.
wake_listen_window_secs: 8
barge_in:
# Enables live playback cut and processing-time stop/defer decisions.
enabled: true
# normal cuts faster; conservative requires louder sustained speech.
sensitivity: normal
# Conservative sensitivity automatically returns to normal after 15 minutes.
conservative_ttl_secs: 900
# Speak a short acknowledgement before draining merged deferred utterances.
acknowledgement_enabled: true
acknowledgement_text: "그동안 말씀하신 거 같이 정리해서 작업할게요."
# Wake words or phrases that activate voice commands.
wake_words:
- "agentdesk"
# Discord user IDs allowed to invoke voice commands.
allowed_user_ids:
- "YOUR_DISCORD_USER_ID"
# Single hands-free lobby voice channel. Agent aliases route utterances from here.
lobby_channel_id: "YOUR_VOICE_LOBBY_CHANNEL_ID"
# Alias-free follow-up window for the last routed lobby agent.
active_agent_ttl_seconds: 180
# Voice channel IDs that should be joined automatically on startup.
# The lobby channel is auto-joined automatically when configured.
auto_join_channel_ids: []
shared_prompt: "~/.adk/release/config/agents/_shared.prompt.md"
# 런타임 MCP 서버 카탈로그입니다. 기본값은 비어 있으며, MEMENTO_ACCESS_KEY가 있으면 memento가 자동 보강됩니다.
# Codex/OpenCode/Qwen/Gemini MCP 설정 동기화와 Claude MCP 인자 생성에 필요할 때만 추가하세요.
# mcp_servers:
# example-server:
# url: "http://127.0.0.1:8765/mcp"
# auth:
# type: bearer
# token_env_var: "EXAMPLE_MCP_TOKEN"
# 리뷰 계열 dispatch에서 MCP 서버를 슬림 모드로 남길 추가 allowlist입니다.
# 기본 allowlist에는 memento/github/filesystem/rg/apply_patch 계열이 포함되고, 여기는 빈 목록이 기본값입니다.
# review_mcp_allowlist:
# - "example-server"
agents:
- id: ch-td
name: "TD"
name_ko: "테크니컬 디렉터"
provider: claude
channels:
claude:
id: "123456789012345678"
name: "td-cc"
workspace: "~/.adk/release/workspaces/ch-td"
prompt_file: "~/.adk/release/config/agents/ch-td.prompt.md"
codex:
id: "223456789012345678"
name: "td-cdx"
workspace: "~/.adk/release/workspaces/ch-td"
prompt_file: "~/.adk/release/config/agents/ch-td.prompt.md"
opencode:
id: "323456789012345678"
name: "td-oc"
workspace: "~/.adk/release/workspaces/ch-td"
prompt_file: "~/.adk/release/config/agents/ch-td.prompt.md"
keywords:
- "아키텍처"
- "코드"
department: engineering
# ─── Multi-provider Discord E2E cells ────────────────────────────────
# Each worker owns one (provider, runtime) cell and one channel under
# the `ADK E2E` Discord category. Channel IDs below are placeholders —
# `scripts/setup-multi-provider-e2e.sh` provisions the real category +
# channels through the announce bot and emits the ids to paste in.
# The orchestrator drives fan-out by `send-to-agent` to each worker.
- id: adk-claude-pipe-e2e
name: "ADK Claude pipe E2E"
name_ko: "ADK Claude pipe E2E"
provider: claude
channels:
claude:
id: "PLACEHOLDER_ADK_CLAUDE_PIPE_E2E"
name: "adk-claude-pipe-e2e"
workspace: "~/.adk/release/workspaces/adk-claude-pipe-e2e"
prompt_file: "~/.adk/release/config/agents/adk-claude-pipe-e2e.prompt.md"
runtime: pipe
keywords: ["e2e", "claude", "pipe"]
department: devsecops
- id: adk-claude-tui-e2e
name: "ADK Claude tui E2E"
name_ko: "ADK Claude tui E2E"
provider: claude
channels:
claude:
id: "PLACEHOLDER_ADK_CLAUDE_TUI_E2E"
name: "adk-claude-tui-e2e"
workspace: "~/.adk/release/workspaces/adk-claude-tui-e2e"
prompt_file: "~/.adk/release/config/agents/adk-claude-tui-e2e.prompt.md"
runtime: tui
keywords: ["e2e", "claude", "tui"]
department: devsecops
- id: adk-claude-e-e2e
name: "ADK Claude-e E2E"
name_ko: "ADK Claude-e E2E"
provider: claude
channels:
claude:
id: "PLACEHOLDER_ADK_CLAUDE_E_E2E"
name: "adk-claude-e-e2e"
workspace: "~/.adk/release/workspaces/adk-claude-e-e2e"
prompt_file: "~/.adk/release/config/agents/adk-claude-e-e2e.prompt.md"
runtime: claude-e
keywords: ["e2e", "claude", "claude-e"]
department: devsecops
- id: adk-codex-pipe-e2e
name: "ADK Codex pipe E2E"
name_ko: "ADK Codex pipe E2E"
provider: codex
channels:
codex:
id: "PLACEHOLDER_ADK_CODEX_PIPE_E2E"
name: "adk-codex-pipe-e2e"
workspace: "~/.adk/release/workspaces/adk-codex-pipe-e2e"
prompt_file: "~/.adk/release/config/agents/adk-codex-pipe-e2e.prompt.md"
runtime: pipe
keywords: ["e2e", "codex", "pipe"]
department: devsecops
- id: adk-codex-tui-e2e
name: "ADK Codex tui E2E"
name_ko: "ADK Codex tui E2E"
provider: codex
channels:
codex:
id: "PLACEHOLDER_ADK_CODEX_TUI_E2E"
name: "adk-codex-tui-e2e"
workspace: "~/.adk/release/workspaces/adk-codex-tui-e2e"
prompt_file: "~/.adk/release/config/agents/adk-codex-tui-e2e.prompt.md"
runtime: tui
keywords: ["e2e", "codex", "tui"]
department: devsecops
- id: adk-e2e-orchestrator
name: "ADK E2E Orchestrator"
name_ko: "ADK E2E 오케스트레이터"
provider: claude
channels:
claude:
id: "PLACEHOLDER_ADK_E2E_ORCHESTRATOR"
name: "adk-e2e-orchestrator"
workspace: "~/.adk/release/workspaces/adk-e2e-orchestrator"
prompt_file: "~/.adk/release/config/agents/adk-e2e-orchestrator.prompt.md"
# Orchestrator itself does not exercise a provider runtime — it
# only dispatches to workers. Pick pipe so the channel stays light.
runtime: pipe
keywords: ["e2e", "orchestrator", "전체"]
department: devsecops
meeting:
channel_name: "round-table"
max_rounds: 3
summary_agent: "ch-td"
available_agents:
- "ch-td"
github:
repos:
- "owner/repo"
memory:
backend: auto
file:
sak_path: "memories/shared-agent-knowledge/shared_knowledge.md"
sam_path: "memories/shared-agent-memory"
ltm_root: "memories/long-term"
auto_memory_root: "~/.claude/projects/*{workspace}*/memory/"
mcp:
endpoint: "http://127.0.0.1:8765"
access_key_env: "MEMENTO_API_KEY"
mcp:
# Claude MCP credential/config 파일을 감시해 변경 시 활성 Claude 세션에 /restart 알림을 보냅니다.
# 기본값은 watch_credentials=true, credential_notify_dedupe_secs=300입니다. 알림 소음이 크면 조정하세요.
watch_credentials: true
credential_notify_dedupe_secs: 300
policies:
dir: "./policies"
hot_reload: true
data:
dir: "~/.adk"
# PostgreSQL control-plane 연결 설정입니다. 기본값은 enabled=false, 127.0.0.1:5432/agentdesk, user=agentdesk입니다.
# routines/cluster/dispatch 저장소를 실제 PG로 사용할 때 활성화하고, foreground_reserve 기본 6은 전경 turn용 여유 풀입니다.
# database:
# enabled: false
# host: "127.0.0.1"
# port: 5432
# dbname: "agentdesk"
# user: "agentdesk"
# password: "REPLACE_ME"
# pool_max: 18
# foreground_reserve: 6
kanban:
manager_channel_id: "123456789012345678"
deadlock_manager_channel_id: "223456789012345678"
human_alert_channel_id: "323456789012345678"
pm_decision_gate_enabled: true
review:
enabled: true
max_rounds: 3
placeholder:
# Discord placeholder/status-panel UI 플래그입니다. 기본값은 live_events_enabled=true,
# status_panel_v2_enabled=true, two_message_panel_enabled=false입니다. 패널 롤아웃/롤백 때 조정하세요.
live_events_enabled: true
status_panel_v2_enabled: true
two_message_panel_enabled: false
runtime:
# T2-W rollout: off keeps the legacy row lifecycle. In this build, observe is a
# turn-path no-op; rollout observation telemetry ships with settlement slice (S-W2).
# Schema probing starts at settle and new handoff stamps require enforce. Only
# dispatched stamping is clamped off; settle_and_sweep is calculated, but this
# build has no consumer for that flag.
intake_delivery_settlement: off
# #5071 T3 execution-identity fence rollout: legacy (default) keeps the
# pre-T3-A1 destructive outcome, observe adds captured-vs-current spawn-nonce
# counters and logs without ever denying, and enforce refuses the two
# automatic watcher-registry removals T3-A1 converted (the relay-recovery
# dead-frontier cancel and the TUI stale-FOREIGN demote) unless every pinned
# value still matches the live one. Caveats: observe and enforce each read the
# per-spawn .spawn_nonce marker twice per destruction decision, so leaving
# legacy is what turns that marker I/O on (#5399 stopped legacy from paying
# for a comparison it discards); a missing or unreadable nonce is a deny under
# enforce, which means a host with no tmux marker store refuses both paths
# unconditionally; and no mode restores the #5067 in-flight emission fences
# T3-A1 removed.
execution_identity_mode: legacy
requested_timeout_min: 45
in_progress_stale_min: 120
long_turn_alert_interval_min: 30
context_compact_percent: 60
context_compact_percent_codex: 75
context_compact_percent_claude: 70
# Minimum context occupancy (tokens) before model-aware compaction is requested.
context_compact_lower_bound_tokens: 300000
dispatch_poll_sec: 30
agent_sync_sec: 300
github_issue_sync_sec: 900
claude_rate_limit_poll_sec: 120
codex_rate_limit_poll_sec: 120
issue_triage_poll_sec: 300
ceo_warn_depth: 3
max_retries: 3
review_reminder_min: 30
rate_limit_warning_pct: 80
rate_limit_danger_pct: 95
github_repo_cache_sec: 300
rate_limit_stale_sec: 600
reset_overrides_on_restart: false
# Prompt-manifest retention policy + per-layer max full-content size (#1699).
# - full_content_days: keep `full_content` for rows newer than this many days;
# older rows are trimmed to NULL by the daily `storage.prompt_manifest_retention`
# maintenance job. `content_sha256` and metadata are always preserved.
# - per_layer_max_bytes_*: write-time per-layer byte cap. Layers exceeding the
# cap are stored truncated + flagged (`is_truncated = TRUE`); the hash always
# covers the original content. Setting either value to 0 disables that cap.
prompt_manifest_retention:
enabled: true
full_content_days: 30
per_layer_max_bytes_adk_provided: 65536
per_layer_max_bytes_user_derived: 16384
automation:
enabled: false
strategy: "squash"
strategy_mode: "direct-first"
allowed_authors: "REPLACE_ME,octocat"
# JS routine worker 설정입니다. 기본값은 enabled=false, dir=./routines, tick=30초이며 PostgreSQL 없이는 실행되지 않습니다.
# 운영 자동화 루틴을 켤 때 enabled를 true로 바꾸고 additional_dirs로 operator script를 덧붙이세요.
# routines:
# enabled: false
# dir: "./routines"
# additional_dirs:
# - "~/.adk/routines"
# tick_interval_secs: 30
# max_due_per_tick: 10
# max_agent_polls_per_tick: 10
# default_timezone: "Asia/Seoul"
# agent_timeout_secs: 1800
# max_checkpoint_bytes: 262144
# hot_reload: true
# stale_paused_alert_secs: 0
# stale_paused_alert_ttl_secs: 86400
# failure_pause_auto_resume_secs: 0
# 자동/수동 escalation 대상 설정입니다. 기본값은 mode=pm, owner_user_id/pm_channel_id 없음,
# schedule은 pm_hours=00:00-08:00, timezone=Asia/Seoul로 해석됩니다. user/scheduled 라우팅 때 설정하세요.
# escalation:
# mode: pm
# owner_user_id: "YOUR_DISCORD_USER_ID"
# pm_channel_id: "YOUR_PM_CHANNEL_ID"
# schedule:
# pm_hours: "00:00-08:00"
# timezone: "Asia/Seoul"
# Onboarding wizard / project-agentfactory rules — externalize what was once
# hardcoded inside the Discord factory prompt. (#1110, Epic #912 Phase P6)
#
# - guild_id: optional override. When omitted, onboarding tooling reuses
# `discord.guild_id` above.
# - default_categories: operator-named labels → Discord category (channel)
# IDs. The wizard / factory agent picks from these labels rather than
# hardcoded numeric IDs.
# - provider_suffix_map: channel-name suffix → CLI provider id. Mirrors the
# dashboard `setupWizardHelpers.ts::PROVIDER_SUFFIX_MAP`. Leave empty to
# fall back to the built-in default.
# - provider_options: providers offered by the wizard's picker (empty =
# all built-in providers).
# - default_provider: provider used when nothing else hints (empty = registry
# default, currently `claude`).
onboarding:
guild_id: "YOUR_GUILD_ID"
default_categories:
dev: "YOUR_DEV_CATEGORY_ID"
operations: "YOUR_OPERATIONS_CATEGORY_ID"
notify: "YOUR_NOTIFY_CATEGORY_ID"
content: "YOUR_CONTENT_CATEGORY_ID"
provider_suffix_map:
"-cc": claude
"-cdx": codex
"-gem": gemini
"-oc": opencode
"-qw": qwen
provider_options:
- claude
- codex
- opencode
default_provider: claude
# agentdesk.yaml 변경을 감시해 hot-swappable 설정을 재적용합니다. 기본값은 true입니다.
# server/database/discord/providers/agents/mcp/routines 등 부팅 바인딩 변경은 재시작 필요로 기록됩니다.
# Dashboard runtime override는 kv_meta에 남지만 재시작 기준 baseline은 위 YAML입니다.
config_hot_reload: true