π Preset groups + true parallel ref fan-out
Two long-requested features in one release. Both are fully backward-compatible β existing v0.14.13 configs continue to work and are auto-migrated on first use.
1. Preset groups (moa.presets + moa.activePreset)
Save multiple full-pipeline configurations as named presets and switch between them with one click. Each preset bundles refs + aggregator + recon + L3 β switching a preset swaps the entire pipeline.
New settings:
moa.presets(object): Map of{ name β { refModels, aggregator, reconModel, l3Summarizer, description? } }moa.activePreset(string): Key intomoa.presetsfor the currently active group
New commands:
MoA: Switch Presetβ QuickPick showing all saved presets with a one-line preview (4 refs Β· agg=GLM-5.2 Β· recon=DeepSeek Β· L3=MiniMax-M3). One-click switch, no re-configuration needed.MoA: Configure Models(updated) β Now opens with a new Step 0/4 to pick / create / delete a preset group before editing. Steps 1-4 then edit the selected preset.
Backward compatibility:
- Legacy flat config (
moa.refModels+moa.aggregator+ ...) is auto-migrated topresets.defaulton extension activation (idempotent). - Migration shows a one-time notification; legacy fields are NOT deleted (kept as read-only fallback).
- Runtime reads go through a new single-source-of-truth function
getActivePresetConfig()inpresetConfig.ts, used by bothmoaRunner.tsandmoaOrchestrator.ts.
Typical usage:
"code"preset: 4 refs + GLM aggregator + DeepSeek recon + MiniMax L3"research"preset: 6 refs + MiniMax aggregator + GLM recon + L3 disabled"quick"preset: 2 refs + GLM aggregator (no recon, no L3)
2. Real parallel ref fan-out (moa.parallelRefs)
Bug: The moa.parallelRefs setting has existed since v0.7.x and was documented as "Fan out reference advisors in parallel", but the code never read it β refs always ran sequentially. Setting parallelRefs: true had no effect.
Fix: Extracted ref execution into a new helper runSingleRef() (atomic, never throws) and the ref prompt body into buildRefPromptBody() (built once, shared by all refs since equal-mode MoA). The Phase 1 loop now has two branches:
parallelRefs: true(new default) βPromise.allSettled(tasks.map(runSingleRef)). All ref requests fire simultaneously; wall-clock = slowest ref. N refs β theoretical NΓ speedup. Individual failures don't affect siblings.parallelRefs: falseβ sequentialfor-await(legacy behavior). Use this if your provider rate-limits concurrent requests.
Default change: moa.parallelRefs default flipped false β true. If you experience cascading 429/5xx errors, set it back to false.
Files changed
| File | Change |
|---|---|
NEW src/presetConfig.ts (~400 LOC) |
MoaPreset lifecycle β getActivePresetConfig(), migrateLegacyToPreset(), savePreset(), deletePreset(), setActivePreset(), listPresets() |
NEW src/types.ts |
MoaPreset interface |
src/moaRunner.ts |
runSingleRef() + buildRefPromptBody() helpers; parallel/serial Phase 1 branches; preset reads |
src/moaConfig.ts |
pickOrCreatePreset() Step 0 UI; switchPreset() command |
src/moaOrchestrator.ts |
resolveModels() uses getActivePresetConfig() |
src/l3Summarizer.ts |
L3 model ID from preset |
src/extension.ts |
Registers moa.switchPreset; auto-migration on activate |
package.json |
2 new settings + 1 new command + version bump + parallelRefs default flip |
README.md |
5-step flow, Preset groups section, parallelRefs default = true |
CHANGELOG.md |
v0.14.14 entry |
.vscodeignore |
Exclude build artifacts (tsc_output.txt, *.bak, eslint.config.mjs, etc.) |
Install
From Marketplace (recommended):
code --install-extension dudali095.moa-bridgeFrom this release:
Download moa-bridge-0.14.14.vsix below, then:
code --install-extension moa-bridge-0.14.14.vsixAfter install, reload VSCode. If you had a previous MoA config, you'll see a one-time notification that it was migrated to the default preset group.
Full changelog
See CHANGELOG.md for the complete history.