v0.19.0 — LINE AI customer-service n8n port + GW line-level provenance
v0.19.0 — LINE AI customer-service n8n port + Google Workspace line-level provenance
🆕 New example: examples/line-ai-customer-service/
Port of the backend of scorpioliu0953/ai_customer_service (Netlify + React + Supabase + GPT/Gemini) to n8n, with the admin frontend implemented as approach C (n8n-hosted UI).
Backend runtime (1:1 with upstream line-webhook.ts, 175 lines)
core/core-message-router— dedup / handover-keyword → human / human-mode timeout / GPT (chat · o-series · gpt-5 Responses) or Gemini / replyentry-line— webhook + raw-body HMAC-SHA256 signature verify + event fan-out
Frontend admin (approach C — runs entirely in n8n, no external host)
admin/admin-ui— Respond-to-Webhook serves a single-file HTML dashboardadmin/api-settings·api-users·api-kb— CRUD over the same Supabase tables- dashboard HTML generated by
admin/_build_admin.mjs(avoids hand JSON-escaping) X-Admin-Tokenauth via n8n envLINECS_ADMIN_TOKEN
Design
- Only one n8n credential (Supabase). LINE / OpenAI / Gemini keys are read from the
settingsrow — same as upstream, so the dashboard can edit them. - Docs:
SDD.md(portability verdict — backend portable, React dashboard not),FRONTEND-SDD.md(approach C),docs/{install,supabase-setup,line-setup,admin-setup,field-mapping}. - Gotchas documented: LINE signature needs raw body, self-hosted needs
NODE_FUNCTION_ALLOW_BUILTIN=crypto, reply-token ~1 min TTL, no native LINE/Gemini nodes.
📎 Google Workspace example — line-level provenance
- New
examples/google-workspace-admin-workflow/PROVENANCE.md— maps every preserved data item to the exact upstreamsrc/Code.gsline, pinned to commitfce2513(11 subfolders / 9 Doc headings / T001–T010 / 10 checklist rows / 5 reminder offsets / 14 date types / sheet headers). - Inline
<- Code.gs:Lxxxmarkers in thePreparenodes + a source pointer in each core overview sticky note.
✅ Validation
Both examples pass _audit.mjs static lint (0 errors / 0 warnings) and local n8n REST import (Google Workspace 7/7, LINE 6/6 accepted by n8n).
🤖 Generated with Claude Code