Home

boring / v2

publicBoring-Software-Inc/v2
Overview Code History Branches Pull requestsIssuesInsights Campfire Docs
main
HomeOverview Code PRsIssues

feat(workflows): webhook and discord outbound action nodes

3 months ago

41cbe5f
Authored
grim7/21/2026, 9:59:28 PM
two terminal action nodes deliver the verdict outbound. the SSRF boundary
(guarded-fetch) is the crux: https only rejected at save AND on the resolved
IP at delivery (TOCTOU), no redirects, private/reserved/metadata ranges
refused v4 and v6, 10s timeout, body capped and discarded. HMAC-SHA256
signing over the exact wire body (sign once), X-Delivery-ID + Idempotency-Key
= the stable action row id so retries dedupe. delivery runs async through a
scheduled job, retried like the surface sweeper; failures record the class
never the url. urls + signing secrets are set-only masked to the client and
kept out of logs. a test-connection button probes reachability; a webhook
node pointed at a discord url warns. at-rest encryption is a tracked gap
(WEBHOOK-SECURITY-GAP.md).

Parent324fbee

24 files changed
  • WEBHOOK-SECURITY-GAP.md+46−0
  • apps/web/src/components/workflows/editor/editor-sidebar.tsx+6−0
  • apps/web/src/components/workflows/editor/properties-panel.tsx+192−102
  • apps/web/src/components/workflows/editor/workflow-editor-page.tsx+4−0
  • apps/web/src/components/workflows/editor/workflow-editor.tsx+35−8
  • apps/web/src/lib/delivery-probe.ts+39−0
  • apps/web/src/lib/server-fn-classification.ts+1−0
  • apps/web/src/lib/workflow-secrets.test.ts+80−0
  • apps/web/src/lib/workflow-secrets.ts+116−0
  • apps/web/src/lib/workflows.functions.ts+89−4
  • apps/worker/src/deliver-webhook.integration.test.ts+243−0
  • apps/worker/src/index.ts+22−1
  • apps/worker/src/jobs/deliver-webhook.ts+114−0
  • apps/worker/src/jobs/pr-surface.ts+35−0
  • apps/worker/src/jobs/sweep-actions.ts+6−0
  • packages/contracts/src/index.ts+1−0
  • packages/contracts/src/webhook-payload.test.ts+59−0
  • packages/contracts/src/webhook-payload.ts+86−0
  • packages/contracts/src/workflow.ts+33−0
  • packages/db/src/services/runs.ts+89−1
  • packages/utils/src/guarded-fetch.test.ts+331−0
  • packages/utils/src/guarded-fetch.ts+298−0
  • packages/utils/src/index.ts+10−0
  • scripts/e2e/scenarios.ts+116−0