Commit Graph

139 Commits

Author SHA1 Message Date
Lucas Berger 216f3a406a fix(16): repair broken connections, auth credentials, and dead code across 4 workflows
Phase 16 plans 16-02 through 16-05 introduced three classes of defects:

1. Connection keys used node IDs instead of node names (33 broken links
   across n8n-workflow.json, n8n-batch-ui.json, n8n-actions.json)
2. GraphQL HTTP nodes used $env.UNRAID_API_KEY manual headers instead of
   Header Auth credential, causing CSRF/UNAUTHENTICATED errors (20 nodes)
3. Duplicate node name "Execute Batch Update" (serial vs parallel paths)

Also fixes Build Cancel Return Submenu using $input.item.json instead of
$('Prepare Cancel From Confirm').item.json after GraphQL query chain.

Removes 12 dead/orphan nodes (6 pre-migration dead code chains,
6 unused utility templates). Node count: 193 -> 181.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:29:40 -05:00
Lucas Berger 9f6752720b feat(16-05): implement hybrid batch update with updateContainers mutation
- Added IF node to check batch size (threshold: 5 containers)
- Small batches (<=5): use single updateContainers mutation (parallel, fast)
- Large batches (>5): use existing serial Execute Workflow loop
- Build Batch Update Mutation node constructs updateContainers GraphQL query
- Execute Batch Update with 120-second timeout for large image pulls
- Handle Batch Update Response maps results and updates Container ID Registry
- Format and send batch result via Telegram
- Both paths produce consistent result messaging

Workflow pushed to n8n successfully (HTTP 200).
2026-02-09 10:37:05 -05:00
Lucas Berger ed1a114d74 feat(16-05): replace 6 Docker API queries with Unraid GraphQL
- Migrated Get Container For Action to GraphQL
- Migrated Get Container For Cancel to GraphQL
- Migrated Get All Containers For Update All to GraphQL (with imageId)
- Migrated Fetch Containers For Update All Exec to GraphQL (with imageId)
- Migrated Get Container For Callback Update to GraphQL
- Migrated Fetch Containers For Bitmap Stop to GraphQL

Added 6 GraphQL Response Normalizer nodes and 6 Container ID Registry update nodes.
All nodes use $env.UNRAID_HOST and $env.UNRAID_API_KEY for authentication.
15-second timeout for myunraid.net cloud relay.
Workflow pushed to n8n successfully (HTTP 200).
2026-02-09 10:34:20 -05:00
Lucas Berger 1b61343528 feat(15-01): add Callback Token Encoder and Decoder utility nodes
- Callback Token Encoder: compress 129-char Unraid PrefixedID to 8-char hex token
- SHA-256 hashing with 7-window collision detection (56 chars / 8-char windows)
- Callback Token Decoder: resolve 8-char token back to PrefixedID
- Both use JSON serialization for static data persistence (_callbackTokens)
- Standalone utility nodes at [600,2400] and [1000,2400]
- Not connected - Phase 16 will wire into active flow

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 08:53:38 -05:00
Lucas Berger e6ac219212 feat(15-02): add GraphQL Error Handler and HTTP Template utility nodes
- GraphQL Error Handler maps ALREADY_IN_STATE to HTTP 304 (matches Docker API pattern)
- Handles NOT_FOUND, FORBIDDEN, UNAUTHORIZED error codes
- HTTP Template pre-configured with 15s timeout for myunraid.net cloud relay
- Environment variable auth (UNRAID_HOST, UNRAID_API_KEY headers)
- continueRegularOutput error handling for downstream processing
- Standalone utility nodes at [600,2600] and [1000,2600] for Phase 16 wiring
- Fix: removed invalid notesDisplayMode from Container ID Registry
2026-02-09 08:52:23 -05:00
Lucas Berger 1b4b596e05 feat(15-02): add GraphQL Response Normalizer utility node
- Transforms Unraid GraphQL response to Docker API contract
- Maps id->Id, state (UPPERCASE)->State (lowercase), names->Names
- STOPPED->exited conversion (Docker convention)
- Validates response.errors[] and data.docker.containers structure
- Standalone utility node at [200, 2600] for Phase 16 wiring
2026-02-09 08:47:58 -05:00
Lucas Berger 903e73d616 feat: v1.3 Unraid Update Status Sync
Unraid GraphQL API foundation — connectivity, authentication, and
container ID format verified for native Unraid API integration.

