Файли
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

60 рядки
1.6 KiB
Plaintext

/// Runtime probe: optional exports, async calls and
/// cancellation, and a WASI p2 task model built on `wasi:io/poll`.
/// Test fixture only; not part of the plugin API.
package openidea:[email protected];
interface host-api {
use wasi:io/[email protected].{pollable};
/// A long-running job the host started for the guest.
resource task {
/// Progress report (`total` unknown while `none`).
report: func(done: u32, total: option<u32>);
/// Set by the host when the user cancels.
is-cancelled: func() -> bool;
/// Ready when the host pushed the next item, or on cancellation.
next-ready: func() -> pollable;
/// The pushed item, if any (non-blocking).
take: func() -> option<string>;
}
/// The task of the current call.
current-task: func() -> task;
/// An async host import: sleeps without blocking the host thread.
sleep-ms: func(ms: u32);
}
interface base {
run: func(cmd: string, arg: string) -> result<string, string>;
}
/// Optional exports: a plugin implements only the providers it needs.
interface code-actions {
actions: func(path: string) -> list<string>;
}
interface completion {
complete: func(prefix: string) -> list<string>;
}
world probe-min {
import host-api;
export base;
}
world probe-full {
import host-api;
export base;
export code-actions;
export completion;
}
/// The host binds this world; guests implement `probe-min` or `probe-full`.
world probe-host {
import host-api;
export base;
export code-actions;
export completion;
}