Skip to content

fix(ui): use feature detection for crypto.randomUUID to support HTTP deployments#1868

Open
wsszh wants to merge 2 commits into
kagent-dev:mainfrom
wsszh:fix/crypto-randomuuid-insecure-context
Open

fix(ui): use feature detection for crypto.randomUUID to support HTTP deployments#1868
wsszh wants to merge 2 commits into
kagent-dev:mainfrom
wsszh:fix/crypto-randomuuid-insecure-context

Conversation

@wsszh
Copy link
Copy Markdown

@wsszh wsszh commented May 14, 2026

Summary

  • The UI uses crypto.randomUUID() which requires a Secure Context (HTTPS or localhost). Deployments served over plain HTTP crash on /agents/new with Uncaught TypeError: crypto.randomUUID is not a function.
  • Introduces a generateId() utility in ui/src/lib/utils.ts that detects crypto.randomUUID availability at runtime and falls back to the uuid package (already a dependency, v14) when unavailable.
  • Replaces all 8 crypto.randomUUID() call sites across 4 source files.

Changes

File Change
ui/src/lib/utils.ts Add generateId() with runtime feature detection
ui/src/lib/promptSourceRow.ts crypto.randomUUID()generateId()
ui/src/lib/openClawSandboxForm.ts crypto.randomUUID()generateId()
ui/src/components/prompts/FragmentEntriesEditor.tsx crypto.randomUUID()generateId()
ui/src/app/agents/new/page.tsx crypto.randomUUID()generateId()

Context

crypto.randomUUID() is a Web Crypto API gated behind Secure Context. Any deployment accessed via http:// (common in internal/dev clusters without TLS termination) crashes when rendering the agent creation form. The uuid npm package (v14, already in package.json) uses crypto.getRandomValues() which works in all contexts.

The fix uses runtime feature detection (typeof crypto.randomUUID === "function") so it works with the pre-built Docker image regardless of deployment configuration — no Helm or environment variable changes needed.

ui/public/mockServiceWorker.js also calls crypto.randomUUID() but is auto-generated by MSW and runs in a Service Worker context (always secure), so it is not modified.

Test plan

  • cd ui && npm run build passes
  • cd ui && npm run lint passes
  • Deploy over HTTP → /agents/new → "Skip wizard" → form loads without crash
  • Deploy over HTTPS → same flow works using native crypto.randomUUID()
  • grep -r 'crypto.randomUUID' ui/src/ returns only utils.ts feature-detection branch (and mockServiceWorker.js)
…deployments

crypto.randomUUID() requires a Secure Context (HTTPS or localhost).
Deployments served over plain HTTP crash on /agents/new with
"Uncaught TypeError: crypto.randomUUID is not a function".

Add a generateId() utility that detects crypto.randomUUID availability
at runtime and falls back to the uuid package (already a dependency)
when unavailable. Replace all 8 crypto.randomUUID() call sites.

Signed-off-by: wsszh <wsszh@users.noreply.github.com>
Signed-off-by: sup <sup@supdeMacBook-Pro.local>
Copilot AI review requested due to automatic review settings May 14, 2026 08:19
@wsszh wsszh requested a review from peterj as a code owner May 14, 2026 08:19
@github-actions github-actions Bot added the bug Something isn't working label May 14, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Fixes a runtime crash on HTTP deployments where crypto.randomUUID() is unavailable outside Secure Contexts. Adds a generateId() helper with feature detection that falls back to the uuid package, and replaces all call sites.

Changes:

  • Add generateId() utility in ui/src/lib/utils.ts with runtime feature detection and uuid v4 fallback.
  • Replace all 8 crypto.randomUUID() call sites in 4 files with generateId().

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.

Show a summary per file
File Description
ui/src/lib/utils.ts Adds generateId() helper and imports uuidv4 fallback.
ui/src/lib/promptSourceRow.ts Switches to generateId() for prompt source row ids.
ui/src/lib/openClawSandboxForm.ts Switches to generateId() for sandbox channel row ids.
ui/src/components/prompts/FragmentEntriesEditor.tsx Switches 4 call sites to generateId() for fragment row ids.
ui/src/app/agents/new/page.tsx Switches 2 call sites to generateId() for prompt source row ids.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

3 participants