@ekanos/cli 0.14.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -4
- package/dist/auth/ekanos-api.d.ts +23 -0
- package/dist/auth/ekanos-api.js +33 -6
- package/dist/auth/ekanos-api.js.map +1 -1
- package/dist/commands/agents.d.ts +2 -2
- package/dist/commands/agents.js +14 -20
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/apps.d.ts +11 -3
- package/dist/commands/apps.js +86 -28
- package/dist/commands/apps.js.map +1 -1
- package/dist/commands/catalog.d.ts +4 -2
- package/dist/commands/catalog.js +166 -35
- package/dist/commands/catalog.js.map +1 -1
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.js +17 -0
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/runs.d.ts +7 -3
- package/dist/commands/runs.js +24 -6
- package/dist/commands/runs.js.map +1 -1
- package/dist/commands/scope-notice.d.ts +7 -0
- package/dist/commands/scope-notice.js +4 -11
- package/dist/commands/scope-notice.js.map +1 -1
- package/dist/commands/sources-roles.d.ts +5 -0
- package/dist/commands/sources-roles.js +235 -0
- package/dist/commands/sources-roles.js.map +1 -0
- package/dist/commands/sources.d.ts +5 -0
- package/dist/commands/sources.js +6 -1
- package/dist/commands/sources.js.map +1 -1
- package/dist/commands/team-agent-readiness.d.ts +23 -17
- package/dist/commands/team-agent-readiness.js +57 -90
- package/dist/commands/team-agent-readiness.js.map +1 -1
- package/dist/commands/team-agents-agents.d.ts +8 -5
- package/dist/commands/team-agents-agents.js +173 -58
- package/dist/commands/team-agents-agents.js.map +1 -1
- package/dist/commands/team-agents-define.d.ts +31 -0
- package/dist/commands/team-agents-define.js +176 -0
- package/dist/commands/team-agents-define.js.map +1 -0
- package/dist/commands/team-agents-mcp.js +112 -10
- package/dist/commands/team-agents-mcp.js.map +1 -1
- package/dist/commands/team-agents-triggers.d.ts +1 -1
- package/dist/commands/team-agents-triggers.js +137 -5
- package/dist/commands/team-agents-triggers.js.map +1 -1
- package/dist/commands/team-agents.d.ts +4 -1
- package/dist/commands/team-agents.js +17 -4
- package/dist/commands/team-agents.js.map +1 -1
- package/dist/commands/team-llm-key.d.ts +14 -0
- package/dist/commands/team-llm-key.js +122 -0
- package/dist/commands/team-llm-key.js.map +1 -0
- package/dist/commands/teams-connect.js +123 -31
- package/dist/commands/teams-connect.js.map +1 -1
- package/dist/commands/teams-lifecycle.d.ts +90 -0
- package/dist/commands/teams-lifecycle.js +457 -0
- package/dist/commands/teams-lifecycle.js.map +1 -0
- package/dist/commands/teams-onboard.d.ts +14 -0
- package/dist/commands/teams-onboard.js +62 -13
- package/dist/commands/teams-onboard.js.map +1 -1
- package/dist/commands/teams-overview.js +7 -3
- package/dist/commands/teams-overview.js.map +1 -1
- package/dist/commands/teams.d.ts +25 -5
- package/dist/commands/teams.js +101 -39
- package/dist/commands/teams.js.map +1 -1
- package/dist/commands/workflows.d.ts +37 -0
- package/dist/commands/workflows.js +589 -0
- package/dist/commands/workflows.js.map +1 -0
- package/dist/connect-fields.d.ts +22 -0
- package/dist/connect-fields.js +115 -0
- package/dist/connect-fields.js.map +1 -0
- package/dist/context.d.ts +12 -0
- package/dist/context.js +32 -9
- package/dist/context.js.map +1 -1
- package/dist/index.d.ts +13 -0
- package/dist/index.js +367 -133
- package/dist/index.js.map +1 -1
- package/dist/invocation.d.ts +31 -0
- package/dist/invocation.js +58 -0
- package/dist/invocation.js.map +1 -0
- package/dist/runs-api.js +8 -3
- package/dist/runs-api.js.map +1 -1
- package/dist/safe-fs.d.ts +18 -0
- package/dist/safe-fs.js +57 -0
- package/dist/safe-fs.js.map +1 -1
- package/dist/secret-form.d.ts +48 -0
- package/dist/secret-form.js +212 -0
- package/dist/secret-form.js.map +1 -0
- package/dist/secret-input.d.ts +96 -0
- package/dist/secret-input.js +299 -0
- package/dist/secret-input.js.map +1 -0
- package/dist/team-connect-api.d.ts +78 -3
- package/dist/team-connect-api.js +17 -2
- package/dist/team-connect-api.js.map +1 -1
- package/dist/team-lifecycle-api.d.ts +435 -0
- package/dist/team-lifecycle-api.js +301 -0
- package/dist/team-lifecycle-api.js.map +1 -0
- package/dist/teams-api.d.ts +13 -1
- package/dist/teams-api.js +90 -31
- package/dist/teams-api.js.map +1 -1
- package/dist/unknown-command.d.ts +18 -0
- package/dist/unknown-command.js +50 -0
- package/dist/unknown-command.js.map +1 -0
- package/dist/workflows-api.d.ts +69 -0
- package/dist/workflows-api.js +182 -0
- package/dist/workflows-api.js.map +1 -0
- package/package.json +3 -3
- package/templates/AGENTS.md.tmpl +6 -4
- package/templates/claude-skill.md.tmpl +4 -1
- package/templates/package.json.tmpl +4 -4
- package/templates/skills/build-agent/SKILL.md +56 -22
- package/templates/skills/build-agent/references/agent-json.md +4 -1
- package/templates/skills/build-agent/references/app-setup.md +14 -7
- package/templates/skills/build-agent/references/rollout.md +40 -20
- package/templates/skills/build-agent/references/set-up-an-integration.md +46 -29
- package/templates/skills/build-agent/references/triggers.md +4 -3
- package/templates/skills/build-integration/references/widget-design.md +1 -1
- package/templates/skills/ekanos-platform/SKILL.md +77 -23
- package/templates/skills/polish-widgets/references/patterns.md +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-agents-triggers.js","sourceRoot":"","sources":["../../src/commands/team-agents-triggers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type TeamAgentLink,\n type TeamAgentLinkAddRequest,\n TeamAgentLinkAddResultSchema,\n TeamAgentLinkListSchema,\n TeamAgentRowRemoveResultSchema,\n type TeamAgentTrigger,\n type TeamAgentTriggerAddRequest,\n TeamAgentTriggerAddResultSchema,\n TeamAgentTriggerListSchema,\n} from '@ekanos/integration-schema';\nimport type { z } from 'zod';\n\nimport type { CliContext } from '../context';\nimport { invalidStateError, usageError } from '../errors';\nimport type { ExitCode } from '../exit-codes';\nimport { ensureSecretsDir, writeSecretFile } from '../secret-file';\nimport { call } from '../teams-api';\nimport { parseFilters } from './agents-edit';\nimport { type TeamAgentRun, requireOperand, usageFor } from './team-agents';\n\n/**\n * `ekanos teams triggers list|add|remove` and `ekanos teams links\n * list|add|remove` — a team agent's triggers and outgoing links, set up by\n * the Source admin. When the template keeps an area, the host shows the\n * effective rows and refuses changes with the command that hands the area\n * to the team.\n */\n\nexport async function runTeamTriggers(\n ctx: CliContext,\n run: TeamAgentRun,\n): Promise<ExitCode> {\n const team = requireOperand(run.operands[0], 'team slug', 'triggers');\n const key = requireOperand(run.operands[1], 'agent key', 'triggers');\n const base = agentPath(team, key);\n\n switch (run.verb) {\n case 'list': {\n noExtra(run.operands, 2, 'triggers');\n const list = await send(\n run,\n TeamAgentTriggerListSchema,\n 'GET',\n `${base}/triggers`,\n );\n return ctx.succeed(\n { host: run.host, ...list },\n ctx.ui.result({\n title:\n list.triggers.length === 0\n ? `${list.agent.slug} on ${list.team.slug} has no triggers`\n : `Triggers of ${list.agent.slug} on ${list.team.slug}`,\n tone: list.triggers.length === 0 ? 'warn' : 'ok',\n rows: list.triggers.map((trigger) => [\n trigger.id,\n describeTrigger(trigger),\n ]),\n notes: [\n ...(list.teamOwned\n ? [\n '\"ekanos teams triggers add <team> <key> manual|schedule|webhook|event …\" adds one.',\n ]\n : [\n `These follow the template. To let the team change them: ekanos agents overrides ${key} enable triggers`,\n ]),\n ...(list.triggers.some(\n (trigger) =>\n trigger.type === 'webhook' && trigger.secretSet === false,\n )\n ? [\n `A webhook trigger with no token yet gets its URL and token from \"ekanos teams triggers rotate ${team} ${key} <trigger-key|id>\".`,\n ]\n : []),\n ],\n }),\n );\n }\n case 'add': {\n const body = triggerBody(run, team, key);\n // A webhook trigger's token comes back once: have somewhere to put it.\n const secrets =\n body.type === 'webhook' ? ensureSecretsDir(run.args.env) : null;\n const added = await send(\n run,\n TeamAgentTriggerAddResultSchema,\n 'POST',\n `${base}/triggers`,\n body,\n );\n const rows: Array<[string, string]> = [\n ['Trigger', added.trigger.id],\n ['Fires on', describeTrigger(added.trigger)],\n ];\n const { webhook, ...rest } = added;\n const saved = webhook\n ? saveTriggerToken(run, secrets, {\n team: added.team.slug,\n agent: added.agent.slug,\n trigger: added.trigger.key ?? added.trigger.id,\n webhook,\n again: `ekanos teams triggers rotate ${team} ${key} ${added.trigger.key ?? added.trigger.id} --yes`,\n })\n : null;\n if (saved) rows.push(...saved.rows);\n return ctx.succeed(\n { host: run.host, ...rest, webhook: saved?.json ?? null },\n ctx.ui.result({\n title: `Added a ${added.trigger.type} trigger to ${added.agent.slug} on ${added.team.slug}`,\n tone: saved ? 'warn' : 'ok',\n rows,\n notes: saved ? saved.notes : [],\n }),\n );\n }\n case 'remove': {\n const ref = run.operands[2]?.trim();\n if (!ref) {\n throw usageError(\n 'Name the trigger to remove, by its id or key.',\n `List them: ekanos teams triggers list ${team} ${key}`,\n );\n }\n noExtra(run.operands, 3, 'triggers');\n if (!run.args.yes) {\n throw invalidStateError(\n `Removing trigger ${ref} from ${key} on ${team} stops it starting runs; a webhook trigger's URL stops working for good (adding it again makes a new one).`,\n `Re-run with --yes: ekanos teams triggers remove ${team} ${key} ${ref} --yes`,\n );\n }\n const id = UUID.test(ref)\n ? ref\n : await triggerIdByKey(run, team, key, ref);\n const removed = await send(\n run,\n TeamAgentRowRemoveResultSchema,\n 'DELETE',\n `${base}/triggers/${encodeURIComponent(id)}`,\n );\n return ctx.succeed(\n { host: run.host, ...removed },\n ctx.ui.result({\n title: `Removed trigger ${removed.removed} from ${removed.agent.slug}`,\n }),\n );\n }\n case 'rotate':\n return rotateSecret(ctx, run, team, key);\n default:\n throw usageError(\n `Unknown teams triggers subcommand \"${run.verb}\".`,\n usageFor('triggers'),\n );\n }\n}\n\nexport async function runTeamLinks(\n ctx: CliContext,\n run: TeamAgentRun,\n): Promise<ExitCode> {\n const team = requireOperand(run.operands[0], 'team slug', 'links');\n const from = requireOperand(run.operands[1], 'agent key', 'links');\n const base = agentPath(team, from);\n\n switch (run.verb) {\n case 'list': {\n noExtra(run.operands, 2, 'links');\n const list = await send(\n run,\n TeamAgentLinkListSchema,\n 'GET',\n `${base}/links`,\n );\n return ctx.succeed(\n { host: run.host, ...list },\n ctx.ui.result({\n title:\n list.links.length === 0\n ? `${list.agent.slug} on ${list.team.slug} has no links`\n : `Links from ${list.agent.slug} on ${list.team.slug}`,\n tone: list.links.length === 0 ? 'warn' : 'ok',\n rows: list.links.map((link) => [link.id, describeLink(link)]),\n notes: list.teamOwned\n ? []\n : [\n `These follow the template. To let the team change them: ekanos agents overrides ${from} enable links`,\n ],\n }),\n );\n }\n case 'add': {\n const to = requireOperand(\n run.operands[2],\n 'agent key to link to',\n 'links',\n );\n noExtra(run.operands, 3, 'links');\n const kind = flag(run, 'kind');\n if (kind !== 'talk' && kind !== 'delegate') {\n throw usageError(\n 'Say what kind of link: --kind talk|delegate.',\n usageFor('links'),\n );\n }\n const mode = flag(run, 'mode');\n if (mode !== undefined && mode !== 'await' && mode !== 'handoff') {\n throw usageError('--mode is await or handoff.', usageFor('links'));\n }\n if (mode !== undefined && kind === 'talk') {\n throw usageError(\n 'Only a delegate link takes --mode.',\n usageFor('links'),\n );\n }\n const body: TeamAgentLinkAddRequest = {\n to,\n kind,\n ...(mode ? { mode } : {}),\n };\n const added = await send(\n run,\n TeamAgentLinkAddResultSchema,\n 'POST',\n `${base}/links`,\n body,\n );\n return ctx.succeed(\n { host: run.host, ...added },\n ctx.ui.result({\n title: `Linked ${added.agent.slug} → ${added.link.to.slug} on ${added.team.slug}`,\n rows: [\n ['Link', added.link.id],\n ['Kind', describeLink(added.link)],\n ],\n }),\n );\n }\n case 'remove': {\n const ref = run.operands[2]?.trim();\n if (!ref) {\n throw usageError(\n 'Name the link to remove, by its id or the key of the agent it goes to.',\n `List them: ekanos teams links list ${team} ${from}`,\n );\n }\n noExtra(run.operands, 3, 'links');\n if (!run.args.yes) {\n throw invalidStateError(\n `Removing link ${ref} from ${from} on ${team} means ${from} can no longer reach that agent.`,\n `Re-run with --yes: ekanos teams links remove ${team} ${from} ${ref} --yes`,\n );\n }\n const id = UUID.test(ref)\n ? ref\n : await linkIdByTarget(run, team, from, ref);\n const removed = await send(\n run,\n TeamAgentRowRemoveResultSchema,\n 'DELETE',\n `${base}/links/${encodeURIComponent(id)}`,\n );\n return ctx.succeed(\n { host: run.host, ...removed },\n ctx.ui.result({\n title: `Removed link ${removed.removed} from ${removed.agent.slug}`,\n }),\n );\n }\n default:\n throw usageError(\n `Unknown teams links subcommand \"${run.verb}\".`,\n usageFor('links'),\n );\n }\n}\n\n/**\n * `triggers rotate <team> <key> <trigger-key|id>`: a webhook trigger's new\n * bearer token, the old one revoked — shown once, as `add` shows it. A\n * template's webhook trigger starts with no token, so this is also how its\n * team gets one. Replacing a live token cuts off whoever sends with it, so\n * that needs `--yes`, as `teams webhook` does.\n */\nasync function rotateSecret(\n ctx: CliContext,\n run: TeamAgentRun,\n team: string,\n key: string,\n): Promise<ExitCode> {\n const ref = run.operands[2]?.trim();\n if (!ref) {\n throw usageError(\n 'Name the webhook trigger, by its key or id.',\n `List them: ekanos teams triggers list ${team} ${key}`,\n );\n }\n noExtra(run.operands, 3, 'triggers');\n\n const base = agentPath(team, key);\n const list = await send(\n run,\n TeamAgentTriggerListSchema,\n 'GET',\n `${base}/triggers`,\n );\n const trigger =\n list.triggers.find((entry) => entry.id === ref) ??\n list.triggers.find((entry) => entry.key === ref.toLowerCase());\n if (!trigger) {\n throw usageError(\n `${list.agent.slug} on ${list.team.slug} has no trigger \"${ref}\".`,\n `List them: ekanos teams triggers list ${team} ${key}`,\n );\n }\n if (trigger.type !== 'webhook') {\n throw usageError(\n `\"${ref}\" is a ${trigger.type} trigger; only a webhook trigger has a token to rotate.`,\n `List them: ekanos teams triggers list ${team} ${key}`,\n );\n }\n if (trigger.secretSet !== false && !run.args.yes) {\n throw invalidStateError(\n `${trigger.key ?? trigger.id} on ${list.team.slug} already has a token. A new one revokes it, and whatever sends to the URL with the old token is refused until it uses the new one.`,\n `Re-run with --yes when you are ready to update the sender: ekanos teams triggers rotate ${team} ${key} ${ref} --yes`,\n );\n }\n\n const secrets = ensureSecretsDir(run.args.env);\n const rotated = await send(\n run,\n TeamAgentTriggerAddResultSchema,\n 'POST',\n `${base}/triggers/${encodeURIComponent(trigger.id)}`,\n { rotate: true },\n );\n const { webhook, ...rest } = rotated;\n const saved = webhook\n ? saveTriggerToken(run, secrets, {\n team: rotated.team.slug,\n agent: rotated.agent.slug,\n trigger: rotated.trigger.key ?? rotated.trigger.id,\n webhook,\n again: `ekanos teams triggers rotate ${team} ${key} ${ref} --yes`,\n })\n : null;\n return ctx.succeed(\n { host: run.host, ...rest, webhook: saved?.json ?? null },\n ctx.ui.result({\n title: `New token for ${rotated.trigger.key ?? rotated.trigger.id} on ${rotated.team.slug}`,\n tone: 'warn',\n rows: saved?.rows ?? [],\n notes: [\n ...(saved?.notes ?? []),\n ...(trigger.secretSet === false\n ? []\n : ['The previous token is revoked.']),\n ],\n }),\n );\n}\n\n/**\n * A webhook trigger's bearer token goes to a 0600 file, never to the output\n * (a terminal, or an agent's context). The URL is not a secret — the trigger\n * id — so it is still printed. JSON carries `{ url, secretFile }`.\n */\nfunction saveTriggerToken(\n run: TeamAgentRun,\n dir: string | null,\n input: {\n team: string;\n agent: string;\n trigger: string;\n webhook: { url: string; token: string };\n again: string;\n },\n) {\n const file = writeSecretFile(dir ?? ensureSecretsDir(run.args.env), {\n owner: input.team,\n what: `${input.agent}-${input.trigger}-trigger-token`,\n purpose: `Bearer token for the webhook trigger ${input.trigger} of agent ${input.agent} on team ${input.team} (source ${run.source}). Send it as \"Authorization: Bearer <token>\" when you POST JSON to ${input.webhook.url}.`,\n values: [\n ['URL', input.webhook.url],\n ['BEARER_TOKEN', input.webhook.token],\n ],\n again: input.again,\n });\n return {\n json: { url: input.webhook.url, secretFile: file },\n rows: [\n ['URL', input.webhook.url],\n ['Bearer token', `saved to ${file} (readable only by you)`],\n ] as Array<[string, string]>,\n notes: [\n 'The token is shown nowhere else and cannot be read again. Copy it from that file into the sender yourself — not into a chat or an agent session — then delete the file. POST JSON to the URL with \"Authorization: Bearer <token>\".',\n ],\n };\n}\n\nfunction triggerBody(\n run: TeamAgentRun,\n team: string,\n key: string,\n): TeamAgentTriggerAddRequest {\n const type = run.operands[2]?.trim().toLowerCase();\n const prompt = flag(run, 'prompt') ?? '';\n switch (type) {\n case 'manual':\n noExtra(run.operands, 3, 'triggers');\n return { type: 'manual', promptTemplate: prompt };\n case 'schedule': {\n noExtra(run.operands, 3, 'triggers');\n const cron = flag(run, 'cron');\n if (!cron || !prompt) {\n throw usageError(\n 'A schedule needs --cron and --prompt.',\n `e.g. ekanos teams triggers add ${team} ${key} schedule --cron \"0 9 * * 1-5\" --timezone America/Los_Angeles --prompt \"Summarize yesterday's tickets\"`,\n );\n }\n return {\n type: 'schedule',\n scheduleCron: cron,\n timezone: flag(run, 'timezone') ?? 'UTC',\n promptTemplate: prompt,\n };\n }\n case 'webhook':\n noExtra(run.operands, 3, 'triggers');\n if (!prompt) {\n throw usageError(\n 'A webhook needs --prompt: what to do with each request.',\n `e.g. ekanos teams triggers add ${team} ${key} webhook --prompt \"Triage this alert: {{body.title}}\"`,\n );\n }\n return { type: 'webhook', promptTemplate: prompt };\n case 'event':\n case 'integration_event': {\n const eventId = run.operands[3]?.trim();\n if (!eventId) {\n throw usageError(\n 'Name the event, e.g. zendesk.ticket_created.',\n `e.g. ekanos teams triggers add ${team} ${key} event zendesk.ticket_created --filter '{\"priority\":[\"urgent\"]}'`,\n );\n }\n noExtra(run.operands, 4, 'triggers');\n return {\n type: 'integration_event',\n eventId,\n filter: parseFilters(filterFlag(run)),\n promptTemplate: prompt,\n };\n }\n case 'slack': {\n noExtra(run.operands, 3, 'triggers');\n const channels = listFlag(run, 'channel');\n const directMessages = run.args.flags?.dms === true;\n if (channels.length === 0 && !directMessages) {\n throw usageError(\n 'A slack trigger answers in channels, direct messages, or both.',\n `e.g. ekanos teams triggers add ${team} ${key} slack --channel '#support' --dms --yes (the bot must be in each channel; \"ekanos teams connect ${team} slack\" installs Slack first)`,\n );\n }\n if (!run.args.yes) {\n throw usageError(\n 'Anyone in those channels, and anyone who messages the bot, can then ask the agent to act with everything it is granted.',\n 'Pass --yes to confirm that audience, as the app asks before it adds the trigger.',\n );\n }\n return {\n type: 'slack',\n channels,\n directMessages,\n promptTemplate: prompt,\n confirmAudience: true,\n };\n }\n case 'linear': {\n noExtra(run.operands, 3, 'triggers');\n const labelNames = listFlag(run, 'label');\n const onMention = run.args.flags?.mention !== false;\n if (!onMention && labelNames.length === 0) {\n throw usageError(\n 'A linear trigger answers @mentions, labelled issues, or both.',\n `e.g. ekanos teams triggers add ${team} ${key} linear --label feedback (\"ekanos teams connect ${team} linear-app\" installs the Ekanos Linear app first). The Linear integration's own events are event triggers: \"ekanos catalog linear --json\" lists them.`,\n );\n }\n return { type: 'linear', onMention, labelNames, promptTemplate: prompt };\n }\n default:\n throw usageError(\n type ? `Unknown trigger type \"${type}\".` : 'Name the trigger type.',\n usageFor('triggers'),\n );\n }\n}\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * A trigger named by key, the name it has in agent.json. Only a template's\n * trigger has one, and it changes at the template, so that is said here\n * with the template-level command rather than left to the host's refusal.\n */\nasync function triggerIdByKey(\n run: TeamAgentRun,\n team: string,\n key: string,\n ref: string,\n): Promise<string> {\n const list = await send(\n run,\n TeamAgentTriggerListSchema,\n 'GET',\n `${agentPath(team, key)}/triggers`,\n );\n const trigger = list.triggers.find(\n (entry) => entry.key === ref.toLowerCase(),\n );\n if (!trigger) {\n throw usageError(\n `${list.agent.slug} on ${list.team.slug} has no trigger \"${ref}\".`,\n `List them: ekanos teams triggers list ${team} ${key}`,\n );\n }\n if (trigger.owner === 'template') {\n throw invalidStateError(\n `Trigger ${ref} comes from the template, so it can only change there.`,\n `Remove it from the template for every team: ekanos agents triggers ${key} remove ${ref}, then publish.`,\n );\n }\n return trigger.id;\n}\n\n/**\n * A link named by the key of the agent it goes to, as the template level\n * names it. Two links to one agent (talk and delegate) need `--kind`.\n */\nasync function linkIdByTarget(\n run: TeamAgentRun,\n team: string,\n from: string,\n to: string,\n): Promise<string> {\n const list = await send(\n run,\n TeamAgentLinkListSchema,\n 'GET',\n `${agentPath(team, from)}/links`,\n );\n const kind = flag(run, 'kind');\n const matches = list.links.filter(\n (link) =>\n link.to.slug === to.toLowerCase() && (!kind || link.kind === kind),\n );\n if (matches.length === 0) {\n throw usageError(\n `${list.agent.slug} on ${list.team.slug} has no link to \"${to}\"${kind ? ` of kind ${kind}` : ''}.`,\n `List them: ekanos teams links list ${team} ${from}`,\n );\n }\n if (matches.length > 1) {\n throw usageError(\n `${list.agent.slug} has more than one link to ${to}.`,\n `Name which with --kind talk|delegate: ekanos teams links remove ${team} ${from} ${to} --kind delegate`,\n );\n }\n return matches[0]!.id;\n}\n\n/** `--filter`, repeatable: `field=value` or a JSON object, as at the template level. */\nfunction filterFlag(run: TeamAgentRun): readonly string[] {\n const value = run.args.flags?.filter;\n if (Array.isArray(value)) return value;\n return typeof value === 'string' ? [value] : [];\n}\n\nfunction describeTrigger(trigger: TeamAgentTrigger): string {\n const what =\n trigger.type === 'schedule'\n ? `schedule ${trigger.scheduleCron ?? ''} (${trigger.timezone ?? 'UTC'})`\n : trigger.type === 'integration_event'\n ? `event ${trigger.eventId ?? ''}${trigger.filter && Object.keys(trigger.filter).length > 0 ? ` ${JSON.stringify(trigger.filter)}` : ''}`\n : trigger.type;\n const tags = [\n trigger.owner === 'template'\n ? `from template${trigger.key ? ` (key ${trigger.key})` : ''}`\n : 'team',\n trigger.active ? 'on' : 'off',\n ...(trigger.secretSet === false ? ['no token yet'] : []),\n ];\n return `${what} · ${tags.join(' · ')}`;\n}\n\nfunction describeLink(link: TeamAgentLink): string {\n const kind =\n link.kind === 'delegate' ? `delegate (${link.mode ?? 'await'})` : 'talk';\n const tags = [\n link.owner === 'template' ? 'from template' : 'team',\n ...(link.active ? [] : ['inactive']),\n ];\n return `${kind} → ${link.to.slug} · ${tags.join(' · ')}`;\n}\n\nfunction agentPath(team: string, key: string): string {\n return `/api/partner/teams/${encodeURIComponent(team)}/agents/${encodeURIComponent(key)}`;\n}\n\nfunction flag(run: TeamAgentRun, name: string): string | undefined {\n const value = run.args.flags?.[name];\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\n/** A repeatable flag's values; each may also be comma-separated. */\nfunction listFlag(run: TeamAgentRun, name: string): string[] {\n const value = run.args.flags?.[name];\n const values = Array.isArray(value)\n ? value\n : typeof value === 'string'\n ? [value]\n : [];\n return values\n .flatMap((entry) => entry.split(','))\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\nfunction noExtra(\n operands: readonly string[],\n count: number,\n area: 'triggers' | 'links',\n) {\n const extra = operands[count];\n if (extra !== undefined) {\n throw usageError(`Unexpected argument \"${extra}\".`, usageFor(area));\n }\n}\n\nfunction send<T>(\n run: TeamAgentRun,\n schema: z.ZodType<T>,\n method: 'GET' | 'POST' | 'DELETE',\n path: string,\n body?: unknown,\n): Promise<T> {\n return run.client.call((token) =>\n call(run.host, token, schema, { method, path, source: run.source, body }),\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"team-agents-triggers.js","sourceRoot":"","sources":["../../src/commands/team-agents-triggers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type TeamAgentLink,\n type TeamAgentLinkAddRequest,\n TeamAgentLinkAddResultSchema,\n TeamAgentLinkListSchema,\n TeamAgentRowRemoveResultSchema,\n type TeamAgentTrigger,\n type TeamAgentTriggerAddRequest,\n TeamAgentTriggerAddResultSchema,\n TeamAgentTriggerListSchema,\n type TeamAgentTriggerUpdateRequest,\n TeamAgentTriggerUpdateResultSchema,\n} from '@ekanos/integration-schema';\nimport type { z } from 'zod';\n\nimport type { CliContext } from '../context';\nimport { invalidStateError, usageError } from '../errors';\nimport type { ExitCode } from '../exit-codes';\nimport { cli } from '../invocation';\nimport { ensureSecretsDir, writeSecretFile } from '../secret-file';\nimport { call } from '../teams-api';\nimport { parseFilters } from './agents-edit';\nimport { type TeamAgentRun, requireOperand, usageFor } from './team-agents';\nimport { confirmChange } from './teams-lifecycle';\n\n/**\n * `ekanos teams triggers list|add|remove|rotate|enable|disable|edit` and `ekanos teams links\n * list|add|remove` — a team agent's triggers and outgoing links, set up by\n * the Source admin. When the template keeps an area, the host shows the\n * effective rows and refuses changes with the command that hands the area\n * to the team.\n */\n\nexport async function runTeamTriggers(\n ctx: CliContext,\n run: TeamAgentRun,\n): Promise<ExitCode> {\n const team = requireOperand(run.operands[0], 'team slug', 'triggers');\n const key = requireOperand(run.operands[1], 'agent key', 'triggers');\n const base = agentPath(team, key);\n\n switch (run.verb) {\n case 'list': {\n noExtra(run.operands, 2, 'triggers');\n const list = await send(\n run,\n TeamAgentTriggerListSchema,\n 'GET',\n `${base}/triggers`,\n );\n return ctx.succeed(\n { host: run.host, ...list },\n ctx.ui.result({\n title:\n list.triggers.length === 0\n ? `${list.agent.slug} on ${list.team.slug} has no triggers`\n : `Triggers of ${list.agent.slug} on ${list.team.slug}`,\n tone: list.triggers.length === 0 ? 'warn' : 'ok',\n rows: list.triggers.map((trigger) => [\n trigger.id,\n describeTrigger(trigger),\n ]),\n notes: [\n ...(list.teamOwned\n ? [\n '\"ekanos teams triggers add <team> <key> manual|schedule|webhook|event …\" adds one.',\n ]\n : [\n `These follow the template. To let the team change them: ekanos agents overrides ${key} enable triggers`,\n ]),\n ...(list.triggers.some(\n (trigger) =>\n trigger.type === 'webhook' && trigger.secretSet === false,\n )\n ? [\n `A webhook trigger with no token yet gets its URL and token from \"ekanos teams triggers rotate ${team} ${key} <trigger-key|id>\".`,\n ]\n : []),\n ],\n }),\n );\n }\n case 'add': {\n const body = triggerBody(run, team, key);\n // A webhook trigger's token comes back once: have somewhere to put it.\n const secrets =\n body.type === 'webhook' ? ensureSecretsDir(run.args.env) : null;\n const added = await send(\n run,\n TeamAgentTriggerAddResultSchema,\n 'POST',\n `${base}/triggers`,\n body,\n );\n const rows: Array<[string, string]> = [\n ['Trigger', added.trigger.id],\n ['Fires on', describeTrigger(added.trigger)],\n ];\n const { webhook, ...rest } = added;\n const saved = webhook\n ? saveTriggerToken(run, secrets, {\n team: added.team.slug,\n agent: added.agent.slug,\n trigger: added.trigger.key ?? added.trigger.id,\n webhook,\n again: `ekanos teams triggers rotate ${team} ${key} ${added.trigger.key ?? added.trigger.id} --yes`,\n })\n : null;\n if (saved) rows.push(...saved.rows);\n const personal = added.agent.ownership === 'personal';\n return ctx.succeed(\n {\n host: run.host,\n ...rest,\n webhook: saved?.json ?? null,\n ...(personal ? { actsFor: 'creator' } : {}),\n },\n ctx.ui.result({\n title: `Added a ${added.trigger.type} trigger to ${added.agent.slug} on ${added.team.slug}`,\n tone: saved || personal ? 'warn' : 'ok',\n rows,\n notes: [\n ...(personal ? personalTriggerNotes(added.trigger.type) : []),\n ...(saved ? saved.notes : []),\n ],\n }),\n );\n }\n case 'remove': {\n const ref = run.operands[2]?.trim();\n if (!ref) {\n throw usageError(\n 'Name the trigger to remove, by its id or key.',\n `List them: ekanos teams triggers list ${team} ${key}`,\n );\n }\n noExtra(run.operands, 3, 'triggers');\n if (!run.args.yes) {\n throw invalidStateError(\n `Removing trigger ${ref} from ${key} on ${team} stops it starting runs; a webhook trigger's URL stops working for good (adding it again makes a new one).`,\n `Re-run with --yes: ekanos teams triggers remove ${team} ${key} ${ref} --yes`,\n );\n }\n const id = UUID.test(ref)\n ? ref\n : await triggerIdByKey(run, team, key, ref);\n const removed = await send(\n run,\n TeamAgentRowRemoveResultSchema,\n 'DELETE',\n `${base}/triggers/${encodeURIComponent(id)}`,\n );\n return ctx.succeed(\n { host: run.host, ...removed },\n ctx.ui.result({\n title: `Removed trigger ${removed.removed} from ${removed.agent.slug}`,\n }),\n );\n }\n case 'rotate':\n return rotateSecret(ctx, run, team, key);\n case 'enable':\n case 'disable':\n case 'edit':\n return updateTrigger(ctx, run, team, key, run.verb);\n default:\n throw usageError(\n `Unknown teams triggers subcommand \"${run.verb}\".`,\n usageFor('triggers'),\n );\n }\n}\n\nexport async function runTeamLinks(\n ctx: CliContext,\n run: TeamAgentRun,\n): Promise<ExitCode> {\n const team = requireOperand(run.operands[0], 'team slug', 'links');\n const from = requireOperand(run.operands[1], 'agent key', 'links');\n const base = agentPath(team, from);\n\n switch (run.verb) {\n case 'list': {\n noExtra(run.operands, 2, 'links');\n const list = await send(\n run,\n TeamAgentLinkListSchema,\n 'GET',\n `${base}/links`,\n );\n return ctx.succeed(\n { host: run.host, ...list },\n ctx.ui.result({\n title:\n list.links.length === 0\n ? `${list.agent.slug} on ${list.team.slug} has no links`\n : `Links from ${list.agent.slug} on ${list.team.slug}`,\n tone: list.links.length === 0 ? 'warn' : 'ok',\n rows: list.links.map((link) => [link.id, describeLink(link)]),\n notes: list.teamOwned\n ? []\n : [\n `These follow the template. To let the team change them: ekanos agents overrides ${from} enable links`,\n ],\n }),\n );\n }\n case 'add': {\n const to = requireOperand(\n run.operands[2],\n 'agent key to link to',\n 'links',\n );\n noExtra(run.operands, 3, 'links');\n const kind = flag(run, 'kind');\n if (kind !== 'talk' && kind !== 'delegate') {\n throw usageError(\n 'Say what kind of link: --kind talk|delegate.',\n usageFor('links'),\n );\n }\n const mode = flag(run, 'mode');\n if (mode !== undefined && mode !== 'await' && mode !== 'handoff') {\n throw usageError('--mode is await or handoff.', usageFor('links'));\n }\n if (mode !== undefined && kind === 'talk') {\n throw usageError(\n 'Only a delegate link takes --mode.',\n usageFor('links'),\n );\n }\n const body: TeamAgentLinkAddRequest = {\n to,\n kind,\n ...(mode ? { mode } : {}),\n };\n const added = await send(\n run,\n TeamAgentLinkAddResultSchema,\n 'POST',\n `${base}/links`,\n body,\n );\n return ctx.succeed(\n { host: run.host, ...added },\n ctx.ui.result({\n title: `Linked ${added.agent.slug} → ${added.link.to.slug} on ${added.team.slug}`,\n rows: [\n ['Link', added.link.id],\n ['Kind', describeLink(added.link)],\n ],\n }),\n );\n }\n case 'remove': {\n const ref = run.operands[2]?.trim();\n if (!ref) {\n throw usageError(\n 'Name the link to remove, by its id or the key of the agent it goes to.',\n `List them: ekanos teams links list ${team} ${from}`,\n );\n }\n noExtra(run.operands, 3, 'links');\n if (!run.args.yes) {\n throw invalidStateError(\n `Removing link ${ref} from ${from} on ${team} means ${from} can no longer reach that agent.`,\n `Re-run with --yes: ekanos teams links remove ${team} ${from} ${ref} --yes`,\n );\n }\n const id = UUID.test(ref)\n ? ref\n : await linkIdByTarget(run, team, from, ref);\n const removed = await send(\n run,\n TeamAgentRowRemoveResultSchema,\n 'DELETE',\n `${base}/links/${encodeURIComponent(id)}`,\n );\n return ctx.succeed(\n { host: run.host, ...removed },\n ctx.ui.result({\n title: `Removed link ${removed.removed} from ${removed.agent.slug}`,\n }),\n );\n }\n default:\n throw usageError(\n `Unknown teams links subcommand \"${run.verb}\".`,\n usageFor('links'),\n );\n }\n}\n\n/**\n * `triggers rotate <team> <key> <trigger-key|id>`: a webhook trigger's new\n * bearer token, the old one revoked — shown once, as `add` shows it. A\n * template's webhook trigger starts with no token, so this is also how its\n * team gets one. Replacing a live token cuts off whoever sends with it, so\n * that needs `--yes`, as `teams webhook` does.\n */\nasync function rotateSecret(\n ctx: CliContext,\n run: TeamAgentRun,\n team: string,\n key: string,\n): Promise<ExitCode> {\n const ref = run.operands[2]?.trim();\n if (!ref) {\n throw usageError(\n 'Name the webhook trigger, by its key or id.',\n `List them: ekanos teams triggers list ${team} ${key}`,\n );\n }\n noExtra(run.operands, 3, 'triggers');\n\n const base = agentPath(team, key);\n const list = await send(\n run,\n TeamAgentTriggerListSchema,\n 'GET',\n `${base}/triggers`,\n );\n const trigger =\n list.triggers.find((entry) => entry.id === ref) ??\n list.triggers.find((entry) => entry.key === ref.toLowerCase());\n if (!trigger) {\n throw usageError(\n `${list.agent.slug} on ${list.team.slug} has no trigger \"${ref}\".`,\n `List them: ekanos teams triggers list ${team} ${key}`,\n );\n }\n if (trigger.type !== 'webhook') {\n throw usageError(\n `\"${ref}\" is a ${trigger.type} trigger; only a webhook trigger has a token to rotate.`,\n `List them: ekanos teams triggers list ${team} ${key}`,\n );\n }\n if (trigger.secretSet !== false && !run.args.yes) {\n throw invalidStateError(\n `${trigger.key ?? trigger.id} on ${list.team.slug} already has a token. A new one revokes it, and whatever sends to the URL with the old token is refused until it uses the new one.`,\n `Re-run with --yes when you are ready to update the sender: ekanos teams triggers rotate ${team} ${key} ${ref} --yes`,\n );\n }\n\n const secrets = ensureSecretsDir(run.args.env);\n const rotated = await send(\n run,\n TeamAgentTriggerAddResultSchema,\n 'POST',\n `${base}/triggers/${encodeURIComponent(trigger.id)}`,\n { rotate: true },\n );\n const { webhook, ...rest } = rotated;\n const saved = webhook\n ? saveTriggerToken(run, secrets, {\n team: rotated.team.slug,\n agent: rotated.agent.slug,\n trigger: rotated.trigger.key ?? rotated.trigger.id,\n webhook,\n again: `ekanos teams triggers rotate ${team} ${key} ${ref} --yes`,\n })\n : null;\n return ctx.succeed(\n { host: run.host, ...rest, webhook: saved?.json ?? null },\n ctx.ui.result({\n title: `New token for ${rotated.trigger.key ?? rotated.trigger.id} on ${rotated.team.slug}`,\n tone: 'warn',\n rows: saved?.rows ?? [],\n notes: [\n ...(rotated.agent.ownership === 'personal'\n ? personalTriggerNotes('webhook')\n : []),\n ...(saved?.notes ?? []),\n ...(trigger.secretSet === false\n ? []\n : ['The previous token is revoked.']),\n ],\n }),\n );\n}\n\n/**\n * A webhook trigger's bearer token goes to a 0600 file, never to the output\n * (a terminal, or an agent's context). The URL is not a secret — the trigger\n * id — so it is still printed. JSON carries `{ url, secretFile }`.\n */\nfunction saveTriggerToken(\n run: TeamAgentRun,\n dir: string | null,\n input: {\n team: string;\n agent: string;\n trigger: string;\n webhook: { url: string; token: string };\n again: string;\n },\n) {\n const file = writeSecretFile(dir ?? ensureSecretsDir(run.args.env), {\n owner: input.team,\n what: `${input.agent}-${input.trigger}-trigger-token`,\n purpose: `Bearer token for the webhook trigger ${input.trigger} of agent ${input.agent} on team ${input.team} (source ${run.source}). Send it as \"Authorization: Bearer <token>\" when you POST JSON to ${input.webhook.url}.`,\n values: [\n ['URL', input.webhook.url],\n ['BEARER_TOKEN', input.webhook.token],\n ],\n again: input.again,\n });\n return {\n json: { url: input.webhook.url, secretFile: file },\n rows: [\n ['URL', input.webhook.url],\n ['Bearer token', `saved to ${file} (readable only by you)`],\n ] as Array<[string, string]>,\n notes: [\n 'The token is shown nowhere else and cannot be read again. Copy it from that file into the sender yourself — not into a chat or an agent session — then delete the file. POST JSON to the URL with \"Authorization: Bearer <token>\".',\n ],\n };\n}\n\n/**\n * A personal agent's trigger acts for its creator, with their own\n * connections (plan 247 decision 3) — so its webhook token is as good as\n * their say-so, within the agent's tools and policy.\n */\nfunction personalTriggerNotes(type: string): string[] {\n return type === 'webhook'\n ? [\n 'This is a personal agent: each request to this webhook makes it act as its creator, with their own connections. Whoever holds the token can do that, within its tools and policy (a write set to approve still waits for them). Keep the token secret, and rotate it if it may have leaked.',\n ]\n : [\n 'This is a personal agent: each run this trigger starts acts as its creator, with their own connections.',\n ];\n}\n\n/**\n * `teams triggers enable|disable|edit <team> <key> <trigger-id|key>` — the\n * app's trigger switch and Edit. The trigger stays what it is: same type,\n * same install or event, and a webhook keeps its URL and token (only\n * `teams triggers rotate` makes a new one). Turning one off, or changing who\n * a Slack trigger answers, asks first at a terminal; `--yes` in a script.\n */\nasync function updateTrigger(\n ctx: CliContext,\n run: TeamAgentRun,\n team: string,\n key: string,\n verb: 'enable' | 'disable' | 'edit',\n): Promise<ExitCode> {\n const ref = run.operands[2]?.trim();\n if (!ref) {\n throw usageError(\n `Name the trigger to ${verb}, by its id or key.`,\n `List them: ${cli()} teams triggers list ${team} ${key}`,\n );\n }\n noExtra(run.operands, 3, 'triggers');\n\n const body: TeamAgentTriggerUpdateRequest =\n verb === 'edit'\n ? editBody(run, team, key, ref)\n : { enabled: verb === 'enable' };\n const audience =\n body.channels !== undefined || body.directMessages !== undefined;\n if (!run.args.yes && (verb === 'disable' || audience)) {\n await confirmChange(\n ctx,\n run.args,\n verb === 'disable'\n ? {\n what: `Turning trigger ${ref} of ${key} on ${team} off stops it starting runs until it is turned on again. A webhook keeps its URL and token.`,\n command: `${cli()} teams triggers disable ${team} ${key} ${ref} --yes`,\n question: `Turn trigger ${ref} of ${key} on ${team} off? [y/N]`,\n }\n : {\n what: 'Anyone in those channels, and anyone who messages the bot, can then ask the agent to act with everything it is granted.',\n command: `${cli()} teams triggers edit ${team} ${key} ${ref} … --yes`,\n question: `Let that audience ask ${key} on ${team} to act? [y/N]`,\n },\n );\n }\n const result = await run.client.call((token) =>\n call(run.host, token, TeamAgentTriggerUpdateResultSchema, {\n method: 'PATCH',\n path: `${agentPath(team, key)}/triggers/${encodeURIComponent(ref)}`,\n source: run.source,\n body: audience ? { ...body, confirmAudience: true } : body,\n }),\n );\n const title =\n verb === 'edit'\n ? `Changed trigger ${result.trigger.key ?? result.trigger.id} of ${result.agent.slug} on ${result.team.slug}`\n : `Turned trigger ${result.trigger.key ?? result.trigger.id} of ${result.agent.slug} on ${result.team.slug} ${verb === 'enable' ? 'on' : 'off'}`;\n return ctx.succeed(\n { host: run.host, ...result },\n ctx.ui.result({\n title,\n tone: 'ok',\n rows: [\n ['Trigger', result.trigger.id],\n ['Fires on', describeTrigger(result.trigger)],\n ...(verb === 'edit'\n ? [\n [\n 'Changed',\n result.changed\n .map((field) => CHANGED_WORDS[field] ?? field)\n .join(', '),\n ] as [string, string],\n ]\n : []),\n ],\n notes:\n result.trigger.type === 'webhook'\n ? ['Its URL and token are unchanged.']\n : [],\n }),\n );\n}\n\n/** A changed field as `teams triggers edit` names it. */\nconst CHANGED_WORDS: Record<string, string> = {\n enabled: 'on/off',\n promptTemplate: 'prompt',\n scheduleCron: 'cron',\n timezone: 'time zone',\n filter: 'filter',\n channels: 'channels',\n directMessages: 'direct messages',\n onMention: 'mentions',\n labelNames: 'labels',\n};\n\n/** What `teams triggers edit` changes, from its flags; at least one. */\nfunction editBody(\n run: TeamAgentRun,\n team: string,\n key: string,\n ref: string,\n): TeamAgentTriggerUpdateRequest {\n const flags = run.args.flags ?? {};\n const body: TeamAgentTriggerUpdateRequest = {};\n const prompt = flags.prompt;\n if (typeof prompt === 'string') body.promptTemplate = prompt.trim();\n const cron = flag(run, 'cron');\n if (cron) body.scheduleCron = cron;\n const timezone = flag(run, 'timezone');\n if (timezone) body.timezone = timezone;\n const filters = filterFlag(run);\n if (filters.length > 0) body.filter = parseFilters(filters);\n if (flags.channel !== undefined) body.channels = listFlag(run, 'channel');\n if (typeof flags.dms === 'boolean') body.directMessages = flags.dms;\n if (flags.label !== undefined) body.labelNames = listFlag(run, 'label');\n if (typeof flags.mention === 'boolean') body.onMention = flags.mention;\n if (Object.keys(body).length === 0) {\n throw usageError(\n 'Say what to change.',\n `e.g. ${cli()} teams triggers edit ${team} ${key} ${ref} --prompt \"…\" (or --cron, --timezone, --filter, --channel, --dms, --label, --mention). To turn it on or off: ${cli()} teams triggers enable|disable ${team} ${key} ${ref}`,\n );\n }\n return body;\n}\n\nfunction triggerBody(\n run: TeamAgentRun,\n team: string,\n key: string,\n): TeamAgentTriggerAddRequest {\n const type = run.operands[2]?.trim().toLowerCase();\n const prompt = flag(run, 'prompt') ?? '';\n switch (type) {\n case 'manual':\n noExtra(run.operands, 3, 'triggers');\n return { type: 'manual', promptTemplate: prompt };\n case 'schedule': {\n noExtra(run.operands, 3, 'triggers');\n const cron = flag(run, 'cron');\n if (!cron || !prompt) {\n throw usageError(\n 'A schedule needs --cron and --prompt.',\n `e.g. ekanos teams triggers add ${team} ${key} schedule --cron \"0 9 * * 1-5\" --timezone America/Los_Angeles --prompt \"Summarize yesterday's tickets\"`,\n );\n }\n return {\n type: 'schedule',\n scheduleCron: cron,\n timezone: flag(run, 'timezone') ?? 'UTC',\n promptTemplate: prompt,\n };\n }\n case 'webhook':\n noExtra(run.operands, 3, 'triggers');\n if (!prompt) {\n throw usageError(\n 'A webhook needs --prompt: what to do with each request.',\n `e.g. ekanos teams triggers add ${team} ${key} webhook --prompt \"Triage this alert: {{body.title}}\"`,\n );\n }\n return { type: 'webhook', promptTemplate: prompt };\n case 'event':\n case 'integration_event': {\n const eventId = run.operands[3]?.trim();\n if (!eventId) {\n throw usageError(\n 'Name the event, e.g. zendesk.ticket_created.',\n `e.g. ekanos teams triggers add ${team} ${key} event zendesk.ticket_created --filter '{\"priority\":[\"urgent\"]}'`,\n );\n }\n noExtra(run.operands, 4, 'triggers');\n return {\n type: 'integration_event',\n eventId,\n filter: parseFilters(filterFlag(run)),\n promptTemplate: prompt,\n };\n }\n case 'slack': {\n noExtra(run.operands, 3, 'triggers');\n const channels = listFlag(run, 'channel');\n const directMessages = run.args.flags?.dms === true;\n if (channels.length === 0 && !directMessages) {\n throw usageError(\n 'A slack trigger answers in channels, direct messages, or both.',\n `e.g. ekanos teams triggers add ${team} ${key} slack --channel '#support' --dms --yes (the bot must be in each channel; \"ekanos teams connect ${team} slack\" installs Slack first)`,\n );\n }\n if (!run.args.yes) {\n throw usageError(\n 'Anyone in those channels, and anyone who messages the bot, can then ask the agent to act with everything it is granted.',\n 'Pass --yes to confirm that audience, as the app asks before it adds the trigger.',\n );\n }\n return {\n type: 'slack',\n channels,\n directMessages,\n promptTemplate: prompt,\n confirmAudience: true,\n };\n }\n case 'linear': {\n noExtra(run.operands, 3, 'triggers');\n const labelNames = listFlag(run, 'label');\n const onMention = run.args.flags?.mention !== false;\n if (!onMention && labelNames.length === 0) {\n throw usageError(\n 'A linear trigger answers @mentions, labelled issues, or both.',\n `e.g. ekanos teams triggers add ${team} ${key} linear --label feedback (\"ekanos teams connect ${team} linear-app\" installs the Ekanos Linear app first). The Linear integration's own events are event triggers: \"ekanos catalog linear --json\" lists them.`,\n );\n }\n return { type: 'linear', onMention, labelNames, promptTemplate: prompt };\n }\n default:\n throw usageError(\n type ? `Unknown trigger type \"${type}\".` : 'Name the trigger type.',\n usageFor('triggers'),\n );\n }\n}\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * A trigger named by key, the name it has in agent.json. Only a template's\n * trigger has one, and it changes at the template, so that is said here\n * with the template-level command rather than left to the host's refusal.\n */\nasync function triggerIdByKey(\n run: TeamAgentRun,\n team: string,\n key: string,\n ref: string,\n): Promise<string> {\n const list = await send(\n run,\n TeamAgentTriggerListSchema,\n 'GET',\n `${agentPath(team, key)}/triggers`,\n );\n const trigger = list.triggers.find(\n (entry) => entry.key === ref.toLowerCase(),\n );\n if (!trigger) {\n throw usageError(\n `${list.agent.slug} on ${list.team.slug} has no trigger \"${ref}\".`,\n `List them: ekanos teams triggers list ${team} ${key}`,\n );\n }\n if (trigger.owner === 'template') {\n throw invalidStateError(\n `Trigger ${ref} comes from the template, so it can only change there.`,\n `Remove it from the template for every team: ekanos agents triggers ${key} remove ${ref}, then publish.`,\n );\n }\n return trigger.id;\n}\n\n/**\n * A link named by the key of the agent it goes to, as the template level\n * names it. Two links to one agent (talk and delegate) need `--kind`.\n */\nasync function linkIdByTarget(\n run: TeamAgentRun,\n team: string,\n from: string,\n to: string,\n): Promise<string> {\n const list = await send(\n run,\n TeamAgentLinkListSchema,\n 'GET',\n `${agentPath(team, from)}/links`,\n );\n const kind = flag(run, 'kind');\n const matches = list.links.filter(\n (link) =>\n link.to.slug === to.toLowerCase() && (!kind || link.kind === kind),\n );\n if (matches.length === 0) {\n throw usageError(\n `${list.agent.slug} on ${list.team.slug} has no link to \"${to}\"${kind ? ` of kind ${kind}` : ''}.`,\n `List them: ekanos teams links list ${team} ${from}`,\n );\n }\n if (matches.length > 1) {\n throw usageError(\n `${list.agent.slug} has more than one link to ${to}.`,\n `Name which with --kind talk|delegate: ekanos teams links remove ${team} ${from} ${to} --kind delegate`,\n );\n }\n return matches[0]!.id;\n}\n\n/** `--filter`, repeatable: `field=value` or a JSON object, as at the template level. */\nfunction filterFlag(run: TeamAgentRun): readonly string[] {\n const value = run.args.flags?.filter;\n if (Array.isArray(value)) return value;\n return typeof value === 'string' ? [value] : [];\n}\n\nfunction describeTrigger(trigger: TeamAgentTrigger): string {\n const what =\n trigger.type === 'schedule'\n ? `schedule ${trigger.scheduleCron ?? ''} (${trigger.timezone ?? 'UTC'})`\n : trigger.type === 'integration_event'\n ? `event ${trigger.eventId ?? ''}${trigger.filter && Object.keys(trigger.filter).length > 0 ? ` ${JSON.stringify(trigger.filter)}` : ''}`\n : trigger.type;\n const tags = [\n trigger.owner === 'template'\n ? `from template${trigger.key ? ` (key ${trigger.key})` : ''}`\n : 'team',\n trigger.active ? 'on' : 'off',\n ...(trigger.secretSet === false ? ['no token yet'] : []),\n ];\n return `${what} · ${tags.join(' · ')}`;\n}\n\nfunction describeLink(link: TeamAgentLink): string {\n const kind =\n link.kind === 'delegate' ? `delegate (${link.mode ?? 'await'})` : 'talk';\n const tags = [\n link.owner === 'template' ? 'from template' : 'team',\n ...(link.active ? [] : ['inactive']),\n ];\n return `${kind} → ${link.to.slug} · ${tags.join(' · ')}`;\n}\n\nfunction agentPath(team: string, key: string): string {\n return `/api/partner/teams/${encodeURIComponent(team)}/agents/${encodeURIComponent(key)}`;\n}\n\nfunction flag(run: TeamAgentRun, name: string): string | undefined {\n const value = run.args.flags?.[name];\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\n/** A repeatable flag's values; each may also be comma-separated. */\nfunction listFlag(run: TeamAgentRun, name: string): string[] {\n const value = run.args.flags?.[name];\n const values = Array.isArray(value)\n ? value\n : typeof value === 'string'\n ? [value]\n : [];\n return values\n .flatMap((entry) => entry.split(','))\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\nfunction noExtra(\n operands: readonly string[],\n count: number,\n area: 'triggers' | 'links',\n) {\n const extra = operands[count];\n if (extra !== undefined) {\n throw usageError(`Unexpected argument \"${extra}\".`, usageFor(area));\n }\n}\n\nfunction send<T>(\n run: TeamAgentRun,\n schema: z.ZodType<T>,\n method: 'GET' | 'POST' | 'DELETE',\n path: string,\n body?: unknown,\n): Promise<T> {\n return run.client.call((token) =>\n call(run.host, token, schema, { method, path, source: run.source, body }),\n );\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CliContext } from '../context.js';
|
|
2
2
|
import type { ExitCode } from '../exit-codes.js';
|
|
3
|
+
import { SkillsClient } from './skills.js';
|
|
3
4
|
import { TeamsClient, type TeamsArgs } from './teams.js';
|
|
4
5
|
/**
|
|
5
6
|
* `ekanos teams agents|triggers|links|mcp …` — a Source admin setting up a
|
|
@@ -12,13 +13,15 @@ import { TeamsClient, type TeamsArgs } from './teams.js';
|
|
|
12
13
|
* team may also be named with `--team <slug>`, as `runs`, `approvals`,
|
|
13
14
|
* `skills` and `knowledge` name it.
|
|
14
15
|
*/
|
|
15
|
-
export declare const TEAM_AGENT_AREAS: readonly ['agents', 'triggers', 'links', 'mcp'];
|
|
16
|
+
export declare const TEAM_AGENT_AREAS: readonly ['agents', 'triggers', 'links', 'mcp', 'llm-key'];
|
|
16
17
|
export type TeamAgentArea = (typeof TEAM_AGENT_AREAS)[number];
|
|
17
18
|
export declare function isTeamAgentArea(value: string | undefined): value is TeamAgentArea;
|
|
18
19
|
/** What every area handler gets: an authorized client and its operands. */
|
|
19
20
|
export interface TeamAgentRun {
|
|
20
21
|
args: TeamsArgs;
|
|
21
22
|
client: TeamsClient;
|
|
23
|
+
/** `agents create|apply`: pushes the skill folders beside an agent.json. */
|
|
24
|
+
skills: SkillsClient;
|
|
22
25
|
host: string;
|
|
23
26
|
/** The Source slug, for `?source=`. */
|
|
24
27
|
source: string;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { requireSession, resolveAuthEnvironment } from '../auth/session.js';
|
|
2
2
|
import { usageError } from '../errors.js';
|
|
3
3
|
import { resolveSourceTarget } from '../source-target.js';
|
|
4
|
+
import { SkillsClient } from './skills.js';
|
|
4
5
|
import { runTeamAgentsArea } from './team-agents-agents.js';
|
|
5
6
|
import { runTeamMcp } from './team-agents-mcp.js';
|
|
6
7
|
import { runTeamLinks, runTeamTriggers } from './team-agents-triggers.js';
|
|
8
|
+
import { runTeamLlmKey } from './team-llm-key.js';
|
|
7
9
|
import { TeamsClient } from './teams.js';
|
|
8
10
|
/**
|
|
9
11
|
* `ekanos teams agents|triggers|links|mcp …` — a Source admin setting up a
|
|
@@ -16,7 +18,13 @@ import { TeamsClient } from './teams.js';
|
|
|
16
18
|
* team may also be named with `--team <slug>`, as `runs`, `approvals`,
|
|
17
19
|
* `skills` and `knowledge` name it.
|
|
18
20
|
*/
|
|
19
|
-
export const TEAM_AGENT_AREAS = [
|
|
21
|
+
export const TEAM_AGENT_AREAS = [
|
|
22
|
+
'agents',
|
|
23
|
+
'triggers',
|
|
24
|
+
'links',
|
|
25
|
+
'mcp',
|
|
26
|
+
'llm-key',
|
|
27
|
+
];
|
|
20
28
|
export function isTeamAgentArea(value) {
|
|
21
29
|
return TEAM_AGENT_AREAS.some((area) => area === value);
|
|
22
30
|
}
|
|
@@ -37,6 +45,7 @@ export async function runTeamAgentCommands(ctx, args) {
|
|
|
37
45
|
const run = {
|
|
38
46
|
args,
|
|
39
47
|
client: new TeamsClient(env, resolved.session),
|
|
48
|
+
skills: new SkillsClient(env, resolved.session),
|
|
40
49
|
host: env.host,
|
|
41
50
|
source: resolved.source,
|
|
42
51
|
verb,
|
|
@@ -51,18 +60,22 @@ export async function runTeamAgentCommands(ctx, args) {
|
|
|
51
60
|
return runTeamLinks(ctx, run);
|
|
52
61
|
case 'mcp':
|
|
53
62
|
return runTeamMcp(ctx, run);
|
|
63
|
+
case 'llm-key':
|
|
64
|
+
return runTeamLlmKey(ctx, run);
|
|
54
65
|
}
|
|
55
66
|
}
|
|
56
67
|
export function usageFor(area) {
|
|
57
68
|
switch (area) {
|
|
58
69
|
case 'agents':
|
|
59
|
-
return 'Run one of: ekanos teams agents list <team> | show <team> <key> | enable <team> <key> [--as <member-email>] [--draft] [--confirm-access] | confirm <team> <key> | disable <team> <key> --yes | pin <team> <key> <version> | pin <team> <key> --draft | unpin <team> <key> | policy <team> <key> [set <tool> auto|approve | unset <tool> | --reads auto|approve --writes auto|approve] [--confirm-access] | skills <team> <key> [add|remove <skill>].';
|
|
70
|
+
return 'Run one of: ekanos teams agents list <team> | show <team> <key> | create <team> --from <dir|agent.json> [--personal] [--confirm-access] [--no-skills] | apply <team> <dir|agent.json> [--personal] [--base-version <n>] [--overwrite] [--confirm-access] [--no-skills] | enable <team> <key> [--as <member-email>] [--draft] [--confirm-access] | confirm <team> <key> | disable <team> <key> --yes | archive <team> <key> [--yes] | unarchive <team> <key> | pin <team> <key> <version> | pin <team> <key> --draft | unpin <team> <key> | policy <team> <key> [set <tool> auto|approve | unset <tool> | --reads auto|approve --writes auto|approve] [--confirm-access] | skills <team> <key> [add|remove <skill>] | tags <team> <key> [add|remove <tag>].';
|
|
60
71
|
case 'triggers':
|
|
61
|
-
return 'Run one of: ekanos teams triggers list <team> <key> | add <team> <key> <manual|schedule|webhook|event|slack|linear> … | remove <team> <key> <trigger-id|key> --yes | rotate <team> <key> <trigger-key|id> [--yes].';
|
|
72
|
+
return 'Run one of: ekanos teams triggers list <team> <key> | add <team> <key> <manual|schedule|webhook|event|slack|linear> … (a personal agent: schedule or webhook, its creator only) | remove <team> <key> <trigger-id|key> --yes | rotate <team> <key> <trigger-key|id> [--yes] | enable <team> <key> <trigger-id|key> | disable <team> <key> <trigger-id|key> [--yes] | edit <team> <key> <trigger-id|key> [--prompt <text>] [--cron <expr>] [--timezone <zone>] [--filter …] [--channel <#name|id>…] [--dms|--no-dms] [--label <name>…] [--mention|--no-mention] (in place: a webhook keeps its URL and token).';
|
|
62
73
|
case 'links':
|
|
63
74
|
return 'Run one of: ekanos teams links list <team> <key> | add <team> <from-key> <to-key> --kind talk|delegate [--mode await|handoff] | remove <team> <from-key> <link-id|to-key> [--kind talk|delegate] --yes. The team may be --team <slug> instead.';
|
|
64
75
|
case 'mcp':
|
|
65
|
-
return 'Run one of: ekanos teams mcp list <team> | add <team> <server-key> --url <url> [--auth none|token|oauth] [--name <name>] | status <team> <server-key> | token <team> <server-key> (hidden input at your terminal) | effect <team> <server-key> <tool> read|write | remove <team> <server-key> --yes.';
|
|
76
|
+
return 'Run one of: ekanos teams mcp list <team> | add <team> <server-key> --url <url> [--auth none|token|oauth] [--name <name>] | status <team> <server-key> | token <team> <server-key> (hidden input at your terminal, or --secret-env|--secret-file|--secret-stdin|--browser) | effect <team> <server-key> <tool> read|write | refresh <team> <server-key> (or --agent <agent-key>: every server it has) | attach <team> <server-key> <agent-key> | detach <team> <server-key> <agent-key> [--yes] | remove <team> <server-key> --yes.';
|
|
77
|
+
case 'llm-key':
|
|
78
|
+
return "Run one of: ekanos teams llm-key show <team> (provider, and the key's last four characters if one is saved) | set <team> (hidden input at your terminal, or --secret-env|--secret-file|--secret-stdin|--browser) | remove <team> --yes.";
|
|
66
79
|
}
|
|
67
80
|
}
|
|
68
81
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-agents.js","sourceRoot":"","sources":["../../src/commands/team-agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAkB,MAAM,SAAS,CAAC;AAEtD;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,
|
|
1
|
+
{"version":3,"file":"team-agents.js","sourceRoot":"","sources":["../../src/commands/team-agents.ts"],"names":[],"mappings":"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","sourcesContent":["import { requireSession, resolveAuthEnvironment } from '../auth/session';\nimport type { CliContext } from '../context';\nimport { usageError } from '../errors';\nimport type { ExitCode } from '../exit-codes';\nimport { resolveSourceTarget } from '../source-target';\nimport { SkillsClient } from './skills';\nimport { runTeamAgentsArea } from './team-agents-agents';\nimport { runTeamMcp } from './team-agents-mcp';\nimport { runTeamLinks, runTeamTriggers } from './team-agents-triggers';\nimport { runTeamLlmKey } from './team-llm-key';\nimport { TeamsClient, type TeamsArgs } from './teams';\n\n/**\n * `ekanos teams agents|triggers|links|mcp …` — a Source admin setting up a\n * team's agents from the terminal, acting on that team through the partner\n * API (`/api/partner/teams/<team>/agents/*`, `/mcp/*`). Every write goes\n * through the same checks the app's agent pages make and leaves an Admin\n * Audit row naming the person.\n *\n * The shape is always `teams <area> <verb> <team> [<agent-key> …]`; the\n * team may also be named with `--team <slug>`, as `runs`, `approvals`,\n * `skills` and `knowledge` name it.\n */\n\nexport const TEAM_AGENT_AREAS = [\n 'agents',\n 'triggers',\n 'links',\n 'mcp',\n 'llm-key',\n] as const;\nexport type TeamAgentArea = (typeof TEAM_AGENT_AREAS)[number];\n\nexport function isTeamAgentArea(\n value: string | undefined,\n): value is TeamAgentArea {\n return TEAM_AGENT_AREAS.some((area) => area === value);\n}\n\n/** What every area handler gets: an authorized client and its operands. */\nexport interface TeamAgentRun {\n args: TeamsArgs;\n client: TeamsClient;\n /** `agents create|apply`: pushes the skill folders beside an agent.json. */\n skills: SkillsClient;\n host: string;\n /** The Source slug, for `?source=`. */\n source: string;\n /** The verb. */\n verb: string;\n /** Everything after the verb: `<team> [<key> …]`. */\n operands: readonly string[];\n}\n\nexport async function runTeamAgentCommands(\n ctx: CliContext,\n args: TeamsArgs,\n): Promise<ExitCode> {\n const [area, verb, ...positional] = args.positionals;\n if (!isTeamAgentArea(area)) {\n throw usageError(\n `Unknown teams area \"${area ?? ''}\".`,\n 'See \"ekanos teams --help\".',\n );\n }\n if (!verb) {\n throw usageError(`teams ${area} needs a subcommand.`, usageFor(area));\n }\n const operands = withTeamFlag(positional, args.flags?.team);\n\n const env = resolveAuthEnvironment(ctx, args.host, args.env, {\n projectDir: args.dir,\n });\n const resolved = await resolveSourceTarget(env, requireSession(env), args);\n const run: TeamAgentRun = {\n args,\n client: new TeamsClient(env, resolved.session),\n skills: new SkillsClient(env, resolved.session),\n host: env.host,\n source: resolved.source,\n verb,\n operands,\n };\n\n switch (area) {\n case 'agents':\n return runTeamAgentsArea(ctx, run);\n case 'triggers':\n return runTeamTriggers(ctx, run);\n case 'links':\n return runTeamLinks(ctx, run);\n case 'mcp':\n return runTeamMcp(ctx, run);\n case 'llm-key':\n return runTeamLlmKey(ctx, run);\n }\n}\n\nexport function usageFor(area: TeamAgentArea): string {\n switch (area) {\n case 'agents':\n return 'Run one of: ekanos teams agents list <team> | show <team> <key> | create <team> --from <dir|agent.json> [--personal] [--confirm-access] [--no-skills] | apply <team> <dir|agent.json> [--personal] [--base-version <n>] [--overwrite] [--confirm-access] [--no-skills] | enable <team> <key> [--as <member-email>] [--draft] [--confirm-access] | confirm <team> <key> | disable <team> <key> --yes | archive <team> <key> [--yes] | unarchive <team> <key> | pin <team> <key> <version> | pin <team> <key> --draft | unpin <team> <key> | policy <team> <key> [set <tool> auto|approve | unset <tool> | --reads auto|approve --writes auto|approve] [--confirm-access] | skills <team> <key> [add|remove <skill>] | tags <team> <key> [add|remove <tag>].';\n case 'triggers':\n return 'Run one of: ekanos teams triggers list <team> <key> | add <team> <key> <manual|schedule|webhook|event|slack|linear> … (a personal agent: schedule or webhook, its creator only) | remove <team> <key> <trigger-id|key> --yes | rotate <team> <key> <trigger-key|id> [--yes] | enable <team> <key> <trigger-id|key> | disable <team> <key> <trigger-id|key> [--yes] | edit <team> <key> <trigger-id|key> [--prompt <text>] [--cron <expr>] [--timezone <zone>] [--filter …] [--channel <#name|id>…] [--dms|--no-dms] [--label <name>…] [--mention|--no-mention] (in place: a webhook keeps its URL and token).';\n case 'links':\n return 'Run one of: ekanos teams links list <team> <key> | add <team> <from-key> <to-key> --kind talk|delegate [--mode await|handoff] | remove <team> <from-key> <link-id|to-key> [--kind talk|delegate] --yes. The team may be --team <slug> instead.';\n case 'mcp':\n return 'Run one of: ekanos teams mcp list <team> | add <team> <server-key> --url <url> [--auth none|token|oauth] [--name <name>] | status <team> <server-key> | token <team> <server-key> (hidden input at your terminal, or --secret-env|--secret-file|--secret-stdin|--browser) | effect <team> <server-key> <tool> read|write | refresh <team> <server-key> (or --agent <agent-key>: every server it has) | attach <team> <server-key> <agent-key> | detach <team> <server-key> <agent-key> [--yes] | remove <team> <server-key> --yes.';\n case 'llm-key':\n return \"Run one of: ekanos teams llm-key show <team> (provider, and the key's last four characters if one is saved) | set <team> (hidden input at your terminal, or --secret-env|--secret-file|--secret-stdin|--browser) | remove <team> --yes.\";\n }\n}\n\n/**\n * `--team <slug>` in place of the leading team operand. Given both, they\n * must agree; given only the flag, it becomes the first operand.\n */\nfunction withTeamFlag(\n operands: readonly string[],\n flag: string | boolean | string[] | undefined,\n): readonly string[] {\n if (flag === undefined) return operands;\n const team = typeof flag === 'string' ? flag.trim().toLowerCase() : '';\n if (!team) {\n throw usageError('--team needs a team slug.', 'e.g. --team bank-a');\n }\n return operands[0]?.trim().toLowerCase() === team\n ? operands\n : [team, ...operands];\n}\n\n/** A slug operand (team, agent key, server key), or a usage error naming it. */\nexport function requireOperand(\n value: string | undefined,\n what: string,\n area: TeamAgentArea,\n): string {\n const slug = value?.trim().toLowerCase();\n if (slug && /^[a-z0-9][a-z0-9-]*$/.test(slug)) return slug;\n throw usageError(\n value ? `\"${value}\" is not a ${what}.` : `Name the ${what}.`,\n usageFor(area),\n );\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CliContext } from '../context.js';
|
|
2
|
+
import type { ExitCode } from '../exit-codes.js';
|
|
3
|
+
import { type TeamAgentRun } from './team-agents.js';
|
|
4
|
+
/**
|
|
5
|
+
* `ekanos teams llm-key show|set|remove <team>` — the team's own LLM
|
|
6
|
+
* provider key (bring your own key), as its settings page sets it, for the
|
|
7
|
+
* Source admin (`/api/partner/teams/<team>/llm-key`).
|
|
8
|
+
*
|
|
9
|
+
* `show` says only whether one is saved, for which provider, and its last
|
|
10
|
+
* four characters. `set` takes the key like every other secret here: hidden
|
|
11
|
+
* at a terminal, or `--secret-env`, `--secret-file`, `--secret-stdin` or
|
|
12
|
+
* `--browser` (`secret-input.ts`) — never a value in argv.
|
|
13
|
+
*/
|
|
14
|
+
export declare function runTeamLlmKey(ctx: CliContext, run: TeamAgentRun): Promise<ExitCode>;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { TeamLlmKeyRemoveResultSchema, TeamLlmKeyStatusSchema, } from '@ekanos/integration-schema';
|
|
2
|
+
import { invalidStateError, usageError, validationError } from '../errors.js';
|
|
3
|
+
import { SINGLE_SECRET_FORMS, collectSecrets, readSecretFlags, secretInputGiven, } from '../secret-input.js';
|
|
4
|
+
import { call } from '../teams-api.js';
|
|
5
|
+
import { promptHidden } from './apps.js';
|
|
6
|
+
import { requireOperand, usageFor } from './team-agents.js';
|
|
7
|
+
import { canPrompt, teamsSecretIO } from './teams.js';
|
|
8
|
+
/**
|
|
9
|
+
* `ekanos teams llm-key show|set|remove <team>` — the team's own LLM
|
|
10
|
+
* provider key (bring your own key), as its settings page sets it, for the
|
|
11
|
+
* Source admin (`/api/partner/teams/<team>/llm-key`).
|
|
12
|
+
*
|
|
13
|
+
* `show` says only whether one is saved, for which provider, and its last
|
|
14
|
+
* four characters. `set` takes the key like every other secret here: hidden
|
|
15
|
+
* at a terminal, or `--secret-env`, `--secret-file`, `--secret-stdin` or
|
|
16
|
+
* `--browser` (`secret-input.ts`) — never a value in argv.
|
|
17
|
+
*/
|
|
18
|
+
export async function runTeamLlmKey(ctx, run) {
|
|
19
|
+
var _a;
|
|
20
|
+
const team = requireOperand(run.operands[0], 'team slug', 'llm-key');
|
|
21
|
+
const extra = run.operands[1];
|
|
22
|
+
if (extra !== undefined) {
|
|
23
|
+
throw usageError(`Unexpected argument "${extra}".`, usageFor('llm-key'));
|
|
24
|
+
}
|
|
25
|
+
// The one provider a team can bring a key for today; the route takes
|
|
26
|
+
// `provider` already, so another is a flag here when one ships.
|
|
27
|
+
const provider = 'anthropic';
|
|
28
|
+
const path = `/api/partner/teams/${encodeURIComponent(team)}/llm-key`;
|
|
29
|
+
switch (run.verb) {
|
|
30
|
+
case 'show': {
|
|
31
|
+
const status = await run.client.call((token) => call(run.host, token, TeamLlmKeyStatusSchema, {
|
|
32
|
+
method: 'GET',
|
|
33
|
+
path,
|
|
34
|
+
source: run.source,
|
|
35
|
+
}));
|
|
36
|
+
return ctx.succeed(Object.assign({ host: run.host }, status), render(ctx, status, `${status.team.slug}'s LLM key`));
|
|
37
|
+
}
|
|
38
|
+
case 'set': {
|
|
39
|
+
const secret = readSecretFlags(run.args.flags);
|
|
40
|
+
const interactive = canPrompt(ctx, run.args);
|
|
41
|
+
const again = `teams llm-key set ${team} --source ${run.source}`;
|
|
42
|
+
if (!interactive && !secretInputGiven(secret)) {
|
|
43
|
+
throw usageError('teams llm-key set needs the API key, and there is no terminal to ask at.', `Without a terminal, pass ${SINGLE_SECRET_FORMS}. Or run it yourself in your terminal: npx @ekanos/cli ${again}`);
|
|
44
|
+
}
|
|
45
|
+
const collected = await collectSecrets(ctx, {
|
|
46
|
+
fields: [
|
|
47
|
+
{
|
|
48
|
+
name: 'apiKey',
|
|
49
|
+
label: `${providerName(provider)} API key`,
|
|
50
|
+
sensitive: true,
|
|
51
|
+
required: true,
|
|
52
|
+
description: 'The team’s own key: its agents and assistant use it instead of the Source’s. Stored in the vault; only its last four characters are ever shown.',
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
flags: secret,
|
|
56
|
+
io: teamsSecretIO(run.args),
|
|
57
|
+
interactive,
|
|
58
|
+
title: `${team}'s ${providerName(provider)} API key`,
|
|
59
|
+
refusal: 'teams llm-key set needs the API key, and there is no terminal to ask at.',
|
|
60
|
+
again,
|
|
61
|
+
prompt: () => { var _a; return ((_a = run.args.askSecret) !== null && _a !== void 0 ? _a : promptHidden)(`${providerName(provider)} API key for ${team} (hidden): `); },
|
|
62
|
+
});
|
|
63
|
+
const apiKey = (_a = collected.apiKey) !== null && _a !== void 0 ? _a : '';
|
|
64
|
+
if (!apiKey) {
|
|
65
|
+
throw validationError('No key entered; nothing was saved.', `Run "ekanos ${again}" when you have it.`);
|
|
66
|
+
}
|
|
67
|
+
const status = await run.client.call((token) => call(run.host, token, TeamLlmKeyStatusSchema, {
|
|
68
|
+
method: 'PUT',
|
|
69
|
+
path,
|
|
70
|
+
source: run.source,
|
|
71
|
+
body: { provider, apiKey },
|
|
72
|
+
}));
|
|
73
|
+
return ctx.succeed(Object.assign({ host: run.host }, status), render(ctx, status, `Saved ${status.team.slug}'s LLM key`));
|
|
74
|
+
}
|
|
75
|
+
case 'remove': {
|
|
76
|
+
if (!run.args.yes && !canPrompt(ctx, run.args)) {
|
|
77
|
+
throw invalidStateError(`Removing ${team}'s LLM key puts its agents and assistant back on the Source's key.`, `Re-run with --yes: ekanos teams llm-key remove ${team} --yes`);
|
|
78
|
+
}
|
|
79
|
+
const removed = await run.client.call((token) => call(run.host, token, TeamLlmKeyRemoveResultSchema, {
|
|
80
|
+
method: 'DELETE',
|
|
81
|
+
path,
|
|
82
|
+
source: run.source,
|
|
83
|
+
}));
|
|
84
|
+
return ctx.succeed(Object.assign({ host: run.host }, removed), ctx.ui.result({
|
|
85
|
+
title: removed.removed
|
|
86
|
+
? `Removed ${removed.team.slug}'s ${providerName(removed.provider)} key`
|
|
87
|
+
: `${removed.team.slug} had no ${providerName(removed.provider)} key`,
|
|
88
|
+
tone: removed.removed ? 'warn' : undefined,
|
|
89
|
+
rows: [
|
|
90
|
+
[
|
|
91
|
+
'Now uses',
|
|
92
|
+
"the Source's key, as every team without its own does",
|
|
93
|
+
],
|
|
94
|
+
],
|
|
95
|
+
}));
|
|
96
|
+
}
|
|
97
|
+
default:
|
|
98
|
+
throw usageError(run.verb
|
|
99
|
+
? `Unknown teams llm-key subcommand "${run.verb}".`
|
|
100
|
+
: 'teams llm-key needs a subcommand.', usageFor('llm-key'));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function providerName(provider) {
|
|
104
|
+
return provider === 'anthropic' ? 'Anthropic' : provider;
|
|
105
|
+
}
|
|
106
|
+
function render(ctx, status, title) {
|
|
107
|
+
var _a;
|
|
108
|
+
return ctx.ui.result({
|
|
109
|
+
title,
|
|
110
|
+
rows: [
|
|
111
|
+
['Provider', providerName(status.provider)],
|
|
112
|
+
[
|
|
113
|
+
'Key',
|
|
114
|
+
status.set
|
|
115
|
+
? `saved, ending ${(_a = status.last4) !== null && _a !== void 0 ? _a : '…'}`
|
|
116
|
+
: "not set — the team uses the Source's key",
|
|
117
|
+
],
|
|
118
|
+
...(status.addedAt ? [['Added', status.addedAt]] : []),
|
|
119
|
+
],
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=team-llm-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-llm-key.js","sourceRoot":"","sources":["../../src/commands/team-llm-key.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type TeamLlmKeyStatus,\n TeamLlmKeyRemoveResultSchema,\n TeamLlmKeyStatusSchema,\n} from '@ekanos/integration-schema';\n\nimport type { CliContext } from '../context';\nimport { invalidStateError, usageError, validationError } from '../errors';\nimport type { ExitCode } from '../exit-codes';\nimport {\n SINGLE_SECRET_FORMS,\n collectSecrets,\n readSecretFlags,\n secretInputGiven,\n} from '../secret-input';\nimport { call } from '../teams-api';\nimport { promptHidden } from './apps';\nimport { type TeamAgentRun, requireOperand, usageFor } from './team-agents';\nimport { canPrompt, teamsSecretIO } from './teams';\n\n/**\n * `ekanos teams llm-key show|set|remove <team>` — the team's own LLM\n * provider key (bring your own key), as its settings page sets it, for the\n * Source admin (`/api/partner/teams/<team>/llm-key`).\n *\n * `show` says only whether one is saved, for which provider, and its last\n * four characters. `set` takes the key like every other secret here: hidden\n * at a terminal, or `--secret-env`, `--secret-file`, `--secret-stdin` or\n * `--browser` (`secret-input.ts`) — never a value in argv.\n */\n\nexport async function runTeamLlmKey(\n ctx: CliContext,\n run: TeamAgentRun,\n): Promise<ExitCode> {\n const team = requireOperand(run.operands[0], 'team slug', 'llm-key');\n const extra = run.operands[1];\n if (extra !== undefined) {\n throw usageError(`Unexpected argument \"${extra}\".`, usageFor('llm-key'));\n }\n // The one provider a team can bring a key for today; the route takes\n // `provider` already, so another is a flag here when one ships.\n const provider = 'anthropic';\n const path = `/api/partner/teams/${encodeURIComponent(team)}/llm-key`;\n\n switch (run.verb) {\n case 'show': {\n const status = await run.client.call((token) =>\n call(run.host, token, TeamLlmKeyStatusSchema, {\n method: 'GET',\n path,\n source: run.source,\n }),\n );\n return ctx.succeed(\n { host: run.host, ...status },\n render(ctx, status, `${status.team.slug}'s LLM key`),\n );\n }\n case 'set': {\n const secret = readSecretFlags(run.args.flags);\n const interactive = canPrompt(ctx, run.args);\n const again = `teams llm-key set ${team} --source ${run.source}`;\n if (!interactive && !secretInputGiven(secret)) {\n throw usageError(\n 'teams llm-key set needs the API key, and there is no terminal to ask at.',\n `Without a terminal, pass ${SINGLE_SECRET_FORMS}. Or run it yourself in your terminal: npx @ekanos/cli ${again}`,\n );\n }\n const collected = await collectSecrets(ctx, {\n fields: [\n {\n name: 'apiKey',\n label: `${providerName(provider)} API key`,\n sensitive: true,\n required: true,\n description:\n 'The team’s own key: its agents and assistant use it instead of the Source’s. Stored in the vault; only its last four characters are ever shown.',\n },\n ],\n flags: secret,\n io: teamsSecretIO(run.args),\n interactive,\n title: `${team}'s ${providerName(provider)} API key`,\n refusal:\n 'teams llm-key set needs the API key, and there is no terminal to ask at.',\n again,\n prompt: () =>\n (run.args.askSecret ?? promptHidden)(\n `${providerName(provider)} API key for ${team} (hidden): `,\n ),\n });\n const apiKey = collected.apiKey ?? '';\n if (!apiKey) {\n throw validationError(\n 'No key entered; nothing was saved.',\n `Run \"ekanos ${again}\" when you have it.`,\n );\n }\n const status = await run.client.call((token) =>\n call(run.host, token, TeamLlmKeyStatusSchema, {\n method: 'PUT',\n path,\n source: run.source,\n body: { provider, apiKey },\n }),\n );\n return ctx.succeed(\n { host: run.host, ...status },\n render(ctx, status, `Saved ${status.team.slug}'s LLM key`),\n );\n }\n case 'remove': {\n if (!run.args.yes && !canPrompt(ctx, run.args)) {\n throw invalidStateError(\n `Removing ${team}'s LLM key puts its agents and assistant back on the Source's key.`,\n `Re-run with --yes: ekanos teams llm-key remove ${team} --yes`,\n );\n }\n const removed = await run.client.call((token) =>\n call(run.host, token, TeamLlmKeyRemoveResultSchema, {\n method: 'DELETE',\n path,\n source: run.source,\n }),\n );\n return ctx.succeed(\n { host: run.host, ...removed },\n ctx.ui.result({\n title: removed.removed\n ? `Removed ${removed.team.slug}'s ${providerName(removed.provider)} key`\n : `${removed.team.slug} had no ${providerName(removed.provider)} key`,\n tone: removed.removed ? 'warn' : undefined,\n rows: [\n [\n 'Now uses',\n \"the Source's key, as every team without its own does\",\n ],\n ],\n }),\n );\n }\n default:\n throw usageError(\n run.verb\n ? `Unknown teams llm-key subcommand \"${run.verb}\".`\n : 'teams llm-key needs a subcommand.',\n usageFor('llm-key'),\n );\n }\n}\n\nfunction providerName(provider: string): string {\n return provider === 'anthropic' ? 'Anthropic' : provider;\n}\n\nfunction render(\n ctx: CliContext,\n status: TeamLlmKeyStatus,\n title: string,\n): string {\n return ctx.ui.result({\n title,\n rows: [\n ['Provider', providerName(status.provider)],\n [\n 'Key',\n status.set\n ? `saved, ending ${status.last4 ?? '…'}`\n : \"not set — the team uses the Source's key\",\n ],\n ...(status.addedAt ? ([['Added', status.addedAt]] as const) : []),\n ],\n });\n}\n"]}
|