Files
openidea/perf/budgets.json
l0ng-ai 78e0c7a23e feat(plugins): finalize plugin API before release, concurrent providers
Plugin API (breaking; the plugin system is unreleased):
- Remove the runtime `contributions` interface (register-command,
  register-language, register-theme). Commands, languages and themes are
  declared in plugin.toml only, so everything a plugin contributes goes
  through the install preview and consent. The registry drops runtime
  scope, `contribute` and `dispose_runtime`; inline `definition` in
  language and theme declarations is gone.
- `completion-item.kind` is a string (the 25 LSP kinds; unknown kinds show
  no icon), like the other open-ended kinds.
- `lifecycle.activate` and `commands.run` return `types.error` instead of a
  string. The host maps it to the matching error kind, and only `failed`
  counts against the plugin: cancelling, a missing grant or an unknown
  command does not. The SDK's `Plugin` returns `Result<_, Error>`; plain
  messages convert to `Error::Failed`.

Runtime:
- Editor providers of several plugins are called at the same time
  (`Actor::submit` + `Pending::wait`): the wait is the slowest plugin's,
  not the sum, so each gets the full edit-path budget.

Versioning and tooling:
- Components are checked at install and by `openidea-plugin check` for the
  plugin API they were built for; another major or a newer minor is
  refused with what to do.
- Tests: the SDK's WIT matches the host's, a simulated next-minor host
  links every shipped component, every host function has an SDK wrapper,
  released APIs only grow (no snapshot until the first release).
- plugins/build.sh builds every checked-in component, records a source
  fingerprint next to it, and `--check` fails on stale components; CI runs
  it plus fmt, clippy (host and wasm) and tests for the SDK, the official
  plugins and the fixtures.
- The API evolution rules and the checklist for a new host function are in
  plugins/README.md; the design notes under docs/ are removed.
2026-11-04 02:41:46 +08:00

93 lines
2.9 KiB
JSON

{
"$comment": "Upper bounds, lower is better. ui: `<scenario>.<metric>` from `pnpm perf` (medians of the measured runs; enforced at CPU 1x only). Latencies are input → start of the first frame showing the result, so ~16.7 ms is 'next frame'. rust: criterion bench id → mean in microseconds, from `pnpm perf:rust` (`plugins/…`: the plugin runtime budgets).",
"regressionTolerance": 0.2,
"regressionFloor": 1,
"ui": {
"bundle.initialJsKb": 850,
"bundle.initialCssKb": 60,
"startup.readyMs": 400,
"startup.tbtMs": 50,
"startup.heapMb": 30,
"startup.domNodes": 1500,
"typing.p95Ms": 20,
"typing.maxMs": 33,
"typing.missedFramePct": 2,
"typing.styleLayoutMsPerKey": 3,
"typing.mainThreadMsPerKey": 10,
"typing.tbtMs": 50,
"typingLarge.openMs": 200,
"typingLarge.p95Ms": 20,
"typingLarge.maxMs": 33,
"typingLarge.missedFramePct": 2,
"typingLarge.styleLayoutMsPerKey": 3,
"typingLarge.mainThreadMsPerKey": 20,
"typingLarge.tbtMs": 50,
"keyRepeat.p95Ms": 20,
"keyRepeat.maxMs": 33,
"keyRepeat.missedFramePct": 2,
"keyRepeat.mainThreadMsPerKey": 16,
"keyRepeat.tbtMs": 50,
"scroll.frameP95Ms": 17.5,
"scroll.droppedFramesPct": 2,
"scroll.tbtMs": 50,
"scroll.jumpMs": 33,
"tabs.openSmallMs": 100,
"tabs.switchP95Ms": 33,
"popups.findActionOpenMs": 50,
"popups.findActionQueryMs": 120,
"popups.findActionKeyP95Ms": 33,
"popups.searchEverywhereOpenMs": 50,
"popups.searchEverywhereQueryMs": 120,
"toolWindows.maxMs": 50,
"projectTree.expandMs": 50,
"projectTree.frameP95Ms": 17.5,
"projectTree.droppedFramesPct": 2,
"projectTree.arrowKeyP95Ms": 20,
"projectTree.arrowKeyMissedFramePct": 2,
"leaks.heapGrowthMb": 4,
"leaks.domNodeGrowth": 100,
"leaks.listenerGrowth": 20
},
"rust": {
"text/open_1mb": 2000,
"text/apply_keystroke_1mb": 20,
"text/apply_100_changes_1mb": 1000,
"text/offset_to_pos_round_trip": 5,
"text/pos_to_byte": 5,
"text/text_for_save_crlf_1mb": 1000,
"syntax_2mb/selection_cached_hit": 5000,
"syntax_2mb/outline_cached_hit": 10000,
"syntax_2mb/folding_cached_hit": 1000,
"syntax_2mb/folding_after_keystroke_incremental": 200000,
"syntax_2mb/outline_after_keystroke_incremental": 350000,
"index_100k/find_files/a": 10000,
"index_100k/find_files/ordcon": 10000,
"index_100k/find_files/src/user": 10000,
"index_100k/find_files/PaymentService": 10000,
"index_100k/find_symbols/OCo": 15000,
"index_100k/find_symbols/q": 15000,
"index_100k/find_symbols/invoiceRepo": 15000,
"index_100k/find_symbols_types/UsSe": 15000,
"search_5k/literal": 100000,
"search_5k/regex": 100000,
"search_5k/dense_limit": 20000,
"plugins/load_50": 20000,
"plugins/cold_activation": 30000,
"plugins/syntax_highlights_2k_lines": 50000
}
}