← back to Norma

agents/onboard-agent/server.js

85 lines

/**
 * Norma OnBoard Agent -- Port 9808
 *
 * Discovers non-profit organizations matching trending pulse topics,
 * matches them with foundations, and helps onboard them as partners.
 *
 * Skills: discover, post, reply (foundation-matcher), monitor, report
 */

const { createAgentServer } = require('../shared/agent-base');

// Import skills
const discover = require('./skills/discover');
const post = require('./skills/post');
const reply = require('./skills/reply');
const monitor = require('./skills/monitor');
const report = require('./skills/report');

const PORT = parseInt(process.env.PORT, 10) || 9808;
const AGENT_NAME = 'onboard-agent';

const { app, start, scheduler } = createAgentServer({
  name: AGENT_NAME,
  port: PORT,
  skills: {
    discover,
    post,
    reply,
    monitor,
    report,
  },
  cronJobs: [
    {
      name: 'discover-orgs',
      schedule: '15 */3 * * *', // every 3 hours at :15
      fn: async () => {
        console.log(`[${AGENT_NAME}] Cron: discovering orgs from trending topics...`);
        try {
          const result = await discover({ limit: 10, skip_ai: false });
          console.log(
            `[${AGENT_NAME}] Cron discover complete: ${result.topics_searched} topics, ` +
            `${result.orgs_found} orgs found, ${result.new_discoveries} new discoveries`
          );
        } catch (err) {
          console.error(`[${AGENT_NAME}] Cron discover error:`, err.message);
        }
      },
    },
    {
      name: 'match-foundations',
      schedule: '45 */6 * * *', // every 6 hours at :45
      fn: async () => {
        console.log(`[${AGENT_NAME}] Cron: matching foundations to discoveries...`);
        try {
          const result = await reply({ limit: 20 });
          console.log(
            `[${AGENT_NAME}] Cron match complete: ${result.matched} matched, ` +
            `${result.links_created} links created`
          );
        } catch (err) {
          console.error(`[${AGENT_NAME}] Cron match error:`, err.message);
        }
      },
    },
    {
      name: 'monitor-pulse',
      schedule: '*/30 * * * *', // every 30 minutes
      fn: async () => {
        console.log(`[${AGENT_NAME}] Cron: monitoring pulse for new topics...`);
        try {
          const result = await monitor({ minutes_back: 30 });
          console.log(
            `[${AGENT_NAME}] Cron monitor complete: ${result.new_topics} new topics, ` +
            `${result.triggered_discoveries} triggered discoveries`
          );
        } catch (err) {
          console.error(`[${AGENT_NAME}] Cron monitor error:`, err.message);
        }
      },
    },
  ],
});

start();