Commit Graph

327 Commits

Author SHA1 Message Date
Lucas Berger 66574efed2 fix(logs): properly parse Docker multiplexed stream format
Docker logs API returns multiplexed stream with 8-byte headers per frame,
not just newline-separated text. The old code split on \n which missed
frames that weren't newline-terminated.

Now properly parses the binary stream format:
- Reads 8-byte header (stream type + frame size)
- Extracts frame data based on size
- Splits frame content by newlines
- Correctly counts and displays requested number of lines

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 22:26:18 -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 99612a9649 fix(10.1-05): fix Route Action connections in status sub-workflow
Switch node connections must use "main" array format with indices,
not named output keys. Changed from:
  { "list": [...], "status": [...] }
to:
  { "main": [ [...], [...], [...] ] }

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 21:52:36 -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 68dd7ff803 docs(10.1-05): add sub-workflow deployment guide
- Documents 6 sub-workflows (3 deployed, 3 pending)
- Lists all Execute Workflow nodes and target IDs
- Provides deployment steps for TODO placeholders
- Includes rollback instructions using backup files
- Architecture diagram shows workflow relationships
- Input/output contracts for new sub-workflows
- Testing checklist for post-deployment verification
2026-02-04 21:37:10 -05:00
Lucas Berger 4649ed5a5f docs(10.1-04): complete confirmation sub-workflow plan
Tasks completed: 3/3
- Create n8n-confirmation.json sub-workflow
- Update main workflow with confirmation integration
- Create backup

SUMMARY: .planning/phases/10.1-aggressive-workflow-modularization/10.1-04-SUMMARY.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 21:34:47 -05:00
Lucas Berger 1a9f63dbbc chore(10.1-04): add backup before confirmation extraction
- Backup file: n8n-workflow.json.backup-confirm
- Pre-extraction node count: 178 (post-10.1-03)
- Post-extraction node count: 168

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 21:33:38 -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 47c2b47c99 feat(10.1-04): create confirmation dialogs sub-workflow
- New n8n-confirmation.json with 16 nodes
- Handle show_stop/show_update dialog generation
- Handle confirm_stop with expiry checking
- Handle confirm_update (returns action for main workflow)
- Handle cancel and expired actions
- Calls n8n-actions.json for confirmed stop execution

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 21:31:36 -05:00
Lucas Berger 3d138688e5 docs(10.1-03): complete container status sub-workflow plan
Tasks completed: 3/3
- Task 1: Create n8n-status.json sub-workflow
- Task 2: Update main workflow with sub-workflow calls
- Task 3: Create backup for rollback

SUMMARY: .planning/phases/10.1-aggressive-workflow-modularization/10.1-03-SUMMARY.md
2026-02-04 21:28:25 -05:00
Lucas Berger 4245a49f78 chore(10.1-03): add backup for status extraction
- Created n8n-workflow.json.backup-status for rollback
- Verified no orphan node references in main workflow
- Status sub-workflow has 11 nodes with Execute Workflow Trigger
2026-02-04 21:27:13 -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 369eb2a87e feat(10.1-03): create container status sub-workflow
- Created n8n-status.json with 11 nodes
- Handles list, status, and paginate actions
- Input: chatId, messageId, action, containerName, page, queryId, searchTerm
- Output: success, action, text, reply_markup, container data
- Docker queries via HTTP request to docker-socket-proxy
2026-02-04 21:24:46 -05:00
Lucas Berger 884fefaab5 docs(10.1-02): complete batch UI extraction plan
Tasks completed: 3/3
- Task 1: Create n8n-batch-ui.json sub-workflow (16 nodes)
- Task 2: Update main workflow (192 -> 179 nodes, -13)
- Task 3: Create backup for rollback

SUMMARY: .planning/phases/10.1-aggressive-workflow-modularization/10.1-02-SUMMARY.md
2026-02-04 21:21:32 -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 07a62d13f1 feat(10.1-02): create batch UI sub-workflow
- Created n8n-batch-ui.json with 16 nodes
- Handles batch selection UI: mode, toggle, nav, clear, cancel, exec actions
- Returns structured data for main workflow to send Telegram responses
- Entry point: Execute Workflow Trigger with input contract
- Uses existing Docker API pattern for container listing

