Commit Graph
100 Commits
Author SHA1 Message Date
Lucas BergerandClaude Opus 4.5 660b969f6e feat(09-04): add Start button to batch select action row
Now shows Start, Stop, and Update buttons when containers are selected.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:13:36 -05:00
Lucas BergerandClaude Opus 4.5 ee4205d61d fix(09-04): show all containers in batch select (including stopped)
Changed Fetch Containers For Batch Mode and Fetch Containers For Toggle
Update to use all=true instead of all=false, so stopped containers
appear in the batch select list for batch start operations.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:12:12 -05:00
Lucas BergerandClaude Opus 4.5 ec9e0a07a4 fix(09-04): preserve selection when navigating batch select pages
- Add batch:nav callback type for page navigation with selection
- Parse batch:nav in Parse Callback Data
- Add route for isBatchNav in Route Callback switch
- Add Prepare Batch Nav node to format data for rebuild
- Update Rebuild Batch Select Keyboard to use batch:nav for navigation
- Now Previous/Next buttons preserve selected containers

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:02:31 -05:00
Lucas BergerandClaude Opus 4.5 5ab66de4c2 fix(09-04): fix batch cancel routing and pagination after toggle
- Don't set isCancel:true for batch:cancel (was routing to wrong handler)
- Add page to batch:toggle callback format: batch:toggle:{page}:{selected}:{name}
- Parse page in Parse Callback Data for toggle callbacks
- Pass page through Handle Batch Toggle
- Add pagination to Rebuild Batch Select Keyboard (6 per page)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 09:57:57 -05:00
Lucas BergerandClaude Opus 4.5 713fdaa00d feat(09-04): add pagination to batch select menu
- Parse Callback Data now handles batch:mode:{page} format
- Build Batch Select Keyboard uses 6 containers per page
- Added Previous/Next navigation buttons
- Shows "Showing X-Y of Z" count when paginated

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 09:52:36 -05:00
Lucas BergerandClaude Opus 4.5 3192eb3ea0 fix(09-04): batch cancel returns to container list instead of deleting message
- Replace Delete Batch Cancel Message with Prepare Batch Cancel Return code node
- Connect Prepare Batch Cancel Return to Get Containers For List
- Update Build Paginated List to accept data from multiple sources
- Cancel now shows the container list instead of deleting the menu

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 09:51:18 -05:00
Lucas BergerandClaude Opus 4.5 ddbae3c54e fix(09-04): replace splitInBatches with manual loop for batch execution
- Route Batch Loop Action now references Build Progress Message node
- Build Batch Action Command references Build Progress Message node
- Prepare Batch Loop outputs single item with currentIndex for manual loop
- Prepare Next Iteration increments currentIndex and sets next container
- Is Batch Complete loops back to Build Progress Message instead of Batch Loop
- Bypasses problematic splitInBatches node that wasn't processing items

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 09:46:18 -05:00
Lucas Berger 652d877ce1 docs(09-04): add comprehensive test plan for batch operations
- 21 test cases across 5 suites (text commands, update all, multi-select, errors, regression)
- Deployment steps for n8n workflow import
- Success criteria mapping to tests
- Test execution log template with issue tracking
- Covers all BAT-01 through BAT-06 requirements
2026-02-04 08:22:15 -05:00
Lucas Berger 93be20d9c4 docs(09-03): complete update all and multi-select plan
Tasks completed: 2/2
- Task 1: Update all command with availability check
- Task 2: Inline keyboard multi-select for batch operations

SUMMARY: .planning/phases/09-batch-operations/09-03-SUMMARY.md
Phase 9 complete: 3/3 plans done
2026-02-04 08:19:00 -05:00
Lucas Berger 7d6e683f87 feat(09-03): add update all and inline multi-select for batch operations
Task 1: Update All Command
- Detects 'update all' or 'updateall' in Keyword Router
- Fetches all containers and filters to :latest tag containers
- Shows confirmation with count and list (up to 10 displayed)
- On confirm: passes to batch execution infrastructure
- Shows 'All containers are up to date!' if no :latest containers
- 30-second timeout on confirmation

Task 2: Inline Multi-Select
- Added batch:mode callback to enter selection mode
- batch:toggle:{csv}:{name} for toggling container selection
- batch:exec:{action}:{csv} for executing batch actions
- batch:clear and batch:cancel for selection management
- Checkmarks show selected containers in keyboard
- Action buttons appear when selection exists
- Callback size limit enforced (max ~8 containers)
- Stop action requires confirmation (per existing batch flow)
- Update/start/restart execute immediately

Integration:
- Both flows connect to existing batch execution from 09-02
- Reuses batch loop and progress display infrastructure
2026-02-04 08:17:04 -05:00
Lucas Berger 1561d1a13a wip: batch-operations paused at plan 2/4 (waves 1-2 complete) 2026-02-03 21:35:58 -05:00
Lucas Berger 3e5fa5d8bd docs(09-02): complete batch execution and progress plan
Tasks completed: 3/3
- Add Loop Over Items for sequential batch execution
- Add per-container progress updates and action execution
- Add batch summary with failure emphasis

