Changed Match Container to get action data from Parse Intent node
instead of the old Parse Action node which isn't executed in the
intent-based routing flow.
Mapping:
- action -> intent.parameters.action
- containerQuery -> intent.container
- chatId -> intent.original_message.chat.id
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Parse and Match now returns formatted text directly, so Format Response
node is redundant. Connect Parse and Match directly to Send Docker Response
to avoid 'Unexpected response format' error.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Changed typeValidation from 'strict' to 'loose' and rightValue from
strings to numbers to fix type mismatch error in Switch node conditions.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Split Claude API call into two nodes:
- Prepare Claude Request: Code node that builds the request body
- Claude Intent Parser: HTTP Request node that sends the request
This fixes the 'model: Field Required' error caused by complex
expression evaluation issues in the HTTP Request node's jsonBody.
Also updated Parse Intent to get original message from the new node.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Removed empty leftValue from options and changed condition check from
object notEmpty to string notEmpty using optional chaining on specific
properties (message?.text, callback_query?.id).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Connection keys referenced hyphenated IDs (code-parse-logs) instead of
actual node names (Parse Logs Command). Fixed 10 connection sources to
use proper node names.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Answer Batch Query to dismiss callback loading state
- Add Delete Batch Confirm Message to remove confirmation message
- Add Send Batch Result to display final success/failure message
- Wire up complete flow: Format Result -> Answer -> Delete -> Send
- UI cleanup keeps chat clean with only result message remaining
- Update Parse Callback Data to detect batch (c is array) vs single
- Add isBatch and containerIds fields to callback data
- Add 'batch' route in Route Callback switch (output 2)
- Add Build Batch Commands node to prepare curl commands for each container
- Add Prepare Batch Execution to combine commands with result markers
- Add Execute Batch Action to run all container actions sequentially
- Add Parse Batch Result to parse RESULT_N:statusCode output
- Add Format Batch Result to build success/failure message
- Replace placeholder 'Format Multiple Matches' with 'Build Batch Keyboard'
- Create inline_keyboard with 'Yes, <action> N containers' and 'Cancel' buttons
- Encode batch container IDs in callback_data (limit 4 for 64-byte constraint)
- Use HTTP Request for sendMessage (same pattern as suggestion flow)
- Format container list with bullet points in confirmation message
- Add Parse Callback Data code node to decode callback_query JSON
- Add Route Callback switch for cancel/expired/execute branches
- Add Handle Cancel with answer query and delete message
- Add Handle Expired with alert message and delete message
- Add Build Callback Action to construct curl command from callback
- Add Execute Callback Action to run Docker API call
- Add Parse Callback Result to check status and build response
- Add Answer Action Query, Delete Suggestion Message, Send Callback Result
- 2-minute timeout enforced via timestamp in callback_data
- Replace Format No Match with Find Closest Match code node
- Add Check Suggestion IF node to route based on hasSuggestion
- Add Build Suggestion Keyboard code node for inline button payload
- Add Send Suggestion HTTP Request to Telegram API with inline_keyboard
- Update Match Container to include allContainers for suggestion logic
- Suggestion shown when score >= 2 (partial match found)
- Update Telegram Trigger to receive both message and callback_query updates
- Add Route Update Type switch to route messages vs callbacks
- Add IF Callback Authenticated node for callback query auth
- Restructure connections: message flow through auth, callback through separate auth
- Add Docker List for Action node to get container list
- Add Match Container node with fuzzy matching (substring, prefix stripping)
- Add Check Match Count Switch node to route 0/1/>1 matches
- Add Build Action Command node to construct curl POST command
- Add Execute Action node to call Docker API start/stop/restart
- Add Parse Action Result node handling 204/304 success and error codes
- Add Send Action Result node for Telegram response
- Add placeholder nodes for No Match and Multiple Matches branches
- Use graceful ?t=10 timeout for stop/restart actions
- Add new route in Switch node for start/stop/restart commands
- Route matches case-insensitive startsWith for each action
- Add Parse Action Code node to extract action type and container name
- Action branch routes to Parse Action, ready for container matching
- Add -s (silent) flag to curl to suppress progress output
- Change error handling to only check stdout for valid JSON
- Ignore stderr which contains curl progress info
- Add Switch node to route messages based on content
- Add Execute Command node with curl to Docker API
- Add Parse and Match code node with fuzzy matching
- Add Format Response code node with emoji mapping
- Preserve echo branch for non-docker messages
- Handle summary, single match, multiple matches, and errors
n8n community edition blocks env var access in expressions.
Hardcoded TELEGRAM_USER_ID for single-user authentication.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>