Part of batch UI extraction (Task 1/3)
2026-02-04 21:16:13 -05:00
Lucas Berger cd7c177553 docs(10.1-01): complete foundation and domain analysis plan
Tasks completed: 3/3
- Rename sub-workflows to shorter pattern
- Analyze main workflow domain boundaries
- User approval on extraction boundaries

SUMMARY: .planning/phases/10.1-aggressive-workflow-modularization/10.1-01-SUMMARY.md
2026-02-04 21:10:07 -05:00
Lucas Berger fba90a6cc4 docs(10.1-01): analyze main workflow domain boundaries
Domain analysis of 192-node main workflow:
- Batch UI/Orchestration: 48 nodes (HIGH extraction value)
- Container List/Menu: 17 nodes (HIGH extraction feasibility)
- Confirmation Dialogs: 30 nodes (MEDIUM extraction feasibility)
- Matching/Disambiguation: 15 nodes (optional extraction)
- Telegram Responses: 58 nodes (LOCKED to remain in main)

Key finding: Target of 50-80 nodes not achievable due to locked
Telegram response pattern. Realistic target: 115-125 nodes.

Recommended extraction order:
- Wave 2: Batch UI + Container List
- Wave 3: Confirmation + Matching (optional)
2026-02-04 20:29:21 -05:00
Lucas Berger ff532aa99e refactor(10.1-01): rename sub-workflows to shorter pattern
- n8n-container-update.json -> n8n-update.json
- n8n-container-actions.json -> n8n-actions.json
- n8n-container-logs.json -> n8n-logs.json

Workflow IDs remain unchanged (n8n assigns on import).
Main workflow Execute Workflow nodes reference by ID, not filename.
2026-02-04 20:26:34 -05:00
Lucas Berger 25dd3ab2d2 docs(10.1): create phase plan
Phase 10.1: Aggressive Workflow Modularization
- 5 plan(s) in 3 wave(s)
- Wave 1: Foundation (rename files, analyze boundaries, user approval)
- Wave 2: 3 parallel extractions (batch-ui, status, confirmation)
- Wave 3: Integration verification and UAT
- Ready for execution

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 20:20:29 -05:00
Lucas Berger f071a949b1 docs(10.1): research phase domain
Phase 10.1: Aggressive Workflow Modularization
- Standard stack identified (Execute Workflow nodes, sub-workflow patterns)
- Architecture patterns documented (input contracts, error handling, routing)
- Pitfalls catalogued (memory issues, data references, error gaps, circular deps)
- Analyzed existing workflows (192 nodes main, 3 sub-workflows)
- Validated patterns against n8n docs and community best practices
- Confidence: HIGH (grounded in existing implementations + locked user decisions)
2026-02-04 20:14:22 -05:00
Lucas Berger 8e372dd8ed wip: 10.1-aggressive-workflow-modularization paused at context gathered
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 17:01:32 -05:00
Lucas Berger 9285f3e011 docs(10.1): capture phase context
Phase 10.1: Aggressive Workflow Modularization
- Implementation decisions documented
- Phase boundary established
- Fixed misnamed phase directories (10.1/10.2)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 17:00:37 -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 d043e11bd4 fix(actions): fix paired item reference in Format Result nodes
Changed from $('When executed by another workflow') to $('Route Action')
to avoid paired item reference errors when data flows through the
Resolve Container ID path.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 16:26:31 -05:00
Lucas Berger 4ea0824c40 chore: add project-level Claude instructions
Includes n8n API integration docs, workflow IDs, push commands,
and technical patterns learned during development.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 16:22:41 -05:00
Lucas Berger adbd7bd87d fix(batch): resolve container IDs in sub-workflows
When batch operations are triggered via keyboard callbacks, the main
workflow only passes container names (not IDs). The sub-workflows now:
- Check if containerId is empty
- If empty, query Docker API to resolve name → ID
- Then proceed with the action