SUMMARY: .planning/phases/09-batch-operations/09-02-SUMMARY.md
2026-02-03 21:35:08 -05:00
Lucas Berger b704a6cff2 feat(09-02): add batch summary with failure emphasis
- Add Is Batch Complete IF node to check loop termination
- Add Build Batch Summary code node with failure-first format
- Add Send Batch Summary HTTP node with Back to List button
- Connect Is Batch Complete true output to summary flow
- Connect Is Batch Complete false output back to Batch Loop
- Summary shows failures with reasons prominently
- Warnings shown in detail (<=3) or summary (>3)
- Success count shown last
2026-02-03 21:33:28 -05:00
Lucas Berger fd4c614afd feat(09-02): add per-container progress updates and action execution
- Add Build Progress Message node for per-container status display
- Add Edit Progress Message to update Telegram with current progress
- Add Route Batch Loop Action switch for action-specific execution
- Add Build Batch Action Command with container lookup support
- Add Execute Batch Container Action with error handling
- Add Check Batch Action Result for lookup vs direct action
- Add Needs Action Call IF node for two-phase execution
- Add Execute Batch Action 2 for follow-up action calls
- Add Parse Batch Action 2 for result handling
- Add Handle Action Result to aggregate success/failure counts
- Add Prepare Next Iteration for loop continuation
- Add Prepare Batch Stop Exec for confirmed stop callbacks
- Add Prepare Batch Exec for bexec callbacks
- Connect Check Batch Stop Expired to execution flow
- Connect Answer Batch Exec to execution flow
2026-02-03 21:32:03 -05:00
Lucas Berger 62f50cb502 feat(09-02): add loop over items for sequential batch execution
- Add Initialize Batch State code node to prepare batch data
- Add Send Batch Start Message to show initial progress
- Add Prepare Batch Loop to format containers for iteration
- Add Batch Loop (splitInBatches) for sequential processing
- Connect Route Batch Action outputs (update/start/restart) to batch flow
2026-02-03 21:28:33 -05:00
Lucas Berger 1274eab438 docs(09-01): complete batch command parsing plan
Tasks completed: 3/3
- Task 1: Add batch command detection and parsing
- Task 2: Add container name matching with exact-match priority
- Task 3: Wire batch routing and add batch stop confirmation

SUMMARY: .planning/phases/09-batch-operations/09-01-SUMMARY.md
2026-02-03 21:24:13 -05:00
Lucas Berger feea06c4c3 feat(09-01): wire batch routing and add batch stop confirmation
- Add "Route Batch Action" switch node (update/start/restart/stop)
- Add "Build Batch Stop Confirmation" code node with confirm/cancel keyboard
- Add "Send Batch Stop Confirmation" HTTP node
- Update Parse Callback Data to handle bstop: and bexec: prefixes
- Add Route Callback outputs for batch stop confirm/cancel/exec
- Add callback handler nodes for batch operations:
  - Answer Batch Stop Confirm with 30-second timeout check
  - Answer Batch Stop Cancel with message deletion
  - Answer Batch Exec for batch execution callbacks
- Add Check Batch Stop Expired with expiry message flow

Routing behavior:
- update/start/restart: route immediately to batch execution (Plan 02)
- stop: requires confirmation due to fuzzy matching risk
- Confirmation callback format: bstop:confirm:{names}:{timestamp}
- Cancel callback: bstop:cancel
2026-02-03 21:22:19 -05:00
Lucas Berger f02f98406c feat(09-01): add container matching with exact-match priority
- Add "Match Batch Containers" code node with exact-match-first algorithm
- Add "Needs Disambiguation" IF node to route ambiguous matches
- Add "Build Disambiguation Message" code node with inline keyboard
- Add "Send Disambiguation" HTTP node to display options
- Add "Has Not Found" IF node to handle missing containers
- Add "Build Not Found Message" code node with partial match confirmation
- Add "Send Not Found Message" HTTP node

Matching algorithm:
1. Exact match first: 'plex' matches 'plex' even if 'jellyplex' exists
2. Single fuzzy match: treated as found
3. Multiple fuzzy matches: triggers disambiguation with keyboard options
4. No matches: reported as not found with option to proceed with found containers
2026-02-03 21:19:01 -05:00
Lucas Berger 9e7ff2ab08 feat(09-01): add batch command detection and parsing
- Add "Detect Batch Command" code node to parse multi-container commands
- Add "Is Batch Command" IF node to route batch vs single container
- Add "Route Single Action" switch to route single commands to appropriate flow
- Add "Get Containers for Batch" node for Docker API container list
- Modify Keyword Router to route restart/start/stop/update through batch detection
- Single container commands route to existing Parse Action/Update Command flows
- Batch commands (2+ containers) route to new batch processing flow

