mirror of
https://github.com/microsoft/vscode.git
synced 2026-07-09 16:24:45 +01:00
3073c2bb48
* nes: fold currentFile budgeting into the global budget cascade Under the opt-in global budget experiment, the current file now draws its clip budget from the shared pool (its `shares.currentFile` slice of `totalTokens`) and donates whatever it does not use to the cascade as the initial surplus. When the global budget is disabled (prod default) behavior is byte-identical, and the new defaults (totalTokens 8000, shares in eighths) reproduce today's per-part `maxTokens` caps exactly. - xtabPromptOptions: add `GlobalBudgetSharePart`, `currentFileBudget()` and `validate()`; grow `shares` to include `currentFile`; bump `DEFAULT_TOTAL_TOKENS` to 8000 and rebalance `DEFAULT_SHARES`. - promptCrafting: seed the cascade's initial surplus from the current file's leftover budget; delegate validation to the namespace helper. - xtabProvider: size and clip the current file from the pool and compute the surplus, gated on `globalBudget` being defined. - Tests: volume-neutral invariant, `currentFileBudget`/`validate` units, and provider-level regression + new-behavior coverage. - Docs: rewrite globalBudgetCascade.md for the seeded-surplus design. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes: collapse global-budget settings into a single exp-driven JSON string Replace the two experiment-driven global-budget settings (globalBudget.enabled boolean + globalBudget.totalTokens number) with a single JSON-encoded string setting, modelled after modelConfigurationString, that defines totalTokens, order, and shares together. - configurationService: remove InlineEditsXtabGlobalBudgetEnabled and InlineEditsXtabGlobalBudgetTotalTokens; add InlineEditsXtabGlobalBudget (string | undefined, ExperimentBased, default undefined). - xtabPromptOptions: add GlobalBudgetOptions.VALIDATOR (all top-level fields optional; shares must be complete when present) and a pure GlobalBudgetOptions.fromConfigString(): Result<GlobalBudgetOptions, string> that JSON-parses, structurally validates, merges over the defaults, then runs the semantic validate(). Never throws. - xtabProvider: inject ITelemetryService; resolve the budget via getGlobalBudget(), returning undefined (disabled, identical to prod) when the string is unset/empty/invalid and emitting incorrectNesGlobalBudgetConfig telemetry on parse/validation failure. - Tests: migrate the provider global-budget tests to the JSON string and add fromConfigString unit tests. - Docs: rewrite the globalBudgetCascade.md Wiring section and migration note. No regression: an unset string keeps the byte-identical legacy path. '{}' enables the budget with the volume-neutral defaults; {"totalTokens":N} only overrides the pool size. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes: clip the current file last under a global budget to reuse cascade leftover Under a global budget the current file is now clipped LAST, sized to its base share plus whatever the budget cascade left unused (`currentFileBudget + finalSurplus`), so it trims less and reuses leftover budget. The cascade runs first (seeded with 0, the current file never donates) and is threaded into `getUserPrompt` via `precomputedCascade` so it renders exactly once. This replaces the earlier two-mode design: the opt-in `reuseLeftoverForCurrentFile` flag and the seeded-surplus "donate-forward" path are dropped, along with all `currentFileBudgetSurplus`/`initialSurplus` threading. Clip-last is now the single behavior under a global budget. The validator hardening (rejecting non-finite or negative `totalTokens`/shares) is kept. No production regression: when `globalBudget` is undefined the current file is still clipped to its own `currentFile.maxTokens` with the legacy await ordering, byte-identical to before. The global budget remains experiment-gated and off in prod. Tests and globalBudgetCascade.md updated for the clip-last-only behavior. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * nes: address review — restore nLinesOfCurrentFileInPrompt telemetry timing - xtabProvider: record setNLinesOfCurrentFileInPrompt inside both budget branches. In the legacy/prod branch the clip happens before the context-gathering awaits, so the telemetry call is moved back there to match prod timing exactly (it is still emitted when a request is cancelled mid-gathering). The clip-last branch records it after the cascade, as the clip is inherently last there. - xtabPromptOptions: fix two stale JSDoc blocks that still described the removed donate-forward behavior; describe clip-last instead. - globalBudgetCascade.md: correct the conservation bound to T·(Σ shares) and document the share-sum tolerance (over-allocation ≤ ~1e-3·T). - promptCrafting.spec: add a cascade test asserting finalSurplus shrinks as the cascade consumes budget (current file reuses less leftover). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * nes: fix stale DEFAULT_ORDER doc comment to say clip-last Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * nes: rename clipCurrentFileToBudget param to overriddenMaxTokens Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * nes: extract current-file clip + context gathering into a method Pulls the ~55-line global-budget/legacy if-else out of doGetNextEditWithSelection into a private gatherContextAndClipCurrentFile method returning Result<{ clippedTaggedCurrentDoc, areaAroundCodeToEdit, precomputedCascade, langCtx, neighborSnippets }, NoNextEditReason>. Behavior, clip-first/clip-last ordering, and nLinesOfCurrentFileInPrompt telemetry timing are unchanged. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * nes: recalibrate global-budget defaults to merged currentFile cap (1500) main (#322382) lowered currentFile.maxTokens 2000->1500, which broke the global-budget 'volume-neutral defaults' invariant (floor(total*share) must equal each part's legacy cap). Recalibrate DEFAULT_SHARES to cap/7500 and set DEFAULT_TOTAL_TOKENS to 7500 (the sum of the merged per-part caps: 1500 + 2000 + 2000 + 1000 + 1000), so shares still sum to exactly 1 and every part's base allocation reproduces its cap. finalSurplus stays 6000 (7500 - 1500). Update dependent specs (literal 8000 -> DEFAULT_TOTAL_TOKENS, stale 2000 cap comments -> 1500) and the design doc (defaults table, worked examples, effective caps, ordering caveat, migration note) for T=7500 and currentFile base 1500. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>