eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
15 lines (13 loc) • 4.14 kB
JavaScript
import{defineSetupIntegration}from"../types.js";import{provisionLinqConnector}from"./connect.js";import{listLinqPhoneNumbers}from"./management.js";import{join}from"node:path";import{deriveSlackConnectorSlug}from"#setup/scaffold/index.js";import{writeTextFile}from"#setup/scaffold/files.js";import{select,text}from"#setup/ask.js";import{appendEnv}from"#setup/append-env.js";const defaultDeps={listPhoneNumbers:listLinqPhoneNumbers};function connectTemplate(e){return`import { connectLinqCredentials } from "@vercel/connect/eve";
import { linqChannel } from "eve/channels/linq";
export default linqChannel({
credentials: connectLinqCredentials(${JSON.stringify(e)}),
});
`}async function prepareLinqSetup(e,t=defaultDeps){let n=await e.asker.ask(select({key:`linq-credentials`,message:`How would you like to configure Linq?`,options:[{id:`connect`,value:`connect`,label:`Set up Vercel Connect`,hint:`Provision a managed Linq line`},{id:`portable`,value:`portable`,label:`Use portable credentials`,hint:`Register the webhook in Linq`}],recommended:e.environment.vercel.kind===`available`?`connect`:`portable`,required:!0}));if(n===`connect`){if(e.environment.vercel.kind===`unavailable`)throw Error("Vercel Connect requires an authenticated Vercel CLI. Run `vercel login`, then retry Linq setup.");let r=await e.resolveVercelProject(`Linq`),i=await e.asker.ask(text({key:`linq-connector-name`,message:`Name your Linq agent`,recommended:await deriveSlackConnectorSlug(e.appRoot),required:!0}));if(await e.asker.ask(select({key:`linq-account`,message:`Which Linq account would you like to use?`,options:[{id:`new`,value:`new`,label:`Create a new Linq account`,hint:`Provision a new managed Linq line`},{id:`existing`,value:`existing`,label:`Use an existing Linq account`,hint:`Connect a Linq partner API token and select agent phone numbers`}],recommended:`new`,required:!0}))===`new`)return{credentials:n,connectorSlug:i.trim(),project:r};let a=await e.asker.ask(text({key:`linq-existing-api-token`,message:`Linq partner API token`,required:!0,sensitive:!0,environment:`LINQ_API_KEY`})),o=await t.listPhoneNumbers(a.trim(),e.signal),s=await e.asker.askMany({key:`linq-existing-phone-numbers`,message:`Choose your agent's phone numbers`,options:o.map(e=>({id:e,value:e,label:e})),detected:o,requireSelection:!0,required:!0});return{credentials:n,connectorSlug:i.trim(),existingAccount:{apiToken:a.trim(),phoneNumbers:s},project:r}}let r=await e.asker.ask(text({key:`linq-api-key`,message:`Linq API key`,required:!0,sensitive:!0,environment:`LINQ_API_KEY`})),i=await e.asker.ask(text({key:`linq-signing-secret`,message:`Linq webhook signing secret`,required:!0,sensitive:!0,environment:`LINQ_WEBHOOK_SECRET`}));return{credentials:n,apiKey:r.trim(),signingSecret:i.trim()}}async function applyLinqSetup(e,t){let n=join(t.appRoot,`agent/channels/linq.ts`),r;if(e.credentials===`connect`){let i={log:t.presenter.log,project:e.project,projectRoot:t.projectRoot,slug:e.connectorSlug,signal:t.signal};e.existingAccount!==void 0&&(i.existingAccount=e.existingAccount);let a=await provisionLinqConnector(i);r=a.phoneNumber,await writeTextFile(n,connectTemplate(a.uid),{force:t.force}),r!==void 0&&t.presenter.note(r,`Text your agent`,{tone:`success`})}else await appendEnv(join(t.projectRoot,`.env.local`),{LINQ_API_KEY:e.apiKey,LINQ_WEBHOOK_SECRET:e.signingSecret}),await writeTextFile(n,`import { linqChannel } from "eve/channels/linq";
export default linqChannel({
credentials: {
apiKey: process.env.LINQ_API_KEY!,
signingSecret: process.env.LINQ_WEBHOOK_SECRET!,
},
});
`,{force:t.force}),t.presenter.nextSteps([`Deploy the agent, then create a Linq webhook subscription for https://<your-host>/eve/v1/linq with message.received, reaction.added, and reaction.removed events.`]);return t.presenter.log.success(`Scaffolded channel: linq`),{facts:r===void 0?[]:[{label:`Agent phone number`,value:r,kind:`phone`}],deploymentRequired:!0}}const LINQ_SETUP=defineSetupIntegration({kind:`linq`,label:`Linq`,hint:`iMessage and SMS through Linq`,prepare:prepareLinqSetup,apply:applyLinqSetup});export{LINQ_SETUP,applyLinqSetup,prepareLinqSetup};