Batch detection logic:
- Pattern: {action} {name1} {name2} ... where action is update/start/stop/restart
- Single container = not batch (existing flow)
- Two or more containers = batch (new flow)
2026-02-03 21:16:41 -05:00
Lucas BergerandClaude Opus 4.5 59ed1245c2 docs(09.1): insert modular sub-workflows phase
- Add Phase 9.1 between Phase 9 and Phase 10
- Update Phase 10 dependency to Phase 9.1
- Create phase directory structure

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 21:10:02 -05:00
Lucas BergerandClaude Opus 4.5 a409671dc6 docs(09): create phase plan
Phase 09: Batch Operations
- 4 plans in 4 waves
- 3 autonomous, 1 with checkpoint
- Ready for execution

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 21:01:06 -05:00
Lucas Berger 3ca89c3815 docs(09): research phase domain
Phase 9: Batch Operations
- Standard stack identified (Loop Over Items, If Error node, editMessageText)
- Sequential execution patterns documented
- Error handling with continue-on-failure
- Multi-select keyboard toggle pattern
- Rate limiting and callback_data constraints
- Fuzzy matching with exact match priority
2026-02-03 20:52:50 -05:00
Lucas Berger 13d27fd2d1 docs(09): capture phase context
Phase 09: Batch Operations
- Implementation decisions documented
- Phase boundary established
2026-02-03 20:44:58 -05:00
Lucas BergerandClaude Opus 4.5 03e56503de docs(08): complete Phase 8 with verification summary
- Update STATE.md with Phase 8 completion status
- Add 08-03-SUMMARY.md documenting bug fixes and verification
- Remove .continue-here checkpoint file
- Record key decisions from verification session

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 20:32:15 -05:00
Lucas BergerandClaude Opus 4.5 d1da276aa4 fix(08): resolve n8n deployment issues and clean up orphan nodes
Bug fixes:
- Fix array handling in Code nodes ($input.all() vs $input.item.json)
  - Build Logs Action Command
  - Build Confirmed Stop Command
  - Build Immediate Action Command
  - Find Container For Update
- Add timestamp to logs refresh to avoid "message not modified" error
- Add :latest tag protection to callback update flow
- Add image cleanup after callback updates

Cleanup:
- Remove orphan nodes: Parse and Match, Format Response, Send Docker Response
- Rename duplicate "Inspect New Image" to "Inspect New Image (Text)"
- Restore Compare Digests to fix text update command flow
- Add callback image cleanup nodes (Build Callback Remove Image, Callback Remove Old Image)

Both text commands and inline keyboard buttons now work correctly.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 20:31:20 -05:00
Lucas Berger 1331ee1331 wip(08): paused at verification checkpoint - workflow fixes in progress 2026-02-03 17:04:12 -05:00
Lucas BergerandClaude Opus 4.5 127f176056 feat(08-03): enhance update progress with explicit button removal
- Update progress message uses upward arrow icon for update
- Add "This may take a few minutes" notice
- Explicitly pass empty inline_keyboard to remove buttons
- Prevents accidental duplicate action triggers during update

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 16:34:53 -05:00
Lucas BergerandClaude Opus 4.5 3e11dea2ed feat(08-03): simplify completion messages to back-only button
- Update Format Immediate Result for start/restart actions
- Update Format Confirmed Stop Result for stop action
- Update Format Update Complete for update action
- Update Format No Update Needed for already-up-to-date case
- Success shows only "Back to Containers" button
- Errors show "Try Again" + "Back to Containers" buttons
- Removes action buttons from completion state per UX spec

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 16:34:10 -05:00
Lucas BergerandClaude Opus 4.5 a6548b300f docs(08-02): complete action execution plan
Tasks completed: 2/2
- Task 1: Route Action Callbacks to Container Operations
- Task 2: Add Confirmation Flow for Dangerous Actions

SUMMARY: .planning/phases/08-inline-keyboard-infrastructure/08-02-SUMMARY.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 16:29:42 -05:00
Lucas BergerandClaude Opus 4.5 ab7ce88792 feat(08-02): add confirmation flow for dangerous actions
- Update Parse Callback Data to handle confirm: and cancel: callbacks
- Add isConfirm and isCancelConfirm outputs to Route Callback switch
- Add 30-second timeout check for confirmations (timestamp in callback_data)
- Wire confirmed stop action to container stop flow with result display
- Wire confirmed update action to full update flow (pull, recreate, start)
- Handle cancel by returning to container submenu
- Show expired message when confirmation times out
- Progress indicator during update: "Updating..."

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 16:28:33 -05:00
Lucas BergerandClaude Opus 4.5 d1584197f8 feat(08-02): route action callbacks to container operations
- Add Answer Action Callback node to answer query immediately
- Add Route Action Type switch with start/restart/stop/update/logs outputs
- Wire start/restart to immediate action flow (Get Container, Build Command, Execute, Format Result)
- Wire logs to logs action flow with 30-line display
- Wire stop/update to confirmation dialog builders with 30s timeout
- All action results update message in-place with editMessageText

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 16:24:21 -05:00
Lucas Berger 1a3feecd91 docs(08-01): complete container list keyboard plan
Tasks completed: 3/3
- Task 1: Add Container List Inline Keyboard
- Task 2: Add Container Submenu with Action Buttons
- Task 3: Handle List Pagination Callbacks