Phase 14: Unraid API Access (2 plans, 4 tasks)
- Established Unraid GraphQL API connectivity via myunraid.net cloud relay
- Dual credential storage (.env.unraid-api + n8n env vars)
- Container ID format: {server_hash}:{container_hash} (128-char SHA256 pair)
- Complete API contract documented in ARCHITECTURE.md
- "unraid" test command added to Telegram bot

Phases 15-16 dropped (superseded by v1.4 Unraid API Native).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 07:47:31 -05:00
Lucas Berger c2c2ce7092 fix(12-02): Update All flow — 9 bug fixes from UAT
Fixes discovered during BATCH-04/BATCH-05 UAT testing:

- Convert confirmation to HTTP Request (editMessageText for inline kb,
  sendMessage for text command) with dynamic endpoint selection
- Fix data chain breaks: use named node refs ($('Parse Callback Data'),
  $('Get Update All Data')) instead of $json after API calls
- Add infrastructure container exclusion (n8n, socket-proxy) by image
  and container name to prevent bot self-destruction during updates
- Add batch responseMode to update sub-workflow (skip Telegram messages)
- Reorder infra check before :latest filter so sha256-digest images
  appear in skipped list
- Add onError:continueRegularOutput to Answer Update All Start for
  expired callback queries
- Show "Back to List" button in batch summary for update-all flow
- Add Prepare Update All Batch fallback in Prepare Batch Loop

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas Berger d153453aa9 refactor(workflow): remove orphan callback node chain (172→166 nodes) 2026-02-08 18:56:44 -05:00
Lucas Berger 0810c0919a fix(11-01): fix bitmap node references to use Parse Callback Data
Is Bitmap Batch Stop and Resolve Batch Stop Names were checking $json.bitmap
which contains the Telegram API response, not the parsed callback data. Changed
both to reference $("Parse Callback Data").item.json directly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas Berger 551a69f1f3 fix(11-01): fix batch stop bitmap resolution wiring and parser return
Three bugs from plan 11-01 execution:
1. Parse Callback Data bstop return missing bitmap/isBitmapBatchStop fields
2. Is Bitmap Batch Stop wired to expired branch [0] instead of not-expired [1]
3. Is Bitmap Batch Stop false branch went to Initialize Batch State, bypassing Prepare Batch Stop Exec

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas Berger 3275e190c4 feat(11-02): add Update All button to container list with callback routing
- Add 'Update All :latest' button to Build Container List and Build Paginated List
- Add uall:start parser to Parse Callback Data (sets isUpdateAllStart flag)
- Add updateallstart rule to Route Callback (index 2)
- Add Answer Update All Start node with 'Checking for updates...' callback response
- Wire Route Callback [updateallstart] -> Answer Update All Start -> Get All Containers For Update All
- Fix Check Available Updates to support both text and callback origins (try/catch for Keyword Router vs Parse Callback Data)
2026-02-08 18:56:44 -05:00
Lucas Berger bac38634a3 feat(11-01): update main workflow for bitmap-encoded batch callbacks
- Add new parsers for b: (toggle), bn: (nav), be: (exec) formats in Parse Callback Data
- Update Prepare Batch UI Input to forward bitmap field instead of selectedCsv
- Retain old batch:toggle/nav/exec parsers for backward compatibility with in-flight messages
- Add bitmap detection in bstop:confirm parser (detects alphanumeric vs CSV format)
- Add 3 new nodes for bitmap resolution flow:
  - Is Bitmap Batch Stop (IF node)
  - Fetch Containers For Bitmap Stop (HTTP)
  - Resolve Batch Stop Names (Code node with decodeBitmap)
- Wire bitmap resolution flow: Check Batch Stop Expired -> Is Bitmap -> [true] Fetch -> Resolve -> Initialize
- Legacy CSV format routes directly to Initialize Batch State (false path)
- Total: 171 nodes (168 + 3 new)
2026-02-08 18:56:44 -05:00
Lucas Berger 43f525a89c fix(10.2-04): wire correlation ID generators and remove orphan nodes
- Renamed connection keys from node IDs to node names (Generate Correlation ID, Generate Callback Correlation ID)
- Rewired IF User Authenticated -> Generate Correlation ID -> Keyword Router
- Rewired IF Callback Authenticated -> Generate Callback Correlation ID -> Parse Callback Data
- Removed 2 orphan nodes (Delete Batch Confirm Message, Send Text Update Started)
- Removed ghost connection key (code-log-error)
- Node count reduced from 170 to 168
2026-02-08 18:56:44 -05:00
Lucas Berger 7f579d5fe9 refactor(10.2): remove static-data-dependent debug commands and logging nodes
n8n workflow static data does not persist between executions on this
instance, making the ring buffer, debug commands, and trace capture
non-functional. Removed:
- 4 Keyword Router debug rules (/errors, /clear, /debug, /trace)
- Process Debug Command + Send Debug Response nodes
- Log Error + Log Trace utility nodes
- 2 error detection IF nodes (Check Execute *Action Success)
- Inline trace blocks from 7 result-handling Code nodes

