@ekanos/cli 0.15.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.js +3 -2
- 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 +21 -5
- 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 +18 -2
- package/dist/commands/team-agent-readiness.js +39 -39
- package/dist/commands/team-agent-readiness.js.map +1 -1
- package/dist/commands/team-agents-agents.d.ts +5 -2
- package/dist/commands/team-agents-agents.js +152 -15
- 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 +6 -2
- 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 +357 -122
- 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 +88 -27
- 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 +43 -10
- 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 +26 -2
- package/templates/skills/build-agent/references/set-up-an-integration.md +46 -29
- package/templates/skills/build-integration/references/widget-design.md +1 -1
- package/templates/skills/ekanos-platform/SKILL.md +66 -14
- package/templates/skills/polish-widgets/references/patterns.md +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-agents-agents.js","sourceRoot":"","sources":["../../src/commands/team-agents-agents.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AgentRunListSchema,\n type ChannelRequirement,\n type Requirement,\n type TeamAgentAccess,\n type TeamAgentChangeResult,\n TeamAgentChangeResultSchema,\n type TeamAgentEntry,\n TeamAgentListSchema,\n type TeamAgentPolicy,\n type TeamAgentPolicyChange,\n TeamAgentPolicySchema,\n type TeamAgentSkills,\n type TeamAgentSkillsChange,\n TeamAgentSkillsSchema,\n} from '@ekanos/integration-schema';\n\nimport type { CliContext } from '../context';\nimport { invalidStateError, notFoundError, usageError } from '../errors';\nimport type { ExitCode } from '../exit-codes';\nimport { call, listTeamEvents } from '../teams-api';\nimport {\n REASON_WORDS,\n agentReadiness,\n channelFix,\n describeAgentReadiness,\n fixLine,\n liveLine,\n reachedVia,\n requirementFix,\n} from './team-agent-readiness';\nimport { type TeamAgentRun, requireOperand, usageFor } from './team-agents';\n\n/**\n * `ekanos teams agents list|show|enable|confirm|disable|pin|unpin|policy|skills` —\n * a team's provided agents, turned on, versioned, given an approval policy\n * and skills by the Source admin. `enable|pin … --draft` puts one team on\n * the template's latest, unpublished version to test it there before\n * publishing. `confirm` (and `--confirm-access`) records the caller's own\n * confirmation that it may use its connections in runs no one watches:\n * whoever sets an agent up confirms it (plan 247.2), never a member.\n * `show` answers \"is this agent live, and if not, why?\" for one agent; `list`\n * ends each agent with the same verdict.\n */\nexport async function runTeamAgentsArea(\n ctx: CliContext,\n run: TeamAgentRun,\n): Promise<ExitCode> {\n const team = requireOperand(run.operands[0], 'team slug', 'agents');\n const base = `/api/partner/teams/${encodeURIComponent(team)}/agents`;\n\n if (run.verb === 'list') {\n expectOperands(run, 1);\n const list = await run.client.call((token) =>\n call(run.host, token, TeamAgentListSchema, {\n method: 'GET',\n path: base,\n source: run.source,\n }),\n );\n const target = { team: list.team.slug, source: run.source };\n return ctx.succeed(\n {\n host: run.host,\n ...list,\n agents: list.agents.map((entry) => ({\n ...entry,\n readiness: agentReadiness(entry, target),\n })),\n },\n [\n ctx.ui.result({\n title:\n list.agents.length === 0\n ? `No agents are provided for ${list.team.slug}`\n : `Agents for ${list.team.slug}`,\n tone: list.agents.length === 0 ? 'warn' : 'ok',\n }),\n ...list.agents.map((entry) =>\n describeEntry(entry, list.team.slug, run.source),\n ),\n list.mcpServers.length > 0\n ? `\\nMCP servers: ${list.mcpServers.map((server) => `${server.key} (${server.status})`).join(', ')}`\n : '',\n ]\n .filter(Boolean)\n .join('\\n'),\n );\n }\n\n const key = requireOperand(run.operands[1], 'agent key', 'agents');\n const path = `${base}/${encodeURIComponent(key)}`;\n\n switch (run.verb) {\n case 'show':\n expectOperands(run, 2);\n return show(ctx, run, base, key);\n case 'enable': {\n expectOperands(run, 2);\n const as = stringFlag(run, 'as');\n const draft = run.args.flags?.draft === true;\n const confirmAccess = run.args.flags?.['confirm-access'] === true;\n const result = await change(run, `${path}/enable`, 'POST', {\n ...(as ? { as } : {}),\n ...(draft ? { draft: true } : {}),\n ...(confirmAccess ? { confirmAccess: true } : {}),\n });\n if (draft) requireDraftHost(result, 'enabled');\n return ctx.succeed(\n { host: run.host, ...result },\n describeChange(\n result,\n `${\n draft\n ? `Testing draft v${result.version ?? '?'} of ${result.slug} on ${result.team.slug}`\n : `Turned on ${result.slug} for ${result.team.slug}`\n }${confirmAccess && result.accessConfirmed ? ', and you confirmed what it may use' : ''}`,\n run.source,\n { confirmRequested: confirmAccess },\n ),\n );\n }\n case 'confirm': {\n expectOperands(run, 2);\n // Confirm what the person is shown, never a publish that lands after:\n // the host refuses if the version moved (AGENT_VERSION_CHANGED).\n const shown = await shownVersion(ctx, run, base, key);\n const result = await change(\n run,\n `${path}/confirm`,\n 'POST',\n shown === null ? {} : { expectedVersion: shown },\n );\n return ctx.succeed(\n { host: run.host, ...result },\n describeChange(\n result,\n `You confirmed what ${result.slug} on ${result.team.slug} may use`,\n run.source,\n { confirmRequested: true },\n ),\n );\n }\n case 'disable': {\n expectOperands(run, 2);\n if (!run.args.yes) {\n throw invalidStateError(\n `Turning ${key} off for ${team} pauses it: nothing starts it for that team until it is turned on again, and turning it on is refused once the person it runs as has left the team.`,\n `Re-run with --yes: ekanos teams agents disable ${team} ${key} --yes`,\n );\n }\n const result = await change(run, `${path}/disable`, 'POST', {});\n return ctx.succeed(\n { host: run.host, ...result },\n describeChange(\n result,\n `Turned off ${result.slug} for ${result.team.slug}`,\n run.source,\n ),\n );\n }\n case 'pin': {\n if (run.args.flags?.draft === true) {\n expectOperands(run, 2);\n const result = await change(run, `${path}/pin`, 'PUT', {\n version: null,\n draft: true,\n });\n requireDraftHost(result, 'pinned');\n return ctx.succeed(\n { host: run.host, ...result },\n describeChange(\n result,\n `Testing draft v${result.version ?? '?'} of ${result.slug} on ${result.team.slug}`,\n run.source,\n ),\n );\n }\n expectOperands(run, 3);\n const version = Number(run.operands[2]);\n if (!Number.isInteger(version) || version < 1) {\n throw usageError(\n run.operands[2]\n ? `\"${run.operands[2]}\" is not a version number.`\n : 'Name the version to pin.',\n `e.g. \"ekanos teams agents pin ${team} ${key} 3\", or \"--draft\" to test the unpublished draft. \"ekanos agents show ${key}\" lists its versions.`,\n );\n }\n const result = await change(run, `${path}/pin`, 'PUT', { version });\n return ctx.succeed(\n { host: run.host, ...result },\n describeChange(\n result,\n `${result.team.slug} stays on v${result.version ?? version} of ${result.slug}`,\n run.source,\n ),\n );\n }\n case 'unpin': {\n expectOperands(run, 2);\n const result = await change(run, `${path}/pin`, 'PUT', { version: null });\n return ctx.succeed(\n { host: run.host, ...result },\n describeChange(\n result,\n `${result.team.slug} follows each published version of ${result.slug}`,\n run.source,\n ),\n );\n }\n case 'policy':\n return policy(ctx, run, team, key, `${path}/policy`);\n case 'skills':\n return skills(ctx, run, team, key, `${path}/skills`);\n default:\n throw usageError(\n `Unknown teams agents subcommand \"${run.verb}\".`,\n usageFor('agents'),\n );\n }\n}\n\n/**\n * One agent on one team: each product and whose connection it acts through,\n * each trigger and how its events reach the agent (with the last event and\n * the last run), access, \"Live: yes/no\" and exactly one Next. Reads the\n * team's agents, then its recent runs and events; a host without the\n * activity reads still answers the rest.\n */\nasync function show(\n ctx: CliContext,\n run: TeamAgentRun,\n base: string,\n key: string,\n): Promise<ExitCode> {\n const list = await run.client.call((token) =>\n call(run.host, token, TeamAgentListSchema, {\n method: 'GET',\n path: base,\n source: run.source,\n }),\n );\n const entry = list.agents.find((candidate) => candidate.key === key);\n if (!entry) {\n throw notFoundError(\n `No agent \"${key}\" is provided for ${list.team.slug}.`,\n `\"ekanos teams agents list ${list.team.slug}\" lists the agents provided for it.`,\n );\n }\n const target = { team: list.team.slug, source: run.source };\n const readiness = agentReadiness(entry, target);\n const [runs, events] = entry.agent\n ? await Promise.all([\n activity(ctx, 'runs', () =>\n run.client.call((token) =>\n call(run.host, token, AgentRunListSchema, {\n method: 'GET',\n path: `/api/partner/teams/${encodeURIComponent(target.team)}/runs?agent=${encodeURIComponent(key)}`,\n source: run.source,\n }),\n ),\n ),\n entry.agent.triggers.some((trigger) => trigger.eventId)\n ? activity(ctx, 'events', () =>\n run.client.call((token) =>\n listTeamEvents(\n run.host,\n token,\n { source: run.source, team: target.team },\n { limit: 100 },\n ),\n ),\n )\n : Promise.resolve(null),\n ])\n : [null, null];\n\n return ctx.succeed(\n {\n host: run.host,\n team: list.team,\n agent: entry,\n readiness,\n lastRun: runs?.runs[0] ?? null,\n recentEvents: events\n ? events.events.filter((event) =>\n entry.agent?.triggers.some(\n (trigger) => trigger.eventId === event.eventId,\n ),\n )\n : null,\n },\n describeAgentReadiness(\n entry,\n target,\n readiness,\n {\n runs: runs?.runs ?? null,\n events: events?.events ?? null,\n },\n list.scope,\n ),\n );\n}\n\n/** A read `show` can do without: on failure, say so and carry on. */\nasync function activity<T>(\n ctx: CliContext,\n what: string,\n read: () => Promise<T>,\n): Promise<T | null> {\n try {\n return await read();\n } catch (error) {\n ctx.log(\n `Could not read the team's recent ${what}: ${error instanceof Error ? error.message : String(error)}`,\n );\n return null;\n }\n}\n\nasync function policy(\n ctx: CliContext,\n run: TeamAgentRun,\n team: string,\n key: string,\n path: string,\n): Promise<ExitCode> {\n const [action, tool, decision] = run.operands.slice(2);\n const change: TeamAgentPolicyChange = {};\n const reads = approvalFlag(run, 'reads');\n const writes = approvalFlag(run, 'writes');\n if (reads) change.reads = reads;\n if (writes) change.writes = writes;\n\n if (action === 'set') {\n const mode = parseApproval(decision);\n if (!tool || !mode) {\n throw usageError(\n 'policy set needs a tool and auto|approve.',\n `e.g. \"ekanos teams agents policy ${team} ${key} set zendesk_reply_to_ticket approve\".`,\n );\n }\n change.set = { [tool]: mode };\n } else if (action === 'unset') {\n if (!tool || decision) {\n throw usageError(\n 'policy unset needs exactly one tool.',\n `e.g. \"ekanos teams agents policy ${team} ${key} unset zendesk_reply_to_ticket\".`,\n );\n }\n change.unset = [tool];\n } else if (action !== undefined) {\n throw usageError(`Unknown policy action \"${action}\".`, usageFor('agents'));\n }\n\n const writing = Object.keys(change).length > 0;\n const confirmAccess = run.args.flags?.['confirm-access'] === true;\n if (confirmAccess && !writing) {\n throw usageError(\n '--confirm-access goes with a policy change.',\n `To confirm on its own: \"ekanos teams agents confirm ${team} ${key}\".`,\n );\n }\n const result = await run.client.call((token) =>\n call(run.host, token, TeamAgentPolicySchema, {\n method: writing ? 'PUT' : 'GET',\n path,\n source: run.source,\n ...(writing\n ? { body: { ...change, ...(confirmAccess ? { confirmAccess } : {}) } }\n : {}),\n }),\n );\n return ctx.succeed(\n { host: run.host, ...result },\n describePolicy(ctx, result, writing, run.source),\n );\n}\n\n/**\n * `teams agents skills <team> <key> [add|remove <skill>]` — the skills the\n * team's agent reads. A provided agent takes the team's own only where its\n * template allows (`teamCustomization.skills`); its template's stay.\n */\nasync function skills(\n ctx: CliContext,\n run: TeamAgentRun,\n team: string,\n key: string,\n path: string,\n): Promise<ExitCode> {\n const [action, slug, extra] = run.operands.slice(2);\n if (extra !== undefined) {\n throw usageError(`Unexpected argument \"${extra}\".`, usageFor('agents'));\n }\n let change: TeamAgentSkillsChange | null = null;\n if (action === 'add' || action === 'remove') {\n if (!slug) {\n throw usageError(\n `skills ${action} needs a skill slug.`,\n `e.g. \"ekanos teams agents skills ${team} ${key} ${action} refund-policy\". \"ekanos skills list --team ${team}\" lists the team's skills.`,\n );\n }\n change = { [action]: [slug.trim().toLowerCase()] };\n } else if (action !== undefined) {\n throw usageError(`Unknown skills action \"${action}\".`, usageFor('agents'));\n }\n\n const result = await run.client.call((token) =>\n call(run.host, token, TeamAgentSkillsSchema, {\n method: change ? 'PUT' : 'GET',\n path,\n source: run.source,\n ...(change ? { body: change } : {}),\n }),\n );\n return ctx.succeed(\n { host: run.host, ...result },\n describeSkills(ctx, result, change),\n );\n}\n\nfunction describeSkills(\n ctx: CliContext,\n result: TeamAgentSkills,\n change: TeamAgentSkillsChange | null,\n): string {\n const [verb, slug] = change?.add\n ? ['Attached', change.add[0]]\n : change?.remove\n ? ['Detached', change.remove[0]]\n : [null, null];\n const head = ctx.ui.result({\n title: verb\n ? `${verb} ${slug} ${verb === 'Attached' ? 'to' : 'from'} ${result.slug} on ${result.team.slug}`\n : `Skills of ${result.slug} on ${result.team.slug}`,\n tone: result.editable ? 'ok' : 'warn',\n rows: [\n [\n 'team skills',\n result.editable ? 'allowed' : 'no — follows the template',\n ],\n ],\n notes: result.lockedReason ? [result.lockedReason] : [],\n });\n if (result.skills.length === 0) return `${head}\\n\\nNo skills attached.`;\n return `${head}\\n\\n${ctx.ui.table(\n ['skill', 'name', 'from'],\n result.skills.map((skill) => [\n skill.slug,\n skill.name,\n skill.fromTemplate ? 'the template' : `${skill.level} skill`,\n ]),\n )}`;\n}\n\nfunction describePolicy(\n ctx: CliContext,\n policy: TeamAgentPolicy,\n changed: boolean,\n source: string,\n): string {\n // Absent from an older host: say nothing rather than guess.\n const unconfirmed = policy.accessConfirmed === false;\n const head = ctx.ui.result({\n title: changed\n ? `Policy updated for ${policy.slug} on ${policy.team.slug}`\n : `Policy of ${policy.slug} on ${policy.team.slug}`,\n tone: policy.editable && !unconfirmed ? 'ok' : 'warn',\n rows: [\n ['reads', policy.reads],\n ['writes', policy.writes],\n ['editable', policy.editable ? 'yes' : 'no — follows the template'],\n ],\n notes: [\n ...(policy.lockedReason ? [policy.lockedReason] : []),\n ...(unconfirmed\n ? [\n `Not confirmed: until you or one of the team's agent managers confirms what it may use, it uses only what needs no confirmation (a looser policy drops a confirmation). Confirm it as yourself with --confirm-access on the change, or for a provided agent ${confirmCommand(policy.team.slug, policy.key, source)}; a team manager can also confirm on its page in the app`,\n ]\n : []),\n ],\n });\n if (policy.tools.length === 0) {\n return `${head}\\n\\nNo tools yet: connect its integrations or MCP servers.`;\n }\n return `${head}\\n\\n${ctx.ui.table(\n ['tool', 'from', 'effect', 'runs'],\n policy.tools.map((tool) => [\n tool.name,\n tool.source,\n tool.effect,\n `${tool.decision === 'auto' ? 'on its own' : 'waits for approval'}${tool.overridden ? ' (set per tool)' : ''}`,\n ]),\n )}`;\n}\n\n/**\n * The version `confirm` is about to approve — the one it runs — printed\n * before it is sent, so the person confirms what they saw. Null when the\n * team's agent has no version to name.\n */\nasync function shownVersion(\n ctx: CliContext,\n run: TeamAgentRun,\n base: string,\n key: string,\n): Promise<number | null> {\n const list = await run.client.call((token) =>\n call(run.host, token, TeamAgentListSchema, {\n method: 'GET',\n path: base,\n source: run.source,\n }),\n );\n const agent = list.agents.find((entry) => entry.key === key)?.agent;\n if (!agent || agent.version === null) return null;\n ctx.log(\n `Confirming what ${key} v${agent.version} on ${list.team.slug} may use${agent.runsAs ? ` (it runs as ${agent.runsAs})` : ''}.`,\n );\n return agent.version;\n}\n\nfunction change(\n run: TeamAgentRun,\n path: string,\n method: 'POST' | 'PUT',\n body: unknown,\n): Promise<TeamAgentChangeResult> {\n return run.client.call((token) =>\n call(run.host, token, TeamAgentChangeResultSchema, {\n method,\n path,\n source: run.source,\n body,\n }),\n );\n}\n\nfunction describeEntry(\n entry: TeamAgentEntry,\n team: string,\n source: string,\n): string {\n const readiness = agentReadiness(entry, { team, source });\n if (!entry.agent) {\n return `\\n${entry.key} — ${entry.name}\\n off · v${entry.publishedVersion ?? '?'} published\\n ${liveLine(readiness)} · Next: ${readiness.next}`;\n }\n const agent = entry.agent;\n const version = versionLabel(agent);\n const lines = [\n `\\n${entry.key} — ${entry.name}`,\n ` ${agent.status} · ${version} · runs as ${agent.runsAs ?? 'nobody'}${agent.accessConfirmed ? '' : ` · access not confirmed (${confirmCommand(team, entry.key, source)})`}`,\n ` triggers: ${agent.triggers.length === 0 ? 'none' : agent.triggers.map((trigger) => `${trigger.type}${trigger.enabled ? '' : ' (off)'}`).join(', ')}`,\n ` links: ${agent.links.length === 0 ? 'none' : agent.links.map((link) => `${link.kind}${link.mode ? `/${link.mode}` : ''} → ${link.to}`).join(', ')}`,\n ];\n lines.push(\n ...requirementLines(agent.requirements, agent.missing, team, source),\n );\n if (agent.draft) lines.push(...draftLines(team, entry.key));\n lines.push(...channelLines(agent.channels ?? [], team, source));\n lines.push(\n ` ${liveLine(readiness)}${readiness.next ? ` · Next: ${readiness.next}` : ''}`,\n );\n return lines.join('\\n');\n}\n\nfunction versionLabel(agent: {\n version: number | null;\n pinned: boolean;\n draft?: boolean;\n}): string {\n if (agent.draft)\n return `draft v${agent.version ?? '?'} (testing, unpublished)`;\n return `v${agent.version ?? '?'} ${agent.pinned ? '(pinned)' : '(following)'}`;\n}\n\n/** What testing a draft on a team means, and the next step. */\nfunction draftLines(team: string, key: string): string[] {\n return [\n ' Only this team runs the draft, and only when started by hand: its triggers, schedules and hand-offs do not start it, and every write waits for approval.',\n ` Test it: ekanos agents test ${key} --team ${team} --prompt \"…\" --follow. Publishing (ekanos agents publish ${key}) puts this team back to following.`,\n ];\n}\n\n/**\n * An older host ignores `draft` and would have turned on, or unpinned to,\n * the published version instead. Say so rather than report a draft test\n * that is not happening.\n */\nfunction requireDraftHost(\n result: TeamAgentChangeResult,\n verb: 'enabled' | 'pinned',\n) {\n if (result.draft === true) return;\n throw invalidStateError(\n `This host does not support testing a draft on one team: it ${verb} ${result.slug} on v${result.version ?? '?'} ${result.pinned ? '(pinned)' : '(following)'} instead.`,\n `Check with \"ekanos teams agents list ${result.team.slug}\", and test once the host is updated.`,\n );\n}\n\n/**\n * What the agent still needs connected, each with why and the command that\n * makes it; then any product working on another connection than the one its\n * template names (the Source connection unusable, the team's own used).\n */\nexport function requirementLines(\n requirements: Requirement[],\n missing: Requirement[],\n team: string,\n source: string,\n): string[] {\n const missingLines = missing.flatMap((item) => {\n const fix = requirementFix(item, team, source);\n return [\n ` ✗ missing: ${item.name} (${item.kind === 'mcp' ? 'MCP server' : 'integration'} ${item.key})${item.reason && item.reason !== 'not_connected' ? ` — ${REASON_WORDS[item.reason]}` : ''}`,\n ...(fix ? [` → ${fix}`] : []),\n ];\n });\n const fallbacks = requirements\n .filter(\n (item) =>\n item.connected &&\n item.reason !== undefined &&\n item.reason !== null &&\n item.reason !== 'not_connected',\n )\n .flatMap((item) => {\n const fix = requirementFix(item, team, source);\n return [\n ` ! ${item.name} uses the team's own connection: ${REASON_WORDS[item.reason!]}`,\n ...(fix ? [` → ${fix}`] : []),\n ];\n });\n return [...missingLines, ...fallbacks];\n}\n\n/**\n * What the agent's triggers need installed before they can fire: missing\n * ones first, each with the command that installs it. A trigger listed above\n * with its channel missing here is one that will never start a run.\n */\nexport function channelLines(\n channels: ChannelRequirement[],\n team: string,\n source: string,\n): string[] {\n return channels.flatMap((channel) =>\n channel.ready\n ? [\n channel.arrival === undefined || channel.arrival === 'install'\n ? ` ✓ ${channel.name} installed — ${channel.triggers.join(', ')} can fire`\n : ` ✓ ${channel.triggers.join(', ')} reachable (${reachedVia(channel)}${channel.lastDeliveryAt ? `, last delivery ${channel.lastDeliveryAt}` : ''}) — can fire`,\n ]\n : [\n ` ✗ missing: ${channel.problem ?? `${channel.name} not ready`} — ${channel.triggers.join(', ')} can never fire until it is`,\n ` → ${fixLine(channelFix(channel, team, source))}`,\n ],\n );\n}\n\nfunction describeChange(\n result: TeamAgentChangeResult,\n title: string,\n source: string,\n options: { confirmRequested?: boolean } = {},\n): string {\n const covers = result.access ? describeAccess(result.access) : null;\n const lines = [\n `${options.confirmRequested && !result.accessConfirmed ? '!' : '✓'} ${title}`,\n ` ${result.status} · ${versionLabel(result)} · runs as ${result.runsAs ?? 'nobody'}`,\n ];\n if (result.accessConfirmed) {\n if (covers) {\n lines.push(\n ` Confirmed: in runs no one watches it may use ${result.runsAs ? `${result.runsAs}'s` : 'their'} connections to ${covers}.`,\n );\n }\n } else {\n if (options.confirmRequested) {\n // An older host ignores confirmAccess rather than refusing it.\n lines.push(\n ' This host did not record the confirmation: it may not support confirming from the CLI yet.',\n );\n }\n lines.push(\n ` Not confirmed: until you or one of the team's agent managers confirms what it may use${covers ? ` (${result.runsAs ? `${result.runsAs}'s` : 'its'} connections, to ${covers})` : ''}, it uses only what needs no confirmation.`,\n ` → ${confirmCommand(result.team.slug, result.key, source)}`,\n );\n }\n lines.push(...requirementLines([], result.missing, result.team.slug, source));\n if (result.draft) lines.push(...draftLines(result.team.slug, result.key));\n lines.push(...channelLines(result.channels ?? [], result.team.slug, source));\n return lines.join('\\n');\n}\n\n/** What a confirmation covers, in words: whose connections, to what. */\nexport function describeAccess(access: TeamAgentAccess): string {\n if (access.scope === 'all') return 'every tool of every product they connect';\n if (access.scope === 'read_only')\n return 'read from every product they connect';\n const parts = [\n ...access.products.map((product) => `${product.name} (every tool)`),\n ...access.tools,\n ];\n return parts.length > 0\n ? parts.join(', ')\n : 'nothing yet (no products granted)';\n}\n\nfunction confirmCommand(team: string, key: string, source: string): string {\n return `ekanos teams agents confirm ${team} ${key} --source ${source}`;\n}\n\nfunction expectOperands(run: TeamAgentRun, count: number) {\n const extra = run.operands[count];\n if (extra !== undefined) {\n throw usageError(`Unexpected argument \"${extra}\".`, usageFor('agents'));\n }\n}\n\nfunction stringFlag(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\nfunction parseApproval(value: string | undefined): 'auto' | 'approve' | null {\n return value === 'auto' || value === 'approve' ? value : null;\n}\n\nfunction approvalFlag(\n run: TeamAgentRun,\n name: 'reads' | 'writes',\n): 'auto' | 'approve' | undefined {\n const value = stringFlag(run, name);\n if (value === undefined) return undefined;\n const mode = parseApproval(value);\n if (!mode) {\n throw usageError(`--${name} takes auto or approve.`, usageFor('agents'));\n }\n return mode;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"team-agents-agents.js","sourceRoot":"","sources":["../../src/commands/team-agents-agents.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AgentRunListSchema,\n type ChannelRequirement,\n type Requirement,\n type TeamAgentAccess,\n type TeamAgentChangeResult,\n TeamAgentChangeResultSchema,\n type TeamAgentEntry,\n TeamAgentListSchema,\n type TeamAgentPolicy,\n type TeamAgentPolicyChange,\n TeamAgentPolicySchema,\n type TeamAgentSkills,\n type TeamAgentSkillsChange,\n TeamAgentSkillsSchema,\n type TeamAgentTagsChange,\n TeamAgentTagsSchema,\n type TeamOwnAgent,\n} from '@ekanos/integration-schema';\n\nimport type { CliContext } from '../context';\nimport { invalidStateError, notFoundError, usageError } from '../errors';\nimport type { ExitCode } from '../exit-codes';\nimport { cli } from '../invocation';\nimport { call, listTeamEvents } from '../teams-api';\nimport {\n REASON_WORDS,\n agentReadiness,\n channelFix,\n describeAgentReadiness,\n fixLine,\n liveLine,\n reachedVia,\n requirementFix,\n} from './team-agent-readiness';\nimport { type TeamAgentRun, requireOperand, usageFor } from './team-agents';\nimport { runTeamAgentDefine } from './team-agents-define';\nimport { confirmChange } from './teams-lifecycle';\n\n/**\n * `ekanos teams agents list|show|create|apply|enable|confirm|disable|archive|unarchive|pin|unpin|policy|skills|tags` —\n * a team's provided agents, turned on, versioned, given an approval policy\n * and skills by the Source admin; and the team's own and personal agents,\n * made and changed from an agent.json with `create|apply`\n * (team-agents-define.ts), turned on with `enable`. A personal agent is\n * listed and shown to everyone, and changed by its creator alone. `enable|pin … --draft` puts one team on\n * the template's latest, unpublished version to test it there before\n * publishing. `confirm` (and `--confirm-access`) records the caller's own\n * confirmation that it may use its connections in runs no one watches:\n * whoever sets an agent up confirms it (plan 247.2), never a member.\n * `show` answers \"is this agent live, and if not, why?\" for one agent; `list`\n * ends each agent with the same verdict.\n */\nexport async function runTeamAgentsArea(\n ctx: CliContext,\n run: TeamAgentRun,\n): Promise<ExitCode> {\n const team = requireOperand(run.operands[0], 'team slug', 'agents');\n const base = `/api/partner/teams/${encodeURIComponent(team)}/agents`;\n\n if (run.verb === 'list') {\n expectOperands(run, 1);\n const list = await run.client.call((token) =>\n call(run.host, token, TeamAgentListSchema, {\n method: 'GET',\n path: base,\n source: run.source,\n }),\n );\n const target = { team: list.team.slug, source: run.source };\n const own = list.ownAgents ?? [];\n return ctx.succeed(\n {\n host: run.host,\n ...list,\n agents: list.agents.map((entry) => ({\n ...entry,\n readiness: agentReadiness(entry, target),\n })),\n },\n [\n ctx.ui.result({\n title:\n list.agents.length === 0 && own.length === 0\n ? `No agents are provided for ${list.team.slug}`\n : `Agents for ${list.team.slug}`,\n tone: list.agents.length === 0 && own.length === 0 ? 'warn' : 'ok',\n }),\n ...list.agents.map((entry) =>\n describeEntry(entry, list.team.slug, run.source),\n ),\n ...(own.length > 0\n ? [\n `\nThe team's own and personal agents:`,\n ...own.map((agent) =>\n describeOwnAgent(agent, list.team.slug, run.source),\n ),\n ]\n : []),\n list.mcpServers.length > 0\n ? `\\nMCP servers: ${list.mcpServers.map((server) => `${server.key} (${server.status})`).join(', ')}`\n : '',\n ]\n .filter(Boolean)\n .join('\\n'),\n );\n }\n\n if (run.verb === 'create' || run.verb === 'apply') {\n return runTeamAgentDefine(ctx, run, run.verb);\n }\n\n const key = requireOperand(run.operands[1], 'agent key', 'agents');\n const path = `${base}/${encodeURIComponent(key)}`;\n\n switch (run.verb) {\n case 'show':\n expectOperands(run, 2);\n return show(ctx, run, base, key);\n case 'enable': {\n expectOperands(run, 2);\n const as = stringFlag(run, 'as');\n const draft = run.args.flags?.draft === true;\n const confirmAccess = run.args.flags?.['confirm-access'] === true;\n const result = await change(run, `${path}/enable`, 'POST', {\n ...(as ? { as } : {}),\n ...(draft ? { draft: true } : {}),\n ...(confirmAccess ? { confirmAccess: true } : {}),\n });\n if (draft) requireDraftHost(result, 'enabled');\n return ctx.succeed(\n { host: run.host, ...result },\n describeChange(\n result,\n `${\n draft\n ? `Testing draft v${result.version ?? '?'} of ${result.slug} on ${result.team.slug}`\n : `Turned on ${result.slug} for ${result.team.slug}`\n }${confirmAccess && result.accessConfirmed ? ', and you confirmed what it may use' : ''}`,\n run.source,\n { confirmRequested: confirmAccess },\n ),\n );\n }\n case 'confirm': {\n expectOperands(run, 2);\n // Confirm what the person is shown, never a publish that lands after:\n // the host refuses if the version moved (AGENT_VERSION_CHANGED).\n const shown = await shownVersion(ctx, run, base, key);\n const result = await change(\n run,\n `${path}/confirm`,\n 'POST',\n shown === null ? {} : { expectedVersion: shown },\n );\n return ctx.succeed(\n { host: run.host, ...result },\n describeChange(\n result,\n `You confirmed what ${result.slug} on ${result.team.slug} may use`,\n run.source,\n { confirmRequested: true },\n ),\n );\n }\n case 'disable': {\n expectOperands(run, 2);\n if (!run.args.yes) {\n throw invalidStateError(\n `Turning ${key} off for ${team} pauses it: nothing starts it for that team until it is turned on again, and turning it on is refused once the person it runs as has left the team.`,\n `Re-run with --yes: ekanos teams agents disable ${team} ${key} --yes`,\n );\n }\n const result = await change(run, `${path}/disable`, 'POST', {});\n return ctx.succeed(\n { host: run.host, ...result },\n describeChange(\n result,\n `Turned off ${result.slug} for ${result.team.slug}`,\n run.source,\n ),\n );\n }\n case 'pin': {\n if (run.args.flags?.draft === true) {\n expectOperands(run, 2);\n const result = await change(run, `${path}/pin`, 'PUT', {\n version: null,\n draft: true,\n });\n requireDraftHost(result, 'pinned');\n return ctx.succeed(\n { host: run.host, ...result },\n describeChange(\n result,\n `Testing draft v${result.version ?? '?'} of ${result.slug} on ${result.team.slug}`,\n run.source,\n ),\n );\n }\n expectOperands(run, 3);\n const version = Number(run.operands[2]);\n if (!Number.isInteger(version) || version < 1) {\n throw usageError(\n run.operands[2]\n ? `\"${run.operands[2]}\" is not a version number.`\n : 'Name the version to pin.',\n `e.g. \"ekanos teams agents pin ${team} ${key} 3\", or \"--draft\" to test the unpublished draft. \"ekanos agents show ${key}\" lists its versions.`,\n );\n }\n const result = await change(run, `${path}/pin`, 'PUT', { version });\n return ctx.succeed(\n { host: run.host, ...result },\n describeChange(\n result,\n `${result.team.slug} stays on v${result.version ?? version} of ${result.slug}`,\n run.source,\n ),\n );\n }\n case 'unpin': {\n expectOperands(run, 2);\n const result = await change(run, `${path}/pin`, 'PUT', { version: null });\n return ctx.succeed(\n { host: run.host, ...result },\n describeChange(\n result,\n `${result.team.slug} follows each published version of ${result.slug}`,\n run.source,\n ),\n );\n }\n case 'archive': {\n expectOperands(run, 2);\n // Asked before any request: a script or an agent run passes --yes.\n if (!run.args.yes) {\n await confirmChange(ctx, run.args, {\n what: `Archiving ${key} on ${team} takes it off the team's list: nothing starts it until it is unarchived and turned on again. Its runs, approvals and setup are kept.`,\n command: `${cli()} teams agents archive ${team} ${key} --yes`,\n question: `Archive ${key} on ${team}? [y/N]`,\n });\n }\n const result = await change(run, `${path}/archive`, 'POST', {});\n return ctx.succeed(\n { host: run.host, ...result },\n [\n `✓ Archived ${result.slug} on ${result.team.slug}`,\n ` Bring it back, paused: ${cli()} teams agents unarchive ${result.team.slug} ${result.slug} --source ${run.source}`,\n ].join('\\n'),\n );\n }\n case 'unarchive': {\n expectOperands(run, 2);\n const result = await change(run, `${path}/unarchive`, 'POST', {});\n return ctx.succeed(\n { host: run.host, ...result },\n [\n `✓ Unarchived ${result.slug} on ${result.team.slug}: it is paused`,\n ` runs as ${result.runsAs ?? 'nobody'}`,\n ` Next: ${cli()} teams agents enable ${result.team.slug} ${result.slug} --source ${run.source}`,\n ].join('\\n'),\n );\n }\n case 'tags':\n return tags(ctx, run, team, key, `${path}/tags`);\n case 'policy':\n return policy(ctx, run, team, key, `${path}/policy`);\n case 'skills':\n return skills(ctx, run, team, key, `${path}/skills`);\n default:\n throw usageError(\n `Unknown teams agents subcommand \"${run.verb}\".`,\n usageFor('agents'),\n );\n }\n}\n\n/**\n * One agent on one team: each product and whose connection it acts through,\n * each trigger and how its events reach the agent (with the last event and\n * the last run), access, \"Live: yes/no\" and exactly one Next. Reads the\n * team's agents, then its recent runs and events; a host without the\n * activity reads still answers the rest.\n */\nasync function show(\n ctx: CliContext,\n run: TeamAgentRun,\n base: string,\n key: string,\n): Promise<ExitCode> {\n const list = await run.client.call((token) =>\n call(run.host, token, TeamAgentListSchema, {\n method: 'GET',\n path: base,\n source: run.source,\n }),\n );\n const entry = list.agents.find((candidate) => candidate.key === key);\n // The host finds an agent by its own slug first, as here: a team agent\n // named like a template that is not turned on is the team agent.\n const own = entry?.agent\n ? undefined\n : list.ownAgents?.find((candidate) => candidate.slug === key);\n if (own) {\n return ctx.succeed(\n { host: run.host, team: list.team, ownAgent: own },\n describeOwnAgent(own, list.team.slug, run.source).trimStart(),\n );\n }\n if (!entry) {\n throw notFoundError(\n `No agent \"${key}\" is provided for ${list.team.slug}.`,\n `\"ekanos teams agents list ${list.team.slug}\" lists the agents provided for it.`,\n );\n }\n const target = { team: list.team.slug, source: run.source };\n const readiness = agentReadiness(entry, target);\n const [runs, events] = entry.agent\n ? await Promise.all([\n activity(ctx, 'runs', () =>\n run.client.call((token) =>\n call(run.host, token, AgentRunListSchema, {\n method: 'GET',\n path: `/api/partner/teams/${encodeURIComponent(target.team)}/runs?agent=${encodeURIComponent(key)}`,\n source: run.source,\n }),\n ),\n ),\n entry.agent.triggers.some((trigger) => trigger.eventId)\n ? activity(ctx, 'events', () =>\n run.client.call((token) =>\n listTeamEvents(\n run.host,\n token,\n { source: run.source, team: target.team },\n { limit: 100 },\n ),\n ),\n )\n : Promise.resolve(null),\n ])\n : [null, null];\n\n return ctx.succeed(\n {\n host: run.host,\n team: list.team,\n agent: entry,\n readiness,\n lastRun: runs?.runs[0] ?? null,\n recentEvents: events\n ? events.events.filter((event) =>\n entry.agent?.triggers.some(\n (trigger) => trigger.eventId === event.eventId,\n ),\n )\n : null,\n },\n describeAgentReadiness(\n entry,\n target,\n readiness,\n {\n runs: runs?.runs ?? null,\n events: events?.events ?? null,\n },\n list.scope,\n ),\n );\n}\n\n/** A read `show` can do without: on failure, say so and carry on. */\nasync function activity<T>(\n ctx: CliContext,\n what: string,\n read: () => Promise<T>,\n): Promise<T | null> {\n try {\n return await read();\n } catch (error) {\n ctx.log(\n `Could not read the team's recent ${what}: ${error instanceof Error ? error.message : String(error)}`,\n );\n return null;\n }\n}\n\nasync function policy(\n ctx: CliContext,\n run: TeamAgentRun,\n team: string,\n key: string,\n path: string,\n): Promise<ExitCode> {\n const [action, tool, decision] = run.operands.slice(2);\n const change: TeamAgentPolicyChange = {};\n const reads = approvalFlag(run, 'reads');\n const writes = approvalFlag(run, 'writes');\n if (reads) change.reads = reads;\n if (writes) change.writes = writes;\n\n if (action === 'set') {\n const mode = parseApproval(decision);\n if (!tool || !mode) {\n throw usageError(\n 'policy set needs a tool and auto|approve.',\n `e.g. \"ekanos teams agents policy ${team} ${key} set zendesk_reply_to_ticket approve\".`,\n );\n }\n change.set = { [tool]: mode };\n } else if (action === 'unset') {\n if (!tool || decision) {\n throw usageError(\n 'policy unset needs exactly one tool.',\n `e.g. \"ekanos teams agents policy ${team} ${key} unset zendesk_reply_to_ticket\".`,\n );\n }\n change.unset = [tool];\n } else if (action !== undefined) {\n throw usageError(`Unknown policy action \"${action}\".`, usageFor('agents'));\n }\n\n const writing = Object.keys(change).length > 0;\n const confirmAccess = run.args.flags?.['confirm-access'] === true;\n if (confirmAccess && !writing) {\n throw usageError(\n '--confirm-access goes with a policy change.',\n `To confirm on its own: \"ekanos teams agents confirm ${team} ${key}\".`,\n );\n }\n const result = await run.client.call((token) =>\n call(run.host, token, TeamAgentPolicySchema, {\n method: writing ? 'PUT' : 'GET',\n path,\n source: run.source,\n ...(writing\n ? { body: { ...change, ...(confirmAccess ? { confirmAccess } : {}) } }\n : {}),\n }),\n );\n return ctx.succeed(\n { host: run.host, ...result },\n describePolicy(ctx, result, writing, run.source),\n );\n}\n\n/**\n * `teams agents skills <team> <key> [add|remove <skill>]` — the skills the\n * team's agent reads. A provided agent takes the team's own only where its\n * template allows (`teamCustomization.skills`); its template's stay.\n */\nasync function skills(\n ctx: CliContext,\n run: TeamAgentRun,\n team: string,\n key: string,\n path: string,\n): Promise<ExitCode> {\n const [action, slug, extra] = run.operands.slice(2);\n if (extra !== undefined) {\n throw usageError(`Unexpected argument \"${extra}\".`, usageFor('agents'));\n }\n let change: TeamAgentSkillsChange | null = null;\n if (action === 'add' || action === 'remove') {\n if (!slug) {\n throw usageError(\n `skills ${action} needs a skill slug.`,\n `e.g. \"ekanos teams agents skills ${team} ${key} ${action} refund-policy\". \"ekanos skills list --team ${team}\" lists the team's skills.`,\n );\n }\n change = { [action]: [slug.trim().toLowerCase()] };\n } else if (action !== undefined) {\n throw usageError(`Unknown skills action \"${action}\".`, usageFor('agents'));\n }\n\n const result = await run.client.call((token) =>\n call(run.host, token, TeamAgentSkillsSchema, {\n method: change ? 'PUT' : 'GET',\n path,\n source: run.source,\n ...(change ? { body: change } : {}),\n }),\n );\n return ctx.succeed(\n { host: run.host, ...result },\n describeSkills(ctx, result, change),\n );\n}\n\n/**\n * `teams agents tags <team> <key> [add|remove <tag>]` — the labels that\n * organize the team's agents; they grant nothing. A tag the team does not\n * have yet is made when it is added, as the app's New tag makes it.\n */\nasync function tags(\n ctx: CliContext,\n run: TeamAgentRun,\n team: string,\n key: string,\n path: string,\n): Promise<ExitCode> {\n const [action, tag, extra] = run.operands.slice(2);\n if (extra !== undefined) {\n throw usageError(\n `Unexpected argument \"${extra}\".`,\n 'Quote a tag name with spaces, e.g. \"Customer support\".',\n );\n }\n let change: TeamAgentTagsChange | null = null;\n if (action === 'add' || action === 'remove') {\n if (!tag?.trim()) {\n throw usageError(\n `tags ${action} needs a tag.`,\n `e.g. ${cli()} teams agents tags ${team} ${key} ${action} \"Customer support\"`,\n );\n }\n change = { [action]: tag.trim() };\n } else if (action !== undefined) {\n throw usageError(`Unknown tags action \"${action}\".`, usageFor('agents'));\n }\n\n const result = await run.client.call((token) =>\n call(run.host, token, TeamAgentTagsSchema, {\n method: change ? 'PUT' : 'GET',\n path,\n source: run.source,\n ...(change ? { body: change } : {}),\n }),\n );\n const title = change?.add\n ? `Tagged ${result.slug} on ${result.team.slug} \"${change.add}\"`\n : change?.remove\n ? `Took the tag \"${change.remove}\" off ${result.slug} on ${result.team.slug}`\n : `Tags of ${result.slug} on ${result.team.slug}`;\n const lines = [\n ctx.ui.result({\n title,\n tone: 'ok',\n rows: [\n [\n 'tags',\n result.tags.length === 0\n ? 'none'\n : result.tags.map((item) => item.name).join(', '),\n ],\n ],\n notes: result.createdTag\n ? [\n `${result.team.slug} had no tag \"${result.createdTag.name}\": it was made.`,\n ]\n : [],\n }),\n ];\n const others = result.teamTags.filter(\n (item) => !result.tags.some((on) => on.slug === item.slug),\n );\n if (!change && others.length > 0) {\n lines.push(\n `\\nThe team's other tags: ${others.map((item) => item.name).join(', ')}`,\n );\n }\n return ctx.succeed({ host: run.host, ...result }, lines.join('\\n'));\n}\n\nfunction describeSkills(\n ctx: CliContext,\n result: TeamAgentSkills,\n change: TeamAgentSkillsChange | null,\n): string {\n const [verb, slug] = change?.add\n ? ['Attached', change.add[0]]\n : change?.remove\n ? ['Detached', change.remove[0]]\n : [null, null];\n const head = ctx.ui.result({\n title: verb\n ? `${verb} ${slug} ${verb === 'Attached' ? 'to' : 'from'} ${result.slug} on ${result.team.slug}`\n : `Skills of ${result.slug} on ${result.team.slug}`,\n tone: result.editable ? 'ok' : 'warn',\n rows: [\n [\n 'team skills',\n result.editable ? 'allowed' : 'no — follows the template',\n ],\n ],\n notes: result.lockedReason ? [result.lockedReason] : [],\n });\n if (result.skills.length === 0) return `${head}\\n\\nNo skills attached.`;\n return `${head}\\n\\n${ctx.ui.table(\n ['skill', 'name', 'from'],\n result.skills.map((skill) => [\n skill.slug,\n skill.name,\n skill.fromTemplate ? 'the template' : `${skill.level} skill`,\n ]),\n )}`;\n}\n\nfunction describePolicy(\n ctx: CliContext,\n policy: TeamAgentPolicy,\n changed: boolean,\n source: string,\n): string {\n // Absent from an older host: say nothing rather than guess.\n const unconfirmed = policy.accessConfirmed === false;\n const head = ctx.ui.result({\n title: changed\n ? `Policy updated for ${policy.slug} on ${policy.team.slug}`\n : `Policy of ${policy.slug} on ${policy.team.slug}`,\n tone: policy.editable && !unconfirmed ? 'ok' : 'warn',\n rows: [\n ['reads', policy.reads],\n ['writes', policy.writes],\n ['editable', policy.editable ? 'yes' : 'no — follows the template'],\n ],\n notes: [\n ...(policy.lockedReason ? [policy.lockedReason] : []),\n ...(unconfirmed\n ? [\n `Not confirmed: until you or one of the team's agent managers confirms what it may use, it uses only what needs no confirmation (a looser policy drops a confirmation). Confirm it as yourself with --confirm-access on the change, or for a provided agent ${confirmCommand(policy.team.slug, policy.key, source)}; a team manager can also confirm on its page in the app`,\n ]\n : []),\n ],\n });\n if (policy.tools.length === 0) {\n return `${head}\\n\\nNo tools yet: connect its integrations or MCP servers.`;\n }\n return `${head}\\n\\n${ctx.ui.table(\n ['tool', 'from', 'effect', 'runs'],\n policy.tools.map((tool) => [\n tool.name,\n tool.source,\n tool.effect,\n `${tool.decision === 'auto' ? 'on its own' : 'waits for approval'}${tool.overridden ? ' (set per tool)' : ''}`,\n ]),\n )}`;\n}\n\n/**\n * The version `confirm` is about to approve — the one it runs — printed\n * before it is sent, so the person confirms what they saw. Null when the\n * team's agent has no version to name.\n */\nasync function shownVersion(\n ctx: CliContext,\n run: TeamAgentRun,\n base: string,\n key: string,\n): Promise<number | null> {\n const list = await run.client.call((token) =>\n call(run.host, token, TeamAgentListSchema, {\n method: 'GET',\n path: base,\n source: run.source,\n }),\n );\n const own = list.ownAgents?.find((entry) => entry.slug === key);\n if (own) {\n ctx.log(\n `Confirming what ${key} v${own.version} on ${list.team.slug} may use (it runs as ${own.createdBy ?? 'nobody'}).`,\n );\n return own.version;\n }\n const agent = list.agents.find((entry) => entry.key === key)?.agent;\n if (!agent || agent.version === null) return null;\n ctx.log(\n `Confirming what ${key} v${agent.version} on ${list.team.slug} may use${agent.runsAs ? ` (it runs as ${agent.runsAs})` : ''}.`,\n );\n return agent.version;\n}\n\nfunction change(\n run: TeamAgentRun,\n path: string,\n method: 'POST' | 'PUT',\n body: unknown,\n): Promise<TeamAgentChangeResult> {\n return run.client.call((token) =>\n call(run.host, token, TeamAgentChangeResultSchema, {\n method,\n path,\n source: run.source,\n body,\n }),\n );\n}\n\nfunction describeEntry(\n entry: TeamAgentEntry,\n team: string,\n source: string,\n): string {\n const readiness = agentReadiness(entry, { team, source });\n if (!entry.agent) {\n return `\\n${entry.key} — ${entry.name}\\n off · v${entry.publishedVersion ?? '?'} published\\n ${liveLine(readiness)} · Next: ${readiness.next}`;\n }\n const agent = entry.agent;\n const version = versionLabel(agent);\n const lines = [\n `\\n${entry.key} — ${entry.name}`,\n ` ${agent.status} · ${version} · runs as ${agent.runsAs ?? 'nobody'}${agent.accessConfirmed ? '' : ` · access not confirmed (${confirmCommand(team, entry.key, source)})`}`,\n ` triggers: ${agent.triggers.length === 0 ? 'none' : agent.triggers.map((trigger) => `${trigger.type}${trigger.enabled ? '' : ' (off)'}`).join(', ')}`,\n ` links: ${agent.links.length === 0 ? 'none' : agent.links.map((link) => `${link.kind}${link.mode ? `/${link.mode}` : ''} → ${link.to}`).join(', ')}`,\n ];\n lines.push(\n ...requirementLines(agent.requirements, agent.missing, team, source),\n );\n if (agent.draft) lines.push(...draftLines(team, entry.key));\n lines.push(...channelLines(agent.channels ?? [], team, source));\n lines.push(\n ` ${liveLine(readiness)}${readiness.next ? ` · Next: ${readiness.next}` : ''}`,\n );\n return lines.join('\\n');\n}\n\n/**\n * One of the team's own agents, or a personal one: whose it is, its version\n * (what `apply --base-version` names), its triggers, and the next step.\n */\nfunction describeOwnAgent(\n agent: TeamOwnAgent,\n team: string,\n source: string,\n): string {\n const personal = agent.ownership === 'personal';\n const whose = personal\n ? `personal agent of ${agent.yours ? 'yours' : (agent.createdBy ?? 'a former member')}`\n : `team agent · runs as ${agent.createdBy ?? 'nobody'}`;\n const lines = [\n `\n${agent.slug} — ${agent.name}`,\n ` ${agent.status} · v${agent.version} · ${whose}${agent.accessConfirmed ? '' : ' · access not confirmed'}`,\n ` triggers: ${agent.triggers.length === 0 ? 'none' : agent.triggers.map((trigger) => `${trigger.type}${trigger.enabled ? '' : ' (off)'}`).join(', ')}`,\n ];\n if (personal && !agent.yours) {\n lines.push(\n ' Only its creator changes it, runs it, decides its approvals or reads its runs.',\n );\n } else if (agent.status !== 'active') {\n lines.push(\n ` Next: ekanos teams agents enable ${team} ${agent.slug} --source ${source}`,\n );\n } else if (!agent.accessConfirmed) {\n lines.push(` Next: ${confirmCommand(team, agent.slug, source)}`);\n }\n return lines.join('\\n');\n}\n\nfunction versionLabel(agent: {\n version: number | null;\n pinned: boolean;\n draft?: boolean;\n}): string {\n if (agent.draft)\n return `draft v${agent.version ?? '?'} (testing, unpublished)`;\n return `v${agent.version ?? '?'} ${agent.pinned ? '(pinned)' : '(following)'}`;\n}\n\n/** What testing a draft on a team means, and the next step. */\nfunction draftLines(team: string, key: string): string[] {\n return [\n ' Only this team runs the draft, and only when started by hand: its triggers, schedules and hand-offs do not start it, and every write waits for approval.',\n ` Test it: ekanos agents test ${key} --team ${team} --prompt \"…\" --follow. Publishing (ekanos agents publish ${key}) puts this team back to following.`,\n ];\n}\n\n/**\n * An older host ignores `draft` and would have turned on, or unpinned to,\n * the published version instead. Say so rather than report a draft test\n * that is not happening.\n */\nfunction requireDraftHost(\n result: TeamAgentChangeResult,\n verb: 'enabled' | 'pinned',\n) {\n if (result.draft === true) return;\n throw invalidStateError(\n `This host does not support testing a draft on one team: it ${verb} ${result.slug} on v${result.version ?? '?'} ${result.pinned ? '(pinned)' : '(following)'} instead.`,\n `Check with \"ekanos teams agents list ${result.team.slug}\", and test once the host is updated.`,\n );\n}\n\n/**\n * What the agent still needs connected, each with why and the command that\n * makes it; then any product working on another connection than the one its\n * template names (the Source connection unusable, the team's own used).\n */\nexport function requirementLines(\n requirements: Requirement[],\n missing: Requirement[],\n team: string,\n source: string,\n): string[] {\n const missingLines = missing.flatMap((item) => {\n const fix = requirementFix(item, team, source);\n return [\n ` ✗ missing: ${item.name} (${item.kind === 'mcp' ? 'MCP server' : 'integration'} ${item.key})${item.reason && item.reason !== 'not_connected' ? ` — ${REASON_WORDS[item.reason]}` : ''}`,\n ...(fix ? [` → ${fix}`] : []),\n ];\n });\n const fallbacks = requirements\n .filter(\n (item) =>\n item.connected &&\n item.reason !== undefined &&\n item.reason !== null &&\n item.reason !== 'not_connected',\n )\n .flatMap((item) => {\n const fix = requirementFix(item, team, source);\n return [\n ` ! ${item.name} uses the team's own connection: ${REASON_WORDS[item.reason!]}`,\n ...(fix ? [` → ${fix}`] : []),\n ];\n });\n return [...missingLines, ...fallbacks];\n}\n\n/**\n * What the agent's triggers need installed before they can fire: missing\n * ones first, each with the command that installs it. A trigger listed above\n * with its channel missing here is one that will never start a run.\n */\nexport function channelLines(\n channels: ChannelRequirement[],\n team: string,\n source: string,\n): string[] {\n return channels.flatMap((channel) =>\n channel.ready\n ? [\n channel.arrival === undefined || channel.arrival === 'install'\n ? ` ✓ ${channel.name} installed — ${channel.triggers.join(', ')} can fire`\n : ` ✓ ${channel.triggers.join(', ')} reachable (${reachedVia(channel)}${channel.lastDeliveryAt ? `, last delivery ${channel.lastDeliveryAt}` : ''}) — can fire`,\n ]\n : [\n ` ✗ missing: ${channel.problem ?? `${channel.name} not ready`} — ${channel.triggers.join(', ')} can never fire until it is`,\n ` → ${fixLine(channelFix(channel, team, source))}`,\n ],\n );\n}\n\nfunction describeChange(\n result: TeamAgentChangeResult,\n title: string,\n source: string,\n options: { confirmRequested?: boolean } = {},\n): string {\n const covers = result.access ? describeAccess(result.access) : null;\n const lines = [\n `${options.confirmRequested && !result.accessConfirmed ? '!' : '✓'} ${title}`,\n ` ${result.status} · ${versionLabel(result)} · runs as ${result.runsAs ?? 'nobody'}`,\n ];\n if (result.accessConfirmed) {\n if (covers) {\n lines.push(\n ` Confirmed: in runs no one watches it may use ${result.runsAs ? `${result.runsAs}'s` : 'their'} connections to ${covers}.`,\n );\n }\n } else {\n if (options.confirmRequested) {\n // An older host ignores confirmAccess rather than refusing it.\n lines.push(\n ' This host did not record the confirmation: it may not support confirming from the CLI yet.',\n );\n }\n lines.push(\n ` Not confirmed: until you or one of the team's agent managers confirms what it may use${covers ? ` (${result.runsAs ? `${result.runsAs}'s` : 'its'} connections, to ${covers})` : ''}, it uses only what needs no confirmation.`,\n ` → ${confirmCommand(result.team.slug, result.key, source)}`,\n );\n }\n lines.push(...requirementLines([], result.missing, result.team.slug, source));\n if (result.draft) lines.push(...draftLines(result.team.slug, result.key));\n lines.push(...channelLines(result.channels ?? [], result.team.slug, source));\n return lines.join('\\n');\n}\n\n/** What a confirmation covers, in words: whose connections, to what. */\nexport function describeAccess(access: TeamAgentAccess): string {\n if (access.scope === 'all') return 'every tool of every product they connect';\n if (access.scope === 'read_only')\n return 'read from every product they connect';\n const parts = [\n ...access.products.map((product) => `${product.name} (every tool)`),\n ...access.tools,\n ];\n return parts.length > 0\n ? parts.join(', ')\n : 'nothing yet (no products granted)';\n}\n\nfunction confirmCommand(team: string, key: string, source: string): string {\n return `ekanos teams agents confirm ${team} ${key} --source ${source}`;\n}\n\nfunction expectOperands(run: TeamAgentRun, count: number) {\n const extra = run.operands[count];\n if (extra !== undefined) {\n throw usageError(`Unexpected argument \"${extra}\".`, usageFor('agents'));\n }\n}\n\nfunction stringFlag(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\nfunction parseApproval(value: string | undefined): 'auto' | 'approve' | null {\n return value === 'auto' || value === 'approve' ? value : null;\n}\n\nfunction approvalFlag(\n run: TeamAgentRun,\n name: 'reads' | 'writes',\n): 'auto' | 'approve' | undefined {\n const value = stringFlag(run, name);\n if (value === undefined) return undefined;\n const mode = parseApproval(value);\n if (!mode) {\n throw usageError(`--${name} takes auto or approve.`, usageFor('agents'));\n }\n return mode;\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type AgentTemplateBody, type TeamAgentBody } from '@ekanos/integration-schema';
|
|
2
|
+
import type { CliContext } from '../context.js';
|
|
3
|
+
import type { ExitCode } from '../exit-codes.js';
|
|
4
|
+
import { type TeamAgentRun } from './team-agents.js';
|
|
5
|
+
/**
|
|
6
|
+
* `ekanos teams agents create <team> --from <dir|file> [--personal]` and
|
|
7
|
+
* `ekanos teams agents apply <team> <dir|file> [--personal]` — one of the
|
|
8
|
+
* team's own agents, or the caller's personal one, from the same
|
|
9
|
+
* `agent.json` (+ `AGENT.md`, + `skills/<slug>/` folders) that `ekanos
|
|
10
|
+
* agents apply` reads for a Source template, read by the same loader.
|
|
11
|
+
*
|
|
12
|
+
* Why two verbs: `apply` is `agents apply` at team level — it creates the
|
|
13
|
+
* agent when there is none and changes it when there is, refusing a change
|
|
14
|
+
* made since the version you name (`--base-version`, the version `teams
|
|
15
|
+
* agents show` reports; `--overwrite` replaces it anyway), so a CI job or
|
|
16
|
+
* an agent can run it again and again. `create` is the same request that
|
|
17
|
+
* only ever makes a new agent: it never names a version, so an agent that
|
|
18
|
+
* exists already is refused rather than changed. The file's own
|
|
19
|
+
* `baseVersion` is a template version and is never sent here.
|
|
20
|
+
*
|
|
21
|
+
* Creating makes you the agent's creator — its tools run as you, and a
|
|
22
|
+
* personal one acts for you on every trigger — so you must be an active
|
|
23
|
+
* member of the team. A personal agent is yours alone to change.
|
|
24
|
+
*/
|
|
25
|
+
export declare function runTeamAgentDefine(ctx: CliContext, run: TeamAgentRun, verb: 'create' | 'apply'): Promise<ExitCode>;
|
|
26
|
+
/**
|
|
27
|
+
* The definition fields of a template body. A field that sets a template up
|
|
28
|
+
* on every team's copy is refused rather than dropped, so a file never
|
|
29
|
+
* reads as doing something it does not.
|
|
30
|
+
*/
|
|
31
|
+
export declare function teamAgentBody(body: AgentTemplateBody, file: string): TeamAgentBody;
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { TEMPLATE_ONLY_AGENT_FIELDS, TeamAgentApplyResultSchema, TeamAgentBodySchema, } from '@ekanos/integration-schema';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { usageError, validationError } from '../errors.js';
|
|
4
|
+
import { call } from '../teams-api.js';
|
|
5
|
+
import { readAgentInput } from './agents.js';
|
|
6
|
+
import { AGENT_SKILLS_DIR, findAgentSkillFolders, pushSkillFolder, pushSummary, readSkillFolder, } from './skills.js';
|
|
7
|
+
import { requireOperand, usageFor } from './team-agents.js';
|
|
8
|
+
import { describeAccess } from './team-agents-agents.js';
|
|
9
|
+
/**
|
|
10
|
+
* `ekanos teams agents create <team> --from <dir|file> [--personal]` and
|
|
11
|
+
* `ekanos teams agents apply <team> <dir|file> [--personal]` — one of the
|
|
12
|
+
* team's own agents, or the caller's personal one, from the same
|
|
13
|
+
* `agent.json` (+ `AGENT.md`, + `skills/<slug>/` folders) that `ekanos
|
|
14
|
+
* agents apply` reads for a Source template, read by the same loader.
|
|
15
|
+
*
|
|
16
|
+
* Why two verbs: `apply` is `agents apply` at team level — it creates the
|
|
17
|
+
* agent when there is none and changes it when there is, refusing a change
|
|
18
|
+
* made since the version you name (`--base-version`, the version `teams
|
|
19
|
+
* agents show` reports; `--overwrite` replaces it anyway), so a CI job or
|
|
20
|
+
* an agent can run it again and again. `create` is the same request that
|
|
21
|
+
* only ever makes a new agent: it never names a version, so an agent that
|
|
22
|
+
* exists already is refused rather than changed. The file's own
|
|
23
|
+
* `baseVersion` is a template version and is never sent here.
|
|
24
|
+
*
|
|
25
|
+
* Creating makes you the agent's creator — its tools run as you, and a
|
|
26
|
+
* personal one acts for you on every trigger — so you must be an active
|
|
27
|
+
* member of the team. A personal agent is yours alone to change.
|
|
28
|
+
*/
|
|
29
|
+
export async function runTeamAgentDefine(ctx, run, verb) {
|
|
30
|
+
var _a, _b, _c, _d;
|
|
31
|
+
var _e;
|
|
32
|
+
const team = requireOperand(run.operands[0], 'team slug', 'agents');
|
|
33
|
+
const from = flagString(run, 'from');
|
|
34
|
+
const positional = run.operands[1];
|
|
35
|
+
if (run.operands.length > 2 || (from && positional)) {
|
|
36
|
+
throw usageError(`teams agents ${verb} takes the team and one agent directory or file.`, usageFor('agents'));
|
|
37
|
+
}
|
|
38
|
+
const target = from !== null && from !== void 0 ? from : positional;
|
|
39
|
+
if (!target) {
|
|
40
|
+
throw usageError(`teams agents ${verb} needs an agent directory or agent.json.`, verb === 'create'
|
|
41
|
+
? `e.g. ekanos teams agents create ${team} --from agents/triage [--personal]`
|
|
42
|
+
: `e.g. ekanos teams agents apply ${team} agents/triage --base-version 3`);
|
|
43
|
+
}
|
|
44
|
+
const personal = ((_a = run.args.flags) === null || _a === void 0 ? void 0 : _a.personal) === true;
|
|
45
|
+
const overwrite = ((_b = run.args.flags) === null || _b === void 0 ? void 0 : _b.overwrite) === true;
|
|
46
|
+
const baseVersion = parseBaseVersion(flagString(run, 'base-version'));
|
|
47
|
+
if (verb === 'create' && (baseVersion !== null || overwrite)) {
|
|
48
|
+
throw usageError('create only makes a new agent, so it takes no --base-version or --overwrite.', `Change an existing one with: ekanos teams agents apply ${team} ${target} --base-version <n>`);
|
|
49
|
+
}
|
|
50
|
+
// Read the local input before any network call, so a bad file fails fast.
|
|
51
|
+
const input = readAgentInput(target, run.args.dir);
|
|
52
|
+
const pushSkills = ((_c = run.args.flags) === null || _c === void 0 ? void 0 : _c.skills) !== false;
|
|
53
|
+
const folders = input.file && pushSkills
|
|
54
|
+
? findAgentSkillFolders(path.dirname(input.file)).map((dir) => readSkillFolder(dir, run.args.dir))
|
|
55
|
+
: [];
|
|
56
|
+
const body = withLocalSkills(teamAgentBody(input.body, (_e = input.file) !== null && _e !== void 0 ? _e : target), folders.map((folder) => folder.slug));
|
|
57
|
+
// The skills first, so the agent can name them: the team's own level.
|
|
58
|
+
const pushed = [];
|
|
59
|
+
for (const folder of folders) {
|
|
60
|
+
pushed.push(await pushSkillFolder(run.skills, run.host, {
|
|
61
|
+
source: run.source,
|
|
62
|
+
team,
|
|
63
|
+
folder,
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
const request = Object.assign({ key: input.key, ownership: personal ? 'personal' : 'team', body,
|
|
67
|
+
baseVersion,
|
|
68
|
+
overwrite }, (((_d = run.args.flags) === null || _d === void 0 ? void 0 : _d['confirm-access']) === true
|
|
69
|
+
? { confirmAccess: true }
|
|
70
|
+
: {}));
|
|
71
|
+
const result = await run.client.call((token) => call(run.host, token, TeamAgentApplyResultSchema, {
|
|
72
|
+
method: 'POST',
|
|
73
|
+
path: `/api/partner/teams/${encodeURIComponent(team)}/agents`,
|
|
74
|
+
source: run.source,
|
|
75
|
+
body: request,
|
|
76
|
+
}));
|
|
77
|
+
return ctx.succeed(Object.assign(Object.assign({ host: run.host }, result), { skillsPushed: pushed }), [
|
|
78
|
+
...pushed.map((entry) => pushSummary(ctx.ui, entry)),
|
|
79
|
+
describeResult(ctx, result, run.source),
|
|
80
|
+
].join('\n\n'));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The definition fields of a template body. A field that sets a template up
|
|
84
|
+
* on every team's copy is refused rather than dropped, so a file never
|
|
85
|
+
* reads as doing something it does not.
|
|
86
|
+
*/
|
|
87
|
+
export function teamAgentBody(body, file) {
|
|
88
|
+
const set = TEMPLATE_ONLY_AGENT_FIELDS.filter((field) => {
|
|
89
|
+
const value = body[field];
|
|
90
|
+
if (value === undefined)
|
|
91
|
+
return false;
|
|
92
|
+
if (Array.isArray(value))
|
|
93
|
+
return value.length > 0;
|
|
94
|
+
return Object.values(value).some((entry) => entry !== false);
|
|
95
|
+
});
|
|
96
|
+
if (set.length > 0) {
|
|
97
|
+
throw validationError(`${file} sets ${set.join(', ')}, which only a Source template has: they say how it is set up on every team's copy.`, 'Drop them for a team or personal agent. Add its triggers with "ekanos teams triggers add <team> <key> schedule|webhook …", or publish it to every team with "ekanos agents apply".');
|
|
98
|
+
}
|
|
99
|
+
return TeamAgentBodySchema.parse({
|
|
100
|
+
name: body.name,
|
|
101
|
+
description: body.description,
|
|
102
|
+
instructions: body.instructions,
|
|
103
|
+
model: body.model,
|
|
104
|
+
maxTurns: body.maxTurns,
|
|
105
|
+
tools: body.tools,
|
|
106
|
+
policy: body.policy,
|
|
107
|
+
skills: body.skills,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/** The agent's skills plus the folders beside it, which it uses by being there. */
|
|
111
|
+
function withLocalSkills(body, slugs) {
|
|
112
|
+
const skills = [...body.skills];
|
|
113
|
+
for (const slug of slugs)
|
|
114
|
+
if (!skills.includes(slug))
|
|
115
|
+
skills.push(slug);
|
|
116
|
+
if (skills.length > 50) {
|
|
117
|
+
throw validationError(`The agent would name ${skills.length} skills (with its ${AGENT_SKILLS_DIR}/ folders); the limit is 50.`, 'Drop some, or pass --no-skills and list them in agent.json.');
|
|
118
|
+
}
|
|
119
|
+
return Object.assign(Object.assign({}, body), { skills });
|
|
120
|
+
}
|
|
121
|
+
function describeResult(ctx, result, source) {
|
|
122
|
+
var _a, _b;
|
|
123
|
+
const team = result.team.slug;
|
|
124
|
+
const personal = result.ownership === 'personal';
|
|
125
|
+
const title = result.outcome === 'created'
|
|
126
|
+
? `Created ${personal ? 'your personal agent' : 'agent'} ${result.slug} on ${team}`
|
|
127
|
+
: result.outcome === 'updated'
|
|
128
|
+
? `Updated ${result.slug} on ${team} to v${result.version}`
|
|
129
|
+
: `${result.slug} on ${team} already matches the file`;
|
|
130
|
+
const rows = [
|
|
131
|
+
['Agent', `${result.name} (${result.slug})`],
|
|
132
|
+
['Owned by', personal ? `${(_a = result.createdBy) !== null && _a !== void 0 ? _a : 'you'} alone` : 'the team'],
|
|
133
|
+
['Runs as', (_b = result.createdBy) !== null && _b !== void 0 ? _b : 'nobody (its creator left the team)'],
|
|
134
|
+
['Version', `v${result.version}`],
|
|
135
|
+
['Status', result.status],
|
|
136
|
+
['Skills', result.skills.length > 0 ? result.skills.join(', ') : 'none'],
|
|
137
|
+
[
|
|
138
|
+
'Access',
|
|
139
|
+
`${describeAccess(result.access)} — ${result.accessConfirmed ? 'confirmed' : 'not confirmed'}`,
|
|
140
|
+
],
|
|
141
|
+
];
|
|
142
|
+
const next = [];
|
|
143
|
+
if (!result.accessConfirmed) {
|
|
144
|
+
next.push(`Until someone who sets it up confirms what it may use, it runs only the tools that need no confirmation: ekanos teams agents confirm ${team} ${result.slug} --source ${source}`);
|
|
145
|
+
}
|
|
146
|
+
if (result.status !== 'active') {
|
|
147
|
+
next.push(`It is ${result.status}: turn it on with ekanos teams agents enable ${team} ${result.slug} --source ${source}`);
|
|
148
|
+
}
|
|
149
|
+
next.push(`Start it from a schedule or a webhook: ekanos teams triggers add ${team} ${result.slug} schedule --cron "0 9 * * 1-5" --prompt "…"`);
|
|
150
|
+
if (personal) {
|
|
151
|
+
next.push('It acts for you, with your own connections, on every trigger: only you change it, run it, decide its approvals or cancel its runs.');
|
|
152
|
+
}
|
|
153
|
+
return ctx.ui.result({
|
|
154
|
+
title,
|
|
155
|
+
tone: result.outcome === 'unchanged' || !result.accessConfirmed ? 'warn' : 'ok',
|
|
156
|
+
rows,
|
|
157
|
+
notes: [
|
|
158
|
+
...next,
|
|
159
|
+
`Change it later from the same file: ekanos teams agents apply ${team} <dir> --base-version ${result.version}${personal ? ' --personal' : ''}`,
|
|
160
|
+
],
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
function parseBaseVersion(value) {
|
|
164
|
+
if (value === undefined)
|
|
165
|
+
return null;
|
|
166
|
+
const version = Number(value);
|
|
167
|
+
if (Number.isInteger(version) && version >= 1)
|
|
168
|
+
return version;
|
|
169
|
+
throw usageError(`--base-version must be a version number (got "${value}").`, '"ekanos teams agents show <team> <key>" shows the version.');
|
|
170
|
+
}
|
|
171
|
+
function flagString(run, name) {
|
|
172
|
+
var _a;
|
|
173
|
+
const value = (_a = run.args.flags) === null || _a === void 0 ? void 0 : _a[name];
|
|
174
|
+
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=team-agents-define.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-agents-define.js","sourceRoot":"","sources":["../../src/commands/team-agents-define.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type AgentTemplateBody,\n TEMPLATE_ONLY_AGENT_FIELDS,\n type TeamAgentApplyRequest,\n type TeamAgentApplyResult,\n TeamAgentApplyResultSchema,\n type TeamAgentBody,\n TeamAgentBodySchema,\n} from '@ekanos/integration-schema';\nimport * as path from 'node:path';\n\nimport type { CliContext } from '../context';\nimport { usageError, validationError } from '../errors';\nimport type { ExitCode } from '../exit-codes';\nimport { call } from '../teams-api';\nimport type { ResultRow } from '../ui';\nimport { readAgentInput } from './agents';\nimport {\n AGENT_SKILLS_DIR,\n findAgentSkillFolders,\n pushSkillFolder,\n pushSummary,\n readSkillFolder,\n} from './skills';\nimport { type TeamAgentRun, requireOperand, usageFor } from './team-agents';\nimport { describeAccess } from './team-agents-agents';\n\n/**\n * `ekanos teams agents create <team> --from <dir|file> [--personal]` and\n * `ekanos teams agents apply <team> <dir|file> [--personal]` — one of the\n * team's own agents, or the caller's personal one, from the same\n * `agent.json` (+ `AGENT.md`, + `skills/<slug>/` folders) that `ekanos\n * agents apply` reads for a Source template, read by the same loader.\n *\n * Why two verbs: `apply` is `agents apply` at team level — it creates the\n * agent when there is none and changes it when there is, refusing a change\n * made since the version you name (`--base-version`, the version `teams\n * agents show` reports; `--overwrite` replaces it anyway), so a CI job or\n * an agent can run it again and again. `create` is the same request that\n * only ever makes a new agent: it never names a version, so an agent that\n * exists already is refused rather than changed. The file's own\n * `baseVersion` is a template version and is never sent here.\n *\n * Creating makes you the agent's creator — its tools run as you, and a\n * personal one acts for you on every trigger — so you must be an active\n * member of the team. A personal agent is yours alone to change.\n */\nexport async function runTeamAgentDefine(\n ctx: CliContext,\n run: TeamAgentRun,\n verb: 'create' | 'apply',\n): Promise<ExitCode> {\n const team = requireOperand(run.operands[0], 'team slug', 'agents');\n const from = flagString(run, 'from');\n const positional = run.operands[1];\n if (run.operands.length > 2 || (from && positional)) {\n throw usageError(\n `teams agents ${verb} takes the team and one agent directory or file.`,\n usageFor('agents'),\n );\n }\n const target = from ?? positional;\n if (!target) {\n throw usageError(\n `teams agents ${verb} needs an agent directory or agent.json.`,\n verb === 'create'\n ? `e.g. ekanos teams agents create ${team} --from agents/triage [--personal]`\n : `e.g. ekanos teams agents apply ${team} agents/triage --base-version 3`,\n );\n }\n\n const personal = run.args.flags?.personal === true;\n const overwrite = run.args.flags?.overwrite === true;\n const baseVersion = parseBaseVersion(flagString(run, 'base-version'));\n if (verb === 'create' && (baseVersion !== null || overwrite)) {\n throw usageError(\n 'create only makes a new agent, so it takes no --base-version or --overwrite.',\n `Change an existing one with: ekanos teams agents apply ${team} ${target} --base-version <n>`,\n );\n }\n\n // Read the local input before any network call, so a bad file fails fast.\n const input = readAgentInput(target, run.args.dir);\n const pushSkills = run.args.flags?.skills !== false;\n const folders =\n input.file && pushSkills\n ? findAgentSkillFolders(path.dirname(input.file)).map((dir) =>\n readSkillFolder(dir, run.args.dir),\n )\n : [];\n const body = withLocalSkills(\n teamAgentBody(input.body, input.file ?? target),\n folders.map((folder) => folder.slug),\n );\n\n // The skills first, so the agent can name them: the team's own level.\n const pushed = [];\n for (const folder of folders) {\n pushed.push(\n await pushSkillFolder(run.skills, run.host, {\n source: run.source,\n team,\n folder,\n }),\n );\n }\n\n const request: TeamAgentApplyRequest = {\n key: input.key,\n ownership: personal ? 'personal' : 'team',\n body,\n baseVersion,\n overwrite,\n ...(run.args.flags?.['confirm-access'] === true\n ? { confirmAccess: true }\n : {}),\n };\n const result = await run.client.call((token) =>\n call(run.host, token, TeamAgentApplyResultSchema, {\n method: 'POST',\n path: `/api/partner/teams/${encodeURIComponent(team)}/agents`,\n source: run.source,\n body: request,\n }),\n );\n\n return ctx.succeed(\n { host: run.host, ...result, skillsPushed: pushed },\n [\n ...pushed.map((entry) => pushSummary(ctx.ui, entry)),\n describeResult(ctx, result, run.source),\n ].join('\\n\\n'),\n );\n}\n\n/**\n * The definition fields of a template body. A field that sets a template up\n * on every team's copy is refused rather than dropped, so a file never\n * reads as doing something it does not.\n */\nexport function teamAgentBody(\n body: AgentTemplateBody,\n file: string,\n): TeamAgentBody {\n const set = TEMPLATE_ONLY_AGENT_FIELDS.filter((field) => {\n const value = body[field];\n if (value === undefined) return false;\n if (Array.isArray(value)) return value.length > 0;\n return Object.values(value).some((entry) => entry !== false);\n });\n if (set.length > 0) {\n throw validationError(\n `${file} sets ${set.join(', ')}, which only a Source template has: they say how it is set up on every team's copy.`,\n 'Drop them for a team or personal agent. Add its triggers with \"ekanos teams triggers add <team> <key> schedule|webhook …\", or publish it to every team with \"ekanos agents apply\".',\n );\n }\n return TeamAgentBodySchema.parse({\n name: body.name,\n description: body.description,\n instructions: body.instructions,\n model: body.model,\n maxTurns: body.maxTurns,\n tools: body.tools,\n policy: body.policy,\n skills: body.skills,\n });\n}\n\n/** The agent's skills plus the folders beside it, which it uses by being there. */\nfunction withLocalSkills(body: TeamAgentBody, slugs: string[]): TeamAgentBody {\n const skills = [...body.skills];\n for (const slug of slugs) if (!skills.includes(slug)) skills.push(slug);\n if (skills.length > 50) {\n throw validationError(\n `The agent would name ${skills.length} skills (with its ${AGENT_SKILLS_DIR}/ folders); the limit is 50.`,\n 'Drop some, or pass --no-skills and list them in agent.json.',\n );\n }\n return { ...body, skills };\n}\n\nfunction describeResult(\n ctx: CliContext,\n result: TeamAgentApplyResult,\n source: string,\n): string {\n const team = result.team.slug;\n const personal = result.ownership === 'personal';\n const title =\n result.outcome === 'created'\n ? `Created ${personal ? 'your personal agent' : 'agent'} ${result.slug} on ${team}`\n : result.outcome === 'updated'\n ? `Updated ${result.slug} on ${team} to v${result.version}`\n : `${result.slug} on ${team} already matches the file`;\n const rows: ResultRow[] = [\n ['Agent', `${result.name} (${result.slug})`],\n ['Owned by', personal ? `${result.createdBy ?? 'you'} alone` : 'the team'],\n ['Runs as', result.createdBy ?? 'nobody (its creator left the team)'],\n ['Version', `v${result.version}`],\n ['Status', result.status],\n ['Skills', result.skills.length > 0 ? result.skills.join(', ') : 'none'],\n [\n 'Access',\n `${describeAccess(result.access)} — ${result.accessConfirmed ? 'confirmed' : 'not confirmed'}`,\n ],\n ];\n const next: string[] = [];\n if (!result.accessConfirmed) {\n next.push(\n `Until someone who sets it up confirms what it may use, it runs only the tools that need no confirmation: ekanos teams agents confirm ${team} ${result.slug} --source ${source}`,\n );\n }\n if (result.status !== 'active') {\n next.push(\n `It is ${result.status}: turn it on with ekanos teams agents enable ${team} ${result.slug} --source ${source}`,\n );\n }\n next.push(\n `Start it from a schedule or a webhook: ekanos teams triggers add ${team} ${result.slug} schedule --cron \"0 9 * * 1-5\" --prompt \"…\"`,\n );\n if (personal) {\n next.push(\n 'It acts for you, with your own connections, on every trigger: only you change it, run it, decide its approvals or cancel its runs.',\n );\n }\n return ctx.ui.result({\n title,\n tone:\n result.outcome === 'unchanged' || !result.accessConfirmed ? 'warn' : 'ok',\n rows,\n notes: [\n ...next,\n `Change it later from the same file: ekanos teams agents apply ${team} <dir> --base-version ${result.version}${personal ? ' --personal' : ''}`,\n ],\n });\n}\n\nfunction parseBaseVersion(value: string | undefined): number | null {\n if (value === undefined) return null;\n const version = Number(value);\n if (Number.isInteger(version) && version >= 1) return version;\n throw usageError(\n `--base-version must be a version number (got \"${value}\").`,\n '\"ekanos teams agents show <team> <key>\" shows the version.',\n );\n}\n\nfunction flagString(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"]}
|