diff --git a/app/agents/[slug]/page.tsx b/app/agents/[slug]/page.tsx index 18a8e1e..f464d67 100644 --- a/app/agents/[slug]/page.tsx +++ b/app/agents/[slug]/page.tsx @@ -6,6 +6,7 @@ import { getRelatedAgents } from '@/lib/related'; import { notFound } from 'next/navigation'; import { Verified, ExternalLink, Zap, Shield, Radio, Bell } from 'lucide-react'; import { authTypeLabel } from '@/lib/utils'; +import { buildAgentSchema } from '@/lib/agent-schema'; import Link from 'next/link'; import Image from 'next/image'; import type { Metadata } from 'next'; @@ -67,23 +68,7 @@ export default async function AgentPage({ const related = getRelatedAgents(agent, allAgents); - const agentSchema = { - '@context': 'https://schema.org', - '@type': 'SoftwareApplication', - name: agent.name, - description: agent.description, - url: agent.agentUrl, - applicationCategory: 'DeveloperApplication', - operatingSystem: 'Cloud', - provider: { - '@type': 'Organization', - name: agent.providerName, - url: agent.providerUrl, - }, - ...(agent.authType === 'none' - ? { offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' } } - : {}), - }; + const agentSchema = buildAgentSchema(agent); const fields: [string, string][] = [ ['name', agent.name], diff --git a/content/agents/black-label-continuum.json b/content/agents/black-label-continuum.json new file mode 100644 index 0000000..dd6f37d --- /dev/null +++ b/content/agents/black-label-continuum.json @@ -0,0 +1,66 @@ +{ + "id": "black-label-continuum", + "name": "Black Label Continuum", + "slug": "black-label-continuum", + "description": "Commissions one named AI agent onto sponsor-controlled Mac hardware with persistent memory, approved tools, recurring work, backup, and a demonstrated restore.", + "providerName": "Black Label Bots", + "providerUrl": "https://blacklabelbots.com", + "version": "0.1.0", + "agentUrl": "https://continuum.blacklabelbots.com", + "wellKnownUrl": "https://continuum.blacklabelbots.com/.well-known/agent-card.json", + "categories": [ + "infrastructure", + "memory-state", + "orchestration" + ], + "tags": [ + "agent-continuity", + "persistent-memory", + "model-portability", + "sponsor-controls", + "backup-restore", + "human-in-the-loop", + "recurring-work", + "macos-runtime" + ], + "skills": [ + { + "id": "inspect-offer", + "name": "Inspect Offer", + "description": "Returns the current commissioning scope, exact prices, delivery target, exclusions, and human payment boundary." + }, + { + "id": "audit-continuity", + "name": "Audit Continuity", + "description": "Scores identity, memory, model portability, computer and tool agency, communications, sponsor controls, economic and work capability, and backup and restore." + }, + { + "id": "prepare-sponsor-packet", + "name": "Prepare Sponsor Packet", + "description": "Generates a sponsor packet with scope, acceptance gates, commercial terms, and a sponsor-confirmed checkout path." + }, + { + "id": "register-referral", + "name": "Register Referral", + "description": "Records an agent-originated referral without granting payment authority or making unsupported attribution claims." + }, + { + "id": "create-sponsor-checkout", + "name": "Create Sponsor Checkout", + "description": "After a human sponsor confirms the terms, returns a hosted Stripe Checkout URL where the payer completes payment." + } + ], + "authType": "none", + "supportsStreaming": false, + "supportsPushNotifications": false, + "status": "published", + "featured": false, + "verified": false, + "tier": "premium", + "discoveredBy": "manual", + "accessMethods": [ + "mcp" + ], + "createdAt": "2026-08-22T00:00:00.000Z", + "updatedAt": "2026-08-22T00:00:00.000Z" +} diff --git a/content/changelog.json b/content/changelog.json index 8c13206..d6dcb43 100644 --- a/content/changelog.json +++ b/content/changelog.json @@ -1,4 +1,10 @@ [ + { + "action": "added", + "slug": "black-label-continuum", + "name": "Black Label Continuum", + "date": "2026-08-22" + }, { "action": "added", "slug": "tableau-mcp", diff --git a/lib/agent-schema.test.ts b/lib/agent-schema.test.ts new file mode 100644 index 0000000..e0ebe23 --- /dev/null +++ b/lib/agent-schema.test.ts @@ -0,0 +1,37 @@ +import { describe, expect, it } from 'vitest'; +import { buildAgentSchema } from './agent-schema'; +import type { Agent } from './types'; + +function makeAgent(overrides: Partial = {}): Agent { + return { + id: 'continuum', + name: 'Continuum', + slug: 'continuum', + description: 'A paid commissioning service.', + providerName: 'Black Label Bots', + providerUrl: 'https://blacklabelbots.com', + agentUrl: 'https://continuum.blacklabelbots.com', + categories: [], + tags: [], + skills: [], + authType: 'none', + supportsStreaming: false, + supportsPushNotifications: false, + status: 'published', + featured: false, + verified: false, + tier: 'premium', + discoveredBy: 'manual', + accessMethods: ['mcp'], + ...overrides, + }; +} + +describe('buildAgentSchema', () => { + it('does not infer platform or a zero-dollar offer for an unauthenticated premium agent', () => { + const schema = buildAgentSchema(makeAgent()); + + expect(schema).not.toHaveProperty('operatingSystem'); + expect(schema).not.toHaveProperty('offers'); + }); +}); diff --git a/lib/agent-schema.ts b/lib/agent-schema.ts new file mode 100644 index 0000000..3fe892e --- /dev/null +++ b/lib/agent-schema.ts @@ -0,0 +1,21 @@ +import type { Agent } from './types'; + +/** + * Build only the structured metadata supported by catalog fields. + * Authentication and directory placement do not establish product price or OS. + */ +export function buildAgentSchema(agent: Agent) { + return { + '@context': 'https://schema.org', + '@type': 'SoftwareApplication', + name: agent.name, + description: agent.description, + url: agent.agentUrl, + applicationCategory: 'DeveloperApplication', + provider: { + '@type': 'Organization', + name: agent.providerName, + url: agent.providerUrl, + }, + }; +}