Add a supervised Cursor CLI runtime for routed Cursor model sessions. - Stream Cursor prompt output into Fusion session callbacks with resume support. - Support Windows Cursor shims, inactivity-based supervision, and cursor-agent to cursor fallback execution. - Route Cursor CLI models through the bundled plugin and document the runtime contract. Files changed: .changeset/fn-9097-cursor-cli-runtime.md | 7 ++ docs/cursor-cli-contract.md | 21 ++++ docs/settings-reference.md | 4 +- .../cli-runtime-routing-conformance.test.ts | 11 +- .../engine/src/agents/agent-session-helpers.ts | 6 +- packages/engine/src/agents/cli-provider-routing.ts | 27 ++--- plugins/fusion-plugin-cursor-runtime/README.md | 21 ++++ plugins/fusion-plugin-cursor-runtime/package.json | 1 + .../src/__tests__/cli-spawn.test.ts | 25 ++++- .../src/__tests__/prompt-transport.test.ts | 58 ++++++++++ .../src/__tests__/runtime-adapter.test.ts | 44 +++++--- .../src/__tests__/stream-parser.test.ts | 12 +++ .../fusion-plugin-cursor-runtime/src/cli-spawn.ts | 57 +++++++++- plugins/fusion-plugin-cursor-runtime/src/index.ts | 4 +- .../src/prompt-transport.ts | 120 +++++++++++++++++++++ .../src/runtime-adapter.ts | 59 ++++++---- .../src/stream-parser.ts | 43 ++++++++ plugins/fusion-plugin-cursor-runtime/src/types.ts | 18 ++-- pnpm-lock.yaml | 3 + 19 files changed, 458 insertions(+), 83 deletions(-) Fusion-Task-Id: FN-9097 Fusion-Task-Lineage: a4eed861-6059-4528-9f80-3426f5ccad58 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
66 lines
2.2 KiB
TypeScript
66 lines
2.2 KiB
TypeScript
import { definePlugin } from "@fusion/plugin-sdk";
|
|
import type { FusionPlugin } from "@fusion/plugin-sdk";
|
|
import { probeCursorBinary } from "./probe.js";
|
|
import { discoverCursorProviderModels } from "./provider.js";
|
|
import { CursorRuntimeAdapter } from "./runtime-adapter.js";
|
|
|
|
const plugin: FusionPlugin = definePlugin({
|
|
manifest: {
|
|
id: "fusion-plugin-cursor-runtime",
|
|
name: "Cursor Runtime Plugin",
|
|
version: "0.1.0",
|
|
description: "Cursor CLI runtime support for Fusion",
|
|
runtime: {
|
|
runtimeId: "cursor",
|
|
name: "Cursor Runtime",
|
|
version: "0.1.0",
|
|
},
|
|
},
|
|
state: "installed",
|
|
hooks: {},
|
|
runtime: {
|
|
metadata: {
|
|
runtimeId: "cursor",
|
|
name: "Cursor Runtime",
|
|
version: "0.1.0",
|
|
},
|
|
factory: async (ctx) => new CursorRuntimeAdapter(ctx.settings as Record<string, unknown> | undefined),
|
|
},
|
|
cliProviders: [
|
|
{
|
|
providerId: "cursor-cli",
|
|
displayName: "Cursor CLI",
|
|
binaryName: "cursor-agent",
|
|
providerType: "cli",
|
|
statusRoute: "/providers/cursor-cli/status",
|
|
authRoute: "/auth/cursor-cli",
|
|
actions: [
|
|
{ actionId: "enable", label: "Enable", actionType: "enable", method: "POST", route: "/auth/cursor-cli" },
|
|
{ actionId: "disable", label: "Disable", actionType: "disable", method: "POST", route: "/auth/cursor-cli" },
|
|
{ actionId: "test", label: "Test", actionType: "test", method: "GET", route: "/providers/cursor-cli/status" }
|
|
],
|
|
probe: async () => {
|
|
const status = await probeCursorBinary();
|
|
return {
|
|
available: status.available,
|
|
authenticated: status.authenticated,
|
|
binaryPath: status.binaryPath,
|
|
binaryName: status.binaryName,
|
|
version: status.version,
|
|
reason: status.reason,
|
|
};
|
|
},
|
|
discoverModels: discoverCursorProviderModels,
|
|
runtime: {
|
|
runtimeId: "cursor",
|
|
createAdapter: async (ctx) => new CursorRuntimeAdapter(ctx.settings as Record<string, unknown> | undefined),
|
|
},
|
|
},
|
|
],
|
|
});
|
|
|
|
export default plugin;
|
|
export { probeCursorBinary } from "./probe.js";
|
|
export { discoverCursorProviderModels } from "./provider.js";
|
|
export type { CursorBinaryStatus } from "./types.js";
|