Files
fusion/plugins/fusion-plugin-agent-browser/src/index.ts
Fusion cfa5ef6130 feat(FN-3573): broaden runtime ignore list for live fusion app paths (+2 more)
Commits merged:
- chore(test-isolation): broaden runtime ignore list for live fusion app paths
- feat(FN-3573): complete Step 2 — add plugin setup API client helpers
- feat(FN-3573): complete Step 1 — backfill plugin setup routes

Files changed:
plugins/fusion-plugin-agent-browser/README.md      | 26 ++++++
 plugins/fusion-plugin-agent-browser/manifest.json  | 15 ++++
 plugins/fusion-plugin-agent-browser/package.json   | 25 ++++++
 .../src/__tests__/index.test.ts                    | 66 +++++++++++++++
 .../src/__tests__/prompts.test.ts                  | 21 +++++
 .../src/__tests__/setup.test.ts                    | 39 +++++++++
 .../src/__tests__/skills.test.ts                   |  9 ++
 .../src/__tests__/tools.test.ts                    | 55 ++++++++++++
 .../src/__tests__/types.test.ts                    | 16 ++++
 .../src/__tests__/workflow-steps.test.ts           | 10 +++
 plugins/fusion-plugin-agent-browser/src/index.ts   | 67 +++++++++++++++
 plugins/fusion-plugin-agent-browser/src/probe.ts   | 98 ++++++++++++++++++++++
 plugins/fusion-plugin-agent-browser/src/prompts.ts | 23 +++++
 plugins/fusion-plugin-agent-browser/src/setup.ts   | 31 +++++++
 plugins/fusion-plugin-agent-browser/src/skills.ts  | 12 +++
 plugins/fusion-plugin-agent-browser/src/tools.ts   | 34 ++++++++
 plugins/fusion-plugin-agent-browser/src/types.ts   | 56 +++++++++++++
 .../src/workflow-steps.ts                          | 15 ++++
 plugins/fusion-plugin-agent-browser/tsconfig.json  |  9 ++
 .../fusion-plugin-agent-browser/vitest.config.ts   | 22 +++++
 pnpm-lock.yaml                                     | 16 ++++
 pnpm-workspace.yaml                                |  1 +
 22 files changed, 666 insertions(+)

Fusion-Task-Id: FN-3573
2026-05-06 15:06:24 -07:00

68 lines
4.0 KiB
TypeScript

import { definePlugin } from "@fusion/plugin-sdk";
import type { FusionPlugin, PluginSettingSchema } from "@fusion/plugin-sdk";
import { AGENT_BROWSER_SKILLS } from "./skills.js";
import { buildPromptContributions } from "./prompts.js";
import { setupHooks, setupManifest } from "./setup.js";
import { resolveSettings } from "./types.js";
import { AGENT_BROWSER_WORKFLOW_STEPS } from "./workflow-steps.js";
import { AGENT_BROWSER_TOOLS } from "./tools.js";
import { probeAgentBrowserBinary } from "./probe.js";
const MAX_PROBE_TIMEOUT_MS = 30_000;
export const AGENT_BROWSER_SETTINGS_SCHEMA: Record<string, PluginSettingSchema> = {
enabled: { type: "boolean", label: "Enable Agent Browser", group: "General", defaultValue: true },
installChannel: { type: "enum", label: "Install Channel", enumValues: ["stable", "beta", "nightly"], defaultValue: "stable", group: "General" },
commandTimeoutMs: { type: "number", label: "Command Timeout (ms)", defaultValue: 120000, group: "General" },
headlessMode: { type: "boolean", label: "Headless Mode", defaultValue: true, group: "Browser" },
allowedDomains: { type: "array", label: "Allowed Domains", itemType: "string", defaultValue: [], group: "Browser" },
promptExecutorSystem: { type: "string", label: "Executor System Prompt", multiline: true, defaultValue: "When browsing, summarize evidence with URLs.", group: "Prompt Contributions" },
promptExecutorTask: { type: "string", label: "Executor Task Prompt", multiline: true, defaultValue: "Use browser context only when needed for the task.", group: "Prompt Contributions" },
promptTriage: { type: "string", label: "Triage Prompt", multiline: true, defaultValue: "Mark tasks requiring browser evidence explicitly.", group: "Prompt Contributions" },
promptReviewer: { type: "string", label: "Reviewer Prompt", multiline: true, defaultValue: "Verify browser-derived claims are backed by cited pages.", group: "Prompt Contributions" },
promptHeartbeat: { type: "string", label: "Heartbeat Prompt", multiline: true, defaultValue: "Keep browser interactions bounded and report failures clearly.", group: "Prompt Contributions" },
skillExposure: { type: "enum", label: "Skill Exposure", enumValues: ["none", "selected", "all"], defaultValue: "selected", group: "Skills" },
};
const plugin: FusionPlugin = definePlugin({
manifest: {
id: "fusion-plugin-agent-browser",
name: "Agent Browser Plugin",
version: "0.1.0",
description: "Adds agent-browser setup hooks plus skills, prompt contributions, and workflow steps",
author: "Fusion Team",
homepage: "https://github.com/gsxdsm/fusion",
settingsSchema: AGENT_BROWSER_SETTINGS_SCHEMA,
skills: AGENT_BROWSER_SKILLS.map((s) => ({ skillId: s.skillId, name: s.name })),
workflowSteps: AGENT_BROWSER_WORKFLOW_STEPS.map((s) => ({ stepId: s.stepId, name: s.name })),
promptSurfaces: ["executor-system", "executor-task", "triage", "reviewer", "heartbeat"],
setup: setupManifest,
},
state: "installed",
hooks: {
onLoad: async (ctx) => {
try {
const settings = resolveSettings(ctx.settings);
plugin.promptContributions = buildPromptContributions(settings);
const probe = await probeAgentBrowserBinary({ timeoutMs: Math.min(settings.commandTimeoutMs, MAX_PROBE_TIMEOUT_MS) });
ctx.logger.info(`Agent Browser Plugin loaded — available=${String(probe.available)} channel=${settings.installChannel}`);
ctx.emitEvent("agent-browser:loaded", { available: probe.available, version: probe.version, settings });
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
ctx.logger.error(`Agent Browser Plugin probe failed: ${message}`);
ctx.emitEvent("agent-browser:loaded", { available: false, error: message });
}
},
},
tools: AGENT_BROWSER_TOOLS,
skills: AGENT_BROWSER_SKILLS,
workflowSteps: AGENT_BROWSER_WORKFLOW_STEPS,
promptContributions: buildPromptContributions(resolveSettings(undefined)),
setup: {
manifest: setupManifest,
hooks: setupHooks,
},
});
export default plugin;