File size: 3,178 Bytes
720c6ed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import process from 'node:process';

export const TEMPLATE_AGENT_ID = 'sin-code-database';
export const TEMPLATE_AGENT_NAME = 'SIN-Code-Database';
export const TEMPLATE_AGENT_NAMESPACE = 'sin.code.database';
export const TEMPLATE_AGENT_DESCRIPTION = 'Elite 2026 Database Architect. Writes optimal SQL schemas, Row Level Security (RLS) policies, Postgres Edge Functions, vector embedding tables, and migration files for Supabase-native projects.';
export const TEMPLATE_AGENT_VERSION = '2026.03.09';
export const TEMPLATE_AGENT_DEFAULT_HOST = '127.0.0.1';
export const TEMPLATE_AGENT_DEFAULT_PORT = Number(process.env.PORT || 8000);
export const TEMPLATE_AGENT_EXECUTOR_CONTRACT = 'services/workers/hf_executor_contract.json';
export const TEMPLATE_AGENT_CAPABILITY_REGISTRY = 'control_plane.capabilities';

export const TEMPLATE_AGENT_SKILLS = [
  {
    id: 'sin.code.database.health',
    name: 'Health',
    description: 'Check base agent readiness and identity.',
  },
  {
    id: 'sin.code.database.onboarding.status',
    name: 'Onboarding Status',
    description: 'Read persisted onboarding state.',
  },
  {
    id: 'sin.code.database.onboarding.save',
    name: 'Onboarding Save',
    description: 'Persist onboarding defaults for future autonomous runs.',
  },
  {
    id: 'sin.code.database.room13.claim',
    name: 'Room-13 Claim',
    description: 'Register worker and claim next task from Room-13 coordinator.',
  },
] as const;

export function resolveTemplateAgentConfig() {
  const host =
    process.env.SIN_CODE_DATABASE_HOST?.trim() ||
    (process.env.PORT ? '0.0.0.0' : process.env.HOST?.trim() || TEMPLATE_AGENT_DEFAULT_HOST);
  const port = parseInteger(process.env.SIN_CODE_DATABASE_PORT, parseInteger(process.env.PORT, TEMPLATE_AGENT_DEFAULT_PORT));
  const fallbackPublicHost = host === '0.0.0.0' ? '127.0.0.1' : host;
  const publicBaseUrl =
    process.env.SIN_CODE_DATABASE_PUBLIC_BASE_URL?.trim() ||
    (process.env.SPACE_HOST?.trim() ? `https://${process.env.SPACE_HOST.trim()}` : `http://${fallbackPublicHost}:${port}`);
  return { host, port, publicBaseUrl: publicBaseUrl.replace(/\/+$/, '') };
}

export function buildAgentCard(baseUrl: string) {
  const normalizedBaseUrl = baseUrl.replace(/\/+$/, '');
  const rpcUrl = `${normalizedBaseUrl}/a2a/v1`;
  return {
    name: TEMPLATE_AGENT_NAME,
    description: TEMPLATE_AGENT_DESCRIPTION,
    version: TEMPLATE_AGENT_VERSION,
    documentationUrl: normalizedBaseUrl,
    url: rpcUrl,
    capabilities: { streaming: false, pushNotifications: false },
    defaultInputModes: ['text/plain', 'application/json'],
    defaultOutputModes: ['text/plain', 'application/json'],
    metadata: {
      projectionMode: 'control-plane-first',
      capabilityRegistry: TEMPLATE_AGENT_CAPABILITY_REGISTRY,
      executorContract: TEMPLATE_AGENT_EXECUTOR_CONTRACT,
    },
    skills: [...TEMPLATE_AGENT_SKILLS],
    supportedInterfaces: [{ url: rpcUrl, protocolBinding: 'JSONRPC', protocolVersion: '1.0' }],
  };
}

function parseInteger(input: string | undefined, fallback: number) {
  const parsed = Number.parseInt(String(input || '').trim(), 10);
  return Number.isFinite(parsed) ? parsed : fallback;
}