diff --git a/FEATURE_PARITY.md b/FEATURE_PARITY.md index d6336e90..d6952cbd 100644 --- a/FEATURE_PARITY.md +++ b/FEATURE_PARITY.md @@ -10,6 +10,8 @@ This document tracks feature parity between IronClaw (Rust implementation) and O - 🚫 Out of scope (intentionally skipped) - βž– N/A (not applicable to Rust implementation) +**Last reviewed against OpenClaw PRs:** 2026-03-10 (merged 2026-02-24 through 2026-03-10) + --- ## 1. Architecture @@ -39,11 +41,11 @@ This document tracks feature parity between IronClaw (Rust implementation) and O | Network modes (loopback/LAN/remote) | βœ… | 🚧 | HTTP only | | OpenAI-compatible HTTP API | βœ… | βœ… | /v1/chat/completions, per-request `model` override | | Canvas hosting | βœ… | ❌ | Agent-driven UI | -| Gateway lock (PID-based) | βœ… | βœ… | `fs4` flock-based, acquired in `main.rs` before agent startup | +| Gateway lock (PID-based) | βœ… | ❌ | | | launchd/systemd integration | βœ… | ❌ | | | Bonjour/mDNS discovery | βœ… | ❌ | | | Tailscale integration | βœ… | ❌ | | -| Health check endpoints | βœ… | βœ… | /api/health + /api/gateway/status | +| Health check endpoints | βœ… | βœ… | /api/health + /api/gateway/status + /healthz + /readyz, with channel-backed readiness probes | | `doctor` diagnostics | βœ… | ❌ | | | Agent event broadcast | βœ… | 🚧 | SSE broadcast manager exists (SseManager) but tool/job-state events not fully wired | | Channel health monitor | βœ… | ❌ | Auto-restart with configurable interval | @@ -66,17 +68,17 @@ This document tracks feature parity between IronClaw (Rust implementation) and O | REPL (simple) | βœ… | βœ… | - | For testing | | WASM channels | ❌ | βœ… | - | IronClaw innovation | | WhatsApp | βœ… | ❌ | P1 | Baileys (Web), same-phone mode with echo detection | -| Telegram | βœ… | βœ… | - | WASM channel(MTProto), DM pairing, caption, /start, bot_username | +| Telegram | βœ… | βœ… | - | WASM channel(MTProto), DM pairing, caption, /start, bot_username, DM topics | | Discord | βœ… | ❌ | P2 | discord.js, thread parent binding inheritance | | Signal | βœ… | βœ… | P2 | signal-cli daemonPC, SSE listener HTTP/JSON-R, user/group allowlists, DM pairing | | Slack | βœ… | βœ… | - | WASM tool | | iMessage | βœ… | ❌ | P3 | BlueBubbles or Linq recommended | | Linq | βœ… | ❌ | P3 | Real iMessage via API, no Mac required | -| Feishu/Lark | βœ… | ❌ | P3 | Bitable create app/field tools | +| Feishu/Lark | βœ… | ❌ | P3 | Bitable create app/field tools, Docx table/image/file actions, rich-text media extraction | | LINE | βœ… | ❌ | P3 | | | WebChat | βœ… | βœ… | - | Web gateway chat | | Matrix | βœ… | ❌ | P3 | E2EE support | -| Mattermost | βœ… | ❌ | P3 | Emoji reactions | +| Mattermost | βœ… | ❌ | P3 | Emoji reactions, interactive buttons, model picker | | Google Chat | βœ… | ❌ | P3 | | | MS Teams | βœ… | ❌ | P3 | | | Twitch | βœ… | ❌ | P3 | | @@ -92,6 +94,8 @@ This document tracks feature parity between IronClaw (Rust implementation) and O | User message reactions | βœ… | ❌ | Surface inbound reactions | | sendPoll | βœ… | ❌ | Poll creation via agent | | Cron/heartbeat topic targeting | βœ… | ❌ | Messages land in correct topic | +| DM topics support | βœ… | ❌ | Agent/topic bindings in DMs and agent-scoped SessionKeys | +| Persistent ACP topic binding | βœ… | ❌ | ACP harness sessions can pin to Telegram forum or DM topics | ### Discord-Specific Features (since Feb 2025) @@ -107,21 +111,36 @@ This document tracks feature parity between IronClaw (Rust implementation) and O |---------|----------|----------|-------| | Streaming draft replies | βœ… | ❌ | Partial replies via draft message updates | | Configurable stream modes | βœ… | ❌ | Per-channel stream behavior | -| Thread ownership | βœ… | ❌ | Thread-level ownership tracking | +| Thread ownership | βœ… | ❌ | Thread-level ownership tracking plus reply participation memory | +| Download-file action | βœ… | ❌ | On-demand attachment downloads via message actions | + +### Mattermost-Specific Features (since Mar 2026) + +| Feature | OpenClaw | IronClaw | Notes | +|---------|----------|----------|-------| +| Interactive buttons | βœ… | ❌ | Clickable message buttons with signed callback flow | +| Interactive model picker | βœ… | ❌ | In-channel provider/model chooser | + +### Feishu/Lark-Specific Features (since Mar 2026) + +| Feature | OpenClaw | IronClaw | Notes | +|---------|----------|----------|-------| +| Doc/table actions | βœ… | ❌ | `feishu_doc` supports tables, positional insert, color_text, image upload, and file upload | +| Rich-text embedded media extraction | βœ… | ❌ | Pull video/media attachments from post messages | ### Channel Features | Feature | OpenClaw | IronClaw | Notes | |---------|----------|----------|-------| | DM pairing codes | βœ… | βœ… | `ironclaw pairing list/approve`, host APIs | -| Allowlist/blocklist | βœ… | 🚧 | allow_from + pairing store | +| Allowlist/blocklist | βœ… | 🚧 | `allow_from` + pairing store + hardened command/group allowlists | | Self-message bypass | βœ… | ❌ | Own messages skip pairing | | Mention-based activation | βœ… | βœ… | bot_username + respond_to_all_group_messages | | Per-group tool policies | βœ… | ❌ | Allow/deny specific tools | -| Thread isolation | βœ… | βœ… | Separate sessions per thread | -| Per-channel media limits | βœ… | βœ… | Attachment type in WIT; max 10 per msg, 20MB total, MIME allowlist | -| Typing indicators | βœ… | 🚧 | TUI + Telegram typing/actionable status prompts; richer parity pending | -| Per-channel ackReaction config | βœ… | ❌ | Customizable acknowledgement reactions | +| Thread isolation | βœ… | βœ… | Separate sessions per thread/topic | +| Per-channel media limits | βœ… | 🚧 | Caption support plus `mediaMaxMb` enforcement for WhatsApp, Telegram, and Discord | +| Typing indicators | βœ… | 🚧 | TUI + channel typing, with configurable silence timeout; richer parity pending | +| Per-channel ackReaction config | βœ… | ❌ | Customizable acknowledgement reactions/scopes | | Group session priming | βœ… | ❌ | Member roster injected for context | | Sender_id in trusted metadata | βœ… | ❌ | Exposed in system metadata | @@ -138,7 +157,8 @@ This document tracks feature parity between IronClaw (Rust implementation) and O | `gateway start/stop` | βœ… | ❌ | P2 | | | `onboard` (wizard) | βœ… | βœ… | - | Interactive setup | | `tui` | βœ… | βœ… | - | Ratatui TUI | -| `config` | βœ… | βœ… | - | Read/write config | +| `config` | βœ… | βœ… | - | Read/write config plus validate/path helpers | +| `backup` | βœ… | ❌ | P3 | Create/verify local backup archives | | `channels` | βœ… | ❌ | P2 | Channel management | | `models` | βœ… | 🚧 | - | Model selector in TUI | | `status` | βœ… | βœ… | - | System status (enriched session details) | @@ -177,14 +197,15 @@ This document tracks feature parity between IronClaw (Rust implementation) and O | Global sessions | βœ… | ❌ | Optional shared context | | Session pruning | βœ… | ❌ | Auto cleanup old sessions | | Context compaction | βœ… | βœ… | Auto summarization | +| Compaction model override | βœ… | ❌ | Use a dedicated provider/model for summarization only | | Post-compaction read audit | βœ… | ❌ | Layer 3: workspace rules appended to summaries | | Post-compaction context injection | βœ… | ❌ | Workspace context as system event | | Custom system prompts | βœ… | βœ… | Template variables, safety guardrails | | Skills (modular capabilities) | βœ… | βœ… | Prompt-based skills with trust gating, attenuation, activation criteria, catalog, selector | | Skill routing blocks | βœ… | 🚧 | ActivationCriteria (keywords, patterns, tags) but no "Use when / Don't use when" blocks | | Skill path compaction | βœ… | ❌ | ~ prefix to reduce prompt tokens | -| Thinking modes (low/med/high) | βœ… | ❌ | Configurable reasoning depth | -| Per-model thinkingDefault override | βœ… | ❌ | Override thinking level per model | +| Thinking modes (off/minimal/low/medium/high/xhigh/adaptive) | βœ… | ❌ | Configurable reasoning depth | +| Per-model thinkingDefault override | βœ… | ❌ | Override thinking level per model; Anthropic Claude 4.6 defaults to adaptive | | Block-level streaming | βœ… | ❌ | | | Tool-level streaming | βœ… | ❌ | | | Z.AI tool_stream | βœ… | ❌ | Real-time tool call streaming | @@ -213,15 +234,11 @@ This document tracks feature parity between IronClaw (Rust implementation) and O | Provider | OpenClaw | IronClaw | Priority | Notes | |----------|----------|----------|----------|-------| | NEAR AI | βœ… | βœ… | - | Primary provider | -| Anthropic (Claude) | βœ… | 🚧 | - | Via NEAR AI proxy; Opus 4.5, Sonnet 4, Sonnet 4.6 | -| OpenAI | βœ… | 🚧 | - | Via NEAR AI proxy | -| AWS Bedrock | βœ… | βœ… | - | Native Converse API via aws-sdk-bedrockruntime (requires `--features bedrock`) | -| Google Gemini | βœ… | βœ… | P3 | Via `gemini` adapter | -| io.net | βœ… | βœ… | P3 | Via `ionet` adapter | -| Mistral | βœ… | βœ… | P3 | Via `mistral` adapter | -| Yandex AI Studio | βœ… | βœ… | P3 | Via `yandex` adapter | -| Cloudflare Workers AI | βœ… | βœ… | P3 | Via `cloudflare` adapter | -| NVIDIA API | βœ… | βœ… | P3 | Via `nvidia` adapter and `providers.json` | +| Anthropic (Claude) | βœ… | 🚧 | - | Via NEAR AI proxy; Opus 4.5, Sonnet 4, Sonnet 4.6, adaptive thinking default | +| OpenAI | βœ… | 🚧 | - | Via NEAR AI proxy; GPT-5.4 + Codex OAuth | +| AWS Bedrock | βœ… | ❌ | P3 | | +| Google Gemini | βœ… | ❌ | P3 | | +| NVIDIA API | βœ… | ❌ | P3 | New provider | | OpenRouter | βœ… | βœ… | - | Via OpenAI-compatible provider (RigAdapter) | | Tinfoil | ❌ | βœ… | - | Private inference provider (IronClaw-only) | | OpenAI-compatible | ❌ | βœ… | - | Generic OpenAI-compatible endpoint (RigAdapter) | @@ -242,7 +259,7 @@ This document tracks feature parity between IronClaw (Rust implementation) and O | Per-session model override | βœ… | βœ… | Model selector in TUI | | Model selection UI | βœ… | βœ… | TUI keyboard shortcut | | Per-model thinkingDefault | βœ… | ❌ | Override thinking level per model in config | -| 1M context beta header | βœ… | ❌ | Anthropic extended context support | +| 1M context support | βœ… | ❌ | Anthropic extended context beta + OpenAI Codex GPT-5.4 1M context | ### Owner: _Unassigned_ @@ -252,32 +269,20 @@ This document tracks feature parity between IronClaw (Rust implementation) and O | Feature | OpenClaw | IronClaw | Priority | Notes | |---------|----------|----------|----------|-------| -| WIT inbound-attachment type | N/A | βœ… | P1 | `inbound-attachment` record in channel-host (id, mime_type, filename, size_bytes, source_url, storage_key, extracted_text) | -| WIT outbound attachment type | N/A | βœ… | P1 | `attachment` record in channel (filename, mime_type, data) on `agent-response` | -| WIT on-broadcast export | N/A | βœ… | P1 | Proactive message sending without prior incoming message | -| IncomingMessage attachments | N/A | βœ… | P1 | `IncomingAttachment` struct on `IncomingMessage`, populated from WASM channels | -| OutgoingResponse attachments | N/A | βœ… | P1 | File paths on `OutgoingResponse`, read from disk and sent as WIT attachments | -| Attachment security (size/MIME) | N/A | βœ… | P1 | Inbound: max 10, 20MB total, MIME allowlist. Outbound: 50MB total | -| Telegram media parsing | βœ… | βœ… | P1 | Photo, document, audio, video, voice, sticker parsed and emitted as attachments | -| Telegram media sending | βœ… | βœ… | P1 | sendPhoto/sendDocument multipart upload, auto photoβ†’document fallback >10MB | -| Slack file parsing | βœ… | βœ… | P1 | `files` array from Events API parsed into attachments | -| WhatsApp media parsing | βœ… | βœ… | P1 | Image, audio, video, document parsed with caption as extracted_text | -| Discord attachment parsing | βœ… | ❌ | P2 | Discord interaction payloads don't include file attachments (needs message events) | -| HTTP tool save_to | N/A | βœ… | P1 | Download binary files to /tmp/ for attachment sending (50MB limit, path traversal protection) | -| Credential env var fallback | N/A | βœ… | P2 | Channels can use env vars (e.g., TELEGRAM_BOT_TOKEN) when secrets store not configured | | Image processing (Sharp) | βœ… | ❌ | P2 | Resize, format convert | | Configurable image resize dims | βœ… | ❌ | P2 | Per-agent dimension config | | Multiple images per tool call | βœ… | ❌ | P2 | Single tool invocation, multiple images | | Audio transcription | βœ… | ❌ | P2 | | | Video support | βœ… | ❌ | P3 | | -| PDF parsing | βœ… | ❌ | P2 | pdfjs-dist | -| MIME detection | βœ… | βœ… | P2 | MIME allowlist in host validates attachment types | +| PDF analysis tool | βœ… | ❌ | P2 | Native Anthropic/Gemini path with text/image extraction fallback | +| PDF parsing | βœ… | ❌ | P2 | `pdfjs-dist` fallback path | +| MIME detection | βœ… | ❌ | P2 | | | Media caching | βœ… | ❌ | P3 | | | Vision model integration | βœ… | ❌ | P2 | Image understanding | | TTS (Edge TTS) | βœ… | ❌ | P3 | Text-to-speech | | TTS (OpenAI) | βœ… | ❌ | P3 | | | Incremental TTS playback | βœ… | ❌ | P3 | iOS progressive playback | -| Sticker-to-image | βœ… | βœ… | P3 | Telegram stickers emitted as image/webp attachments | +| Sticker-to-image | βœ… | ❌ | P3 | Telegram stickers | ### Owner: _Unassigned_ @@ -293,7 +298,8 @@ This document tracks feature parity between IronClaw (Rust implementation) and O | Workspace-relative install | βœ… | βœ… | ~/.ironclaw/tools/ | | Channel plugins | βœ… | βœ… | WASM channels | | Auth plugins | βœ… | ❌ | | -| Memory plugins | βœ… | ❌ | Custom backends | +| Memory plugins | βœ… | ❌ | Custom backends + selectable memory slot | +| Context-engine plugins | βœ… | ❌ | Custom context management + subagent/context hooks | | Tool plugins | βœ… | βœ… | WASM tools | | Hook plugins | βœ… | βœ… | Declarative hooks from extension capabilities | | Provider plugins | βœ… | ❌ | | @@ -315,7 +321,7 @@ This document tracks feature parity between IronClaw (Rust implementation) and O | JSON5 support | βœ… | ❌ | Comments, trailing commas | | YAML alternative | βœ… | ❌ | | | Environment variable interpolation | βœ… | βœ… | `${VAR}` | -| Config validation/schema | βœ… | βœ… | Type-safe Config struct | +| Config validation/schema | βœ… | βœ… | Type-safe Config struct + `openclaw config validate` | | Hot-reload | βœ… | ❌ | | | Legacy migration | βœ… | βž– | | | State directory | βœ… `~/.openclaw-state/` | βœ… `~/.ironclaw/` | | @@ -422,6 +428,7 @@ This document tracks feature parity between IronClaw (Rust implementation) and O | Feature | OpenClaw | IronClaw | Priority | Notes | |---------|----------|----------|----------|-------| | Cron jobs | βœ… | βœ… | - | Routines with cron trigger | +| Per-job model fallback override | βœ… | ❌ | P2 | `payload.fallbacks` overrides agent-level fallbacks | | Cron stagger controls | βœ… | ❌ | P3 | Default stagger for scheduled jobs | | Cron finished-run webhook | βœ… | ❌ | P3 | Webhook on job completion | | Timezone support | βœ… | βœ… | - | Via cron expressions | @@ -475,10 +482,10 @@ This document tracks feature parity between IronClaw (Rust implementation) and O | Elevated mode | βœ… | ❌ | | | Safe bins allowlist | βœ… | ❌ | Hardened path trust | | LD*/DYLD* validation | βœ… | ❌ | | -| Path traversal prevention | βœ… | βœ… | Including config includes (OC-06) | +| Path traversal prevention | βœ… | βœ… | Including config includes (OC-06) + workspace-only tool mounts | | Credential theft via env injection | βœ… | 🚧 | Shell env scrubbing + command injection detection; no full OC-09 defense | | Session file permissions (0o600) | βœ… | βœ… | Session token file set to 0o600 in llm/session.rs | -| Skill download path restriction | βœ… | ❌ | Prevent arbitrary write targets | +| Skill download path restriction | βœ… | ❌ | Validated download roots prevent arbitrary write targets | | Webhook signature verification | βœ… | βœ… | | | Media URL validation | βœ… | ❌ | | | Prompt injection defense | βœ… | βœ… | Pattern detection, sanitization |