Skip to content

/status: show usage fetch errors instead of silently hiding#54803

Closed
felixclack wants to merge 18 commits intoopenclaw:mainfrom
felixclack:product/status-usage-error-feedback
Closed

/status: show usage fetch errors instead of silently hiding#54803
felixclack wants to merge 18 commits intoopenclaw:mainfrom
felixclack:product/status-usage-error-feedback

Conversation

@felixclack
Copy link
Copy Markdown

UX Improvement

Improves /status command feedback by showing why usage information is unavailable instead of silently omitting it.

Changes

  • Display provider API errors when usage fetching fails (e.g., timeout, authentication failure)
  • Show structured error messages from usage summary responses
  • Users get clear feedback instead of wondering if usage tracking is broken
  • Better debugging signal for rate-limit and API connectivity issues

User Impact

When the usage API is slow, unavailable, or misconfigured, users now see an explicit message like:

  • 📊 Usage: (unavailable: timeout)
  • 📊 Usage: (error: API authentication failed)

Previously, the usage line would silently disappear, leaving users confused about whether their quota was being tracked.

felixclack and others added 18 commits March 15, 2026 09:10
- Install Ruby 3.3.8 via ruby-build with bundler
- Add PostgreSQL 16 with pgvector extension from official repo
- Install GitHub CLI (gh) for repo operations
- Add OpenAI Codex CLI globally
- Configure fly.toml for clawdbot-felix app in lhr region
- Remove non-root user constraint for volume access

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create fly-entrypoint.sh to symlink tool configs to /data volume
- Persists ~/.codex, ~/.config/gh, ~/.gitconfig, ~/.ssh across restarts
- Auto-creates openclaw wrapper in PATH on startup

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add sync-runtime-config.mjs: idempotent startup script that merges env
  vars into /data/openclaw.json (solves config-set-hangs problem)
- Add fly-deploy.yml GitHub Actions workflow with secret validation,
  app/volume auto-creation, and one-shot RESET_CONFIG support
- Bump NODE_OPTIONS to --max-old-space-size=2880 --optimize-for-size
  for the 4GB machine (was 1536 for 2GB)
- Update fly.toml VM memory to 4096mb
- Add gawk to Dockerfile (fixes mawk keyword clash with awk scripts)
- Add RESET_CONFIG one-shot flag and PostgreSQL conditional start to
  entrypoint
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Splits Dockerfile into builder and runtime stages. Build tools (Rust,
build-essential, Bun, devDependencies) stay in the builder stage and
are excluded from the final image. Ruby is compiled to /opt/ruby for a
clean copy. pnpm prune --prod strips dev deps after build.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This V8 flag is disallowed in NODE_OPTIONS and causes node to exit
immediately with code 9.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The sync-runtime-config script was creating config-level auth.profiles
entries (mode: "token") for providers with env vars set. This overrode
the gateway's auto-discovery of store-level profiles (e.g. OAuth tokens
in auth-profiles.json), causing FailoverError: "No API key found for
provider openai-codex" on cron tasks and Telegram responses.

The fix removes config-level auth.profiles creation. Provider detection
for model selection is preserved. Auth resolution now correctly falls
back to the auth store where OAuth profiles live.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove [http_service] from fly.toml so Fly no longer routes public
internet traffic to the gateway. The control UI and all gateway
endpoints are now only reachable via Tailscale at clawdbot-fly:3000.

Telegram continues working via outbound long polling.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use `tailscale serve` to proxy HTTPS on port 443 to the gateway on
port 3000, with automatic TLS cert provisioning. The control UI is
now accessible at https://clawdbot-fly.<tailnet>.ts.net.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Codex <noreply@openai.com>
Improves UX by showing why usage info is missing.
- Display provider API errors (e.g., timeout, auth failure)
- Show structured errors from usage summary responses
- Users no longer left wondering if usage tracking is broken
- Better debugging signal for rate-limit/API issues
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation channel: discord Channel integration: discord channel: imessage Channel integration: imessage channel: matrix Channel integration: matrix channel: msteams Channel integration: msteams channel: signal Channel integration: signal channel: slack Channel integration: slack channel: telegram Channel integration: telegram channel: whatsapp-web Channel integration: whatsapp-web gateway Gateway runtime scripts Repository scripts docker Docker and sandbox tooling labels Mar 26, 2026
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Mar 26, 2026

