diff --git a/packages/web/package.json b/packages/web/package.json index 095901ab3b..be7b85200f 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -47,17 +47,29 @@ }, "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-grok": "workspace:*", "@aoagents/ao-plugin-agent-kimicode": "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.12.0-beta.256", "@xterm/addon-unicode11": "0.10.0-beta.256", diff --git a/packages/web/src/__tests__/services.test.ts b/packages/web/src/__tests__/services.test.ts index 427d7bbf9a..0b8bd3202a 100644 --- a/packages/web/src/__tests__/services.test.ts +++ b/packages/web/src/__tests__/services.test.ts @@ -8,14 +8,28 @@ const { mockCreateSessionManager, mockRegistry, tmuxPlugin, + processPlugin, + aiderPlugin, claudePlugin, codexPlugin, + cursorPlugin, grokPlugin, 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(); @@ -43,14 +57,28 @@ 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" } }, grokPlugin: { manifest: { name: "grok" } }, 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" } }, }; }); @@ -70,14 +98,28 @@ 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-grok", () => ({ default: grokPlugin })); 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(() => { @@ -123,12 +165,25 @@ describe("services", () => { expect(mockRegister).toHaveBeenCalledWith(codexPlugin); }); - it("registers the Grok agent plugin with web services", async () => { + 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(grokPlugin); + 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 () => { diff --git a/packages/web/src/lib/services.ts b/packages/web/src/lib/services.ts index b20b230812..d20e3ede45 100644 --- a/packages/web/src/lib/services.ts +++ b/packages/web/src/lib/services.ts @@ -35,6 +35,7 @@ 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"; @@ -42,9 +43,20 @@ import pluginAgentKimicode from "@aoagents/ao-plugin-agent-kimicode"; import pluginAgentGrok from "@aoagents/ao-plugin-agent-grok"; 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; @@ -108,6 +120,7 @@ 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); @@ -115,9 +128,20 @@ async function initServices(): Promise { registry.register(pluginAgentGrok); 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 4cdcee7c54..77913508bc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -704,6 +704,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 @@ -722,6 +725,24 @@ 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 @@ -731,12 +752,27 @@ importers: '@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 @@ -3232,8 +3268,8 @@ packages: sass: optional: true - node-abi@3.89.0: - resolution: {integrity: sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==} + node-abi@3.92.0: + resolution: {integrity: sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==} engines: {node: '>=10'} node-addon-api@7.1.1: @@ -6431,7 +6467,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - node-abi@3.89.0: + node-abi@3.92.0: dependencies: semver: 7.7.4 optional: true @@ -6600,7 +6636,7 @@ snapshots: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 3.89.0 + node-abi: 3.92.0 pump: 3.0.4 rc: 1.2.8 simple-get: 4.0.1