Kept: structured error returns in sub-workflows (success/false + error
objects), correlation ID generation, correlationId pass-through.

Node count: 176 -> 170.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas Berger 10ad20f495 fix(10.2-03): use JSON-serialized top-level key for n8n static data persistence
n8n $getWorkflowStaticData only reliably tracks top-level property changes.
Deep nested mutations (staticData.errorLog.debug.enabled = true) are not
persisted between executions. Fix: serialize errorLog as JSON string in
staticData._errorLog — every read does JSON.parse, every write does
JSON.stringify as a top-level assignment.

Fixed in: Process Debug Command, Log Error, Log Trace, 6 inline trace
nodes, Parse Callback Data callback routing trace.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas Berger e331d1618e fix(10.2-03): fix correlationId placement in 19 Prepare Input nodes
Plan 02 executor placed correlationId outside the json object in all
Prepare Input code nodes, creating "Unexpected token '}'" syntax errors.
Moved correlationId inside the json return object in all 19 affected nodes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas Berger 69eb4e0b9d fix(10.2-03): reorder Keyword Router rules — debug commands before generic contains
Two bugs: (1) connection array had old fallback at index [9] shifting debug
connections off-by-one, so /errors routed to Show Menu. (2) /debug status
matched rule 1 (contains "status") before rule 11 (startsWith /debug).
Fix: move startsWith debug rules [1-4] before contains rules [5-12].

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas Berger e7074288f0 feat(10.2-03): wire debug trace capture at sub-workflow boundaries and callback routing
- Added debug trace capture to 6 result-handling Code nodes
- Traces capture sub-workflow boundary data (success, action, hasError)
- Added callback routing trace to Parse Callback Data node
- Traces only activate when debug mode enabled (staticData.errorLog.debug.enabled)
- Auto-disable after 100 executions to prevent performance impact
- Inline tracing (no new nodes added, node count remains 176)
2026-02-08 18:56:44 -05:00
Lucas Berger f7130f61fc feat(10.2-02): add correlation ID generation and error capture to main workflow
Part A - Correlation ID Generation:
- Added Generate Correlation ID node for text command path
- Added Generate Callback Correlation ID node for callback path
- Wired between authentication and routing nodes
- Uses timestamp + random string pattern (no external dependencies)

Part B - Correlation ID Propagation:
- Modified 19 Prepare Input nodes to pass correlationId to sub-workflows
- Uses $input.item.json.correlationId pattern for flexibility
- Supports both text and callback paths

Part C - Error Capture Infrastructure:
- Added 2 error detection IF nodes for high-value paths:
  * Check Execute Container Action Success
  * Check Execute Inline Action Success
- Error path: success === false → Log Error node
- Success path: continues to original result handling
- Log Error node receives error data from sub-workflows
- Pass-through design preserves data for downstream handlers

Main workflow: 172 → 176 nodes (+4)
- 2 correlation ID generators
- 2 error detection IF nodes

