The mobile composer/footer slid over the message list when the user swiped with the keyboard up. Cause: --vv-height / --vv-offset-top were routed through React state via useMobileKeyboard, so on iOS — which fires visualViewport scroll/resize on the same frame as its keyboard animation — the .chat-thread translation lagged by one paint, visible as the composer momentarily floating over messages. Now those two vars are written imperatively in a useLayoutEffect directly to the .chat-thread DOM node on every visualViewport event, mirroring the working pattern at QuickChatFAB.tsx:1032-1052 (which already works correctly on mobile). Only --keyboard-overlap (a structural open/close signal, not per-frame) still flows through React state. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
71 lines
3.9 KiB
JavaScript
71 lines
3.9 KiB
JavaScript
/**
|
|
* Hermes Runtime Plugin
|
|
*
|
|
* Provides an executable Hermes runtime adapter that drives the local `hermes`
|
|
* CLI as a subprocess. Discovered by Fusion's plugin runtime registry; the
|
|
* settings configured in the dashboard's "Runtimes → Hermes" page flow through
|
|
* `ctx.settings` into the CLI invocation.
|
|
*/
|
|
import { definePlugin } from "@fusion/plugin-sdk";
|
|
import { resolveCliSettings } from "./cli-spawn.js";
|
|
import { installFusionSkillIntoHermesHome } from "./fusion-skill-install.js";
|
|
import { HermesRuntimeAdapter } from "./runtime-adapter.js";
|
|
// ── Hermes Runtime Metadata ───────────────────────────────────────────────────
|
|
const HERMES_RUNTIME_ID = "hermes";
|
|
const HERMES_RUNTIME_VERSION = "0.2.0";
|
|
const hermesRuntimeMetadata = {
|
|
runtimeId: HERMES_RUNTIME_ID,
|
|
name: "Hermes Runtime",
|
|
description: "Drives the local `hermes` CLI (NousResearch/hermes-agent)",
|
|
version: HERMES_RUNTIME_VERSION,
|
|
};
|
|
// ── Hermes Runtime Factory ────────────────────────────────────────────────────
|
|
const hermesRuntimeFactory = async (ctx) => {
|
|
return new HermesRuntimeAdapter(ctx.settings);
|
|
};
|
|
// ── Plugin Definition ─────────────────────────────────────────────────────────
|
|
const plugin = definePlugin({
|
|
manifest: {
|
|
id: "fusion-plugin-hermes-runtime",
|
|
name: "Hermes Runtime Plugin",
|
|
version: HERMES_RUNTIME_VERSION,
|
|
description: "Drives the local `hermes` CLI for Fusion agents — captures session ids and resumes via --resume.",
|
|
author: "Fusion Team",
|
|
homepage: "https://github.com/NousResearch/hermes-agent",
|
|
runtime: hermesRuntimeMetadata,
|
|
},
|
|
state: "installed",
|
|
hooks: {
|
|
onLoad: (ctx) => {
|
|
const settings = resolveCliSettings(ctx.settings);
|
|
const skillInstall = installFusionSkillIntoHermesHome({ profile: settings.profile });
|
|
if (skillInstall.outcome === "warning") {
|
|
ctx.logger.warn(`Hermes Runtime Plugin: Fusion skill auto-install warning: ${skillInstall.reason ?? "unknown"}`);
|
|
}
|
|
else if (skillInstall.outcome === "skipped") {
|
|
ctx.logger.warn(`Hermes Runtime Plugin: Fusion skill auto-install skipped: ${skillInstall.reason ?? "unknown"}`);
|
|
}
|
|
ctx.logger.info(`Hermes Runtime Plugin loaded — binary=${settings.binaryPath} model=${settings.model ?? "(default)"} fusionSkill=${skillInstall.outcome}`);
|
|
ctx.emitEvent("hermes-runtime:loaded", {
|
|
runtimeId: HERMES_RUNTIME_ID,
|
|
version: HERMES_RUNTIME_VERSION,
|
|
});
|
|
},
|
|
onUnload: () => {
|
|
// No persistent state to clean up — each prompt spawns a fresh subprocess.
|
|
},
|
|
},
|
|
runtime: {
|
|
metadata: hermesRuntimeMetadata,
|
|
factory: hermesRuntimeFactory,
|
|
},
|
|
});
|
|
export default plugin;
|
|
// ── Public exports ────────────────────────────────────────────────────────────
|
|
export { hermesRuntimeMetadata, hermesRuntimeFactory, HERMES_RUNTIME_ID };
|
|
export { HermesRuntimeAdapter } from "./runtime-adapter.js";
|
|
export { resolveCliSettings, invokeHermesCli, buildHermesArgs, parseHermesOutput, listHermesProfiles, } from "./cli-spawn.js";
|
|
export { installFusionSkillIntoHermesHome, resolveBundledFusionSkillSource, resolveHermesHome, } from "./fusion-skill-install.js";
|
|
// Probe re-export for the dashboard's runtime-provider-probes façade.
|
|
export { probeHermesBinary } from "./probe.js";
|
|
//# sourceMappingURL=index.js.map
|