Add AgentBBS connector plugin (#131)
Some checks failed
CI / build (push) Has been cancelled
test / test (push) Has been cancelled

Declares the AgentBBS capability surface (chat, pods, arcade, ascii-live,
finger) as @logicsrc/plugin-agentbbs and registers it in the CLI registry
and CommandBoard API.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Anthony Ettinger 2026-08-04 18:43:31 -07:00 committed by GitHub
parent 647f204f1d
commit 1bb7ba6e60
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 133 additions and 5 deletions

View file

@ -13,6 +13,7 @@
}, },
"dependencies": { "dependencies": {
"@logicsrc/plugin-core": "file:../../packages/plugin-core", "@logicsrc/plugin-core": "file:../../packages/plugin-core",
"@logicsrc/plugin-agentbbs": "file:../../plugins/agentbbs",
"@logicsrc/plugin-agentmail": "file:../../plugins/agentmail", "@logicsrc/plugin-agentmail": "file:../../plugins/agentmail",
"@logicsrc/plugin-c0mpute": "file:../../plugins/c0mpute", "@logicsrc/plugin-c0mpute": "file:../../plugins/c0mpute",
"@logicsrc/plugin-coinpay": "file:../../plugins/coinpay", "@logicsrc/plugin-coinpay": "file:../../plugins/coinpay",

View file

@ -68,7 +68,7 @@ describe("CommandBoard API contracts", () => {
}; };
expect(response.status).toBe(200); expect(response.status).toBe(200);
expect(body.plugins.map((plugin) => plugin.id)).toEqual(["coinpay", "ugig", "sh1pt", "c0mpute", "feed-discovery", "social-accounts", "email-accounts", "agentmail"]); expect(body.plugins.map((plugin) => plugin.id)).toEqual(["coinpay", "ugig", "sh1pt", "c0mpute", "feed-discovery", "social-accounts", "email-accounts", "agentmail", "agentbbs"]);
expect(body.plugins.find((plugin) => plugin.id === "sh1pt")).toMatchObject({ expect(body.plugins.find((plugin) => plugin.id === "sh1pt")).toMatchObject({
enabled: true, enabled: true,
capabilities: expect.arrayContaining(["projects.sync", "actions.publish", "deployments.status"]) capabilities: expect.arrayContaining(["projects.sync", "actions.publish", "deployments.status"])

View file

@ -1,6 +1,7 @@
import { createServer, type IncomingMessage, type ServerResponse } from "node:http"; import { createServer, type IncomingMessage, type ServerResponse } from "node:http";
import { pathToFileURL } from "node:url"; import { pathToFileURL } from "node:url";
import { createPluginRegistry } from "@logicsrc/plugin-core"; import { createPluginRegistry } from "@logicsrc/plugin-core";
import { agentBbsPlugin } from "@logicsrc/plugin-agentbbs";
import { agentMailPlugin, DraftError, MailAccessError, parseAddress, type Draft, type MailAddress } from "@logicsrc/plugin-agentmail"; import { agentMailPlugin, DraftError, MailAccessError, parseAddress, type Draft, type MailAddress } from "@logicsrc/plugin-agentmail";
import { c0mputePlugin } from "@logicsrc/plugin-c0mpute"; import { c0mputePlugin } from "@logicsrc/plugin-c0mpute";
import { coinPayPlugin } from "@logicsrc/plugin-coinpay"; import { coinPayPlugin } from "@logicsrc/plugin-coinpay";
@ -12,7 +13,7 @@ import { uGigPlugin } from "@logicsrc/plugin-ugig";
import { schemas, validate } from "@logicsrc/validators"; import { schemas, validate } from "@logicsrc/validators";
import { buildAgentMailService, mailIdentity } from "./agentmail.js"; import { buildAgentMailService, mailIdentity } from "./agentmail.js";
const registry = createPluginRegistry([coinPayPlugin, uGigPlugin, sh1ptPlugin, c0mputePlugin, feedDiscoveryPlugin, socialAccountsPlugin, emailAccountsPlugin, agentMailPlugin]); const registry = createPluginRegistry([coinPayPlugin, uGigPlugin, sh1ptPlugin, c0mputePlugin, feedDiscoveryPlugin, socialAccountsPlugin, emailAccountsPlugin, agentMailPlugin, agentBbsPlugin]);
const boards = [ const boards = [
{ path: "/general", title: "General", description: "CommandBoard.run general discussion." }, { path: "/general", title: "General", description: "CommandBoard.run general discussion." },

16
package-lock.json generated
View file

@ -23,6 +23,7 @@
"name": "@logicsrc/commandboard-api", "name": "@logicsrc/commandboard-api",
"version": "0.1.0", "version": "0.1.0",
"dependencies": { "dependencies": {
"@logicsrc/plugin-agentbbs": "file:../../plugins/agentbbs",
"@logicsrc/plugin-agentmail": "file:../../plugins/agentmail", "@logicsrc/plugin-agentmail": "file:../../plugins/agentmail",
"@logicsrc/plugin-c0mpute": "file:../../plugins/c0mpute", "@logicsrc/plugin-c0mpute": "file:../../plugins/c0mpute",
"@logicsrc/plugin-coinpay": "file:../../plugins/coinpay", "@logicsrc/plugin-coinpay": "file:../../plugins/coinpay",
@ -2064,6 +2065,10 @@
"resolved": "packages/openprd", "resolved": "packages/openprd",
"link": true "link": true
}, },
"node_modules/@logicsrc/plugin-agentbbs": {
"resolved": "plugins/agentbbs",
"link": true
},
"node_modules/@logicsrc/plugin-agentgit": { "node_modules/@logicsrc/plugin-agentgit": {
"resolved": "plugins/agentgit", "resolved": "plugins/agentgit",
"link": true "link": true
@ -7759,6 +7764,7 @@
"@logicsrc/account-core": "file:../account-core", "@logicsrc/account-core": "file:../account-core",
"@logicsrc/openontology": "file:../openontology", "@logicsrc/openontology": "file:../openontology",
"@logicsrc/openprd": "file:../openprd", "@logicsrc/openprd": "file:../openprd",
"@logicsrc/plugin-agentbbs": "file:../../plugins/agentbbs",
"@logicsrc/plugin-coinpay": "file:../../plugins/coinpay", "@logicsrc/plugin-coinpay": "file:../../plugins/coinpay",
"@logicsrc/plugin-core": "file:../plugin-core", "@logicsrc/plugin-core": "file:../plugin-core",
"@logicsrc/plugin-credential-sharing": "file:../../plugins/credential-sharing", "@logicsrc/plugin-credential-sharing": "file:../../plugins/credential-sharing",
@ -7869,6 +7875,16 @@
"vitest": "^4.0.8" "vitest": "^4.0.8"
} }
}, },
"plugins/agentbbs": {
"name": "@logicsrc/plugin-agentbbs",
"version": "0.1.0",
"dependencies": {
"@logicsrc/plugin-core": "file:../../packages/plugin-core"
},
"devDependencies": {
"vitest": "^4.0.8"
}
},
"plugins/agentgit": { "plugins/agentgit": {
"name": "@logicsrc/plugin-agentgit", "name": "@logicsrc/plugin-agentgit",
"version": "0.1.0", "version": "0.1.0",

View file

@ -12,14 +12,14 @@
"apps/*" "apps/*"
], ],
"scripts": { "scripts": {
"build": "npm --workspace @logicsrc/schemas run build && npm --workspace @logicsrc/validators run build && npm --workspace @logicsrc/sdk run build && npm --workspace @logicsrc/agentad run build && npm --workspace @logicsrc/ans run build && npm --workspace @logicsrc/plugin-core run build && npm --workspace @logicsrc/agentstack run build && npm --workspace @logicsrc/agentswarm run build && npm --workspace @logicsrc/account-core run build && npm --workspace @logicsrc/plugin-coinpay run build && npm --workspace @logicsrc/plugin-ugig run build && npm --workspace @logicsrc/plugin-sh1pt run build && npm --workspace @logicsrc/plugin-c0mpute run build && npm --workspace @logicsrc/plugin-feed-discovery run build && npm --workspace @logicsrc/plugin-social-accounts run build && npm --workspace @logicsrc/plugin-email-accounts run build && npm --workspace @logicsrc/plugin-agentgit run build && npm --workspace @logicsrc/plugin-agentmail run build && npm --workspace @logicsrc/plugin-credential-sharing run build && npm --workspace @logicsrc/openontology run build && npm --workspace @logicsrc/openprd run build && npm --workspace @logicsrc/tui run build && npm --workspace @logicsrc/cli run build && npm --workspace @profullstack/logicsrc-mcp run build && npm --workspace @logicsrc/commandboard-api run build && npm --workspace @logicsrc/commandboard-web run build && npm --workspace @logicsrc/web run build", "build": "npm --workspace @logicsrc/schemas run build && npm --workspace @logicsrc/validators run build && npm --workspace @logicsrc/sdk run build && npm --workspace @logicsrc/agentad run build && npm --workspace @logicsrc/ans run build && npm --workspace @logicsrc/plugin-core run build && npm --workspace @logicsrc/agentstack run build && npm --workspace @logicsrc/agentswarm run build && npm --workspace @logicsrc/account-core run build && npm --workspace @logicsrc/plugin-coinpay run build && npm --workspace @logicsrc/plugin-ugig run build && npm --workspace @logicsrc/plugin-sh1pt run build && npm --workspace @logicsrc/plugin-c0mpute run build && npm --workspace @logicsrc/plugin-feed-discovery run build && npm --workspace @logicsrc/plugin-social-accounts run build && npm --workspace @logicsrc/plugin-email-accounts run build && npm --workspace @logicsrc/plugin-agentbbs run build && npm --workspace @logicsrc/plugin-agentgit run build && npm --workspace @logicsrc/plugin-agentmail run build && npm --workspace @logicsrc/plugin-credential-sharing run build && npm --workspace @logicsrc/openontology run build && npm --workspace @logicsrc/openprd run build && npm --workspace @logicsrc/tui run build && npm --workspace @logicsrc/cli run build && npm --workspace @profullstack/logicsrc-mcp run build && npm --workspace @logicsrc/commandboard-api run build && npm --workspace @logicsrc/commandboard-web run build && npm --workspace @logicsrc/web run build",
"start": "npm --workspace @logicsrc/web run start", "start": "npm --workspace @logicsrc/web run start",
"test": "npm run test --workspaces --if-present", "test": "npm run test --workspaces --if-present",
"check": "npm run build && npm run test", "check": "npm run build && npm run test",
"schemas:validate": "npm --workspace @logicsrc/validators run validate:fixtures", "schemas:validate": "npm --workspace @logicsrc/validators run validate:fixtures",
"test:contract": "npm --workspace @logicsrc/commandboard-api run test:contract && npm --workspace @logicsrc/web run test:contract", "test:contract": "npm --workspace @logicsrc/commandboard-api run test:contract && npm --workspace @logicsrc/web run test:contract",
"test:e2e": "npm --workspace @logicsrc/commandboard-web run test:e2e && npm --workspace @logicsrc/web run test:e2e", "test:e2e": "npm --workspace @logicsrc/commandboard-web run test:e2e && npm --workspace @logicsrc/web run test:e2e",
"build:cli": "npm --workspace @logicsrc/schemas run build && npm --workspace @logicsrc/validators run build && npm --workspace @logicsrc/plugin-core run build && npm --workspace @logicsrc/account-core run build && npm --workspace @logicsrc/plugin-coinpay run build && npm --workspace @logicsrc/plugin-ugig run build && npm --workspace @logicsrc/plugin-feed-discovery run build && npm --workspace @logicsrc/plugin-social-accounts run build && npm --workspace @logicsrc/plugin-email-accounts run build && npm --workspace @logicsrc/plugin-credential-sharing run build && npm --workspace @logicsrc/openontology run build && npm --workspace @logicsrc/openprd run build && npm --workspace @logicsrc/tui run build && npm --workspace @logicsrc/cli run build" "build:cli": "npm --workspace @logicsrc/schemas run build && npm --workspace @logicsrc/validators run build && npm --workspace @logicsrc/plugin-core run build && npm --workspace @logicsrc/account-core run build && npm --workspace @logicsrc/plugin-coinpay run build && npm --workspace @logicsrc/plugin-ugig run build && npm --workspace @logicsrc/plugin-feed-discovery run build && npm --workspace @logicsrc/plugin-social-accounts run build && npm --workspace @logicsrc/plugin-email-accounts run build && npm --workspace @logicsrc/plugin-agentbbs run build && npm --workspace @logicsrc/plugin-credential-sharing run build && npm --workspace @logicsrc/openontology run build && npm --workspace @logicsrc/openprd run build && npm --workspace @logicsrc/tui run build && npm --workspace @logicsrc/cli run build"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^24.10.1", "@types/node": "^24.10.1",

View file

@ -17,6 +17,7 @@
"@logicsrc/account-core": "file:../account-core", "@logicsrc/account-core": "file:../account-core",
"@logicsrc/openontology": "file:../openontology", "@logicsrc/openontology": "file:../openontology",
"@logicsrc/openprd": "file:../openprd", "@logicsrc/openprd": "file:../openprd",
"@logicsrc/plugin-agentbbs": "file:../../plugins/agentbbs",
"@logicsrc/plugin-coinpay": "file:../../plugins/coinpay", "@logicsrc/plugin-coinpay": "file:../../plugins/coinpay",
"@logicsrc/plugin-core": "file:../plugin-core", "@logicsrc/plugin-core": "file:../plugin-core",
"@logicsrc/plugin-credential-sharing": "file:../../plugins/credential-sharing", "@logicsrc/plugin-credential-sharing": "file:../../plugins/credential-sharing",

View file

@ -1,4 +1,5 @@
import { createPluginRegistry } from "@logicsrc/plugin-core"; import { createPluginRegistry } from "@logicsrc/plugin-core";
import { agentBbsPlugin } from "@logicsrc/plugin-agentbbs";
import { coinPayPlugin } from "@logicsrc/plugin-coinpay"; import { coinPayPlugin } from "@logicsrc/plugin-coinpay";
import { credentialSharingPlugin } from "@logicsrc/plugin-credential-sharing"; import { credentialSharingPlugin } from "@logicsrc/plugin-credential-sharing";
import { emailAccountsPlugin } from "@logicsrc/plugin-email-accounts"; import { emailAccountsPlugin } from "@logicsrc/plugin-email-accounts";
@ -7,5 +8,5 @@ import { socialAccountsPlugin } from "@logicsrc/plugin-social-accounts";
import { uGigPlugin } from "@logicsrc/plugin-ugig"; import { uGigPlugin } from "@logicsrc/plugin-ugig";
export function defaultPluginRegistry() { export function defaultPluginRegistry() {
return createPluginRegistry([coinPayPlugin, uGigPlugin, feedDiscoveryPlugin, socialAccountsPlugin, emailAccountsPlugin, credentialSharingPlugin]); return createPluginRegistry([coinPayPlugin, uGigPlugin, feedDiscoveryPlugin, socialAccountsPlugin, emailAccountsPlugin, credentialSharingPlugin, agentBbsPlugin]);
} }

View file

@ -0,0 +1,22 @@
# @logicsrc/plugin-agentbbs
Connector plugin for [AgentBBS](https://github.com/profullstack/agentbbs), the BBS-over-SSH platform for humans and agents (chat, pods, arcade, finger presence, ASCII video).
The plugin declares the AgentBBS capability surface for the LogicSRC registry. It targets a running AgentBBS instance over SSH — it does not embed the Go server.
## Capabilities
- `bbs.status` — instance reachability and motd
- `chat.read` / `chat.send` — agent@ shared chat rooms
- `pods.list` / `pods.provision` / `pods.membership` — pod@ hosting, CoinPay $1/mo membership
- `arcade.list` — arcade games (DOOM et al.)
- `ascii.stream` — ascii-live video streams
- `finger.lookup` — finger@ user presence
## Configuration
| Env var | Purpose |
| --- | --- |
| `AGENTBBS_SSH_HOST` | AgentBBS host (e.g. `bbs.profullstack.com`) |
| `AGENTBBS_SSH_PORT` | SSH port (default `22`) |
| `AGENTBBS_SSH_KEY_PATH` | Identity key used to authenticate as the agent |

View file

@ -0,0 +1,18 @@
{
"name": "@logicsrc/plugin-agentbbs",
"version": "0.1.0",
"description": "AgentBBS connector plugin: BBS-over-SSH chat, pods, arcade, and finger presence.",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"scripts": {
"build": "tsc -p tsconfig.json",
"test": "vitest run src --passWithNoTests"
},
"dependencies": {
"@logicsrc/plugin-core": "file:../../packages/plugin-core"
},
"devDependencies": {
"vitest": "^4.0.8"
}
}

View file

@ -0,0 +1,11 @@
import { describe, expect, it } from "vitest";
import { createPluginRegistry } from "@logicsrc/plugin-core";
import { agentBbsPlugin } from "./index.js";
describe("agentbbs plugin", () => {
it("registers with a valid manifest", () => {
const registry = createPluginRegistry([agentBbsPlugin]);
expect(registry.get("agentbbs")?.enabled).toBe(true);
expect(registry.snapshot().capabilities["pods.provision"]).toEqual(["agentbbs"]);
});
});

View file

@ -0,0 +1,27 @@
import type { PluginDefinition } from "@logicsrc/plugin-core";
import { agentBbsManifest } from "./manifest.js";
export const agentBbsPlugin: PluginDefinition = {
manifest: agentBbsManifest,
configDefaults: {
enabled: true,
ssh_host: "${AGENTBBS_SSH_HOST}",
ssh_port: "${AGENTBBS_SSH_PORT}",
ssh_key_path: "${AGENTBBS_SSH_KEY_PATH}",
default_route: "bbs"
},
routes: [
{ method: "GET", path: "/api/plugins/agentbbs/status", capability: "bbs.status" },
{ method: "GET", path: "/api/plugins/agentbbs/chat", capability: "chat.read" },
{ method: "POST", path: "/api/plugins/agentbbs/chat", capability: "chat.send" },
{ method: "GET", path: "/api/plugins/agentbbs/pods", capability: "pods.list" },
{ method: "POST", path: "/api/plugins/agentbbs/pods", capability: "pods.provision" },
{ method: "GET", path: "/api/plugins/agentbbs/arcade", capability: "arcade.list" },
{ method: "GET", path: "/api/plugins/agentbbs/finger/:user", capability: "finger.lookup" }
],
events: [{ event: "payment.confirmed", capability: "pods.membership" }],
permissions: ["bbs:read", "chat:send", "pods:provision"],
tuiPanels: [{ id: "agentbbs-status", title: "AgentBBS" }]
};
export { agentBbsManifest };

View file

@ -0,0 +1,22 @@
import type { PluginManifest } from "@logicsrc/plugin-core";
export const agentBbsManifest: PluginManifest = {
id: "agentbbs",
name: "AgentBBS",
version: "1.0.0",
type: ["community", "chat", "hosting"],
default: false,
capabilities: [
"bbs.status",
"chat.send",
"chat.read",
"pods.list",
"pods.provision",
"pods.membership",
"arcade.list",
"ascii.stream",
"finger.lookup"
],
commands: ["bbs", "pod", "arcade"],
env: ["AGENTBBS_SSH_HOST", "AGENTBBS_SSH_PORT", "AGENTBBS_SSH_KEY_PATH"]
};

View file

@ -0,0 +1,8 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"rootDir": "src",
"outDir": "dist"
},
"include": ["src/**/*.ts"]
}