Greptile Summary

This PR delivers a small but useful UX improvement: the /status command now surfaces why usage information is unavailable (e.g., 📊 Usage: (unavailable: Timeout) or 📊 Usage: (error: API authentication failed)) rather than silently omitting the usage line. The core change in src/auto-reply/reply/commands-status.ts is clean and correct — usageEntry.error is typed as string | undefined so the interpolation is safe, and the two error code paths (structured provider errors vs. thrown exceptions) are handled correctly.\n\nThe PR also bundles a significant amount of Fly.io deployment infrastructure:\n\n- Dockerfile: Adds a full operator toolchain (Bun, PostgreSQL 16, GitHub CLI, OpenAI Codex, Tailscale, Ruby 3.3.8) to the runtime image, removes the USER node non-root hardening that was previously explicitly documented as a security measure, and adds a fly-entrypoint.sh as the container ENTRYPOINT.\n- src/gateway/server-http.ts: Adds a new early-return /health endpoint for Fly.io liveness probes, which intentionally bypasses loadConfig() to guarantee the probe always succeeds during startup — but this path is already registered in GATEWAY_PROBE_STATUS_BY_PATH, leaving dead code in the probe stage.\n- src/infra/sync-runtime-config.test.ts: New test suite for runtime config syncing.\n- Plugin SDK / extensions: resolveOutboundSendDep and OutboundSendDeps are now re-exported via each channel's plugin SDK entry point rather than imported directly from the internal src/ path, which is a clean encapsulation improvement.

Confidence Score: 4/5

Safe to merge with the security note about running as root addressed or explicitly acknowledged.

The core feature change is correct and well-implemented. The infrastructure changes are intentional for the Fly.io deployment context but include a notable security regression (dropping USER node) that should be acknowledged. The duplicate /health handler and unversioned curl installs are minor follow-up concerns that don't block the primary UX fix.

Dockerfile (root user removal and unversioned installs), src/gateway/server-http.ts (duplicate /health handler)

Important Files Changed

Filename Overview
src/auto-reply/reply/commands-status.ts Core UX fix: surfaces structured provider errors and caught exceptions as visible usage lines instead of silently nulling them out. Logic is correct and type-safe.
Dockerfile Adds full Fly.io operator toolchain to runtime image and removes USER node non-root hardening; curl
src/gateway/server-http.ts Adds early-return /health endpoint to bypass loadConfig() during startup, but duplicates an existing probe handler entry with a different response shape.
src/infra/sync-runtime-config.test.ts New test suite for runtime config syncing; covers model/thinking/subagent overrides and control UI allowed-origins.
Prompt To Fix All With AI
This is a comment left during a code review.
Path: Dockerfile
Line: 234

Comment:
**Container now runs as root — intentional?**

This PR removes both `RUN chown node:node /app`, all `--chown=node:node` COPY flags, and — most significantly — `USER node`. The original code included an explicit comment:

```
# Security hardening: Run as non-root user
# The node:24-bookworm image includes a 'node' user (uid 1000)
# This reduces the attack surface by preventing container escape via root privileges
USER node
```

The new toolchain (Tailscale, PostgreSQL, Bun in `/root/.bun/bin`) appears to require root at startup, and the entrypoint likely needs root to bootstrap these services. If that's the intent, it might be worth documenting with a comment why running as root is required here, or exploring whether the app process itself can drop privileges after the entrypoint bootstrapping completes (e.g., via `exec su-exec` or `gosu node "$@"` in `fly-entrypoint.sh`).

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: Dockerfile
Line: 131

