n7n-plugin-host 0.2.0

wasmtime-бекенд для crate::registry::PluginRegistry (n7n-harness) — друга (wasm-компонентна) реалізація слотів detector/verify/ast_facts/t0, поруч з in-process-бекендом §3.12 пункту 16а
Documentation
package n7n:fix-deps@0.1.0;

// T0 — детерміновані фікси ДО будь-якої моделі (спека
// `2026-08-17-n7n-harness-local-models.md`, §3.9 "Як пише T0: декларативний
// план, не файлова система", рішення И). Дзеркало
// `harness::pipeline::T0Fn` (`Arc<dyn Fn() -> BoxFuture<'static, EditPlan>>`).
//
// Guest повертає декларативний `edit-plan`, він НІЧОГО не пише сам: жодних
// WASI-прав запису в `t0-plugin` world нижче, лише вужчий read-only
// `host-fs` імпорт (доккоментар `host.wit`). Хост валідує (`prepare`,
// `PreparePlanFn`) і застосовує (`commit`, `CommitPlanFn`) план через
// `write_guard` — межа безпеки §3.7 спеки лишається хостовою за
// побудовою (відсутністю права запису в guest-і), а не за домовленістю.
// Обидві фази `prepare`/`commit` — цілком хостові й НЕ мають відповідника
// в цьому WIT: вони не частина контракту "порахувати план", вони частина
// контракту "застосувати план", який guest не бачить узагалі (`T0Step` у
// `harness::pipeline` лишається хостовим типом).

interface t0 {
    use types.{edit-plan};

    /// Порахувати декларативний план правок. Порожній `files` — валідний
    /// сигнал "нічого не робимо" (дзеркало `EditPlan::empty()`).
    plan: func() -> edit-plan;
}

// `import types;` нижче — синтаксична правка, яку вимагає
// `wasmtime::component::bindgen!` (пункт 16б, `crates/plugin-host`), не
// зміна контракту: `t0.plan` повертає `edit-plan`, який транзитивно
// містить `file-edit-plan`/`anchored-edit`/`anchored-file-edit`/
// `create-file-edit`/`delete-file-edit` (`use types.{edit-plan}` вище
// називає лише САМ `edit-plan`, не весь ланцюжок типів усередині нього).
// Без прямого `import types;` у world bindgen! генерує ці вкладені типи в
// приватному (не `pub`) модулі — компільований код МОЖЕ їх мати, але
// конверсійний код цього крейта (`crates/plugin-host/src/t0.rs`) не може
// на них послатись. `detector-plugin`/`verify-plugin` цієї правки не
// потребують — `violation`/`verify-report` плоскі (жодного вкладеного
// `record`/`variant` усередині), тож bindgen дублює їх напряму в
// просторі імен `detector`/`verify` без додаткового `import`.
// `types` не має жодної функції — `import` тут не додає жодного
// host-виклику для лінкера (нічого імплементувати), лише робить
// згенеровані Rust-типи публічно досяжними за шляхом
// `n7n::fix_deps::types::*` (без префіксу `exports::` — це імпорт, не
// експорт world-у).
world t0-plugin {
    import types;
    import host-fs;
    export t0;
}