6 Commits

Author SHA1 Message Date
Claude
46372e8e38 feat(executor): {input.foo} template interpolation on node config strings
Every action/terminal node's config string fields are now run through
TemplateEngine.Render before the node sees them, so operators can pull
values from the incoming item into any config field.

- {input}, {input.a.b}, {input.tags[0]}, {input["weird.key"]}
- {{ / }} escape to literal braces
- Missing paths / null input → empty string (no 500s on absent query params)
- Unrecognised / malformed placeholders pass through so typos are visible
- Strings render raw; numbers/bools stringified; objects/arrays compact JSON

Interpolation runs executor-side (Executor.RunNodeAsync walks ConfigJson
and rewrites string leaves), so every node opts in for free. 20 new tests
(17 TemplateEngine + 2 Executor + 1 end-to-end webhook→WebResponse).
2026-08-29 18:44:03 +00:00
Claude
bc682d8c9f feat(webhook): GET support — query string → JSON body, HEAD safe no-op
POST behaviour unchanged (JSON body). GET on the same URL now triggers the
workflow with the query string collapsed into a JSON object: /wh/wf/hi?a=1&name=x
becomes {"a":"1","name":"x"}, and repeated keys collapse into a string
array (?tag=a&tag=b → {"tag":["a","b"]}). No query string yields {} —
matches the empty-POST-body semantics.

HEAD returns 200 empty so Slack/Discord link previews don't fire the workflow
AND don't flag the URL as broken. Other verbs (PUT/PATCH/DELETE/OPTIONS) still
return 405 JSON with Allow: POST, GET.

Frontend WebhookUrlHint now advertises both verbs and drops the POST prefix
from the displayed URL so the raw URL is copy-and-clickable.

6 new xUnit tests cover: GET-unknown-404, GET-with-query, GET-repeated-keys,
GET-empty-query, HEAD-200, PUT-still-405 (updated Allow header).
2026-08-29 07:51:27 +00:00
Claude
1a1f519144 fix(webhook): GET on /wh/* returns 405 helper page instead of SPA fallback
Previously a browser click on the webhook URL fell through the POST-only
handler to MapFallbackToFile('index.html'), landing the user on the
workflows page and looking like a bug. Now non-POST verbs on the same
route return 405 with Allow: POST — GETs render a small HTML page showing
the correct curl invocation, other methods get JSON. Two new xUnit tests
cover the HTML and JSON branches and assert we don't hand back the SPA.
2026-08-28 20:16:07 +00:00
Claude
ebd06a6abc feat(nodes): WebResponseNode — resolves webhook TCS with configured payload; move WebhookRouter to Core 2026-08-28 15:20:10 +00:00
Claude
3d7910c5e7 feat(nodes): WebhookNode — registers (workflow,path) route and emits body items 2026-08-28 15:16:51 +00:00
Claude
ff54b1f22d feat(api): POST /wh/{workflow-id}/{*path} endpoint 2026-08-28 15:00:24 +00:00