Comment:
**Unversioned `curl | bash` installs reduce build reproducibility**

Two install scripts are fetched and executed without a version pin:

```dockerfile
RUN curl -fsSL https://bun.sh/install | bash      # line 131 — always installs "latest"
RUN curl -fsSL https://tailscale.com/install.sh | sh  # line 162 — same
```

Each Docker build may pull a different version, making the image non-deterministic and harder to audit. Consider pinning to a specific release (e.g., `BUN_VERSION=1.x.y` for bun, or the versioned Tailscale `apt` package) so the build is reproducible and the installed version is tracked in source control.

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: src/gateway/server-http.ts
Line: 771-775

Comment:
**Duplicate `/health` handler shadows the existing probe infrastructure**

`/health` is already registered in `GATEWAY_PROBE_STATUS_BY_PATH` (line 110) and handled by `handleGatewayProbeRequest`, which returns `{ ok: true, status: "live" }`. The new early-return handler intercepts `req.url === "/health"` before the stages run and returns a different shape: `{ ok: true, ts: Date.now() }`.

The motivation is valid (bypass `loadConfig()` which can throw before the app is fully initialised, guaranteeing liveness probes always succeed on startup). If that's the goal, consider either:
- Removing `/health` from `GATEWAY_PROBE_STATUS_BY_PATH` to avoid the dead code path, or
- Adding a comment explaining why the early handler exists alongside the stage-based one.

As written, a reader has to trace the whole request pipeline to understand why `/health` is listed in the probe map but never reaches the probe handler.

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "/status: show usage fetch errors instead..." | Re-trigger Greptile

Comment thread Dockerfile
@@ -202,11 +233,9 @@ RUN --mount=type=cache,id=openclaw-bookworm-apt-cache,target=/var/cache/apt,shar
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
ca-certificates curl gnupg && \
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Container now runs as root — intentional?

This PR removes both RUN chown node:node /app, all --chown=node:node COPY flags, and — most significantly — USER node. The original code included an explicit comment:

# Security hardening: Run as non-root user
# The node:24-bookworm image includes a 'node' user (uid 1000)
# This reduces the attack surface by preventing container escape via root privileges
USER node

The new toolchain (Tailscale, PostgreSQL, Bun in /root/.bun/bin) appears to require root at startup, and the entrypoint likely needs root to bootstrap these services. If that's the intent, it might be worth documenting with a comment why running as root is required here, or exploring whether the app process itself can drop privileges after the entrypoint bootstrapping completes (e.g., via exec su-exec or gosu node "$@" in fly-entrypoint.sh).

Prompt To Fix With AI
This is a comment left during a code review.
Path: Dockerfile
Line: 234

Comment:
**Container now runs as root — intentional?**

This PR removes both `RUN chown node:node /app`, all `--chown=node:node` COPY flags, and — most significantly — `USER node`. The original code included an explicit comment:

```
# Security hardening: Run as non-root user
# The node:24-bookworm image includes a 'node' user (uid 1000)
# This reduces the attack surface by preventing container escape via root privileges
USER node
```

The new toolchain (Tailscale, PostgreSQL, Bun in `/root/.bun/bin`) appears to require root at startup, and the entrypoint likely needs root to bootstrap these services. If that's the intent, it might be worth documenting with a comment why running as root is required here, or exploring whether the app process itself can drop privileges after the entrypoint bootstrapping completes (e.g., via `exec su-exec` or `gosu node "$@"` in `fly-entrypoint.sh`).

How can I resolve this? If you propose a fix, please make it concise.

Comment thread Dockerfile

# Keep the Fly deployment runtime provisioned with the operator toolchain
# used by the live workspace and entrypoint bootstrapping.
RUN curl -fsSL https://bun.sh/install | bash
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Unversioned curl | bash installs reduce build reproducibility