Error ring buffer now captures:
- Container action failures (Docker API errors)
- Sub-workflow errors with full diagnostic context
- Correlation IDs for request tracing
- Workflow name, node, HTTP codes, raw responses
2026-02-08 18:56:44 -05:00
Lucas Berger 030118efb3 feat(10.2-01): add error and trace logging utility nodes
- Create Log Error code node with ring buffer write logic
- Create Log Trace code node with debug mode check and auto-disable
- Both nodes implement ring buffer (max 50 entries) with auto-rotation
- Log Error: accepts error data, truncates large fields (stack 500, raw 1000)
- Log Error: passes through input data with _errorLogged flag
- Log Trace: checks debug.enabled before logging, passes through unchanged
- Log Trace: auto-disables debug mode after 100 executions
- Both nodes positioned at utility area (2600, -200/-400)
- Nodes are standalone (no connections) - ready for Plan 02 wiring
- Node count: 170 -> 172 (+2 utility nodes)
2026-02-08 18:56:44 -05:00
Lucas Berger d1d13ca671 feat(10.2-01): add hidden debug commands and error ring buffer foundation
- Add 4 new keyword routes: /errors, /clear-errors, /debug, /trace
- Create Process Debug Command code node with unified command handling
- Initialize workflow static data structure (errorLog with debug, errors, traces)
- Implement /errors command to display recent errors (default 5, max 50)
- Implement /clear-errors command to reset error buffer
- Implement /debug on|off|status for debug mode toggle
- Implement /trace <correlationId> for correlation-based query
- Add Send Debug Response Telegram node with HTML formatting
- Wire Keyword Router -> Process Debug Command -> Send Debug Response
- Commands remain hidden (not listed in /start menu)
- Node count: 168 -> 170 (+2 nodes)
2026-02-08 18:56:44 -05:00
Lucas Berger ac2d745e1d fix(10.1-09): wire /list command connection to Prepare Status Input
The list keyword rule was added to Keyword Router but its connection
pointed to Show Menu (fallback) instead of Prepare Status Input.
Added proper connection at index 8 and shifted fallback to index 9.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas Berger a5cffc3745 feat(10.1-09): add /list command to Keyword Router
- Added 'list' route with same output as 'status'
- Both /list and /status now show paginated container list
- Provides user-expected /list command while leveraging existing functionality
2026-02-08 18:56:44 -05:00
Lucas Berger 9982a59adc fix(10.1-09): use dynamic input in Build Cancel Return Submenu
- Changed $('Prepare Cancel Return').item.json to $input.item.json
- Allows node to work with both cancel paths (batch cancel and confirmation cancel)
- Fixes confirmation dialog cancel button returning to container status view
2026-02-08 18:56:44 -05:00
Lucas Berger 95f29e5433 fix(10.1-09): use actionType field in Build Batch Keyboard
- Changed const action = $json.action to $json.actionType
- Fixes disambiguation keyboard showing 'multiple all?' instead of actual action
- Ensures correct callback_data format: bexec:{action}:... not bexec:multiple:...
2026-02-08 18:56:44 -05:00
Lucas Berger 6824697295 fix(10.1-06): fix batch text command data flow through matching sub-workflow
Added "Prepare Batch Execution" Code node between Route Batch Match Result
and Route Batch Action to transform matching sub-workflow output:
- matchedContainers -> allMatched (field name expected by downstream nodes)
- action from Detect Batch Command (stop/start/restart) instead of
  "batch_matched" routing label from sub-workflow

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas Berger aae95e2405 fix(10.1-06): strip inline keyboard from text-mode status responses
Text commands like "status book" should show plain text status without
inline keyboard buttons. Added "Strip Status Keyboard" Code node that
removes reply_markup before sending via Send Container Submenu Direct.
Callback-based status (with messageId) still gets the full UI with buttons.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas Berger 138728a7b1 fix(10.1-06): fix action type passthrough and text status routing
- Prepare Text Action Input now reads action (stop/start/restart) from
  Parse Action Command instead of matching sub-workflow's actionType field
- Added "Has Status Message ID" If node to route status_direct results:
  messageId > 0 → Edit Container List (callback), messageId == 0 →
  Send Container Submenu Direct (text command)
- Pre-existing bug: text "status <name>" routed to editMessageText with
  messageId 0, causing Telegram API error

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas Berger 596b0e5dab fix(10.1-06): replace matching workflow placeholders with deployed ID kL4BoI8ITSP9Oxek
- Updated 3 Execute Workflow nodes: Execute Action Match, Execute Update Match, Execute Batch Match
- Deployed n8n-matching.json as workflow kL4BoI8ITSP9Oxek
- Pushed main workflow to n8n API

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas Berger d5246ba1c6 feat(10.1-06): update main workflow to call matching sub-workflow
- Remove 12 matching/disambiguation logic nodes from main workflow
- Add 9 integration nodes: 3 Prepare Input + 3 Execute Workflow + 3 Route Result
- Net reduction: 3 nodes (168 -> 165)
- Wire Docker List for Action -> Prepare -> Execute -> Route -> existing handlers
- Wire Docker List for Update -> Prepare -> Execute -> Route -> existing handlers
- Wire Get Containers for Batch -> Prepare -> Execute -> Route -> existing handlers
- Preserve all 6 Telegram response nodes in main workflow
- Update Prepare Text Action/Update Input to use sub-workflow return data
- Backup created at n8n-workflow.json.backup-matching

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas Berger df9a4420e9 fix(batch): support text-based batch commands (not just keyboard)
Text-based batch commands (e.g., /start container1 container2) were
failing because Send Batch Start Message always used editMessageText,
but you can't edit the user's message.