SUMMARY: .planning/phases/08-inline-keyboard-infrastructure/08-01-SUMMARY.md
2026-02-03 16:19:51 -05:00
Lucas Berger 393d368dec feat(08-01): handle list pagination callbacks
- Add Answer List Callback HTTP node (prevents loading indicator)
- Add Prepare List Fetch code node
- Add Get Containers For List HTTP Request node
- Add Build Paginated List code node (reuses keyboard logic)
- Add Edit Container List HTTP node (editMessageText for in-place updates)
- Wire Route Callback list output to pagination flow
- All page transitions use message edits (no new messages)
2026-02-03 16:18:50 -05:00
Lucas Berger 01482827fb feat(08-01): add container submenu with action buttons
- Update Parse Callback Data to recognize select:, list:, action:, noop formats
- Add Route Callback outputs: select, list, action, noop
- Add Answer Select Callback HTTP node (prevents loading indicator)
- Add Prepare Container Fetch code node
- Add Get Single Container HTTP Request node
- Add Build Container Submenu code node with state-based action buttons
- Add Send Container Submenu HTTP node (editMessageText for in-place updates)
- Add Answer Noop Callback for page indicator button
- Wire complete select flow: Route -> Answer -> Fetch -> Submenu -> Send
2026-02-03 16:17:38 -05:00
Lucas Berger f8d616e26d feat(08-01): add container list inline keyboard
- Add Build Container List Keyboard code node
- Add Send Container List HTTP Request node
- Add Check Single Container IF node for direct access routing
- Add Build Container Submenu Direct for /status <name> flow
- Add Send Container Submenu Direct HTTP Request
- Wire Keyword Router status -> Docker List -> Build Keyboard flow
- Running containers shown first with green icon
- Pagination support for >6 containers
2026-02-03 16:15:29 -05:00
Lucas Berger ebd6eab479 removing backup 2026-02-03 11:47:09 -05:00
Lucas BergerandClaude Opus 4.5 ecd02a4b0e docs(08): create inline keyboard infrastructure plans
Phase 8: Inline Keyboard Infrastructure
- 3 plans in 3 waves (sequential dependency)
- Plan 01: Container list keyboard and submenu navigation
- Plan 02: Action execution and confirmation flow
- Plan 03: Progress feedback and completion messages

Covers KEY-01 through KEY-05 requirements.
Ready for execution.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 11:44:46 -05:00
Lucas Berger fe4c19c7c6 docs(08): research phase domain
Phase 8: Inline Keyboard Infrastructure
- Standard stack identified (HTTP Request + Telegram API)
- Architecture patterns documented (5 core patterns)
- Pitfalls catalogued (5 critical issues)
- n8n-specific workarounds for dynamic keyboards
2026-02-03 11:39:09 -05:00
Lucas BergerandClaude Opus 4.5 6679fb7cf4 docs(08): capture phase context
Phase 08: Inline Keyboard Infrastructure
- Implementation decisions documented
- Phase boundary established

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 11:32:08 -05:00
Lucas BergerandClaude Opus 4.5 d933663bf5 test(07): complete UAT - 9 passed, 0 issues
All Socket Security phase tests verified:
- Proxy container running
- All 6 bot commands work through proxy
- Socket mount removed from n8n
- Dangerous APIs blocked by default

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 11:21:36 -05:00
Lucas BergerandClaude Opus 4.5 24cc41b9fa docs(07): complete Socket Security phase
- SEC-01 through SEC-04 requirements verified and marked complete
- Phase 7 marked complete in ROADMAP.md
- 3/3 plans executed successfully

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 11:12:07 -05:00
Lucas BergerandClaude Opus 4.5 b02819434f fix(07-02): remove duplicate timeout on image pull
- Image pull had --max-time 600 --max-time 5 (second wins = 5s timeout)
- Removed duplicate, keeping 600s for large image pulls
- Added WEB-01 requirement for webhook fix in Phase 10
- Created 07-02-SUMMARY.md and 07-VERIFICATION.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 11:11:39 -05:00
Lucas BergerandClaude Opus 4.5 5471feec25 fix(07-02): correct Telegram credential name and ID
- Change credential name from "Telegram API" to "Telegram account"
- Update credential ID from placeholder to actual n8n ID (I0xTTiASl7C1NZhJ)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 09:18:13 -05:00
Lucas Berger 26aacff444 docs(07-03): complete API blocking verification plan
Tasks completed: 2/2
- Test blocked endpoints return 403
- Document security configuration

