diff --git a/README.md b/README.md index 100578c..1321b46 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,18 @@ Deployment profiles and hardening references:
+Slack interactive callbacks, canonical node categories, and hardening governance aligned with the current runtime + +- Added Slack interactive callback handling for Block Kit actions, modal submissions, and workflow-style payloads, with signed ingress verification, replay/idempotency checks, bounded external errors, and policy-aware routing for run-affecting actions. +- Aligned shipped node metadata on the canonical `openclaw` category while keeping legacy `Moltbot*` class aliases available for existing workflows. +- Tightened node and frontend maintainability by moving batch-variant randomized seed imports to module scope and keeping tab DOM wiring on shared text-safe helper paths. +- Added explicit verification ownership for the `safe_io` and security-boundary hotspot families so future coverage ratchets depend on targeted regressions instead of broad coverage alone. +- Hardened exception-boundary governance around selected startup and connector paths so unexpected route/bootstrap or trust-parsing failures are surfaced instead of silently masked. + +
+ +
+ Packaging boundaries, node portability guidance, config ownership seams, and connector extraction diagnostics aligned with the current runtime - Made the supported packaging model explicit: the ComfyUI custom node pack remains the primary artifact, the embedded operator platform is the first-class runtime identity, and the connector stays an optional attached subsystem rather than a separate published package. @@ -132,18 +144,6 @@ Deployment profiles and hardening references:
-
- -PNG Info sidebar workflow added with ComfyUI metadata extraction, better large-image handling, and lower-noise operator alerts - -- Added a new `PNG Info` sidebar tab with drag-and-drop, file picker, scoped paste, preview rendering, prompt copy actions, structured summary cards, and raw metadata inspection for saved generation images. -- Added backend metadata parsing for A1111 infotext and ComfyUI `prompt` / `workflow` metadata, including prompt/sampler/model/size extraction from standard ComfyUI graphs and a larger dedicated payload ceiling for original metadata-bearing images. -- Improved operator-facing UX by making large-image failures explain the metadata-preservation constraint more clearly, letting the PNG Info input area scroll with the rest of the content, and moving prompt copy surfaces to the top of the information area. -- Reduced noise in ComfyUI prompt extraction so generic custom `CLIPTextEncode*` nodes now prefer explicit prompt-bearing keys instead of surfacing parser/config strings as if they were prompt text. -- Tightened queue-monitor alert sensitivity so sidebar startup races no longer generate persistent disconnect noise unless the backend stays unavailable long enough to look like a real incident. - -
- See full update history: [docs/release/recent_updates.md](docs/release/recent_updates.md) @@ -340,6 +340,8 @@ Nodes are exported as `Moltbot*` class names for compatibility, but appear as `o - `openclaw: Image to Prompt` - `openclaw: Batch Variants` +The current node category is `openclaw`; serialized workflows that still reference the legacy `Moltbot*` class names continue to load through retained compatibility aliases. + See `web/docs/` for node usage notes. ### Node Portability and Workflow Fallback @@ -366,6 +368,8 @@ Current sidebar composition keeps `web/openclaw_ui.js` as the shell root and rou - tab registration/remount behavior: `web/openclaw_tabs.js` - shared error + compatibility helpers: `web/openclaw_utils.js` +New shell/tab wiring should use the shared text-safe DOM helpers in `web/openclaw_utils.js` instead of duplicating ad hoc element construction in individual tabs. + Canonical DOM/class ownership is now centered on `openclaw-*`; legacy `moltbot-*` class compatibility is still supported through shared runtime aliasing instead of duplicated markup in each tab template. The sidebar now also resolves and stamps its active host surface (`standalone_frontend` vs desktop-embedded host) at mount time so frontend-host drift is explicit and testable instead of inferred from runtime accidents. @@ -666,7 +670,7 @@ The connector currently remains an **optional attached subsystem inside this rep - **Secure**: Outbound-only for Telegram/Discord. LINE/WhatsApp/WeChat/KakaoTalk/Slack require inbound HTTPS (webhook), while Slack can also use Socket Mode and Feishu can run in either webhook or long-connection mode with a dedicated callback ingress path. - **WeChat encrypted mode**: Official Account encrypted webhook mode is supported when AES settings are configured. - **KakaoTalk response safety**: QuickReply limits and safe fallback handling are enforced for reliable payload behavior. -- **Slack multi-workspace mode**: Workspace installs can be handled through connector-managed OAuth install/callback routes with per-workspace token binding and fail-closed health diagnostics. +- **Slack multi-workspace and interactive mode**: Workspace installs can be handled through connector-managed OAuth install/callback routes with per-workspace token binding, fail-closed health diagnostics, and signed interactive callback handling for action payloads. - **Feishu/Lark multi-account mode**: Connector-managed account/workspace bindings support tenant-aware installation resolution, interactive approval cards, and signed callback handling without exposing raw app secrets or widening command trust implicitly. - **Bounded connector numeric envs**: Delivery/media/time-budget settings, bind ports, rate limits, and command-length knobs now clamp or fall back to documented defaults with warnings instead of crashing connector startup on malformed values. - **Packaging diagnostics**: Admin operators/maintainers can inspect `/openclaw/connector/extraction-contract` for the current in-repo recommendation plus the minimum seam families required before any future split. diff --git a/docs/SECURITY.md b/docs/SECURITY.md index c6ccf0e..f5a7393 100644 --- a/docs/SECURITY.md +++ b/docs/SECURITY.md @@ -159,7 +159,7 @@ If this acknowledgement is missing in public profile, deployment profile checks Connector ingress posture is fail-closed in strict profiles: -- if connector platform ingress is active (Telegram/Discord/LINE/WhatsApp/WeChat/Kakao/Slack) +- if connector platform ingress is active (Telegram/Discord/LINE/WhatsApp/WeChat/Kakao/Slack/Feishu) - and matching allowlist variables are missing - startup/deployment checks fail closed (`DP-PUBLIC-009` for public profile) @@ -236,6 +236,7 @@ OpenClaw validates custom LLM `base_url` settings to prevent Server-Side Request * **Default**: known providers and localhost-safe paths are allowed. * **Pinned connect contract**: on supported CPython versions (current baseline: 3.10+), the consolidated `safe_io` outbound executor dials resolved IPs directly for HTTP/HTTPS and keeps TLS `server_hostname` on the original host; the no-skip `tests.test_s70_ssrf_pinning_regression` lane is intended to fail loudly if stdlib connect behavior drifts. +* **Redirect handling**: redirect targets are revalidated against host allowlists, private/reserved-IP blocking, and pinned-connect rules before any follow-up connection is opened. * **Custom base URL**: - requires explicit opt-in: diff --git a/docs/connector.md b/docs/connector.md index f6d48a3..e0c6059 100644 --- a/docs/connector.md +++ b/docs/connector.md @@ -54,6 +54,7 @@ Slack multi-workspace notes: - `GET /openclaw/connector/installations` diagnostics may include per-install health metadata plus aggregate `health_counts`. - Slack lifecycle events such as `tokens_revoked`, `app_uninstalled`, and rate-limit degradation update installation health so outbound replies fail closed or degrade predictably for the affected workspace. - In multi-workspace mode, outbound replies and delayed result deliveries resolve the bot token by workspace binding and keep Slack thread context when replying back to the originating conversation. +- Slack interactive callbacks use the configured interactions path, signature verification, replay/idempotency checks, and connector policy mapping before accepting action payloads. Feishu / Lark notes: @@ -447,7 +448,7 @@ Slack uses the Events API webhook mode in OpenClaw. You must expose the endpoint - `channels:history` (public channel messages) - `groups:history` (private channel messages) - For legacy single-workspace mode, click **Install to Workspace** and copy the **Bot User OAuth Token** (`xoxb-...`). - - For F58 multi-workspace mode, configure a redirect URL and let OpenClaw handle installs through its OAuth routes. + - For multi-workspace mode, configure a redirect URL and let OpenClaw handle installs through its OAuth routes. 3. **Configure connector environment variables** @@ -458,6 +459,7 @@ Slack uses the Events API webhook mode in OpenClaw. You must expose the endpoint OPENCLAW_CONNECTOR_PUBLIC_BASE_URL=https://your-public-host OPENCLAW_CONNECTOR_SLACK_OAUTH_INSTALL_PATH=/slack/install OPENCLAW_CONNECTOR_SLACK_OAUTH_CALLBACK_PATH=/slack/oauth/callback + OPENCLAW_CONNECTOR_SLACK_INTERACTIONS_PATH=/slack/interactions OPENCLAW_CONNECTOR_SLACK_ALLOWED_USERS=U12345,U67890 OPENCLAW_CONNECTOR_SLACK_ALLOWED_CHANNELS=C12345 OPENCLAW_CONNECTOR_SLACK_BIND=127.0.0.1 @@ -469,9 +471,10 @@ Slack uses the Events API webhook mode in OpenClaw. You must expose the endpoint ``` Notes: - - Legacy single-workspace fallback can still set `OPENCLAW_CONNECTOR_SLACK_BOT_TOKEN=xoxb-...`; F58 multi-workspace mode no longer requires that token at startup if OAuth install flow is configured. + - Legacy single-workspace fallback can still set `OPENCLAW_CONNECTOR_SLACK_BOT_TOKEN=xoxb-...`; multi-workspace mode no longer requires that token at startup if OAuth install flow is configured. - `OPENCLAW_CONNECTOR_ADMIN_TOKEN` must match server `OPENCLAW_ADMIN_TOKEN` if server-side admin token is enabled. - Slack ingress is fail-closed: invalid/missing signature, stale timestamp, and replayed events are rejected. + - Slack interactive callbacks use the same signing-secret verification and route actions through the connector policy layer before executing run-affecting behavior. - OAuth callbacks also fail closed on invalid or replayed `state` values. - External OAuth/install failures intentionally use bounded generic text; inspect connector logs and installation diagnostics for redacted detail instead of expecting raw exception text in the callback response. @@ -480,10 +483,11 @@ Slack uses the Events API webhook mode in OpenClaw. You must expose the endpoint - Expose local endpoint to public HTTPS (Cloudflare Tunnel/ngrok/reverse proxy): - local upstream: `http://127.0.0.1:8095` - public URL: `https:///slack/events` + - interactions URL: `https:///slack/interactions` - install URL: `https:///slack/install` - callback URL: `https:///slack/oauth/callback` -5. **Enable Event Subscriptions** +5. **Enable Event Subscriptions and Interactivity** - Go to **Event Subscriptions** and enable events. - Set **Request URL** to `https:///slack/events`. - Slack sends `url_verification`; connector responds automatically. @@ -492,12 +496,15 @@ Slack uses the Events API webhook mode in OpenClaw. You must expose the endpoint - `message.channels` - `message.groups` - `message.im` + - Go to **Interactivity & Shortcuts** and enable interactivity. + - Set **Request URL** to `https:///slack/interactions`. 6. **Invite and validate** - Open `https:///slack/install` and complete the workspace install. - Invite the app to target channels: `/invite @YourBot`. - In channel: `@YourBot /status` (when `OPENCLAW_CONNECTOR_SLACK_REQUIRE_MENTION=true`). - In DM: `/help`. + - For approval or action-capable replies, press a rendered Slack button and confirm the connector logs show a signed interaction accepted or a bounded policy rejection. - Verify connector logs show signed ingress accepted and replies delivered. - Verify `GET /openclaw/connector/installations` shows the Slack workspace binding and health state `ok`. - If you test uninstall/token-revoke scenarios, verify the installation health flips to `revoked` or `invalid_token` and that subsequent replies for that workspace fail closed until reinstalled. diff --git a/docs/legacy-compatibility-governance.md b/docs/legacy-compatibility-governance.md index e76582a..1868d7a 100644 --- a/docs/legacy-compatibility-governance.md +++ b/docs/legacy-compatibility-governance.md @@ -32,7 +32,9 @@ Removal requires all of these conditions: | `header-x-moltbot-aliases` | Header | `X-Moltbot-*` request headers | `X-OpenClaw-*` request headers | `deprecated-observed` | `legacy_api_hits` and warning logs | | `environment-moltbot-prefix` | Environment | `MOLTBOT_*` environment variables | `OPENCLAW_*` environment variables | `retained-compatibility` | configuration diagnostics and warning logs | | `ui-class-moltbot-prefix` | UI class | `moltbot-*` CSS classes and local UI keys | `openclaw-*` CSS classes and local UI keys | `retained-compatibility` | frontend compatibility helper tests and operator reports | -| `workflow-node-moltbot-classes` | Workflow node | `Moltbot*` node class aliases and `moltbot` node category | `OpenClaw*` node classes and `openclaw` node category | `retained-compatibility` | workflow portability diagnostics and node-registration regression tests | +| `workflow-node-moltbot-classes` | Workflow node | `Moltbot*` node class aliases | `OpenClaw*` node classes and `openclaw` node category | `retained-compatibility` | workflow portability diagnostics and node-registration regression tests | + +The historical `moltbot` node category is no longer the current display category. Current shipped nodes use `openclaw`; legacy workflow compatibility is preserved through the `Moltbot*` class aliases rather than through legacy category metadata. ## Operator Visibility diff --git a/docs/r69_ui_framework_migration_decision.md b/docs/r69_ui_framework_migration_decision.md index dde657e..cd14616 100644 --- a/docs/r69_ui_framework_migration_decision.md +++ b/docs/r69_ui_framework_migration_decision.md @@ -70,7 +70,7 @@ Scored 1-5 (higher is better), weighted by current risk profile: 1. OpenClaw frontend is host-coupled to ComfyUI extension lifecycle and remount behavior; framework migration introduces significant integration and lifecycle risk with limited near-term operator value. 2. Current architecture already has critical stability controls (`ErrorBoundary`, tab remount safety, capability-gated registration, compatibility aliases, Vitest + Playwright lanes). Recent decomposition work further reduced shell/admin/runtime hotspot size without introducing a framework dependency. -3. Most remaining roadmap priorities are functionality/security features (`F53/F54/F58/F59`), not frontend rendering abstraction gaps; migration now would consume high-risk bandwidth with weak ROI. +3. Most remaining product priorities are functionality and security features, not frontend rendering abstraction gaps; migration now would consume high-risk bandwidth with weak ROI. ## Decision diff --git a/docs/security_checklist.md b/docs/security_checklist.md index 6dda981..96d0cff 100644 --- a/docs/security_checklist.md +++ b/docs/security_checklist.md @@ -68,7 +68,7 @@ | Rate limiting | Enabled | 10 req/min/user, 30 req/min/channel | | Debug mode | Disabled | No sensitive logging | | Replay protection | Enabled | LINE webhooks reject replays >5min old | -| Feishu interactive callbacks | Signed + deduped | Callback actions reject stale/replayed envelopes and degrade untrusted run actions to approval flow | +| Slack / Feishu interactive callbacks | Signed + deduped | Callback actions reject stale/replayed envelopes and degrade untrusted run actions to approval flow | ## 📞 Support diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index c630a94..012e6e2 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -41,6 +41,7 @@ What to check: Notes: - Compatibility class names such as `Moltbot*` still exist for older workflows, but the canonical portability contract is anchored on `openclaw:*` node identities. +- Current shipped nodes use the `openclaw` category in ComfyUI; seeing older `moltbot` category text usually means the installed pack is stale or ComfyUI has not been restarted after update. - Current diagnostics may include deterministic replacement hints when an unavailable OpenClaw node can degrade to a more portable workflow pattern. - If no portability guidance is present and the pack itself is loaded correctly, treat that as a real contract gap rather than assuming the workflow can be repaired by arbitrary JSON edits.