Two install scripts are fetched and executed without a version pin:

RUN curl -fsSL https://bun.sh/install | bash      # line 131 — always installs "latest"
RUN curl -fsSL https://tailscale.com/install.sh | sh  # line 162 — same

Each Docker build may pull a different version, making the image non-deterministic and harder to audit. Consider pinning to a specific release (e.g., BUN_VERSION=1.x.y for bun, or the versioned Tailscale apt package) so the build is reproducible and the installed version is tracked in source control.

Prompt To Fix With AI
This is a comment left during a code review.
Path: Dockerfile
Line: 131

Comment:
**Unversioned `curl | bash` installs reduce build reproducibility**

Two install scripts are fetched and executed without a version pin:

```dockerfile
RUN curl -fsSL https://bun.sh/install | bash      # line 131 — always installs "latest"
RUN curl -fsSL https://tailscale.com/install.sh | sh  # line 162 — same
```

Each Docker build may pull a different version, making the image non-deterministic and harder to audit. Consider pinning to a specific release (e.g., `BUN_VERSION=1.x.y` for bun, or the versioned Tailscale `apt` package) so the build is reproducible and the installed version is tracked in source control.

How can I resolve this? If you propose a fix, please make it concise.

Comment on lines +771 to +775
// Unauthenticated health check for Fly.io liveness probes.
if (req.method === "GET" && req.url === "/health") {
sendJson(res, 200, { ok: true, ts: Date.now() });
return;
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Duplicate /health handler shadows the existing probe infrastructure

/health is already registered in GATEWAY_PROBE_STATUS_BY_PATH (line 110) and handled by handleGatewayProbeRequest, which returns { ok: true, status: "live" }. The new early-return handler intercepts req.url === "/health" before the stages run and returns a different shape: { ok: true, ts: Date.now() }.

The motivation is valid (bypass loadConfig() which can throw before the app is fully initialised, guaranteeing liveness probes always succeed on startup). If that's the goal, consider either:

  • Removing /health from GATEWAY_PROBE_STATUS_BY_PATH to avoid the dead code path, or
  • Adding a comment explaining why the early handler exists alongside the stage-based one.

As written, a reader has to trace the whole request pipeline to understand why /health is listed in the probe map but never reaches the probe handler.

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/gateway/server-http.ts
Line: 771-775

Comment:
**Duplicate `/health` handler shadows the existing probe infrastructure**

`/health` is already registered in `GATEWAY_PROBE_STATUS_BY_PATH` (line 110) and handled by `handleGatewayProbeRequest`, which returns `{ ok: true, status: "live" }`. The new early-return handler intercepts `req.url === "/health"` before the stages run and returns a different shape: `{ ok: true, ts: Date.now() }`.

The motivation is valid (bypass `loadConfig()` which can throw before the app is fully initialised, guaranteeing liveness probes always succeed on startup). If that's the goal, consider either:
- Removing `/health` from `GATEWAY_PROBE_STATUS_BY_PATH` to avoid the dead code path, or
- Adding a comment explaining why the early handler exists alongside the stage-based one.

As written, a reader has to trace the whole request pipeline to understand why `/health` is listed in the probe map but never reaches the probe handler.

How can I resolve this? If you propose a fix, please make it concise.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f7249fb694

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +120 to +124
const desiredWorkspace = trim(process.env.OPENCLAW_WORKSPACE_DIR) || `${stateDir}/workspace`;
const agents = ensureObject(config, "agents");
const defaults = ensureObject(agents, "defaults");
if (defaults.workspace !== desiredWorkspace) {
defaults.workspace = desiredWorkspace;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve existing workspace unless OPENCLAW_WORKSPACE_DIR is set

This block rewrites agents.defaults.workspace on every startup even when no workspace override env var is provided, because it defaults to ${stateDir}/workspace unconditionally. In deployments that already have a custom workspace in openclaw.json, the value is silently clobbered after restart, which can redirect or orphan existing session/workspace data. Only setting this field when OPENCLAW_WORKSPACE_DIR is explicitly provided (or when defaults.workspace is missing) would avoid this regression.

Useful? React with 👍 / 👎.

Comment thread scripts/fly-entrypoint.sh
sleep 2

# Connect to Tailscale network
tailscale up --authkey="$TAILSCALE_AUTHKEY" --hostname="clawdbot-fly" --accept-routes
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Prevent Tailscale bootstrap failures from stopping gateway launch

Because the script runs with set -e, a non-zero exit from tailscale up aborts the entrypoint before exec "$@" runs. When TAILSCALE_AUTHKEY is set, transient control-plane/auth failures therefore take down the whole gateway process instead of just degrading Tailscale exposure. This should be retried or handled as non-fatal so the gateway can still start.

Useful? React with 👍 / 👎.

@clawsweeper
Copy link
Copy Markdown
Contributor

clawsweeper Bot commented Apr 30, 2026

Codex review: found issues before merge.

What this changes:

The PR attempts to show provider-usage fetch errors in chat /status and also adds Fly.io deployment workflow/runtime scripts, Docker runtime toolchain changes, a /health shortcut, runtime config sync, SDK outbound-send exports, and docs/template edits.

Maintainer follow-up before merge:

The status fix is narrow, but this PR mixes it with security-sensitive Docker/Fly/runtime-config changes and needs maintainer splitting/security review rather than an automated repair on the existing branch.

Security review:

Security review needs attention: Security review needs attention because the diff introduces container privilege and supply-chain risks unrelated to the /status UX fix.

Review findings:

  • [P2] Move usage errors into the shared status renderer — src/auto-reply/reply/commands-status.ts:97-109
  • [P1] Preserve workspaces unless an env override is set — scripts/sync-runtime-config.mjs:120-124
  • [P1] Let the gateway start if Tailscale bootstrap fails — scripts/fly-entrypoint.sh:90
Review details

Best possible solution:

Land the status UX improvement as a narrow current-main patch in src/status/status-text.ts, with regression coverage for structured usageEntry.error and rejected/timeout usage-summary calls. Split the Fly.io, Docker, workflow, runtime-config, SDK export, and docs-template changes into separate owner-reviewed PRs.

Do we have a high-confidence way to reproduce the issue?

Yes. A focused reproduction is to mock loadProviderUsageSummary for buildStatusText to return a provider snapshot with error and no windows, or to reject; current main omits the usage line in both paths based on src/status/status-text.ts:228-239.

Is this the best way to solve the issue?

No. The PR's narrow status idea is right, but the implementation belongs in the shared current renderer and should not be bundled with unrelated deployment, container, workflow, SDK, and template changes.

Full review comments:

  • [P2] Move usage errors into the shared status renderer — src/auto-reply/reply/commands-status.ts:97-109
    The diff adds error rendering to the old inline status command, but current main routes chat /status through buildStatusText. After rebasing, this needs to live in src/status/status-text.ts or provider errors and timeouts will still be hidden.
    Confidence: 0.88
  • [P1] Preserve workspaces unless an env override is set — scripts/sync-runtime-config.mjs:120-124
    This startup sync rewrites agents.defaults.workspace to ${stateDir}/workspace whenever OPENCLAW_WORKSPACE_DIR is unset. Existing deployments with a custom workspace in openclaw.json would silently move agent context and session paths after restart.
    Confidence: 0.9
  • [P1] Let the gateway start if Tailscale bootstrap fails — scripts/fly-entrypoint.sh:90
    Because the script runs with set -e, a non-zero tailscale up exits before exec "$@". A transient Tailnet or auth-key failure would stop the whole gateway instead of only disabling Tailscale exposure.
    Confidence: 0.88
  • [P1] Drop privileges before starting OpenClaw — Dockerfile:262-263
    The branch removes the existing USER node hardening and the new entrypoint ultimately execs the gateway as root. If root is required for bootstrapping, the script should drop privileges before starting the OpenClaw process.
    Confidence: 0.87
  • [P2] Keep Fly deployment defaults generic — fly.toml:4-5
    The PR changes the repository Fly config to a contributor-specific app, region, hostname, and volume names. Merging that would make the upstream deployment template point at one personal deployment instead of a reusable OpenClaw configuration.
    Confidence: 0.82
  • [P3] Use the shared probe handler for /health — src/gateway/server-http.ts:771-774
    /health is already registered as a live gateway probe and current main serves live probes before config loading. This exact-URL shortcut returns a different response shape and leaves the shared probe map with a duplicate dead path.
    Confidence: 0.82

Overall correctness: patch is incorrect
Overall confidence: 0.9

Security concerns:

  • [high] Gateway would run as root in the Docker image — Dockerfile:262
    The PR removes the current non-root runtime hardening and adds an entrypoint that ultimately execs the gateway as root, broadening the impact of any runtime compromise.
    Confidence: 0.88
  • [medium] Root-executed installers are not pinned — Dockerfile:131
    The Dockerfile executes remote Bun and Tailscale install scripts without version pins, so each image build can execute different upstream code as root and produce a less auditable artifact.
    Confidence: 0.84
  • [medium] Persistent root operator config increases blast radius — scripts/fly-entrypoint.sh:35
    The entrypoint symlinks root-scoped Codex, GitHub CLI, Git, and SSH configuration into the Fly volume; combined with running the gateway as root, a runtime compromise could persist and reuse operator credentials across restarts.
    Confidence: 0.78

Acceptance criteria:

  • pnpm test src/auto-reply/reply/commands-status.test.ts src/infra/provider-usage.format.test.ts
  • pnpm exec oxfmt --check --threads=1 src/status/status-text.ts src/auto-reply/reply/commands-status.test.ts

What I checked:

Likely related people:

  • @steipete: Recent history shows @steipete touching provider-usage formatting, gateway liveness probes, Docker hardening/runtime image behavior, and the shallow current-main boundary commit that rewrote the inspected paths. (role: recent maintainer and likely follow-up owner; confidence: high; commits: 14b4c7fd56ae, 04be516926da, aa84b738b6ea; files: src/infra/provider-usage.format.ts, src/gateway/server-http.ts, Dockerfile)
  • @shakkernerd: Recent commits on src/status/status-text.ts preserve workspace auth labels and model status behavior near the current /status rendering surface. (role: recent status renderer maintainer; confidence: medium; commits: 7d4a0bb62163, 3b4d2d88865a; files: src/status/status-text.ts)
  • @vincentkoc: Recent commits on src/gateway/server-http.ts deferred startup imports and trimmed config/auth paths, adjacent to the PR's added /health shortcut and gateway startup behavior. (role: gateway hot-path maintainer; confidence: medium; commits: 1497425b8dbb, a494eea6d40f, 1ee893bc5fec; files: src/gateway/server-http.ts)

Remaining risk / open question:

  • The branch is substantially out of date with current main, so exact conflict resolution and final CI behavior need maintainer validation after splitting or rebasing.
  • The Fly/Docker changes are security-sensitive and deployment-specific enough that they need owner review rather than an automated one-shot repair on this PR branch.

Codex review notes: model gpt-5.5, reasoning high; reviewed against ef799fd57a77.

@felixclack felixclack closed this May 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: discord Channel integration: discord channel: imessage Channel integration: imessage channel: matrix Channel integration: matrix channel: msteams Channel integration: msteams channel: signal Channel integration: signal channel: slack Channel integration: slack channel: telegram Channel integration: telegram channel: whatsapp-web Channel integration: whatsapp-web docker Docker and sandbox tooling docs Improvements or additions to documentation gateway Gateway runtime scripts Repository scripts size: XL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant