Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
8f4b0ad
feat(core): add agent self-scheduling via MCP server
oheckmann74 Mar 3, 2026
3761e58
fix(core): address review findings in self-scheduling
oheckmann74 Mar 4, 2026
8658dd7
fix(core): address remaining review findings in self-scheduling
oheckmann74 Mar 4, 2026
597ab9a
fix(core): address CodeRabbit PR review feedback
oheckmann74 Mar 4, 2026
cc4bfda
refactor(core): address CodeRabbit nitpick feedback
oheckmann74 Mar 4, 2026
80c3885
feat(discord): add typing_indicator output config option
Mar 2, 2026
3b5c749
feat(discord,slack): message dedup, ack emoji, voice transcription, f…
Mar 2, 2026
8ec60b5
feat(discord): reduce verbosity with final-answer-only mode, concise …
Mar 2, 2026
778ec1c
fix(discord): ensure final answer delivery in finalAnswerOnly mode
Mar 2, 2026
e11907e
feat(discord): visual polish — title-less embeds, refined colors, bra…
Mar 2, 2026
d03d25e
feat(discord): support file attachments in Discord messages
Mar 2, 2026
e4fa320
refactor(discord): replace final_answer_only + concise_mode with assi…
oheckmann74 Mar 3, 2026
0c34ec4
Fix Discord attachment path collisions and filename overwrites
oheckmann74 Mar 3, 2026
59ef978
fix(core): increase CLI session startup timeout from 15s to 60s
oheckmann74 Mar 3, 2026
59cf842
feat(core): add injected MCP server support to CLI runtime
oheckmann74 Mar 3, 2026
1562090
feat(discord): buffer file uploads to attach below answer text
oheckmann74 Mar 4, 2026
64f40a9
fix: address review findings across Discord improvements
oheckmann74 Mar 4, 2026
e8a6a1e
fix: address CodeRabbit round 2 feedback on Discord improvements
oheckmann74 Mar 4, 2026
a66b507
feat(core): inject self-scheduling system prompt into agents
oheckmann74 Mar 4, 2026
8cfb8ff
Merge branch 'feature/discord-improvements' into feature/agent-self-s…
oheckmann74 Mar 4, 2026
2a61683
fix(core): always inject system prompt even with custom MCP server
oheckmann74 Mar 4, 2026
c739d7e
bd: backup 2026-03-04 23:28
oheckmann74 Mar 4, 2026
0127223
bd: backup 2026-03-04 23:50
oheckmann74 Mar 4, 2026
2f1f018
Enhance Discord chat UX, slash controls, and runtime parity
oheckmann74 Mar 4, 2026
a758bbe
Fix /retry to reuse Discord pipeline and catch failures
oheckmann74 Mar 5, 2026
3b0b644
Deduplicate CLI assistant snapshots in synthetic result usage
oheckmann74 Mar 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .beads/backup/backup_state.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"last_dolt_commit": "mcgoglttb785sns4t2u2d5avsvj06ql0",
"last_event_id": 0,
"timestamp": "2026-03-04T23:50:42.764912Z",
"counts": {
"issues": 10,
"events": 10,
"comments": 0,
"dependencies": 16,
"labels": 0,
"config": 11
}
}
Empty file added .beads/backup/comments.jsonl
Empty file.
11 changes: 11 additions & 0 deletions .beads/backup/config.jsonl
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{"key":"auto_compact_enabled","value":"false"}
{"key":"compact_batch_size","value":"50"}
{"key":"compact_parallel_workers","value":"5"}
{"key":"compact_tier1_days","value":"30"}
{"key":"compact_tier1_dep_levels","value":"2"}
{"key":"compact_tier2_commits","value":"100"}
{"key":"compact_tier2_days","value":"90"}
{"key":"compact_tier2_dep_levels","value":"5"}
{"key":"compaction_enabled","value":"false"}
{"key":"issue_prefix","value":"herdctl"}
{"key":"schema_version","value":"6"}
16 changes: 16 additions & 0 deletions .beads/backup/dependencies.jsonl
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{"created_at":"2026-03-04T15:29:11Z","created_by":"agent","depends_on_id":"herdctl-gi7","issue_id":"herdctl-60a","type":"blocks"}
{"created_at":"2026-03-04T15:29:10Z","created_by":"agent","depends_on_id":"herdctl-klh","issue_id":"herdctl-60a","type":"blocks"}
{"created_at":"2026-03-04T15:29:12Z","created_by":"agent","depends_on_id":"herdctl-r3t","issue_id":"herdctl-60a","type":"blocks"}
{"created_at":"2026-03-04T15:29:16Z","created_by":"agent","depends_on_id":"herdctl-gi7","issue_id":"herdctl-com","type":"blocks"}
{"created_at":"2026-03-04T15:29:16Z","created_by":"agent","depends_on_id":"herdctl-klh","issue_id":"herdctl-com","type":"blocks"}
{"created_at":"2026-03-04T15:29:17Z","created_by":"agent","depends_on_id":"herdctl-r3t","issue_id":"herdctl-com","type":"blocks"}
{"created_at":"2026-03-04T15:29:15Z","created_by":"agent","depends_on_id":"herdctl-uwa","issue_id":"herdctl-com","type":"blocks"}
{"created_at":"2026-03-04T15:29:08Z","created_by":"agent","depends_on_id":"herdctl-klh","issue_id":"herdctl-gi7","type":"blocks"}
{"created_at":"2026-03-04T15:29:08Z","created_by":"agent","depends_on_id":"herdctl-r3t","issue_id":"herdctl-gi7","type":"blocks"}
{"created_at":"2026-03-04T15:29:07Z","created_by":"agent","depends_on_id":"herdctl-uwa","issue_id":"herdctl-gi7","type":"blocks"}
{"created_at":"2026-03-04T15:29:06Z","created_by":"agent","depends_on_id":"herdctl-uwa","issue_id":"herdctl-klh","type":"blocks"}
{"created_at":"2026-03-04T15:29:13Z","created_by":"agent","depends_on_id":"herdctl-3ee","issue_id":"herdctl-qto","type":"blocks"}
{"created_at":"2026-03-04T15:29:13Z","created_by":"agent","depends_on_id":"herdctl-k0i","issue_id":"herdctl-qto","type":"blocks"}
{"created_at":"2026-03-04T15:29:14Z","created_by":"agent","depends_on_id":"herdctl-r3t","issue_id":"herdctl-qto","type":"blocks"}
{"created_at":"2026-03-04T15:29:10Z","created_by":"agent","depends_on_id":"herdctl-uwa","issue_id":"herdctl-r3t","type":"blocks"}
{"created_at":"2026-03-04T15:29:09Z","created_by":"agent","depends_on_id":"herdctl-uwa","issue_id":"herdctl-zjd","type":"blocks"}
10 changes: 10 additions & 0 deletions .beads/backup/events.jsonl
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{"actor":"agent","comment":null,"created_at":"2026-03-04T15:28:59Z","event_type":"created","id":1,"issue_id":"herdctl-uwa","new_value":"","old_value":""}
{"actor":"agent","comment":null,"created_at":"2026-03-04T15:28:59Z","event_type":"created","id":2,"issue_id":"herdctl-klh","new_value":"","old_value":""}
{"actor":"agent","comment":null,"created_at":"2026-03-04T15:29:00Z","event_type":"created","id":3,"issue_id":"herdctl-gi7","new_value":"","old_value":""}
{"actor":"agent","comment":null,"created_at":"2026-03-04T15:29:01Z","event_type":"created","id":4,"issue_id":"herdctl-3ee","new_value":"","old_value":""}
{"actor":"agent","comment":null,"created_at":"2026-03-04T15:29:02Z","event_type":"created","id":5,"issue_id":"herdctl-zjd","new_value":"","old_value":""}
{"actor":"agent","comment":null,"created_at":"2026-03-04T15:29:02Z","event_type":"created","id":6,"issue_id":"herdctl-r3t","new_value":"","old_value":""}
{"actor":"agent","comment":null,"created_at":"2026-03-04T15:29:03Z","event_type":"created","id":7,"issue_id":"herdctl-k0i","new_value":"","old_value":""}
{"actor":"agent","comment":null,"created_at":"2026-03-04T15:29:04Z","event_type":"created","id":8,"issue_id":"herdctl-60a","new_value":"","old_value":""}
{"actor":"agent","comment":null,"created_at":"2026-03-04T15:29:05Z","event_type":"created","id":9,"issue_id":"herdctl-qto","new_value":"","old_value":""}
{"actor":"agent","comment":null,"created_at":"2026-03-04T15:29:05Z","event_type":"created","id":10,"issue_id":"herdctl-com","new_value":"","old_value":""}
10 changes: 10 additions & 0 deletions .beads/backup/issues.jsonl
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{"acceptance_criteria":"1) Commands are registered and executable in supported channels/DMs. 2) Correct behavior for active/inactive run states. 3) Clear ephemeral success/error responses.","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"c3e4b66f5be19dccae9dc7ea6be53320d112acc6cfed21068fbdde2298853d6e","created_at":"2026-03-04T23:29:01Z","created_by":"agent","crystallizes":0,"defer_until":null,"description":"Extend command surface with execution/session controls for better operational usability in Discord.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"herdctl-3ee","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"oliver.heckmann@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"Discord: Add slash control commands (/stop, /retry, /new, /session)","updated_at":"2026-03-04T23:29:01Z","waiters":"","wisp_type":"","work_type":""}
{"acceptance_criteria":"1) Shared embed builder utilities added. 2) Color/label/footer semantics are consistent. 3) Snapshot tests cover key templates.","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"7f266404dd35390bfd1852f4cc793e5e25e63d027262909de4e32565d33a672f","created_at":"2026-03-04T23:29:04Z","created_by":"agent","crystallizes":0,"defer_until":null,"description":"Centralize embed builders and visual semantics (progress/answer/trace/success/error) for consistent look and readability.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"herdctl-60a","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"oliver.heckmann@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"Discord: Embed/theme design system refactor","updated_at":"2026-03-04T23:29:04Z","waiters":"","wisp_type":"","work_type":""}
{"acceptance_criteria":"1) Test fixtures include representative tool-heavy, error, and status flows. 2) Rendering parity checks exist for both runtimes. 3) Future format drift is caught by tests.","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"6cbb6a0de9b59bfa1b51d4ce43e3fb191eb9421d4165061407173b2b5842a120","created_at":"2026-03-04T23:29:06Z","created_by":"agent","crystallizes":0,"defer_until":null,"description":"Add fixture-driven regression tests that assert equivalent user-visible behavior across SDK and CLI runtime message streams.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"herdctl-com","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"oliver.heckmann@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"Discord: End-to-end regression suite for SDK + CLI runtime streams","updated_at":"2026-03-04T23:29:06Z","waiters":"","wisp_type":"","work_type":""}
{"acceptance_criteria":"1) Message count reduced for complex runs. 2) Final answer remains obvious and readable. 3) Large outputs are attached instead of flooding chat.","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"90e044bb40551aa6156677be32ad33489429146a530f0151e8cdb254cae07bb4","created_at":"2026-03-04T23:29:01Z","created_by":"agent","crystallizes":0,"defer_until":null,"description":"Replace per-event embed burst with a persistent run card plus grouped tool trace updates; attach oversized tool output as files with short previews.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"herdctl-gi7","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"oliver.heckmann@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"Discord: Run card and grouped trace UX","updated_at":"2026-03-04T23:29:01Z","waiters":"","wisp_type":"","work_type":""}
{"acceptance_criteria":"1) Global path remains default. 2) Guild-scoped path registers correctly for selected guilds. 3) Docs describe tradeoffs and usage.","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"0430a137a7092776b18bde96241ba13dc5cbedeea5a154f77bd3bac0973279b0","created_at":"2026-03-04T23:29:04Z","created_by":"agent","crystallizes":0,"defer_until":null,"description":"Add optional guild-scoped command registration for faster development propagation while preserving global default for production.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"herdctl-k0i","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"oliver.heckmann@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"Discord: Configurable slash command registration mode (global vs guild)","updated_at":"2026-03-04T23:29:04Z","waiters":"","wisp_type":"","work_type":""}
{"acceptance_criteria":"1) Live deltas appear in Discord when available. 2) No duplicate final answer content. 3) Fallback path works when only assistant snapshots are present.","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"f718c850b20471775c6bf569f852b31fae04ec3f73bb5691d1ed056afb005c58","created_at":"2026-03-04T23:29:00Z","created_by":"agent","crystallizes":0,"defer_until":null,"description":"Upgrade response delivery to support live delta streaming (stream_event/content_block_delta) into an editable answer message, with fallback to finalized assistant snapshots.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"herdctl-klh","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"oliver.heckmann@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"Discord: Incremental answer streaming via stream_event","updated_at":"2026-03-04T23:29:00Z","waiters":"","wisp_type":"","work_type":""}
{"acceptance_criteria":"1) Docs match schema defaults and runtime behavior. 2) Slash command invocation/troubleshooting is explicit. 3) Docs build/lint passes.","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"2bb093b690e8d06f95f46ef383cc4091ded2c367ab1f89c8f6caf7cb7c433f79","created_at":"2026-03-04T23:29:05Z","created_by":"agent","crystallizes":0,"defer_until":null,"description":"Fix docs mismatches (including result_summary defaults), document slash invocation UX, and explain SDK vs CLI runtime message differences.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"herdctl-qto","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"oliver.heckmann@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"Discord docs: Slash command UX + defaults/runtime parity","updated_at":"2026-03-04T23:29:05Z","waiters":"","wisp_type":"","work_type":""}
{"acceptance_criteria":"1) tool_progress updates run/progress state without spam. 2) auth_status shows only actionable notices. 3) Behavior is tested across SDK and CLI streams.","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"9235b5cb474d3f3b7fec7eb12f77e0eb7d2bb78c9e8af9ef0191aa87cbf2beb9","created_at":"2026-03-04T23:29:03Z","created_by":"agent","crystallizes":0,"defer_until":null,"description":"Handle additional SDK message classes explicitly in Discord UX so users receive useful state updates without noise.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"herdctl-r3t","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"oliver.heckmann@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"Discord: Surface tool_progress and auth_status messages","updated_at":"2026-03-04T23:29:03Z","waiters":"","wisp_type":"","work_type":""}
{"acceptance_criteria":"1) Canonical event model implemented and used by Discord manager. 2) Tests cover SDK-native and CLI-native streams. 3) Existing happy-path output remains functionally equivalent.","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"0a6d9d024453bb3753bb0e0d01f06bde419cbca0e93055d26f7fc5d7aa856caf","created_at":"2026-03-04T23:28:59Z","created_by":"agent","crystallizes":0,"defer_until":null,"description":"Add a normalization layer in @herdctl/discord that maps raw SDKMessage streams from both SDKRuntime and CLIRuntime into canonical chat events before rendering.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"herdctl-uwa","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"oliver.heckmann@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"Discord: Runtime-agnostic message normalizer","updated_at":"2026-03-04T23:28:59Z","waiters":"","wisp_type":"","work_type":""}
{"acceptance_criteria":"1) Fresh-session prompts include formatted recent context. 2) Resume path does not duplicate history. 3) Tests cover empty and reply-chain-heavy contexts.","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"f0e99aab40d55766ae72a9c5d203f327dd6d08a2739e5236f95c76c915333bca","created_at":"2026-03-04T23:29:02Z","created_by":"agent","crystallizes":0,"defer_until":null,"description":"Use built conversation context when no resume session is present; avoid re-injecting context on resume path.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"herdctl-zjd","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"oliver.heckmann@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"Discord: Inject context_messages on fresh session path","updated_at":"2026-03-04T23:29:02Z","waiters":"","wisp_type":"","work_type":""}
Empty file added .beads/backup/labels.jsonl
Empty file.
14 changes: 14 additions & 0 deletions .changeset/agent-self-scheduling.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
"@herdctl/core": minor
---