Fixed by:
- Conditionally use sendMessage vs editMessageText based on fromKeyboard
- Capture new message_id from sendMessage response for progress updates

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 22:21:50 -05:00
Lucas Berger e9a971a014 fix(routing): connect batchStopConfirm to Answer Batch Stop Confirm
Output 11 was incorrectly going to Build Callback Action (single
container handler) instead of Answer Batch Stop Confirm (batch handler).

The batch stop confirm flow should be:
Answer Batch Stop Confirm -> Check Batch Stop Expired -> Prepare Batch Stop Exec

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 22:16:54 -05:00
Lucas Berger ad89700844 fix(routing): swap batchStopConfirm and batchStopCancel connections
Route Callback outputs 11 and 12 were swapped:
- batchStopConfirm was going to Answer Batch Stop Cancel
- batchStopCancel was going to Build Callback Action

Now correctly routed:
- batchStopConfirm (output 11) -> Build Callback Action
- batchStopCancel (output 12) -> Answer Batch Stop Cancel

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 22:14:41 -05:00
Lucas Berger e4740dddb4 fix(batch): pass batchAction to Batch UI sub-workflow
The batch action (stop/start/restart) was being lost because:
1. Parse Callback Data extracted action: "stop"
2. Prepare Batch UI Input overwrote it with action: "exec" (the UI action type)
3. Handle Exec tried to parse callbackData which was empty

Fixed by:
- Adding batchAction field to Prepare Batch UI Input
- Adding batchAction to Batch UI trigger schema
- Updating Handle Exec to use triggerData.batchAction and selectedCsv

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 22:11:50 -05:00
Lucas Berger 1a47176713 fix(telegram): use HTTP Request for editMessageText with keyboards
The n8n Telegram node's inlineKeyboard parameter doesn't work reliably
with editMessageText operation. Switched to HTTP Request node calling
Telegram API directly, which properly passes reply_markup.

Changed nodes:
- Send Confirmation Dialog
- Send Stop Result
- Send Expired Message

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 22:07:20 -05:00
Lucas Berger 0983a5f99a fix(telegram): use inline_keyboard array for Telegram node
The n8n Telegram node's inlineKeyboard parameter expects the keyboard
rows array directly, not the full {inline_keyboard: [...]} object.

Fixed nodes:
- Send Confirmation Dialog
- Send Stop Result
- Send Expired Message

Changed from: JSON.stringify($json.reply_markup)
Changed to: JSON.stringify($json.reply_markup.inline_keyboard)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 22:04:20 -05:00
Lucas Berger 224f5469ab fix(routing): correct Route Callback connection offsets
The batch rule was added at index 4 but connections weren't updated,
causing all subsequent rules to route to wrong handlers:
- select → Answer List Callback (wrong)
- list → Answer Action Callback (wrong)
- action → Answer Noop Callback (wrong)
- noop → nothing (missing)

Fixed by correcting outputs 5-8 to connect to proper handlers.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 22:00:09 -05:00
Lucas Berger 58e4fbdbbe fix(10.1-05): add mode: once to Execute Status nodes
Execute Workflow nodes need mode: "once" to properly pass input
data to sub-workflows. Added to:
- Execute Container Status
- Execute Select Status
- Execute Paginate Status
- Execute Batch Cancel Status

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 21:47:41 -05:00
Lucas Berger 8727b4f7a8 fix(10.1-05): wire Route Status Result to Telegram nodes
Route Status Result had no outgoing connections after status
sub-workflow extraction. Added connections:
- list output → Send Container List
- status_direct output → Edit Container List
- error output → Send Docker Error

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 21:44:10 -05:00
Lucas Berger fae429a05e feat(10.1-05): deploy sub-workflows to n8n with real IDs
- Replaced TODO placeholders with actual n8n workflow IDs:
  - Batch UI: ZJhnGzJT26UUmW45
  - Container Status: lqpg2CqesnKE2RJQ
  - Confirmation Dialogs: fZ1hu8eiovkCk08G