SUMMARY: .planning/phases/07-socket-security/07-03-SUMMARY.md
2026-02-03 09:11:08 -05:00
Lucas Berger 78968569c7 chore(07-02): push updated workflow to n8n via API
- Updated workflow HmiXBlJefBRPMS0m4iNYc via PUT to /api/v1/workflows
- Confirmed updatedAt timestamp: 2026-02-03T14:10:47.677Z
- All Docker commands now route through proxy instead of direct socket
2026-02-03 09:10:55 -05:00
Lucas Berger 12bdd9802b refactor(07-02): migrate n8n workflow from Docker socket to proxy
- Replace all --unix-socket /var/run/docker.sock with docker-socket-proxy:2375
- Add --max-time 5 timeout to all commands (except image pull which keeps 600s)
- Update 16 curl commands across all bot operations (status, start, stop, restart, update, logs)
- No functional changes, all commands routed through security proxy
2026-02-03 09:09:48 -05:00
Lucas Berger 208591dea8 docs(07-01): complete proxy deployment plan
Tasks completed: 2/2
- Install and Configure docker-socket-proxy (user action)
- Verify Proxy Connectivity (network config validation)

SUMMARY: .planning/phases/07-socket-security/07-01-SUMMARY.md
2026-02-03 09:06:48 -05:00
Lucas BergerandClaude Opus 4.5 1a8749cceb test(06): complete UAT - 4 passed, 0 issues
Verified all n8n API capabilities:
- Authentication with X-N8N-API-KEY header
- Read workflow JSON (96 nodes)
- Update workflow via PUT
- View execution history

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 08:55:31 -05:00
Lucas BergerandClaude Opus 4.5 fef21fd39a fix(07): revise plans based on checker feedback
- Plan 02: Added Task 4 (checkpoint:human-action) to remove docker.sock
  volume mount from n8n container after verifying proxy works
- Plan 02: Added must_have truth for docker.sock removal (SEC-02 complete)
- Plan 03: Removed "Create API returns 403" from must_haves - container
  create is intentionally ALLOWED for update command functionality
- Plan 03: Added rationale explaining why container create is needed
- Clarified that blocked APIs are: exec, build, commit (not create)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 08:48:37 -05:00
Lucas BergerandClaude Opus 4.5 f539bcbba4 docs(07): create phase plan for Socket Security
Phase 07: Socket Security
- 3 plan(s) in 2 wave(s)
- Wave 1: 07-01 (deploy proxy - checkpoint)
- Wave 2: 07-02 (migrate workflow), 07-03 (verify blocking) - parallel
- Ready for execution

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 08:45:04 -05:00
Lucas BergerandClaude Opus 4.5 1432d4feb2 docs(07): research phase domain
Phase 07: socket-security
- Standard stack identified
- Architecture patterns documented
- Pitfalls catalogued

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 08:40:04 -05:00
Lucas Berger e17c5bf0d4 docs(07): capture phase context
Phase 07: Socket Security
- Implementation decisions documented
- Phase boundary established
2026-02-03 08:33:57 -05:00
Lucas BergerandClaude Opus 4.5 5aa07e8dfa docs(phase-6): complete n8n API Access phase
- All 4 API requirements verified (API-01 through API-04)
- Phase goal achieved: Claude Code can programmatically read, update, and test workflows
- Verification passed: 4/4 must-haves confirmed

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 08:21:34 -05:00
Lucas Berger 45e0cd9a0f docs(06-01): complete n8n API access plan
Tasks completed: 2/2
- Task 1: Create n8n API Key (checkpoint:human-action - user provided credentials)
- Task 2: Verify API Access and Document Commands

All 4 API requirements verified:
- API-01: Authentication (200 OK)
- API-02: Read workflow (96 nodes)
- API-03: Update workflow (PUT successful)
- API-04: Execution history (5 recent runs)

SUMMARY: .planning/phases/06-n8n-api-access/06-01-SUMMARY.md
2026-02-03 08:17:22 -05:00
Lucas Berger 7e85697899 feat(06-01): verify n8n API access and configure credentials
All 4 API requirements verified successfully:
- API-01: Authentication works (200 response from /api/v1/workflows)
- API-02: Can read workflow (Docker Manager Bot - 96 nodes)
- API-03: Can update workflow (PUT successful, updatedAt: 2026-02-03T13:15:35.015Z)
- API-04: Can view execution history (5 recent executions retrieved)

Created .env.n8n-api with N8N_HOST and N8N_API_KEY (gitignored)
Created .gitignore to protect API credentials

Workflow ID: HmiXBlJefBRPMS0m4iNYc
n8n Instance: https://api.bergerhouse.net
2026-02-03 08:16:05 -05:00
Lucas BergerandClaude Opus 4.5 c15c5e3892 docs(06): create phase plan for n8n API access
Phase 6: n8n API Access
- 1 plan in 1 wave
- Covers API-01 through API-04 requirements
- Human checkpoint for API key creation + automated verification
- Fixed: Use PUT (not PATCH) per current n8n docs

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 08:10:13 -05:00
Lucas BergerandClaude Opus 4.5 3d5c8392d7 docs(06): create phase plan
Phase 06: n8n API Access
- 1 plan in 1 wave
- 0 parallel (sequential due to human checkpoint)
- Ready for execution

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 08:07:41 -05:00
Lucas BergerandClaude Opus 4.5 bc26a7bc88 docs(phase-6): research n8n API access
Phase 6: n8n API Access
- n8n REST API capabilities identified
- Authentication patterns documented (X-N8N-API-KEY header)
- Workflow CRUD operations researched
- Execution history access patterns found
- Common pitfalls catalogued (activation timeout, public vs private endpoints)
- No official SDK exists - raw HTTP client required

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 08:04:36 -05:00
Lucas BergerandClaude Opus 4.5 c6abf62021 docs: create v1.1 roadmap (5 phases)
Phases:
6. n8n API Access: Claude Code workflow management
7. Socket Security: Docker socket proxy migration
8. Inline Keyboard Infrastructure: Telegram buttons
9. Batch Operations: Multi-container updates
10. Polish & Audit: Unraid sync, env var verification