Add agent self-scheduling via MCP server

Agents can now create, update, and delete their own schedules at runtime through a capability-gated MCP server. Enable with `self_scheduling.enabled: true` in agent config.

- Per-agent YAML store at `.herdctl/dynamic-schedules/<agent>.yaml`
- Standalone `herdctl-scheduler` stdio MCP server with 4 tools (create, list, update, delete)
- Auto-injected when `self_scheduling.enabled` is true — no manual MCP config needed
- Safety: namespace isolation, configurable max schedules, minimum interval enforcement, optional TTL
- Dynamic schedules merged with static in scheduler (static wins on name collision)
- `source: "static" | "dynamic"` tag on ScheduleInfo for fleet operator visibility
11 changes: 11 additions & 0 deletions .changeset/cli-runtime-injected-mcp.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"@herdctl/core": minor
---

Add injected MCP server support to CLI runtime via HTTP bridges

CLI runtime now supports `injectedMcpServers` (e.g., file sender for Discord/Slack uploads).
Previously only SDK and Docker runtimes handled injected MCP servers — CLI silently ignored them.

The fix reuses existing `mcp-http-bridge.ts` infrastructure: starts HTTP bridges on localhost
for each injected server and passes them via `--mcp-config` as HTTP-type MCP servers.
11 changes: 11 additions & 0 deletions .changeset/discord-file-attachments.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"@herdctl/core": minor
"@herdctl/discord": minor
---

feat(discord): support file attachments (images, PDFs, text/code files) in Discord messages

When users upload files alongside a Discord message, the connector now detects and processes them:
- Text/code files are downloaded and inlined directly into the agent's prompt
- Images and PDFs are saved to the agent's working directory with a file path reference so the agent can use its Read tool to view them
- Configurable via `chat.discord.attachments` with options for file size limits, allowed types, and automatic cleanup
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,8 @@ coverage/
agent-distribution.md
docs/MANUAL-QA-TEST-PLAN.md.planning/

.planning/phases
.planning/phases

# Dolt database files (added by bd init)
.dolt/
*.db
Loading