- Updated instructions.md with new workflow IDs and renamed files
- All workflows deployed and activated in n8n

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 21:39:37 -05:00
Lucas Berger 36ecdd5ba9 feat(10.1-04): integrate confirmation sub-workflow in main workflow
- Removed 19 single-container confirmation nodes
- Added 9 integration nodes (net -10 nodes: 178->168)
- Route Callback[9,10] (confirm/cancelConfirm) -> Execute Confirmation
- Route Action Type[2,3] (stop/update) -> Execute Confirmation
- Route Confirmation Result handles show/stop_result/confirm_update/cancel/expired
- Added TODO_DEPLOY_CONFIRMATION_WORKFLOW placeholder

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 21:33:23 -05:00
Lucas Berger 13ed81cccf feat(10.1-03): update main workflow to call status sub-workflow
- Removed 10 list/status nodes (Docker queries, keyboard building)
- Added 9 integration nodes (Prepare/Execute pairs for status, select, paginate)
- Keyword Router status output -> Prepare Status Input -> Execute Container Status
- Answer Select Callback -> Execute Select Status -> Send Container Submenu
- Answer List Callback -> Execute Paginate Status -> Edit Container List
- Prepare Batch Cancel Return -> Execute Batch Cancel Status -> Edit Container List
- Added TODO_DEPLOY_STATUS_WORKFLOW placeholder for deployment
2026-02-04 21:26:55 -05:00
Lucas Berger 8b9af171b6 feat(10.1-02): extract batch UI to sub-workflow
- Updated main workflow to call n8n-batch-ui.json sub-workflow
- Main workflow reduced from 192 to 179 nodes (-13 nodes)
- Removed 22 batch UI nodes now handled by sub-workflow:
  - Fetch/Build/Rebuild Batch Select Keyboard nodes
  - Handle Batch Toggle/Clear/Exec/Nav nodes
  - Answer and Edit keyboard nodes
- Added 9 new nodes for sub-workflow integration:
  - Prepare Batch UI Input
  - Execute Batch UI (TODO_DEPLOY_BATCH_UI_WORKFLOW placeholder)
  - Route Batch UI Result with action routing
  - Telegram response handlers for keyboard/confirm/cancel/limit
- Batch execution loop remains in main workflow (orchestration)
- Created backup file for rollback capability

Part of batch UI extraction (Task 2-3/3)
2026-02-04 21:19:57 -05:00
Lucas Berger a8c9ab69d6 fix(batch): edit message in place instead of delete+send
- Skip Delete Batch Select Message node for batch start
- Use editMessageText instead of sendMessage
- Batch start now smoothly transitions like batch stop

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 16:41:07 -05:00
Lucas Berger 23f60ff043 fix(batch): edit confirmation message instead of sending new one
Changed batch start to editMessageText so the confirmation message
gets updated with progress/results instead of leaving it hanging
and sending a separate progress message.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 16:30:42 -05:00
Lucas Berger 1869cab358 fix(10-07): add timestamp to logs refresh to prevent message not modified error
- Format Inline Logs Result now adds timestamp to message
- Shows 'Updated: HH:MM:SS' at bottom of logs display
- Ensures Telegram API always accepts refresh (content always different)
2026-02-04 16:00:30 -05:00
Lucas Berger 77c3d6543d fix(10-07): add fuzzy matching to logs and fix chatId reference
- Send Logs Response now uses Prepare Text Logs Input for chatId
- Container logs sub-workflow uses .includes() for fuzzy matching
- Multiple match handling added with helpful error message
2026-02-04 16:00:07 -05:00
Lucas Berger 28f4c59d3f fix(10-07): fix batch action data chain reference
- Prepare Batch Action Input now uses Build Progress Message reference
- Fixes 'Cannot read properties of undefined' error for batch actions
- Data chain: Build Progress Message -> Edit Progress Message -> Prepare Batch Action Input
2026-02-04 15:59:33 -05:00
Lucas Berger 63a0019ccf fix(10-07): fix batch update data chain reference
- Prepare Batch Update Input now uses Build Progress Message reference
- Fixes 'Cannot read properties of undefined' error
- Data chain: Build Progress Message -> Edit Progress Message -> Prepare Batch Update Input
2026-02-04 15:59:05 -05:00