This fixes batch start/stop/restart/update operations failing with
404 "page not found" errors.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 16:19:33 -05:00
Lucas Berger f7859fc3c4 docs(phase-10): complete workflow modularization phase
All 7 plans executed and verified:
- 3 sub-workflows (Update, Actions, Logs)
- UAT gaps closed (race conditions, data chains, fuzzy matching)
- Main workflow: 209 → 192 nodes (-8%)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 16:05:06 -05:00
Lucas Berger b156fe48cf docs(10-07): complete UAT gap closure plan
Tasks completed: 5/5
- Fix text update race condition (remove parallel message)
- Fix batch update data chain (Build Progress Message reference)
- Fix batch action data chain (Build Progress Message reference)
- Add fuzzy matching to logs and fix chatId reference
- Add timestamp to logs refresh for message not modified error

SUMMARY: .planning/phases/10-workflow-modularization/10-07-SUMMARY.md
2026-02-04 16:01:49 -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
Lucas Berger 9d38bf9f51 fix(10-07): remove text update race condition
- Remove parallel Send Text Update Started connection
- Text updates now only send result via sub-workflow
- Fixes duplicate message issue (Updating... + already up to date)
2026-02-04 15:58:47 -05:00
Lucas Berger 5a6b6e3e85 docs(10): create UAT gap closure plan 10-07
Phase 10 UAT revealed 5 gaps:
- Text update race condition (parallel message send)
- Batch update/action data chain broken ($json vs Build Progress Message)
- Logs fuzzy matching missing
- Logs refresh "message not modified" error

10-07-PLAN.md addresses all gaps in 5 tasks.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 15:54:02 -05:00
Lucas Berger ff675b7e19 test(phase-10): complete UAT - 4 passed, 5 issues
Issues found:
1. Text update sends duplicate messages (sub-workflow + main)
2. Batch update broken - data chain broken after Edit Progress Message
3. Batch actions broken - same data chain issue
4. Logs text command - no fuzzy matching, chatId not preserved
5. Logs refresh - doesn't handle 'message not modified' error

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 15:50:20 -05:00
Lucas Berger 1d55988aff docs(phase-10): complete workflow modularization phase
Phase 10 achievements:
- 3 sub-workflows: Update, Actions, Logs (all deployed)
- Main workflow: 209 → 192 nodes (-8%)
- Consolidated all container operations
- Removed old batch inline path
- Modernized callback formats

Deferred to Phase 10.1: Aggressive modularization (50-80 node target)
Added Phase 10.2: Better Logging & Log Management

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 15:10:19 -05:00
Lucas Berger 57ca18f4d4 refactor(10-06): remove old batch inline path and modernize callbacks
- Update Build Batch Keyboard to use bexec: format instead of legacy JSON
- Update Build Suggestion Keyboard to use action: format instead of legacy JSON
- Remove 7 nodes from old batch inline execution path:
  - Build Batch Commands
  - Prepare Batch Execution
  - Execute Batch Action
  - Parse Batch Result
  - Format Batch Result
  - Send Batch Result
  - Answer Batch Query

Node count: 199 -> 192 (-7 nodes)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 15:07:05 -05:00
Lucas Berger 9799de9418 fix(10-06): deploy logs sub-workflow and wire to main
- Deploy Container Logs sub-workflow to n8n (ID: oE7aO2GhbksXDEIw)
- Replace TODO_DEPLOY_LOGS_WORKFLOW with actual workflow ID
- Update n8n-container-logs.json with deployed ID
- Redeploy all workflows to n8n

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 15:04:14 -05:00
Lucas Berger e160b3e1cd docs(10-06): complete remediation plan
Tasks completed: 4/5 (1 skipped - path still needed)
- Fix batch actions routing to use sub-workflow
- Wire logs sub-workflow (deployment documented)
- Remove Python helper scripts (6 files, 1468 lines)
- Task 3 skipped: old inline path handles legacy callbacks

SUMMARY: .planning/phases/10-workflow-modularization/10-06-SUMMARY.md
2026-02-04 14:55:46 -05:00
Lucas Berger 2bf607ea01 chore(10-06): remove Python helper scripts
- Delete refactor_workflow.py
- Delete task1_batch_update.py
- Delete task2_batch_actions.py
- Delete task3_logs_subworkflow.py
- Delete task3_update_main.py
- Delete task4_cleanup.py

These were development-time helpers for JSON manipulation, not runtime code.
2026-02-04 14:54:30 -05:00