From 5126f3e6d56a90a7e903b1393484febf8057c14b Mon Sep 17 00:00:00 2001 From: ChiragArora31 Date: Wed, 29 Apr 2026 07:02:16 +0530 Subject: [PATCH] fix(web): register bundled plugins statically --- packages/web/package.json | 13 +++++ packages/web/src/__tests__/services.test.ts | 62 +++++++++++++++++++++ packages/web/src/lib/services.ts | 26 +++++++++ pnpm-lock.yaml | 39 +++++++++++++ 4 files changed, 140 insertions(+) diff --git a/packages/web/package.json b/packages/web/package.json index dd86c297e0..d5ef3d2bf4 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -29,14 +29,27 @@ }, "dependencies": { "@aoagents/ao-core": "workspace:*", + "@aoagents/ao-plugin-agent-aider": "workspace:*", "@aoagents/ao-plugin-agent-claude-code": "workspace:*", "@aoagents/ao-plugin-agent-codex": "workspace:*", "@aoagents/ao-plugin-agent-cursor": "workspace:*", "@aoagents/ao-plugin-agent-opencode": "workspace:*", + "@aoagents/ao-plugin-notifier-composio": "workspace:*", + "@aoagents/ao-plugin-notifier-desktop": "workspace:*", + "@aoagents/ao-plugin-notifier-discord": "workspace:*", + "@aoagents/ao-plugin-notifier-openclaw": "workspace:*", + "@aoagents/ao-plugin-notifier-slack": "workspace:*", + "@aoagents/ao-plugin-notifier-webhook": "workspace:*", + "@aoagents/ao-plugin-runtime-process": "workspace:*", "@aoagents/ao-plugin-runtime-tmux": "workspace:*", "@aoagents/ao-plugin-scm-github": "workspace:*", + "@aoagents/ao-plugin-scm-gitlab": "workspace:*", + "@aoagents/ao-plugin-terminal-iterm2": "workspace:*", + "@aoagents/ao-plugin-terminal-web": "workspace:*", "@aoagents/ao-plugin-tracker-github": "workspace:*", + "@aoagents/ao-plugin-tracker-gitlab": "workspace:*", "@aoagents/ao-plugin-tracker-linear": "workspace:*", + "@aoagents/ao-plugin-workspace-clone": "workspace:*", "@aoagents/ao-plugin-workspace-worktree": "workspace:*", "@xterm/addon-fit": "^0.11.0", "@xterm/addon-web-links": "^0.12.0", diff --git a/packages/web/src/__tests__/services.test.ts b/packages/web/src/__tests__/services.test.ts index 8d92746709..501ef3d31d 100644 --- a/packages/web/src/__tests__/services.test.ts +++ b/packages/web/src/__tests__/services.test.ts @@ -8,13 +8,27 @@ const { mockCreateSessionManager, mockRegistry, tmuxPlugin, + processPlugin, + aiderPlugin, claudePlugin, codexPlugin, + cursorPlugin, opencodePlugin, worktreePlugin, + clonePlugin, scmPlugin, + scmGitlabPlugin, + terminalIterm2Plugin, + terminalWebPlugin, trackerGithubPlugin, + trackerGitlabPlugin, trackerLinearPlugin, + notifierComposioPlugin, + notifierDesktopPlugin, + notifierDiscordPlugin, + notifierOpenClawPlugin, + notifierSlackPlugin, + notifierWebhookPlugin, } = vi.hoisted(() => { const mockLoadConfig = vi.fn(); const mockGetGlobalConfigPath = vi.fn(); @@ -42,13 +56,27 @@ const { mockCreateSessionManager, mockRegistry, tmuxPlugin: { manifest: { name: "tmux" } }, + processPlugin: { manifest: { name: "process" } }, + aiderPlugin: { manifest: { name: "aider" } }, claudePlugin: { manifest: { name: "claude-code" } }, codexPlugin: { manifest: { name: "codex" } }, + cursorPlugin: { manifest: { name: "cursor" } }, opencodePlugin: { manifest: { name: "opencode" } }, worktreePlugin: { manifest: { name: "worktree" } }, + clonePlugin: { manifest: { name: "clone" } }, scmPlugin: { manifest: { name: "github" } }, + scmGitlabPlugin: { manifest: { name: "gitlab" } }, + terminalIterm2Plugin: { manifest: { name: "iterm2" } }, + terminalWebPlugin: { manifest: { name: "web" } }, trackerGithubPlugin: { manifest: { name: "github" } }, + trackerGitlabPlugin: { manifest: { name: "gitlab" } }, trackerLinearPlugin: { manifest: { name: "linear" } }, + notifierComposioPlugin: { manifest: { name: "composio" } }, + notifierDesktopPlugin: { manifest: { name: "desktop" } }, + notifierDiscordPlugin: { manifest: { name: "discord" } }, + notifierOpenClawPlugin: { manifest: { name: "openclaw" } }, + notifierSlackPlugin: { manifest: { name: "slack" } }, + notifierWebhookPlugin: { manifest: { name: "webhook" } }, }; }); @@ -68,13 +96,27 @@ vi.mock("@aoagents/ao-core", () => ({ })); vi.mock("@aoagents/ao-plugin-runtime-tmux", () => ({ default: tmuxPlugin })); +vi.mock("@aoagents/ao-plugin-runtime-process", () => ({ default: processPlugin })); +vi.mock("@aoagents/ao-plugin-agent-aider", () => ({ default: aiderPlugin })); vi.mock("@aoagents/ao-plugin-agent-claude-code", () => ({ default: claudePlugin })); vi.mock("@aoagents/ao-plugin-agent-codex", () => ({ default: codexPlugin })); +vi.mock("@aoagents/ao-plugin-agent-cursor", () => ({ default: cursorPlugin })); vi.mock("@aoagents/ao-plugin-agent-opencode", () => ({ default: opencodePlugin })); vi.mock("@aoagents/ao-plugin-workspace-worktree", () => ({ default: worktreePlugin })); +vi.mock("@aoagents/ao-plugin-workspace-clone", () => ({ default: clonePlugin })); vi.mock("@aoagents/ao-plugin-scm-github", () => ({ default: scmPlugin })); +vi.mock("@aoagents/ao-plugin-scm-gitlab", () => ({ default: scmGitlabPlugin })); +vi.mock("@aoagents/ao-plugin-terminal-iterm2", () => ({ default: terminalIterm2Plugin })); +vi.mock("@aoagents/ao-plugin-terminal-web", () => ({ default: terminalWebPlugin })); vi.mock("@aoagents/ao-plugin-tracker-github", () => ({ default: trackerGithubPlugin })); +vi.mock("@aoagents/ao-plugin-tracker-gitlab", () => ({ default: trackerGitlabPlugin })); vi.mock("@aoagents/ao-plugin-tracker-linear", () => ({ default: trackerLinearPlugin })); +vi.mock("@aoagents/ao-plugin-notifier-composio", () => ({ default: notifierComposioPlugin })); +vi.mock("@aoagents/ao-plugin-notifier-desktop", () => ({ default: notifierDesktopPlugin })); +vi.mock("@aoagents/ao-plugin-notifier-discord", () => ({ default: notifierDiscordPlugin })); +vi.mock("@aoagents/ao-plugin-notifier-openclaw", () => ({ default: notifierOpenClawPlugin })); +vi.mock("@aoagents/ao-plugin-notifier-slack", () => ({ default: notifierSlackPlugin })); +vi.mock("@aoagents/ao-plugin-notifier-webhook", () => ({ default: notifierWebhookPlugin })); describe("services", () => { beforeEach(() => { @@ -120,6 +162,26 @@ describe("services", () => { expect(mockRegister).toHaveBeenCalledWith(codexPlugin); }); + it("registers built-in plugins that the web server must bundle statically", async () => { + const { getServices } = await import("../lib/services"); + + await getServices(); + + expect(mockRegister).toHaveBeenCalledWith(processPlugin); + expect(mockRegister).toHaveBeenCalledWith(aiderPlugin); + expect(mockRegister).toHaveBeenCalledWith(clonePlugin); + expect(mockRegister).toHaveBeenCalledWith(scmGitlabPlugin); + expect(mockRegister).toHaveBeenCalledWith(trackerGitlabPlugin); + expect(mockRegister).toHaveBeenCalledWith(notifierComposioPlugin); + expect(mockRegister).toHaveBeenCalledWith(notifierDesktopPlugin); + expect(mockRegister).toHaveBeenCalledWith(notifierDiscordPlugin); + expect(mockRegister).toHaveBeenCalledWith(notifierOpenClawPlugin); + expect(mockRegister).toHaveBeenCalledWith(notifierSlackPlugin); + expect(mockRegister).toHaveBeenCalledWith(notifierWebhookPlugin); + expect(mockRegister).toHaveBeenCalledWith(terminalIterm2Plugin); + expect(mockRegister).toHaveBeenCalledWith(terminalWebPlugin); + }); + it("caches initialized services across repeated calls", async () => { const { getServices } = await import("../lib/services"); diff --git a/packages/web/src/lib/services.ts b/packages/web/src/lib/services.ts index 237c5ac4e6..6689da244d 100644 --- a/packages/web/src/lib/services.ts +++ b/packages/web/src/lib/services.ts @@ -34,14 +34,27 @@ import { // Static plugin imports — webpack needs these to be string literals import pluginRuntimeTmux from "@aoagents/ao-plugin-runtime-tmux"; +import pluginRuntimeProcess from "@aoagents/ao-plugin-runtime-process"; +import pluginAgentAider from "@aoagents/ao-plugin-agent-aider"; import pluginAgentClaudeCode from "@aoagents/ao-plugin-agent-claude-code"; import pluginAgentCodex from "@aoagents/ao-plugin-agent-codex"; import pluginAgentCursor from "@aoagents/ao-plugin-agent-cursor"; import pluginAgentOpencode from "@aoagents/ao-plugin-agent-opencode"; import pluginWorkspaceWorktree from "@aoagents/ao-plugin-workspace-worktree"; +import pluginWorkspaceClone from "@aoagents/ao-plugin-workspace-clone"; import pluginScmGithub from "@aoagents/ao-plugin-scm-github"; +import pluginScmGitlab from "@aoagents/ao-plugin-scm-gitlab"; +import pluginTerminalIterm2 from "@aoagents/ao-plugin-terminal-iterm2"; +import pluginTerminalWeb from "@aoagents/ao-plugin-terminal-web"; import pluginTrackerGithub from "@aoagents/ao-plugin-tracker-github"; +import pluginTrackerGitlab from "@aoagents/ao-plugin-tracker-gitlab"; import pluginTrackerLinear from "@aoagents/ao-plugin-tracker-linear"; +import pluginNotifierComposio from "@aoagents/ao-plugin-notifier-composio"; +import pluginNotifierDesktop from "@aoagents/ao-plugin-notifier-desktop"; +import pluginNotifierDiscord from "@aoagents/ao-plugin-notifier-discord"; +import pluginNotifierOpenClaw from "@aoagents/ao-plugin-notifier-openclaw"; +import pluginNotifierSlack from "@aoagents/ao-plugin-notifier-slack"; +import pluginNotifierWebhook from "@aoagents/ao-plugin-notifier-webhook"; export interface Services { config: LoadedConfig; @@ -104,14 +117,27 @@ async function initServices(): Promise { // Register plugins explicitly (webpack can't handle dynamic import() in core) registry.register(pluginRuntimeTmux); + registry.register(pluginRuntimeProcess); + registry.register(pluginAgentAider); registry.register(pluginAgentClaudeCode); registry.register(pluginAgentCodex); registry.register(pluginAgentCursor); registry.register(pluginAgentOpencode); registry.register(pluginWorkspaceWorktree); + registry.register(pluginWorkspaceClone); registry.register(pluginScmGithub); + registry.register(pluginScmGitlab); + registry.register(pluginTerminalIterm2); + registry.register(pluginTerminalWeb); registry.register(pluginTrackerGithub); + registry.register(pluginTrackerGitlab); registry.register(pluginTrackerLinear); + registry.register(pluginNotifierComposio); + registry.register(pluginNotifierDesktop); + registry.register(pluginNotifierDiscord); + registry.register(pluginNotifierOpenClaw); + registry.register(pluginNotifierSlack); + registry.register(pluginNotifierWebhook); const sessionManager = createSessionManager({ config, registry }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 45534888e6..50cb7c2046 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -617,6 +617,9 @@ importers: '@aoagents/ao-core': specifier: workspace:* version: link:../core + '@aoagents/ao-plugin-agent-aider': + specifier: workspace:* + version: link:../plugins/agent-aider '@aoagents/ao-plugin-agent-claude-code': specifier: workspace:* version: link:../plugins/agent-claude-code @@ -629,18 +632,54 @@ importers: '@aoagents/ao-plugin-agent-opencode': specifier: workspace:* version: link:../plugins/agent-opencode + '@aoagents/ao-plugin-notifier-composio': + specifier: workspace:* + version: link:../plugins/notifier-composio + '@aoagents/ao-plugin-notifier-desktop': + specifier: workspace:* + version: link:../plugins/notifier-desktop + '@aoagents/ao-plugin-notifier-discord': + specifier: workspace:* + version: link:../plugins/notifier-discord + '@aoagents/ao-plugin-notifier-openclaw': + specifier: workspace:* + version: link:../plugins/notifier-openclaw + '@aoagents/ao-plugin-notifier-slack': + specifier: workspace:* + version: link:../plugins/notifier-slack + '@aoagents/ao-plugin-notifier-webhook': + specifier: workspace:* + version: link:../plugins/notifier-webhook + '@aoagents/ao-plugin-runtime-process': + specifier: workspace:* + version: link:../plugins/runtime-process '@aoagents/ao-plugin-runtime-tmux': specifier: workspace:* version: link:../plugins/runtime-tmux '@aoagents/ao-plugin-scm-github': specifier: workspace:* version: link:../plugins/scm-github + '@aoagents/ao-plugin-scm-gitlab': + specifier: workspace:* + version: link:../plugins/scm-gitlab + '@aoagents/ao-plugin-terminal-iterm2': + specifier: workspace:* + version: link:../plugins/terminal-iterm2 + '@aoagents/ao-plugin-terminal-web': + specifier: workspace:* + version: link:../plugins/terminal-web '@aoagents/ao-plugin-tracker-github': specifier: workspace:* version: link:../plugins/tracker-github + '@aoagents/ao-plugin-tracker-gitlab': + specifier: workspace:* + version: link:../plugins/tracker-gitlab '@aoagents/ao-plugin-tracker-linear': specifier: workspace:* version: link:../plugins/tracker-linear + '@aoagents/ao-plugin-workspace-clone': + specifier: workspace:* + version: link:../plugins/workspace-clone '@aoagents/ao-plugin-workspace-worktree': specifier: workspace:* version: link:../plugins/workspace-worktree