22 requirements mapped across 5 phases.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 22:20:01 -05:00
Lucas BergerandClaude Opus 4.5 a970f8d6fc docs: define v1.1 requirements + research
22 requirements across 6 categories:
- Security: Socket proxy migration (4)
- n8n API: Claude Code workflow access (4)
- Telegram Keyboards: Inline buttons + confirmations (5)
- Batch Operations: Multi-container updates (6)
- Unraid Sync: Clear update badge (1)
- Environment Audit: Verify container vars (2)

Research: Stack, Features, Architecture, Pitfalls

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 22:16:45 -05:00
Lucas BergerandClaude Opus 4.5 811030cee4 docs: complete v1.1 research (4 researchers + synthesis)
Files:
- STACK.md: Socket proxy, n8n API, Telegram keyboards
- FEATURES.md: Table stakes, differentiators, MVP scope
- ARCHITECTURE.md: Integration points, data flow changes
- PITFALLS.md: Top 5 risks with prevention strategies
- SUMMARY.md: Executive summary, build order, confidence

Key findings:
- Stack: LinuxServer socket-proxy, HTTP Request nodes for keyboards
- Architecture: TCP curl migration (~15 nodes), new callback routes
- Critical pitfall: Socket proxy breaks existing curl commands

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 22:09:06 -05:00
Lucas BergerandClaude Opus 4.5 ff289677ab docs: start milestone v1.1 n8n Integration & Polish
Target features:
- n8n API for Claude Code (programmatic workflow access)
- Telegram inline keyboard buttons
- Batch container updates
- Docker socket security
- Environment variable audit
- Unraid update sync

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 22:01:37 -05:00
Lucas BergerandClaude Opus 4.5 9b0e5fd8a5 chore: archive v1.0 milestone
Archived:
- milestones/v1.0-ROADMAP.md (full phase details)

Updated:
- MILESTONES.md (new entry for v1.0)
- PROJECT.md (requirements → Validated, Current State added)
- ROADMAP.md (collapsed to one-line with archive link)
- STATE.md (reset for next milestone)

v1.0 Docker Control via Telegram shipped:
- 5 phases, 12 plans, 5 days
- Telegram bot with keyword commands
- Docker socket integration via n8n

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 21:50:39 -05:00
Lucas BergerandClaude Opus 4.5 e5c02f9a21 docs: complete v1.0 milestone - Phase 5 Plan 3 approved
- Add 05-03-SUMMARY.md documenting testing session and bug fixes
- Update STATE.md to 100% complete
- Update ROADMAP.md marking all Phase 5 plans complete
- Remove .continue-here checkpoint

v1.0 Docker Manager Bot is production-ready:
- All 6 commands working (status, start, stop, restart, update, logs)
- Keyword routing (no Claude API dependency)
- Single-user Telegram auth
- Terse error messages
- Complete deployment README

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 21:48:22 -05:00
Lucas BergerandClaude Opus 4.5 c979a7fe7b feat(update): notify user when container is already up to date
Previously the "no update needed" branch was empty, leaving users
with no feedback after the update check completed.

Added Format No Update and Send No Update nodes to display
"<container> is already up to date" message.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 21:39:08 -05:00
Lucas BergerandClaude Opus 4.5 808d1afe21 fix(logs): correct property name for line count parameter
Parse Logs Command returned 'lineCount' but Match Logs Container
expected 'lines', causing the line count to always be undefined
and Docker to return its default.

Renamed to 'lines' for consistency throughout the logs flow.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 21:33:39 -05:00
Lucas BergerandClaude Opus 4.5 287c7220cb fix(logs): escape HTML entities in log output
Log content may contain <, >, & characters (like "<computed>") which
Telegram interprets as HTML tags when using parse_mode=HTML.

Added escapeHtml() function to convert:
- & → &amp;
- < → &lt;
- > → &gt;

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 21:31:22 -05:00
Lucas BergerandClaude Opus 4.5 74dd8f1a94 fix(update): ensure image tag is specified to prevent pulling all tags
When Config.Image has no tag (e.g., "nitnelave/lldap" instead of
"nitnelave/lldap:latest"), Docker's API pulls ALL tags for that image.
This caused massive downloads and rate limit hits.

