feat: v0.9.4 — Multi‑Tool Image Jobs, Fail‑Fast Worker, and Plugin‑Agnostic Results Panel#215
Conversation
…port
- Make Job.tool nullable for multi-tool jobs
- Add Job.tool_list column (JSON-encoded list of tools)
- Add tool, tool_list, job_type fields to JobResultsResponse schema
- Update /v1/jobs/{job_id} endpoint to return new fields
- Add 11 TDD tests for model and schema changes
Backward compatible: single-tool jobs continue to work unchanged.
- Change tool parameter from str to List[str] to accept multiple tools - Validate all tools exist in plugin.tools - Validate all tools support image input - Create job_type='image_multi' for multi-tool submissions - Store tool_list as JSON-encoded list - Add 6 TDD tests for multi-tool submission Backward compatible: single-tool submissions still create job_type='image'
- Detect job_type='image_multi' and parse tool_list
- Execute tools sequentially via run_plugin_tool()
- Aggregate results into {plugin_id, tools: {...}} format
- Fail-fast: one tool failure fails entire job
- Single-tool jobs continue to use {results: {...}} format
- Add 5 TDD tests for multi-tool worker execution
Backward compatible: single-tool image/video jobs unchanged
- Add tool_list and job_type fields to Job interface - Update submitImage() to accept string | string[] for tools - Append multiple tools as separate query parameters Backward compatible: single tool string still works
- App.tsx: Pass all selected tools to submitImage (not just first) - ResultsPanel.tsx: Detect multi-tool results and use ImageMultiToolResults - ResultsPanel.tsx: Display job_type and tool_list in job info - ResultsPanel.tsx: Support both job.results and job.result (backward compat) Multi-tool jobs now display results grouped by tool name
…ltOverlay - v0.9.4 multi-tool agnostic CHANGES: - ResultsPanel: Remove extractBoundingBoxes/extractPlayerPositions, show raw JSON only - ResultOverlay: Remove team colors, pitch lines, radar, ball markers, toggles - generic boxes only - VideoTracker: Remove overlay toggles UI, use simple drawDetections signature - Tests: Updated to match new plugin-agnostic behavior (25 tests passing) VERIFIED: - npm run type-check: PASS - npm run lint: PASS - npm run test ResultsPanel.test.tsx ResultOverlay.test.tsx: 25/25 PASS This implements the v0.9.4 multi-tool architecture requirements where ResultsPanel and ResultOverlay are plugin-agnostic with no soccer-specific logic. Amp-Thread-ID: https://ampcode.com/threads/T-019c87df-d1af-766e-818e-c992370c690b Co-authored-by: Amp <amp@ampcode.com>
…lock styling ISSUE: Multi-tool results showed white background (backgroundColor: '#fff') causing white canvas appearance while single-tool showed styled JSON. FIX: - Replace hardcoded white (#fff, #f5f5f5) with var(--bg-primary) - Use same codeBlockStyle from ResultsPanel (branded colors, monospace) - Remove tool-specific rendering (yolo-tracker section was empty) - Consistent typography with ResultsPanel RESULT: Multi-tool and single-tool results now use identical styling. No more white canvas in multi-tool mode. Amp-Thread-ID: https://ampcode.com/threads/T-019c87df-d1af-766e-818e-c992370c690b Co-authored-by: Amp <amp@ampcode.com>
ISSUE: ImageMultiToolResults and JobResults had hardcoded tool names
('ocr', 'yolo-tracker') making them not plugin-agnostic for v0.9.4.
CHANGES:
- ImageMultiToolResults: Remove tool-specific parsing, show generic JSON only
- JobResults: Remove OCR/detection parsing, show generic JSON only
- Both now use same codeBlockStyle as ResultsPanel (var(--bg-primary))
- Removed tool name conditionals - all tools get same treatment
TESTS UPDATED:
- JobResults.test.tsx: 7/7 passing (now checks JSON rendering)
- ImageMultiToolResults.test.tsx: 7/7 passing (generic JSON tests)
RESULT: Web-UI is now fully plugin-agnostic. No hardcoded tool names or
special rendering logic. All results display as branded JSON blocks.
Amp-Thread-ID: https://ampcode.com/threads/T-019c87df-d1af-766e-818e-c992370c690b
Co-authored-by: Amp <amp@ampcode.com>
…s.test.tsx Changed 'as any' to proper type cast using Parameters<typeof JobResults>[0] to satisfy eslint no-explicit-any rule. Amp-Thread-ID: https://ampcode.com/threads/T-019c87df-d1af-766e-818e-c992370c690b Co-authored-by: Amp <amp@ampcode.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
⭐ PR Title (v0.9.4)
v0.9.4 — Multi‑Tool Image Jobs, Fail‑Fast Worker, and Plugin‑Agnostic Results Panel
⭐ PR Description (v0.9.4)
Summary
This release introduces multi‑tool image job execution to the platform, updates the worker to support fail‑fast sequential tool execution, and removes all legacy soccer‑specific UI logic from the ResultsPanel. The UI now renders plugin‑agnostic JSON output, ensuring consistent behavior across all plugins.
Key Changes
1. Multi‑Tool Image Job Support
/v1/image/submitendpoint now accepts multipletool=parameters.job_type = "image_multi"tool_list = ["toolA", "toolB", ...]job_type = "image").2. Worker: Sequential Multi‑Tool Execution (Fail‑Fast)
tool_listin order.failed.{ "plugin_id": "plugin", "tools": { "toolA": {...}, "toolB": {...} } }{ "results": {...} }3. ResultsPanel Cleanup (Plugin‑Agnostic)
4. No Changes Required for Plugins
plugin.tools.tool_list.Why This Matters
This PR completes the architectural foundation for multi‑tool workflows.
It restores plugin‑agnostic behavior in the UI, eliminates legacy assumptions, and ensures consistent, predictable output formats across all job types.
This is the final step before v1.0.0’s unified output format proposal.
Testing
Migration Notes
tool=params to enable multi‑tool mode.If you want, I can also generate:
Just say the word.