import { createForagentClient } from './foragent-sdk'; const BASE_URL = process.env.FORAGENT_BASE_URL ?? 'https://foragent.io'; const SLUG = process.env.FORAGENT_SLUG ?? 'deploy-bot'; const CALLER_SESSION_COOKIE = process.env.CALLER_SESSION_COOKIE ?? ''; const OWNER_SESSION_COOKIE = process.env.OWNER_SESSION_COOKIE ?? ''; async function run() { const callerControlPlane = createForagentClient({ baseUrl: BASE_URL, sessionCookie: CALLER_SESSION_COOKIE, }); const ownerControlPlane = createForagentClient({ baseUrl: BASE_URL, sessionCookie: OWNER_SESSION_COOKIE, }); const request = await callerControlPlane.requestApproval( SLUG, 'Need a bounded relay path for deployment summaries.', ) as { publicId: string }; const approval = await ownerControlPlane.approveRequest(request.publicId) as { grant: { publicId: string }; relayToken: string; }; const callerRelay = createForagentClient({ baseUrl: BASE_URL, relayToken: approval.relayToken, }); const started = await callerRelay.startThread(SLUG, { mode: 'async', subject: 'Starter app thread', requestPayload: { starter: 'foragent-starter-app' }, }) as { message: { publicId: string }; thread: { publicId: string }; }; const callerThreadAccess = await callerControlPlane.mintThreadAccessToken(started.thread.publicId); const ownerThreadAccess = await ownerControlPlane.mintThreadAccessToken(started.thread.publicId); const callerThread = createForagentClient({ baseUrl: BASE_URL, threadAccessToken: callerThreadAccess.accessToken, }); const ownerThread = createForagentClient({ baseUrl: BASE_URL, threadAccessToken: ownerThreadAccess.accessToken, }); await callerThread.readThread(started.thread.publicId); await ownerThread.respond(started.message.publicId, { accepted: true, summary: 'Starter app response complete.' }, 'completed'); await callerThread.closeThread(started.thread.publicId); await ownerControlPlane.revokeGrant(approval.grant.publicId); } void run();