aft_zoom switches to a single canonical batch: [{ target, symbols }] argument, so files, URLs, and GitHub references can mix in one call and targets beginning with https:// are fetched as URLs rather than read as paths. A single missing symbol now returns the lookup's guidance as text instead of throwing, and the per-symbol line names the searched file. Older spellings (targets/path/filePath/url with symbol/symbols) still run but are no longer advertised to models.
New Features: issue://N and pr://N targets work when GitHub reads are enabled; batch entries with a missing or conflicting target are rejected with a diagnostic naming the values.
Refactors: OpenCode and Pi tool definitions, schemas, and workflow hints advertise only the batch shape; read/write/edit descriptions use filePath on OpenCode V1 and path on V2. Symbols in a batch entry keep their string or array shape, so comma-separated code lists, stringified arrays, and pasted menu selectors parse without splitting Markdown/HTML headings, and multiple GitHub ordinals share one discussion fetch per entry. Translation and catalog fixtures were regenerated for the new shape.
Confidence Score: 5/5
The PR appears safe to merge; no new actionable issue was found.
Summary
aft_zoom now advertises batch: [{ target, symbols }] across Rust, OpenCode, and Pi, while keeping older argument spellings working.
Zoom lookups use one batch for files, web pages, and discussions.
Both earlier threads were manually resolved without explanation. The current code addresses both findings: symbol lists use the existing parser, and GitHub ordinals share one lookup per entry.
Diagram
%%{init: {'theme': 'neutral'}}%%
flowchart LR
A["batch or older arguments"] --> B["Normalize to batch"]
B --> C["Check local read permissions"]
C --> D["Resolve each allowed target"]
D --> E["Parse symbols for the document language"]
E --> F["Return results and per-lookup errors"]