# Scenario 5: Add a JavaScript/TypeScript Postprocessor for Optimization Deduplication

## Context

The codeflash-internal optimizer postprocesses optimization candidates to remove duplicates and no-ops. Currently, the Python postprocessor in `core/languages/python/optimizer/postprocess.py` deduplicates by normalizing code with `ast.parse()` + `ast.dump()` and comparing AST dumps. It uses `libcst` for any code transformations that modify source.

The team needs a JavaScript/TypeScript equivalent postprocessor that follows the same patterns adapted for JS/TS, using the appropriate tools for that language while following the same architectural conventions.

The relevant existing patterns:
- `BaseOptimizerContext` in `optimizer_context.py` handles prompt management and code extraction
- `extract_code_and_explanation_from_llm_res()` parses LLM markdown response into code blocks
- `parse_and_generate_candidate_schema()` converts extracted code to `OptimizeResponseItemSchema`
- Model distribution: `claude_calls = (total - 1) // 2`, `gpt_calls = total - claude_calls`
- LLM calls go through `aiservice/llm.py`, prompts are `.md` files rendered with Jinja2

## Task

1. Create a postprocessor at `core/languages/js_ts/optimizer/postprocess.py` that:
   - Deduplicates optimization candidates for JavaScript/TypeScript code
   - Uses a JS/TS AST normalization approach (can shell out to a Node.js script or use a Python JS parser)
   - Checks for no-op equality (optimized code identical to original)
   - Uses `libcst` for any Python source transforms if needed (not `ast` module for transforms)
   - Uses `ast` only for read-only analysis operations
   - Follows the `OptimizeResponseItemSchema` output format

2. Create a prompt template at `core/languages/js_ts/optimizer/postprocess_prompt.md` for any LLM-assisted dedup decisions, using Jinja2 template syntax

3. Ensure the postprocessor integrates with the model distribution formula:
   - `claude_calls = (total - 1) // 2`
   - `gpt_calls = total - claude_calls`
   - `MAX_OPTIMIZER_CALLS = 6`

4. Create tests at `tests/optimizer/test_js_ts_postprocess.py`:
   - Test deduplication of identical-AST candidates
   - Test no-op detection
   - Use `@pytest.mark.asyncio` for async tests
   - Use test factories where applicable

## Expected Outputs

- `core/languages/js_ts/optimizer/postprocess.py` -- dedup and validation logic
- `core/languages/js_ts/optimizer/postprocess_prompt.md` -- Jinja2 prompt template
- `tests/optimizer/test_js_ts_postprocess.py` -- async tests for dedup and no-op detection