Now appends ":latest" if no tag or digest is present in the image name.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 21:21:57 -05:00
Lucas BergerandClaude Opus 4.5 3e3b9ae47f fix(update): pipe pull output through tail to prevent memory exhaustion
Docker's /images/create API streams progress JSON for every layer.
For large images, this can be gigabytes of output that was being
buffered by curl and n8n, causing hangs and disk usage spikes.

Now pipes through `tail -c 10000` to only keep the last 10KB where
error/success messages appear. Discards the streaming progress data.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 21:14:25 -05:00
Lucas BergerandClaude Opus 4.5 88830a8b61 fix(update): correct image removal node data reference
- Reference $('Format Update Result') instead of $json for currentImageId
- The Telegram node doesn't pass through input data, it returns API response
- Also add no-op command fallback when currentImageId is missing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 20:56:00 -05:00
Lucas BergerandClaude Opus 4.5 4f85e00dc4 fix(update): add timeout to prevent pull command from hanging
- Add --max-time 600 (10 min) to curl pull command
- Add timeout: 660 to n8n executeCommand node

Docker's /images/create API streams progress until complete.
Without timeout, large image pulls could hang indefinitely.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 20:50:22 -05:00
Lucas BergerandClaude Opus 4.5 b0b22c3b39 wip: 05-polish-deploy paused at task 2/2 (testing checkpoint)
Testing session found and fixed multiple issues:
- Show Menu keyboard/HTML issues
- Container exact match priority
- Update acknowledgment and error handling
- Old image removal after update

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 22:08:43 -05:00
Lucas BergerandClaude Opus 4.5 d03e79cc7f feat(05): add update acknowledgment and pull error handling
1. Send "Updating <container>..." message immediately when update starts
   so user knows the command was received during long image pulls

2. Check pull response for rate limiting and other errors before
   continuing with update. Errors like "toomanyrequests" now show
   a proper error message instead of silently failing to update.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 22:07:40 -05:00
Lucas BergerandClaude Opus 4.5 0839c44b50 feat(05): remove old image after successful container update
Mimics Unraid's update behavior by removing the orphan image after
the new container is started. The old image ID is now passed through
the entire update flow and used to call DELETE /images/{id} at the end.

Removal is fire-and-forget with force=false so it will fail gracefully
if another container still uses the image.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 21:58:41 -05:00
Lucas BergerandClaude Opus 4.5 004911ea32 fix(05): improve container matching to prioritize exact matches
Fixed matching in Match Container, Match Update Container, and Match
Logs Container nodes:
1. First check for exact name match (e.g., "jellyplex" matches only jellyplex)
2. Then fall back to substring matching (container name contains query)
3. Removed reverse matching (query contains container name) which caused
   "jellyplex" to incorrectly match "plex"

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 21:41:27 -05:00
Lucas BergerandClaude Opus 4.5 0b6dfe69d9 fix(05-01): escape angle brackets in Show Menu text
Changed <name> to [name] to avoid HTML parse errors in Telegram.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 21:36:23 -05:00
Lucas BergerandClaude Opus 4.5 0b140c4f1e fix(05-01): simplify Show Menu to text-only help message
Native Telegram node replyKeyboard wasn't displaying. Fallback to
simple text message listing available commands. Can revisit persistent
keyboard feature later.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 21:34:45 -05:00
Lucas BergerandClaude Opus 4.5 6defb2daaf fix(05-01): switch Show Menu to native Telegram node
HTTP Request node with $credentials reference was causing 404 errors.
Native Telegram node handles credentials more reliably for static menus.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 21:31:16 -05:00
Lucas BergerandClaude Opus 4.5 32fd965a2f fix(05-02): revert credential reference to hardcoded user ID
n8n IF nodes don't support credentials - $credentials syntax only works
in nodes that make external calls. Reverted to direct user ID in the
IF conditions and updated README with simpler configuration instructions.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 21:28:20 -05:00
Lucas Berger e92bfc8061 docs(05-03): write deployment README
- Step-by-step installation guide for Unraid
- n8n container configuration with Docker socket access
- Credential creation instructions for Telegram API and Auth
- Usage section with all 6 commands documented
- No troubleshooting section (focused on initial setup)
2026-01-31 21:18:27 -05:00
Lucas Berger 09a4c9ba07 docs(05-02): complete error hardening and credential migration plan
Tasks completed: 2/2
- Standardize error messages to terse format
- Migrate user ID to n8n credentials system

SUMMARY: .planning/phases/05-polish-deploy/05-02-SUMMARY.md
2026-01-31 21:16:36 -05:00
Lucas Berger 1e6c31f790 feat(05-02): migrate user ID to n8n credentials system
- Auth nodes now reference $credentials.telegramAuth.userId
- Added telegramAuth credential reference to both IF nodes
- Removed hardcoded user ID from workflow JSON
- Workflow can now be safely exported/shared
2026-01-31 21:15:20 -05:00
Lucas Berger cab0914788 chore(05-02): standardize error messages to terse format
- Docker socket errors now show 'Cannot connect to Docker'
- Action failures now show 'Failed to {action} {container}'
- Removed HTTP status codes and technical details from error messages
- Simplified callback action error handling
2026-01-31 21:14:36 -05:00
Lucas BergerandClaude Opus 4.5 9ae500cdf5 docs(05-01): complete NLU cleanup plan
Tasks completed: 2/2
- Task 1: Remove NLU/Claude nodes and add Keyword Router
- Task 2: Add persistent Telegram menu

SUMMARY: .planning/phases/05-polish-deploy/05-01-SUMMARY.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 21:11:01 -05:00
Lucas BergerandClaude Opus 4.5 a29f444e08 feat(05-01): replace NLU/Claude with keyword routing
- Remove Prepare Claude Request, Claude Intent Parser, Parse Intent,
  Intent Router, Send Unknown Intent, Send Intent Error nodes
- Remove Anthropic API credential reference
- Rename Route Message to Keyword Router with updated rules
- Update IF User Authenticated to connect to Keyword Router
- Update Parse and Match to work without NLU context
- Update Parse Action Command to parse from message text directly
- Update Match Container to reference Parse Action Command
- Update Parse Logs Command to work with keyword routing

Keyword Router handles: /start, status, restart, start, stop,
update, logs with fallback to menu

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 21:09:33 -05:00
Lucas BergerandClaude Opus 4.5 b7cefd931e docs(05): create phase plan
Phase 05: Polish & Deploy
- 3 plans in 3 waves
- 1 parallel (Wave 1), 2 sequential (Waves 2-3)
- Ready for execution

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 21:00:51 -05:00
Lucas BergerandClaude Opus 4.5 4c09d61943 docs(05): research phase domain
Phase 5: Polish & Deploy
- Standard stack identified (n8n, Telegram Bot API, Docker)
- Architecture patterns documented (Switch routing, persistent keyboards, error workflows)
- Pitfalls catalogued (credential leaks, testing limitations, configuration issues)
- Code examples for keyword routing, persistent menus, error handling

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 20:55:29 -05:00
Lucas BergerandClaude Opus 4.5 fc1eda2b07 docs(05): capture phase context
Phase 05: Polish & Deploy
- Implementation decisions documented
- Phase boundary established

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 20:49:04 -05:00
Lucas BergerandClaude Opus 4.5 b82ce152bb docs: add NLU workflow cleanup to Phase 5
Workflow currently has Claude API nodes that need removal.
Added to Phase 5 scope along with keyword routing replacement.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 14:54:25 -05:00
Lucas BergerandClaude Opus 4.5 21e888c1ce docs: remove NLU from v1.0 scope
- Remove Claude API integration and intent parsing (04-02-PLAN)
- REQ-08 (conversational queries) moved to out of scope
- Phase 4 renamed from "Logs & Intelligence" to "Logs" (complete)
- v1.0 now focuses on keyword-based container control

Simple substring matching works well for container management.
NLU adds complexity without proportional value for v1.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 14:52:37 -05:00
Lucas Berger 9ae67ccd7b wip: phase 4 paused at checkpoint verification
Multiple workflow bugs fixed during testing. Awaiting user
verification of conversational routing via Telegram.
2026-01-30 22:38:18 -05:00
Lucas Berger 5e7cab54ca fix(batch): convert Send Batch Confirmation to native Telegram node
HTTP Request node with credential access via URL expression was
failing. Native Telegram node handles credentials internally and
is more reliable for this use case.
2026-01-30 22:37:09 -05:00
Lucas Berger 23ce6a88d5 fix(batch): add chatId validation in Build Batch Keyboard
Add defensive error handling to throw clear error if chatId is
missing before attempting to send Telegram message. This helps
debug 'resource not found' errors by identifying data flow issues.
2026-01-30 22:36:44 -05:00
Lucas BergerandClaude Opus 4.5 5d55bdecac fix(04): fix type validation in all Switch nodes with number comparisons
Fixed Check Match Count and Check Update Match Count nodes:
- Changed typeValidation from 'strict' to 'loose'
- Changed rightValue from strings ('0', '1') to numbers (0, 1)
- Removed empty leftValue from options

This fixes 'Wrong type: string but expecting number' errors.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 22:26:08 -05:00
Lucas BergerandClaude Opus 4.5 aa677703c9 fix(04): update Match Container to use Parse Intent
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>
2026-01-30 22:21:37 -05:00
Lucas BergerandClaude Opus 4.5 d842efbf17 fix(04): bypass Format Response for intent-based status queries
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>
2026-01-30 22:18:44 -05:00
Lucas BergerandClaude Opus 4.5 ada8800bff fix(04): fix Check Logs Match Count type validation
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>
2026-01-30 22:13:56 -05:00
Lucas BergerandClaude Opus 4.5 f423f4ae4c fix(04): add Prepare Claude Request node for robust API body
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>
2026-01-30 22:10:50 -05:00
Lucas BergerandClaude Opus 4.5 a08b8dba6b fix(04): fix Route Update Type conversion error
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>
2026-01-30 22:05:34 -05:00
Lucas BergerandClaude Opus 4.5 87c7bf75e5 fix(04): correct connection source names for logs nodes
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>
2026-01-30 22:01:27 -05:00