@ekanos/cli 0.15.0 → 0.17.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 +103 -8
- 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/add.d.ts +2 -0
- package/dist/commands/add.js +118 -0
- package/dist/commands/add.js.map +1 -0
- 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/audiences.d.ts +31 -0
- package/dist/commands/audiences.js +239 -0
- package/dist/commands/audiences.js.map +1 -0
- package/dist/commands/build.d.ts +2 -0
- package/dist/commands/build.js +41 -0
- package/dist/commands/build.js.map +1 -0
- 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/check.d.ts +2 -0
- package/dist/commands/check.js +43 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/codegen.d.ts +2 -0
- package/dist/commands/codegen.js +49 -0
- package/dist/commands/codegen.js.map +1 -0
- package/dist/commands/contract.d.ts +52 -0
- package/dist/commands/contract.js +300 -0
- package/dist/commands/contract.js.map +1 -0
- package/dist/commands/dev.d.ts +7 -0
- package/dist/commands/dev.js +186 -12
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/index-experience.d.ts +31 -0
- package/dist/commands/index-experience.js +21 -0
- package/dist/commands/index-experience.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.js +12 -0
- package/dist/commands/init.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/new.d.ts +2 -0
- package/dist/commands/new.js +39 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/publish.d.ts +59 -0
- package/dist/commands/publish.js +118 -65
- package/dist/commands/publish.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 +13 -0
- package/dist/commands/scope-notice.js +12 -4
- 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 +8 -1
- package/dist/commands/sources.js.map +1 -1
- package/dist/commands/sync.d.ts +2 -0
- package/dist/commands/sync.js +150 -0
- package/dist/commands/sync.js.map +1 -0
- 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-audience.d.ts +12 -0
- package/dist/commands/teams-audience.js +144 -0
- package/dist/commands/teams-audience.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-scope.js +4 -0
- package/dist/commands/teams-scope.js.map +1 -1
- package/dist/commands/teams.d.ts +25 -5
- package/dist/commands/teams.js +106 -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/compatibility.d.ts +10 -1
- package/dist/compatibility.js +10 -1
- package/dist/compatibility.js.map +1 -1
- 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/dev-experience.d.ts +125 -0
- package/dist/dev-experience.js +128 -0
- package/dist/dev-experience.js.map +1 -0
- package/dist/experience/boundary.d.ts +12 -0
- package/dist/experience/boundary.js +260 -0
- package/dist/experience/boundary.js.map +1 -0
- package/dist/experience/build.d.ts +16 -0
- package/dist/experience/build.js +90 -0
- package/dist/experience/build.js.map +1 -0
- package/dist/experience/checks.d.ts +29 -0
- package/dist/experience/checks.js +133 -0
- package/dist/experience/checks.js.map +1 -0
- package/dist/experience/contract-sources.d.ts +36 -0
- package/dist/experience/contract-sources.js +111 -0
- package/dist/experience/contract-sources.js.map +1 -0
- package/dist/experience/definition-checks.d.ts +26 -0
- package/dist/experience/definition-checks.js +201 -0
- package/dist/experience/definition-checks.js.map +1 -0
- package/dist/experience/definition-shape.d.ts +60 -0
- package/dist/experience/definition-shape.js +2 -0
- package/dist/experience/definition-shape.js.map +1 -0
- package/dist/experience/init.d.ts +10 -0
- package/dist/experience/init.js +64 -0
- package/dist/experience/init.js.map +1 -0
- package/dist/experience/integrations-codegen.d.ts +17 -0
- package/dist/experience/integrations-codegen.js +51 -0
- package/dist/experience/integrations-codegen.js.map +1 -0
- package/dist/experience/json-schema-to-ts.d.ts +1 -0
- package/dist/experience/json-schema-to-ts.js +90 -0
- package/dist/experience/json-schema-to-ts.js.map +1 -0
- package/dist/experience/load-experience.d.ts +23 -0
- package/dist/experience/load-experience.js +115 -0
- package/dist/experience/load-experience.js.map +1 -0
- package/dist/experience/overrides.d.ts +8 -0
- package/dist/experience/overrides.js +21 -0
- package/dist/experience/overrides.js.map +1 -0
- package/dist/experience/pin-integration.d.ts +8 -0
- package/dist/experience/pin-integration.js +17 -0
- package/dist/experience/pin-integration.js.map +1 -0
- package/dist/experience/pin-ops.d.ts +12 -0
- package/dist/experience/pin-ops.js +36 -0
- package/dist/experience/pin-ops.js.map +1 -0
- package/dist/experience/pins.d.ts +35 -0
- package/dist/experience/pins.js +91 -0
- package/dist/experience/pins.js.map +1 -0
- package/dist/experience/project.d.ts +52 -0
- package/dist/experience/project.js +149 -0
- package/dist/experience/project.js.map +1 -0
- package/dist/experience/publish.d.ts +51 -0
- package/dist/experience/publish.js +144 -0
- package/dist/experience/publish.js.map +1 -0
- package/dist/experience/regenerate.d.ts +10 -0
- package/dist/experience/regenerate.js +33 -0
- package/dist/experience/regenerate.js.map +1 -0
- package/dist/experience/report.d.ts +9 -0
- package/dist/experience/report.js +23 -0
- package/dist/experience/report.js.map +1 -0
- package/dist/harness-scaffold.d.ts +52 -18
- package/dist/harness-scaffold.js +189 -9
- package/dist/harness-scaffold.js.map +1 -1
- package/dist/index.d.ts +13 -0
- package/dist/index.js +494 -127
- 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/project-checks.d.ts +12 -0
- package/dist/project-checks.js +46 -0
- package/dist/project-checks.js.map +1 -1
- package/dist/project.d.ts +14 -0
- package/dist/project.js +10 -0
- package/dist/project.js.map +1 -1
- package/dist/repo/publish.d.ts +42 -0
- package/dist/repo/publish.js +225 -0
- package/dist/repo/publish.js.map +1 -0
- package/dist/repo/scaffold.d.ts +30 -0
- package/dist/repo/scaffold.js +165 -0
- package/dist/repo/scaffold.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 +49 -1
- package/dist/teams-api.js +149 -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/validate-findings.js +2 -1
- package/dist/validate-findings.js.map +1 -1
- 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/ekanos.json.tmpl +1 -0
- package/templates/experience/AGENTS.md.tmpl +22 -0
- package/templates/experience/ekanos.json.tmpl +7 -0
- package/templates/experience/ekanos.lock.json.tmpl +4 -0
- package/templates/experience/eslint.config.mjs.tmpl +25 -0
- package/templates/experience/gitignore.tmpl +17 -0
- package/templates/experience/package.json.tmpl +41 -0
- package/templates/experience/src/.ekanos/integrations.d.ts.tmpl +3 -0
- package/templates/experience/src/experience.ts.tmpl +30 -0
- package/templates/experience/src/widgets/hello-widget.tsx.tmpl +40 -0
- package/templates/experience/tsconfig.json.tmpl +20 -0
- package/templates/harness/app/%5F%5Fekanos/api/[...path]/route.ts.tmpl +9 -0
- package/templates/harness/app/[slug]/activation/page.tsx.tmpl +1 -1
- package/templates/harness/app/[slug]/page.tsx.tmpl +1 -1
- package/templates/harness/app/[slug]/tile/page.tsx.tmpl +1 -1
- package/templates/harness/app/[slug]/triggers/page.tsx.tmpl +1 -1
- package/templates/harness/app/[slug]/widgets/[widgetId]/page.tsx.tmpl +1 -1
- package/templates/harness/app/[slug]/widgets/page.tsx.tmpl +1 -1
- package/templates/harness/app/experience/layout.tsx.tmpl +17 -0
- package/templates/harness/app/experience/page.tsx.tmpl +1 -0
- package/templates/harness/app/experience/pages/[id]/page.tsx.tmpl +1 -0
- package/templates/harness/app/experience/review-queue/page.tsx.tmpl +1 -0
- package/templates/harness/app/experience/runs/page.tsx.tmpl +1 -0
- package/templates/harness/app/experience/widgets/[id]/page.tsx.tmpl +1 -0
- package/templates/harness/app/experience/widgets/page.tsx.tmpl +1 -0
- package/templates/harness/app/experience/workflows/[id]/page.tsx.tmpl +1 -0
- package/templates/harness/app/experience/workflows/page.tsx.tmpl +1 -0
- package/templates/harness/app/integrations/[slug]/connect/page.tsx.tmpl +1 -0
- package/templates/harness/app/integrations/[slug]/events/page.tsx.tmpl +1 -0
- package/templates/harness/app/integrations/[slug]/health/page.tsx.tmpl +1 -0
- package/templates/harness/app/integrations/[slug]/operations/[kind]/[name]/page.tsx.tmpl +1 -0
- package/templates/harness/app/integrations/[slug]/operations/page.tsx.tmpl +1 -0
- package/templates/harness/app/integrations/[slug]/page.tsx.tmpl +1 -0
- package/templates/harness/app/integrations/[slug]/preview/activation/page.tsx.tmpl +1 -0
- package/templates/harness/app/integrations/[slug]/preview/layout.tsx.tmpl +1 -0
- package/templates/harness/app/integrations/[slug]/preview/page.tsx.tmpl +1 -0
- package/templates/harness/app/integrations/[slug]/preview/tile/page.tsx.tmpl +1 -0
- package/templates/harness/app/integrations/[slug]/preview/triggers/page.tsx.tmpl +1 -0
- package/templates/harness/app/integrations/[slug]/preview/widgets/[widgetId]/page.tsx.tmpl +1 -0
- package/templates/harness/app/integrations/[slug]/preview/widgets/page.tsx.tmpl +1 -0
- package/templates/harness/app/integrations/[slug]/runs/page.tsx.tmpl +1 -0
- package/templates/harness/app/integrations/layout.tsx.tmpl +1 -0
- package/templates/harness/app/integrations/page.tsx.tmpl +1 -0
- package/templates/harness/app/page.experience.tsx.tmpl +5 -0
- package/templates/harness/repo/app/%5F%5Fekanos/api/[...path]/route.ts.tmpl +11 -0
- package/templates/harness/repo/app/(repo)/connections/page.tsx.tmpl +1 -0
- package/templates/harness/repo/app/(repo)/layout.tsx.tmpl +1 -0
- package/templates/harness/repo/app/(repo)/page.tsx.tmpl +1 -0
- package/templates/harness/repo/app/experiences/[name]/connect/page.tsx.tmpl +1 -0
- package/templates/harness/repo/app/experiences/[name]/layout.tsx.tmpl +9 -0
- package/templates/harness/repo/app/experiences/page.tsx.tmpl +5 -0
- package/templates/harness/repo/app/harness-shell.tsx.tmpl +9 -0
- package/templates/harness/repo/app/integrations/[slug]/layout.tsx.tmpl +1 -0
- package/templates/harness/repo/app/integrations/page.tsx.tmpl +5 -0
- package/templates/harness/repo/app/repo-experiences.ts.tmpl +5 -0
- package/templates/harness/styles/globals.css.tmpl +15 -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-agent-readiness.js","sourceRoot":"","sources":["../../src/commands/team-agent-readiness.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AgentRunSummary,\n ChannelRequirement,\n Requirement,\n TeamAgentEntry,\n TeamAgentHold,\n TeamIntegrationEvent,\n} from '@ekanos/integration-schema';\n\nimport { type ScopeFacts, scopeFix, scopeHiddenWords } from './scope-notice';\n\n/**\n * \"Is this agent live on this team, and if not, why?\" — one answer for\n * `teams agents show` and the summary line of `teams agents list`, built only\n * from what the host already reports (CLI audit 2026-10-19, §3).\n *\n * Live is: on, on a published version, every connection it needs made,\n * access confirmed by someone who sets it up (a team manager or the Source\n * admin, plan 247.2), at least one trigger on, and every trigger's events\n * able to reach it. Each gap is a step with one fix, in the order they have\n * to be done; the first step's fix is \"Next\". A publish holds no team, so\n * there is no update waiting.\n */\n\nconst CLI = 'npx @ekanos/cli';\n\nexport interface ReadinessStep {\n /** What is missing, in words. */\n problem: string;\n /** The one command (or app step) that fixes it. */\n fix: string;\n}\n\nexport interface AgentReadiness {\n live: boolean;\n steps: ReadinessStep[];\n /** The first step's fix; null when there is none. */\n next: string | null;\n}\n\nexport interface ReadinessTarget {\n team: string;\n source: string;\n}\n\nexport function agentReadiness(\n entry: TeamAgentEntry,\n target: ReadinessTarget,\n): AgentReadiness {\n const steps = readinessSteps(entry, target);\n return {\n live: steps.length === 0,\n steps,\n next: steps[0]?.fix ?? null,\n };\n}\n\n/**\n * What a newer version adds over the one a team runs, in words (a publish's\n * report of the teams pinned to another version):\n * \"adds zendesk_update_ticket; lets zendesk_add_tag run without approval\".\n */\nexport function describeHold(hold: TeamAgentHold): string {\n const adds = [\n ...(hold.adds.scope === 'all'\n ? ['every tool of the products it can reach']\n : hold.adds.scope === 'read_only'\n ? ['every read of the products it can reach']\n : []),\n ...hold.adds.products.map((product) => `${product.name} (every tool)`),\n ...hold.adds.tools,\n ];\n const loosens = [\n ...(hold.loosens.writes ? ['writes'] : []),\n ...(hold.loosens.reads ? ['reads'] : []),\n ...hold.loosens.tools,\n ];\n const parts = [\n ...(adds.length > 0 ? [`adds ${adds.join(', ')}`] : []),\n ...(loosens.length > 0\n ? [`lets ${loosens.join(', ')} run without approval`]\n : []),\n ];\n return parts.length > 0 ? parts.join('; ') : 'reaches further';\n}\n\nfunction readinessSteps(\n entry: TeamAgentEntry,\n { team, source }: ReadinessTarget,\n): ReadinessStep[] {\n const enable = `${CLI} teams agents enable ${team} ${entry.key} --source ${source}`;\n const agent = entry.agent;\n if (!agent) return [{ problem: `off for ${team}`, fix: enable }];\n if (agent.status !== 'active') {\n return [{ problem: `${agent.status} for ${team}`, fix: enable }];\n }\n\n const steps: ReadinessStep[] = [];\n if (agent.draft) {\n // A team testing a draft runs it only when started by hand.\n steps.push({\n problem: `testing unpublished draft v${agent.version ?? '?'}: its triggers do not start it`,\n fix: `${CLI} agents publish ${entry.key} --source ${source}`,\n });\n } else if (agent.version === null) {\n steps.push({\n problem: 'no published version',\n fix: `${CLI} agents publish ${entry.key} --source ${source}`,\n });\n }\n for (const item of agent.missing) {\n steps.push({\n problem: `${item.name}: ${REASON_WORDS[item.reason ?? 'not_connected']}`,\n fix:\n requirementFix(item, team, source) ??\n `${CLI} teams mcp status ${team} ${item.key} --source ${source}`,\n });\n }\n if (!agent.accessConfirmed) {\n steps.push({\n problem: 'nobody has confirmed what it may use',\n // Whoever sets it up confirms, as themselves: the Source admin here,\n // or a team manager in the app (plan 247.2).\n fix: `${CLI} teams agents confirm ${team} ${entry.key} --source ${source} (or a team manager confirms in the app: Agents › ${entry.name} › Setup)`,\n });\n }\n if (!agent.triggers.some((trigger) => trigger.enabled)) {\n steps.push({\n problem: 'no trigger is on, so it only runs when started by hand',\n fix: `${CLI} teams triggers add ${team} ${entry.key} event <event-id> --source ${source} (event ids: ${CLI} catalog --source ${source})`,\n });\n }\n for (const channel of agent.channels ?? []) {\n if (channel.ready) continue;\n steps.push({\n problem: channel.problem ?? `${channel.name} not ready`,\n fix: channelFix(channel, team, source),\n });\n }\n return steps;\n}\n\nexport const REASON_WORDS: Record<\n NonNullable<Requirement['reason']>,\n string\n> = {\n not_connected: 'not connected',\n no_route: 'no route maps the Source connection’s events to this team',\n source_unsupported: 'the integration no longer supports a Source connection',\n source_not_entitled: 'the product is not enabled for the Source',\n source_not_connected: 'the Source connection is not made',\n};\n\n/** The one command that makes a requirement, or null when none can. */\nexport function requirementFix(\n item: Requirement,\n team: string,\n source: string,\n): string | null {\n if (item.kind === 'mcp') return null;\n switch (item.reason) {\n case 'no_route':\n return `${CLI} routes set ${item.key} <value> ${team} --source ${source} (values: ${CLI} routes options ${item.key} --source ${source})`;\n case 'source_not_connected':\n return `${CLI} apps connect ${item.key} --source ${source}`;\n case 'source_not_entitled':\n return `a super-admin enables it for the Source (${CLI} sources products --source ${source})`;\n case 'source_unsupported':\n return `set connections.${item.key}.owner to \"team\" in agent.json, then ${CLI} agents apply`;\n default:\n if (item.connected) return null;\n // A per-person product is the runs-as person's connection, not the\n // caller's: connecting your own leaves the agent missing it.\n return item.via === 'person' && item.viaDetail\n ? `${CLI} teams connect ${team} ${item.key} --as ${item.viaDetail} --source ${source}`\n : `${CLI} teams connect ${team} ${item.key} --source ${source}`;\n }\n}\n\n/** The one command that makes a channel ready, or the app step. */\nexport function channelFix(\n channel: ChannelRequirement,\n team: string,\n source: string,\n): string {\n switch (channel.arrival) {\n case 'team-webhook':\n return `${CLI} teams webhook ${team} ${channel.product} --source ${source}`;\n case 'source-route':\n return channel.webhook\n ? `${CLI} routes set ${channel.product} <value> ${team} --source ${source} (values: ${CLI} routes options ${channel.product} --source ${source})`\n : `${CLI} routes webhook ${channel.product} --source ${source}`;\n default:\n return channel.connectionId\n ? `${CLI} teams connect ${team} ${channel.product} --connection ${channel.connectionId} --source ${source}`\n : channel.key === 'slack' || channel.key === 'linear-app'\n ? `${CLI} teams connect ${team} ${channel.key} --source ${source}`\n : `install it on the agent's Triggers tab in the app`;\n }\n}\n\n/** How the events of a ready channel reach the agent. */\nexport function reachedVia(channel: ChannelRequirement): string {\n switch (channel.arrival) {\n case 'team-webhook':\n return 'team webhook';\n case 'source-route':\n return 'Source webhook, routed';\n default:\n return `${channel.name} installed`;\n }\n}\n\n/** A fix as a line: a command is run in the terminal, an app step is not. */\nexport function fixLine(fix: string): string {\n return fix.startsWith(CLI) ? `in your terminal: ${fix}` : fix;\n}\n\n/** \"Live: yes\" or \"Live: no — N steps left\". */\nexport function liveLine(readiness: AgentReadiness): string {\n const left = readiness.steps.length;\n return readiness.live\n ? 'Live: yes'\n : `Live: no — ${left} step${left === 1 ? '' : 's'} left`;\n}\n\n/* ---------------------------------------------------------------------- */\n/* teams agents show */\n/* ---------------------------------------------------------------------- */\n\n/** What happened lately, read alongside the agent; each part optional. */\nexport interface AgentActivity {\n /** The agent's recent runs, newest first. */\n runs: AgentRunSummary[] | null;\n /** The team's recent integration events, newest first. */\n events: TeamIntegrationEvent[] | null;\n}\n\n/**\n * One line per product, per trigger, then Live and Next. A product the\n * team's product scopes hide from it in the app says so — connected or not,\n * the team cannot see it there (`scope`, the team's scopes).\n */\nexport function describeAgentReadiness(\n entry: TeamAgentEntry,\n target: ReadinessTarget,\n readiness: AgentReadiness,\n activity: AgentActivity,\n scope?: ScopeFacts,\n): string {\n const agent = entry.agent;\n if (!agent) {\n return [\n `${entry.key} on ${target.team} · off · v${entry.publishedVersion ?? '?'} published`,\n ` ${liveLine(readiness)}`,\n ` Next: ${readiness.next}`,\n ].join('\\n');\n }\n\n const head = [\n `${entry.key} on ${target.team}`,\n agent.draft\n ? `draft v${agent.version ?? '?'} (testing, unpublished)`\n : `v${agent.version ?? '?'} (${agent.pinned ? 'pinned' : 'following'})`,\n ...(agent.status === 'active' ? [] : [agent.status]),\n `runs as ${agent.runsAs ?? 'nobody'}`,\n agent.accessConfirmed ? '✓ access confirmed' : '✗ access not confirmed',\n ].join(' · ');\n\n const width = Math.max(\n 8,\n ...agent.requirements.map((item) => item.key.length),\n );\n const pad = (label: string) => label.padEnd(width);\n const indent = ' '.repeat(width + 4);\n\n const products = agent.requirements.flatMap((item) => {\n const fix = item.connected\n ? null\n : (requirementFix(item, target.team, target.source) ??\n `${CLI} teams mcp status ${target.team} ${item.key} --source ${target.source}`);\n const hidden =\n item.hiddenByScope && scope\n ? [\n `${indent}! ${scopeHiddenWords(scope)}`,\n `${indent}→ ${fixLine(scopeFix(scope, { ...target, product: item.key }))}`,\n ]\n : [];\n return [\n ` ${pad(item.key)} ${productState(item)}`,\n ...(fix ? [`${indent}→ ${fixLine(fix)}`] : []),\n ...hidden,\n ];\n });\n\n const nameWidth = Math.max(\n 0,\n ...agent.triggers.map(\n (trigger) => (trigger.eventId ?? trigger.type).length,\n ),\n );\n const triggers = agent.triggers.flatMap((trigger, index) => {\n const label = index === 0 ? pad('triggers') : pad('');\n const name = (trigger.eventId ?? trigger.type).padEnd(nameWidth);\n if (!trigger.enabled) return [` ${label} ${name} (off)`];\n const channel = (agent.channels ?? []).find((candidate) =>\n candidate.triggers.includes(trigger.eventId ?? trigger.type),\n );\n const reach = channel\n ? channel.ready\n ? `✓ reachable (${reachedVia(channel)}${channel.lastDeliveryAt ? `, last delivery ${channel.lastDeliveryAt}` : ''})`\n : `✗ ${channel.problem ?? `${channel.name} not ready`}`\n : `✓ ${TRIGGER_REACH[trigger.type] ?? 'reachable'}`;\n // An event trigger's runs are the ones its own events started; any\n // other trigger's, the agent's latest run of that trigger type.\n const ownEvents = trigger.eventId\n ? (activity.events ?? []).filter(\n (event) => event.eventId === trigger.eventId,\n )\n : [];\n const lastEvent = ownEvents[0];\n const lastRun = trigger.eventId\n ? ownEvents.find((event) => event.runs.length > 0)?.runs[0]\n : activity.runs?.find((run) => run.trigger === trigger.type);\n const known = trigger.eventId ? activity.events : activity.runs;\n const facts = [\n reach,\n ...(trigger.eventId && activity.events\n ? [\n lastEvent\n ? `last event ${lastEvent.receivedAt} ${lastEvent.status}`\n : 'no event yet',\n ]\n : []),\n ...(known\n ? [\n lastRun\n ? `last run ${lastRun.startedAt} ${lastRun.status}`\n : 'no run yet',\n ]\n : []),\n ];\n return [\n ` ${label} ${name} ${facts.join(' · ')}`,\n ...(channel && !channel.ready\n ? [\n `${indent}→ ${fixLine(channelFix(channel, target.team, target.source))}`,\n ]\n : []),\n ];\n });\n\n return [\n head,\n ...products,\n ...(agent.triggers.length > 0 ? triggers : [` ${pad('triggers')} none`]),\n ` ${liveLine(readiness)}`,\n ...(readiness.next ? [` Next: ${readiness.next}`] : []),\n ].join('\\n');\n}\n\nconst TRIGGER_REACH: Record<string, string> = {\n manual: 'started by hand',\n schedule: 'runs on its schedule',\n webhook: 'reachable at its trigger URL',\n};\n\nfunction productState(item: Requirement): string {\n if (item.kind === 'mcp') {\n return item.connected\n ? '✓ MCP server connected'\n : '✗ MCP server not signed in';\n }\n const via =\n item.via === 'source'\n ? 'via Source connection'\n : item.via === 'person'\n ? `via ${item.viaDetail ?? 'the runs-as person'}'s personal connection`\n : item.via === 'team'\n ? 'via team connection'\n : null;\n if (item.connected) {\n const routes =\n item.via === 'source' && item.viaDetail\n ? ` · routes: ${item.viaDetail}`\n : '';\n const fallback =\n item.reason && item.reason !== 'not_connected'\n ? ` (${REASON_WORDS[item.reason]})`\n : '';\n return `✓ ${via ?? 'connected'}${routes}${fallback}`;\n }\n const reason = REASON_WORDS[item.reason ?? 'not_connected'];\n return `✗ ${via ? `${via} — ` : ''}${reason}${item.required ? '' : ' (optional)'}`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"team-agent-readiness.js","sourceRoot":"","sources":["../../src/commands/team-agent-readiness.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAmB,QAAQ,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAkC7E,MAAM,UAAU,cAAc,CAC5B,KAAqB,EACrB,MAAuB;;;IAEvB,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5C,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC;QACxB,KAAK;QACL,IAAI,QAAE,MAAA,KAAK,CAAC,CAAC,CAAC,0CAAE,GAAG,mCAAI,IAAI;KAC5B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAAmB;IAC9C,MAAM,IAAI,GAAG;QACX,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK;YAC3B,CAAC,CAAC,CAAC,yCAAyC,CAAC;YAC7C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,WAAW;gBAC/B,CAAC,CAAC,CAAC,yCAAyC,CAAC;gBAC7C,CAAC,CAAC,EAAE,CAAC;QACT,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,eAAe,CAAC;QACtE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK;KACnB,CAAC;IACF,MAAM,OAAO,GAAG;QACd,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK;KACtB,CAAC;IACF,MAAM,KAAK,GAAG;QACZ,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YACpB,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC;YACrD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IACF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;AACjE,CAAC;AAED,SAAS,cAAc,CACrB,KAAqB,EACrB,EAAE,IAAI,EAAE,MAAM,EAAmB;;IAEjC,MAAM,MAAM,GAAG,GAAG,GAAG,EAAE,wBAAwB,IAAI,IAAI,KAAK,CAAC,GAAG,aAAa,MAAM,EAAE,CAAC;IACtF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IACjE,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,QAAQ,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,4DAA4D;QAC5D,KAAK,CAAC,IAAI,CAAC;YACT,OAAO,EAAE,8BAA8B,MAAA,KAAK,CAAC,OAAO,mCAAI,GAAG,gCAAgC;YAC3F,GAAG,EAAE,GAAG,GAAG,EAAE,mBAAmB,KAAK,CAAC,GAAG,aAAa,MAAM,EAAE;SAC/D,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC;YACT,OAAO,EAAE,sBAAsB;YAC/B,GAAG,EAAE,GAAG,GAAG,EAAE,mBAAmB,KAAK,CAAC,GAAG,aAAa,MAAM,EAAE;SAC/D,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC;YACT,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,YAAY,OAAC,IAAI,CAAC,MAAM,mCAAI,eAAe,CAAC,EAAE;YACxE,GAAG,QACD,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,mCAClC,GAAG,GAAG,EAAE,qBAAqB,IAAI,IAAI,IAAI,CAAC,GAAG,aAAa,MAAM,EAAE;SACrE,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC;YACT,OAAO,EAAE,sCAAsC;YAC/C,qEAAqE;YACrE,6CAA6C;YAC7C,GAAG,EAAE,GAAG,GAAG,EAAE,yBAAyB,IAAI,IAAI,KAAK,CAAC,GAAG,aAAa,MAAM,sDAAsD,KAAK,CAAC,IAAI,WAAW;SACtJ,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC;YACT,OAAO,EAAE,wDAAwD;YACjE,GAAG,EAAE,GAAG,GAAG,EAAE,uBAAuB,IAAI,IAAI,KAAK,CAAC,GAAG,8BAA8B,MAAM,iBAAiB,GAAG,EAAE,qBAAqB,MAAM,GAAG;SAC9I,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,OAAO,UAAI,KAAK,CAAC,QAAQ,mCAAI,EAAE,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,KAAK;YAAE,SAAS;QAC5B,KAAK,CAAC,IAAI,CAAC;YACT,OAAO,QAAE,OAAO,CAAC,OAAO,mCAAI,GAAG,OAAO,CAAC,IAAI,YAAY;YACvD,GAAG,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAGrB;IACF,aAAa,EAAE,eAAe;IAC9B,QAAQ,EAAE,2DAA2D;IACrE,kBAAkB,EAAE,wDAAwD;IAC5E,mBAAmB,EAAE,2CAA2C;IAChE,oBAAoB,EAAE,mCAAmC;CAC1D,CAAC;AAEF,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAC5B,IAAiB,EACjB,IAAY,EACZ,MAAc;IAEd,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IACrC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,UAAU;YACb,OAAO,GAAG,GAAG,EAAE,eAAe,IAAI,CAAC,GAAG,YAAY,IAAI,aAAa,MAAM,cAAc,GAAG,EAAE,mBAAmB,IAAI,CAAC,GAAG,aAAa,MAAM,GAAG,CAAC;QAChJ,KAAK,sBAAsB;YACzB,OAAO,GAAG,GAAG,EAAE,iBAAiB,IAAI,CAAC,GAAG,aAAa,MAAM,EAAE,CAAC;QAChE,KAAK,qBAAqB;YACxB,OAAO,4CAA4C,GAAG,EAAE,8BAA8B,MAAM,GAAG,CAAC;QAClG,KAAK,oBAAoB;YACvB,OAAO,mBAAmB,IAAI,CAAC,GAAG,wCAAwC,GAAG,EAAE,eAAe,CAAC;QACjG;YACE,IAAI,IAAI,CAAC,SAAS;gBAAE,OAAO,IAAI,CAAC;YAChC,mEAAmE;YACnE,6DAA6D;YAC7D,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS;gBAC5C,CAAC,CAAC,GAAG,GAAG,EAAE,kBAAkB,IAAI,IAAI,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,SAAS,aAAa,MAAM,EAAE;gBACxF,CAAC,CAAC,GAAG,GAAG,EAAE,kBAAkB,IAAI,IAAI,IAAI,CAAC,GAAG,aAAa,MAAM,EAAE,CAAC;IACxE,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,OAA2B,EAC3B,IAAY,EACZ,MAAc;;IAEd,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5E,MAAM,OAAO,SACX,OAAO,CAAC,OAAO,mCACf,CAAC,MAAM,KAAK,SAAS;QACnB,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,MAAM,KAAK,OAAO;YAClB,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,SAAS,CAAC,CAAC;IACnB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,cAAc;YACjB,OAAO,GAAG,GAAG,EAAE,kBAAkB,IAAI,IAAI,OAAO,CAAC,OAAO,aAAa,MAAM,EAAE,CAAC;QAChF,KAAK,cAAc;YACjB,OAAO,OAAO,CAAC,OAAO;gBACpB,CAAC,CAAC,GAAG,GAAG,EAAE,eAAe,OAAO,CAAC,OAAO,YAAY,IAAI,aAAa,MAAM,cAAc,GAAG,EAAE,mBAAmB,OAAO,CAAC,OAAO,aAAa,MAAM,GAAG;gBACtJ,CAAC,CAAC,GAAG,GAAG,EAAE,mBAAmB,OAAO,CAAC,OAAO,aAAa,MAAM,EAAE,CAAC;QACtE,SAAS,CAAC;YACR,IAAI,OAAO,CAAC,GAAG,KAAK,OAAO,IAAI,OAAO,CAAC,GAAG,KAAK,YAAY,EAAE,CAAC;gBAC5D,OAAO,GAAG,GAAG,EAAE,kBAAkB,IAAI,IAAI,OAAO,CAAC,GAAG,aAAa,MAAM,EAAE,CAAC;YAC5E,CAAC;YACD,MAAM,UAAU,SAAG,OAAO,CAAC,YAAY,mCAAI,MAAM,CAAC;YAClD,OAAO,GAAG,GAAG,EAAE,kBAAkB,IAAI,IAAI,OAAO,CAAC,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,MAAM,EAAE,CAAC;QAClI,CAAC;IACH,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,UAAU,CAAC,OAA2B;IACpD,QAAQ,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,KAAK,cAAc;YACjB,OAAO,cAAc,CAAC;QACxB,KAAK,cAAc;YACjB,OAAO,wBAAwB,CAAC;QAClC;YACE,OAAO,GAAG,OAAO,CAAC,IAAI,YAAY,CAAC;IACvC,CAAC;AACH,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AAClE,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,QAAQ,CAAC,SAAyB;IAChD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;IACpC,OAAO,SAAS,CAAC,IAAI;QACnB,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,cAAc,IAAI,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;AAC7D,CAAC;AAcD;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAqB,EACrB,MAAuB,EACvB,SAAyB,EACzB,QAAuB,EACvB,KAAkB;;IAElB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,GAAG,KAAK,CAAC,GAAG,OAAO,MAAM,CAAC,IAAI,aAAa,MAAA,KAAK,CAAC,gBAAgB,mCAAI,GAAG,YAAY;YACpF,KAAK,QAAQ,CAAC,SAAS,CAAC,EAAE;YAC1B,WAAW,SAAS,CAAC,IAAI,EAAE;SAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAG;QACX,GAAG,KAAK,CAAC,GAAG,OAAO,MAAM,CAAC,IAAI,EAAE;QAChC,KAAK,CAAC,KAAK;YACT,CAAC,CAAC,UAAU,MAAA,KAAK,CAAC,OAAO,mCAAI,GAAG,yBAAyB;YACzD,CAAC,CAAC,IAAI,MAAA,KAAK,CAAC,OAAO,mCAAI,GAAG,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,GAAG;QACzE,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpD,WAAW,MAAA,KAAK,CAAC,MAAM,mCAAI,QAAQ,EAAE;QACrC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,wBAAwB;KACxE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEd,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,CAAC,EACD,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CACrD,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAErC,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS;YACxB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,OAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,mCACjD,GAAG,GAAG,EAAE,qBAAqB,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACtF,MAAM,MAAM,GACV,IAAI,CAAC,aAAa,IAAI,KAAK;YACzB,CAAC,CAAC;gBACE,GAAG,MAAM,KAAK,gBAAgB,CAAC,KAAK,CAAC,EAAE;gBACvC,GAAG,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,KAAK,kCAAO,MAAM,KAAE,OAAO,EAAE,IAAI,CAAC,GAAG,IAAG,CAAC,EAAE;aAC3E;YACH,CAAC,CAAC,EAAE,CAAC;QACT,OAAO;YACL,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,EAAE;YAC3C,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,GAAG,MAAM;SACV,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,CAAC,EACD,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CACnB,CAAC,OAAO,EAAE,EAAE,kBAAC,OAAC,OAAO,CAAC,OAAO,mCAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,GAAA,CACtD,CACF,CAAC;IACF,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;;;QACzD,MAAM,KAAK,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,OAAC,OAAO,CAAC,OAAO,mCAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,OAAO,CAAC,KAAK,KAAK,KAAK,IAAI,QAAQ,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,OAAC,KAAK,CAAC,QAAQ,mCAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,kBACxD,SAAS,CAAC,QAAQ,CAAC,QAAQ,OAAC,OAAO,CAAC,OAAO,mCAAI,OAAO,CAAC,IAAI,CAAC,GAAA,CAC7D,CAAC;QACF,MAAM,KAAK,GAAG,OAAO;YACnB,CAAC,CAAC,OAAO,CAAC,KAAK;gBACb,CAAC,CAAC,gBAAgB,UAAU,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,mBAAmB,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;gBACpH,CAAC,CAAC,KAAK,MAAA,OAAO,CAAC,OAAO,mCAAI,GAAG,OAAO,CAAC,IAAI,YAAY,EAAE;YACzD,CAAC,CAAC,KAAK,MAAA,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,mCAAI,WAAW,EAAE,CAAC;QACtD,mEAAmE;QACnE,gEAAgE;QAChE,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO;YAC/B,CAAC,CAAC,OAAC,QAAQ,CAAC,MAAM,mCAAI,EAAE,CAAC,CAAC,MAAM,CAC5B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAC7C;YACH,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO;YAC7B,CAAC,CAAC,MAAA,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,0CAAE,IAAI,CAAC,CAAC,CAAC;YAC3D,CAAC,CAAC,MAAA,QAAQ,CAAC,IAAI,0CAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAChE,MAAM,KAAK,GAAG;YACZ,KAAK;YACL,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM;gBACpC,CAAC,CAAC;oBACE,SAAS;wBACP,CAAC,CAAC,cAAc,SAAS,CAAC,UAAU,IAAI,SAAS,CAAC,MAAM,EAAE;wBAC1D,CAAC,CAAC,cAAc;iBACnB;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,KAAK;gBACP,CAAC,CAAC;oBACE,OAAO;wBACL,CAAC,CAAC,YAAY,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE;wBACnD,CAAC,CAAC,YAAY;iBACjB;gBACH,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;QACF,OAAO;YACL,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YAC3C,GAAG,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK;gBAC3B,CAAC,CAAC;oBACE,GAAG,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;iBACzE;gBACH,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI;QACJ,GAAG,QAAQ;QACX,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC1E,KAAK,QAAQ,CAAC,SAAS,CAAC,EAAE;QAC1B,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,aAAa,GAA2B;IAC5C,MAAM,EAAE,iBAAiB;IACzB,QAAQ,EAAE,sBAAsB;IAChC,OAAO,EAAE,8BAA8B;CACxC,CAAC;AAEF,SAAS,YAAY,CAAC,IAAiB;;IACrC,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,SAAS;YACnB,CAAC,CAAC,wBAAwB;YAC1B,CAAC,CAAC,4BAA4B,CAAC;IACnC,CAAC;IACD,MAAM,GAAG,GACP,IAAI,CAAC,GAAG,KAAK,QAAQ;QACnB,CAAC,CAAC,uBAAuB;QACzB,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,QAAQ;YACrB,CAAC,CAAC,OAAO,MAAA,IAAI,CAAC,SAAS,mCAAI,oBAAoB,wBAAwB;YACvE,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,MAAM;gBACnB,CAAC,CAAC,qBAAqB;gBACvB,CAAC,CAAC,IAAI,CAAC;IACf,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,MAAM,GACV,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS;YACrC,CAAC,CAAC,cAAc,IAAI,CAAC,SAAS,EAAE;YAChC,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,QAAQ,GACZ,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,eAAe;YAC5C,CAAC,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG;YACnC,CAAC,CAAC,EAAE,CAAC;QACT,OAAO,KAAK,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,WAAW,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC;IACvD,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,OAAC,IAAI,CAAC,MAAM,mCAAI,eAAe,CAAC,CAAC;IAC5D,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;AACrF,CAAC","sourcesContent":["import type {\n AgentRunSummary,\n ChannelRequirement,\n Requirement,\n TeamAgentEntry,\n TeamAgentHold,\n TeamIntegrationEvent,\n} from '@ekanos/integration-schema';\n\nimport { cli } from '../invocation';\nimport { type ScopeFacts, scopeFix, scopeHiddenWords } from './scope-notice';\n\n/**\n * \"Is this agent live on this team, and if not, why?\" — one answer for\n * `teams agents show` and the summary line of `teams agents list`, built only\n * from what the host already reports (CLI audit 2026-10-19, §3).\n *\n * Live is: on, on a published version, every connection it needs made,\n * access confirmed by someone who sets it up (a team manager or the Source\n * admin, plan 247.2), at least one trigger on, and every trigger's events\n * able to reach it. Each gap is a step with one fix, in the order they have\n * to be done; the first step's fix is \"Next\". A publish holds no team, so\n * there is no update waiting.\n */\n\nexport interface ReadinessStep {\n /** What is missing, in words. */\n problem: string;\n /** The one command (or app step) that fixes it. */\n fix: string;\n}\n\nexport interface AgentReadiness {\n live: boolean;\n steps: ReadinessStep[];\n /** The first step's fix; null when there is none. */\n next: string | null;\n}\n\nexport interface ReadinessTarget {\n team: string;\n source: string;\n}\n\nexport function agentReadiness(\n entry: TeamAgentEntry,\n target: ReadinessTarget,\n): AgentReadiness {\n const steps = readinessSteps(entry, target);\n return {\n live: steps.length === 0,\n steps,\n next: steps[0]?.fix ?? null,\n };\n}\n\n/**\n * What a newer version adds over the one a team runs, in words (a publish's\n * report of the teams pinned to another version):\n * \"adds zendesk_update_ticket; lets zendesk_add_tag run without approval\".\n */\nexport function describeHold(hold: TeamAgentHold): string {\n const adds = [\n ...(hold.adds.scope === 'all'\n ? ['every tool of the products it can reach']\n : hold.adds.scope === 'read_only'\n ? ['every read of the products it can reach']\n : []),\n ...hold.adds.products.map((product) => `${product.name} (every tool)`),\n ...hold.adds.tools,\n ];\n const loosens = [\n ...(hold.loosens.writes ? ['writes'] : []),\n ...(hold.loosens.reads ? ['reads'] : []),\n ...hold.loosens.tools,\n ];\n const parts = [\n ...(adds.length > 0 ? [`adds ${adds.join(', ')}`] : []),\n ...(loosens.length > 0\n ? [`lets ${loosens.join(', ')} run without approval`]\n : []),\n ];\n return parts.length > 0 ? parts.join('; ') : 'reaches further';\n}\n\nfunction readinessSteps(\n entry: TeamAgentEntry,\n { team, source }: ReadinessTarget,\n): ReadinessStep[] {\n const enable = `${cli()} teams agents enable ${team} ${entry.key} --source ${source}`;\n const agent = entry.agent;\n if (!agent) return [{ problem: `off for ${team}`, fix: enable }];\n if (agent.status !== 'active') {\n return [{ problem: `${agent.status} for ${team}`, fix: enable }];\n }\n\n const steps: ReadinessStep[] = [];\n if (agent.draft) {\n // A team testing a draft runs it only when started by hand.\n steps.push({\n problem: `testing unpublished draft v${agent.version ?? '?'}: its triggers do not start it`,\n fix: `${cli()} agents publish ${entry.key} --source ${source}`,\n });\n } else if (agent.version === null) {\n steps.push({\n problem: 'no published version',\n fix: `${cli()} agents publish ${entry.key} --source ${source}`,\n });\n }\n for (const item of agent.missing) {\n steps.push({\n problem: `${item.name}: ${REASON_WORDS[item.reason ?? 'not_connected']}`,\n fix:\n requirementFix(item, team, source) ??\n `${cli()} teams mcp status ${team} ${item.key} --source ${source}`,\n });\n }\n if (!agent.accessConfirmed) {\n steps.push({\n problem: 'nobody has confirmed what it may use',\n // Whoever sets it up confirms, as themselves: the Source admin here,\n // or a team manager in the app (plan 247.2).\n fix: `${cli()} teams agents confirm ${team} ${entry.key} --source ${source} (or a team manager confirms in the app: Agents › ${entry.name} › Setup)`,\n });\n }\n if (!agent.triggers.some((trigger) => trigger.enabled)) {\n steps.push({\n problem: 'no trigger is on, so it only runs when started by hand',\n fix: `${cli()} teams triggers add ${team} ${entry.key} event <event-id> --source ${source} (event ids: ${cli()} catalog --source ${source})`,\n });\n }\n for (const channel of agent.channels ?? []) {\n if (channel.ready) continue;\n steps.push({\n problem: channel.problem ?? `${channel.name} not ready`,\n fix: channelFix(channel, team, source),\n });\n }\n return steps;\n}\n\nexport const REASON_WORDS: Record<\n NonNullable<Requirement['reason']>,\n string\n> = {\n not_connected: 'not connected',\n no_route: 'no route maps the Source connection’s events to this team',\n source_unsupported: 'the integration no longer supports a Source connection',\n source_not_entitled: 'the product is not enabled for the Source',\n source_not_connected: 'the Source connection is not made',\n};\n\n/** The one command that makes a requirement, or null when none can. */\nexport function requirementFix(\n item: Requirement,\n team: string,\n source: string,\n): string | null {\n if (item.kind === 'mcp') return null;\n switch (item.reason) {\n case 'no_route':\n return `${cli()} routes set ${item.key} <value> ${team} --source ${source} (values: ${cli()} routes options ${item.key} --source ${source})`;\n case 'source_not_connected':\n return `${cli()} apps connect ${item.key} --source ${source}`;\n case 'source_not_entitled':\n return `a super-admin enables it for the Source (${cli()} sources products --source ${source})`;\n case 'source_unsupported':\n return `set connections.${item.key}.owner to \"team\" in agent.json, then ${cli()} agents apply`;\n default:\n if (item.connected) return null;\n // A per-person product is the runs-as person's connection, not the\n // caller's: connecting your own leaves the agent missing it.\n return item.via === 'person' && item.viaDetail\n ? `${cli()} teams connect ${team} ${item.key} --as ${item.viaDetail} --source ${source}`\n : `${cli()} teams connect ${team} ${item.key} --source ${source}`;\n }\n}\n\n/**\n * The one command that makes a channel ready. An older host sends no\n * `arrival`: the channel's key (`<product>:webhook`, `<product>:route`,\n * `<product>:<connection>`) still says which command it is.\n */\nexport function channelFix(\n channel: ChannelRequirement,\n team: string,\n source: string,\n): string {\n const suffix = channel.key.includes(':') ? channel.key.split(':')[1] : null;\n const arrival =\n channel.arrival ??\n (suffix === 'webhook'\n ? 'team-webhook'\n : suffix === 'route'\n ? 'source-route'\n : 'install');\n switch (arrival) {\n case 'team-webhook':\n return `${cli()} teams webhook ${team} ${channel.product} --source ${source}`;\n case 'source-route':\n return channel.webhook\n ? `${cli()} routes set ${channel.product} <value> ${team} --source ${source} (values: ${cli()} routes options ${channel.product} --source ${source})`\n : `${cli()} routes webhook ${channel.product} --source ${source}`;\n default: {\n if (channel.key === 'slack' || channel.key === 'linear-app') {\n return `${cli()} teams connect ${team} ${channel.key} --source ${source}`;\n }\n const connection = channel.connectionId ?? suffix;\n return `${cli()} teams connect ${team} ${channel.product}${connection ? ` --connection ${connection}` : ''} --source ${source}`;\n }\n }\n}\n\n/** How the events of a ready channel reach the agent. */\nexport function reachedVia(channel: ChannelRequirement): string {\n switch (channel.arrival) {\n case 'team-webhook':\n return 'team webhook';\n case 'source-route':\n return 'Source webhook, routed';\n default:\n return `${channel.name} installed`;\n }\n}\n\n/** A fix as a line: a command is run in the terminal; anything else is a person's step. */\nexport function fixLine(fix: string): string {\n return fix.startsWith(cli()) ? `in your terminal: ${fix}` : fix;\n}\n\n/** \"Live: yes\" or \"Live: no — N steps left\". */\nexport function liveLine(readiness: AgentReadiness): string {\n const left = readiness.steps.length;\n return readiness.live\n ? 'Live: yes'\n : `Live: no — ${left} step${left === 1 ? '' : 's'} left`;\n}\n\n/* ---------------------------------------------------------------------- */\n/* teams agents show */\n/* ---------------------------------------------------------------------- */\n\n/** What happened lately, read alongside the agent; each part optional. */\nexport interface AgentActivity {\n /** The agent's recent runs, newest first. */\n runs: AgentRunSummary[] | null;\n /** The team's recent integration events, newest first. */\n events: TeamIntegrationEvent[] | null;\n}\n\n/**\n * One line per product, per trigger, then Live and Next. A product the\n * team's product scopes hide from it in the app says so — connected or not,\n * the team cannot see it there (`scope`, the team's scopes).\n */\nexport function describeAgentReadiness(\n entry: TeamAgentEntry,\n target: ReadinessTarget,\n readiness: AgentReadiness,\n activity: AgentActivity,\n scope?: ScopeFacts,\n): string {\n const agent = entry.agent;\n if (!agent) {\n return [\n `${entry.key} on ${target.team} · off · v${entry.publishedVersion ?? '?'} published`,\n ` ${liveLine(readiness)}`,\n ` Next: ${readiness.next}`,\n ].join('\\n');\n }\n\n const head = [\n `${entry.key} on ${target.team}`,\n agent.draft\n ? `draft v${agent.version ?? '?'} (testing, unpublished)`\n : `v${agent.version ?? '?'} (${agent.pinned ? 'pinned' : 'following'})`,\n ...(agent.status === 'active' ? [] : [agent.status]),\n `runs as ${agent.runsAs ?? 'nobody'}`,\n agent.accessConfirmed ? '✓ access confirmed' : '✗ access not confirmed',\n ].join(' · ');\n\n const width = Math.max(\n 8,\n ...agent.requirements.map((item) => item.key.length),\n );\n const pad = (label: string) => label.padEnd(width);\n const indent = ' '.repeat(width + 4);\n\n const products = agent.requirements.flatMap((item) => {\n const fix = item.connected\n ? null\n : (requirementFix(item, target.team, target.source) ??\n `${cli()} teams mcp status ${target.team} ${item.key} --source ${target.source}`);\n const hidden =\n item.hiddenByScope && scope\n ? [\n `${indent}! ${scopeHiddenWords(scope)}`,\n `${indent}→ ${fixLine(scopeFix(scope, { ...target, product: item.key }))}`,\n ]\n : [];\n return [\n ` ${pad(item.key)} ${productState(item)}`,\n ...(fix ? [`${indent}→ ${fixLine(fix)}`] : []),\n ...hidden,\n ];\n });\n\n const nameWidth = Math.max(\n 0,\n ...agent.triggers.map(\n (trigger) => (trigger.eventId ?? trigger.type).length,\n ),\n );\n const triggers = agent.triggers.flatMap((trigger, index) => {\n const label = index === 0 ? pad('triggers') : pad('');\n const name = (trigger.eventId ?? trigger.type).padEnd(nameWidth);\n if (!trigger.enabled) return [` ${label} ${name} (off)`];\n const channel = (agent.channels ?? []).find((candidate) =>\n candidate.triggers.includes(trigger.eventId ?? trigger.type),\n );\n const reach = channel\n ? channel.ready\n ? `✓ reachable (${reachedVia(channel)}${channel.lastDeliveryAt ? `, last delivery ${channel.lastDeliveryAt}` : ''})`\n : `✗ ${channel.problem ?? `${channel.name} not ready`}`\n : `✓ ${TRIGGER_REACH[trigger.type] ?? 'reachable'}`;\n // An event trigger's runs are the ones its own events started; any\n // other trigger's, the agent's latest run of that trigger type.\n const ownEvents = trigger.eventId\n ? (activity.events ?? []).filter(\n (event) => event.eventId === trigger.eventId,\n )\n : [];\n const lastEvent = ownEvents[0];\n const lastRun = trigger.eventId\n ? ownEvents.find((event) => event.runs.length > 0)?.runs[0]\n : activity.runs?.find((run) => run.trigger === trigger.type);\n const known = trigger.eventId ? activity.events : activity.runs;\n const facts = [\n reach,\n ...(trigger.eventId && activity.events\n ? [\n lastEvent\n ? `last event ${lastEvent.receivedAt} ${lastEvent.status}`\n : 'no event yet',\n ]\n : []),\n ...(known\n ? [\n lastRun\n ? `last run ${lastRun.startedAt} ${lastRun.status}`\n : 'no run yet',\n ]\n : []),\n ];\n return [\n ` ${label} ${name} ${facts.join(' · ')}`,\n ...(channel && !channel.ready\n ? [\n `${indent}→ ${fixLine(channelFix(channel, target.team, target.source))}`,\n ]\n : []),\n ];\n });\n\n return [\n head,\n ...products,\n ...(agent.triggers.length > 0 ? triggers : [` ${pad('triggers')} none`]),\n ` ${liveLine(readiness)}`,\n ...(readiness.next ? [` Next: ${readiness.next}`] : []),\n ].join('\\n');\n}\n\nconst TRIGGER_REACH: Record<string, string> = {\n manual: 'started by hand',\n schedule: 'runs on its schedule',\n webhook: 'reachable at its trigger URL',\n};\n\nfunction productState(item: Requirement): string {\n if (item.kind === 'mcp') {\n return item.connected\n ? '✓ MCP server connected'\n : '✗ MCP server not signed in';\n }\n const via =\n item.via === 'source'\n ? 'via Source connection'\n : item.via === 'person'\n ? `via ${item.viaDetail ?? 'the runs-as person'}'s personal connection`\n : item.via === 'team'\n ? 'via team connection'\n : null;\n if (item.connected) {\n const routes =\n item.via === 'source' && item.viaDetail\n ? ` · routes: ${item.viaDetail}`\n : '';\n const fallback =\n item.reason && item.reason !== 'not_connected'\n ? ` (${REASON_WORDS[item.reason]})`\n : '';\n return `✓ ${via ?? 'connected'}${routes}${fallback}`;\n }\n const reason = REASON_WORDS[item.reason ?? 'not_connected'];\n return `✗ ${via ? `${via} — ` : ''}${reason}${item.required ? '' : ' (optional)'}`;\n}\n"]}
|
|
@@ -3,9 +3,12 @@ import type { CliContext } from '../context.js';
|
|
|
3
3
|
import type { ExitCode } from '../exit-codes.js';
|
|
4
4
|
import { type TeamAgentRun } from './team-agents.js';
|
|
5
5
|
/**
|
|
6
|
-
* `ekanos teams agents list|show|enable|confirm|disable|pin|unpin|policy|skills` —
|
|
6
|
+
* `ekanos teams agents list|show|create|apply|enable|confirm|disable|archive|unarchive|pin|unpin|policy|skills|tags` —
|
|
7
7
|
* a team's provided agents, turned on, versioned, given an approval policy
|
|
8
|
-
* and skills by the Source admin
|
|
8
|
+
* and skills by the Source admin; and the team's own and personal agents,
|
|
9
|
+
* made and changed from an agent.json with `create|apply`
|
|
10
|
+
* (team-agents-define.ts), turned on with `enable`. A personal agent is
|
|
11
|
+
* listed and shown to everyone, and changed by its creator alone. `enable|pin … --draft` puts one team on
|
|
9
12
|
* the template's latest, unpublished version to test it there before
|
|
10
13
|
* publishing. `confirm` (and `--confirm-access`) records the caller's own
|
|
11
14
|
* confirmation that it may use its connections in runs no one watches:
|
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
import { AgentRunListSchema, TeamAgentChangeResultSchema, TeamAgentListSchema, TeamAgentPolicySchema, TeamAgentSkillsSchema, } from '@ekanos/integration-schema';
|
|
1
|
+
import { AgentRunListSchema, TeamAgentChangeResultSchema, TeamAgentListSchema, TeamAgentPolicySchema, TeamAgentSkillsSchema, TeamAgentTagsSchema, } from '@ekanos/integration-schema';
|
|
2
2
|
import { invalidStateError, notFoundError, usageError } from '../errors.js';
|
|
3
|
+
import { cli } from '../invocation.js';
|
|
3
4
|
import { call, listTeamEvents } from '../teams-api.js';
|
|
4
5
|
import { REASON_WORDS, agentReadiness, channelFix, describeAgentReadiness, fixLine, liveLine, reachedVia, requirementFix, } from './team-agent-readiness.js';
|
|
5
6
|
import { requireOperand, usageFor } from './team-agents.js';
|
|
7
|
+
import { runTeamAgentDefine } from './team-agents-define.js';
|
|
8
|
+
import { confirmChange } from './teams-lifecycle.js';
|
|
6
9
|
/**
|
|
7
|
-
* `ekanos teams agents list|show|enable|confirm|disable|pin|unpin|policy|skills` —
|
|
10
|
+
* `ekanos teams agents list|show|create|apply|enable|confirm|disable|archive|unarchive|pin|unpin|policy|skills|tags` —
|
|
8
11
|
* a team's provided agents, turned on, versioned, given an approval policy
|
|
9
|
-
* and skills by the Source admin
|
|
12
|
+
* and skills by the Source admin; and the team's own and personal agents,
|
|
13
|
+
* made and changed from an agent.json with `create|apply`
|
|
14
|
+
* (team-agents-define.ts), turned on with `enable`. A personal agent is
|
|
15
|
+
* listed and shown to everyone, and changed by its creator alone. `enable|pin … --draft` puts one team on
|
|
10
16
|
* the template's latest, unpublished version to test it there before
|
|
11
17
|
* publishing. `confirm` (and `--confirm-access`) records the caller's own
|
|
12
18
|
* confirmation that it may use its connections in runs no one watches:
|
|
@@ -16,7 +22,7 @@ import { requireOperand, usageFor } from './team-agents.js';
|
|
|
16
22
|
*/
|
|
17
23
|
export async function runTeamAgentsArea(ctx, run) {
|
|
18
24
|
var _a, _b, _c;
|
|
19
|
-
var _d, _e, _f;
|
|
25
|
+
var _d, _e, _f, _g, _h;
|
|
20
26
|
const team = requireOperand(run.operands[0], 'team slug', 'agents');
|
|
21
27
|
const base = `/api/partner/teams/${encodeURIComponent(team)}/agents`;
|
|
22
28
|
if (run.verb === 'list') {
|
|
@@ -27,14 +33,22 @@ export async function runTeamAgentsArea(ctx, run) {
|
|
|
27
33
|
source: run.source,
|
|
28
34
|
}));
|
|
29
35
|
const target = { team: list.team.slug, source: run.source };
|
|
36
|
+
const own = (_d = list.ownAgents) !== null && _d !== void 0 ? _d : [];
|
|
30
37
|
return ctx.succeed(Object.assign(Object.assign({ host: run.host }, list), { agents: list.agents.map((entry) => (Object.assign(Object.assign({}, entry), { readiness: agentReadiness(entry, target) }))) }), [
|
|
31
38
|
ctx.ui.result({
|
|
32
|
-
title: list.agents.length === 0
|
|
39
|
+
title: list.agents.length === 0 && own.length === 0
|
|
33
40
|
? `No agents are provided for ${list.team.slug}`
|
|
34
41
|
: `Agents for ${list.team.slug}`,
|
|
35
|
-
tone: list.agents.length === 0 ? 'warn' : 'ok',
|
|
42
|
+
tone: list.agents.length === 0 && own.length === 0 ? 'warn' : 'ok',
|
|
36
43
|
}),
|
|
37
44
|
...list.agents.map((entry) => describeEntry(entry, list.team.slug, run.source)),
|
|
45
|
+
...(own.length > 0
|
|
46
|
+
? [
|
|
47
|
+
`
|
|
48
|
+
The team's own and personal agents:`,
|
|
49
|
+
...own.map((agent) => describeOwnAgent(agent, list.team.slug, run.source)),
|
|
50
|
+
]
|
|
51
|
+
: []),
|
|
38
52
|
list.mcpServers.length > 0
|
|
39
53
|
? `\nMCP servers: ${list.mcpServers.map((server) => `${server.key} (${server.status})`).join(', ')}`
|
|
40
54
|
: '',
|
|
@@ -42,6 +56,9 @@ export async function runTeamAgentsArea(ctx, run) {
|
|
|
42
56
|
.filter(Boolean)
|
|
43
57
|
.join('\n'));
|
|
44
58
|
}
|
|
59
|
+
if (run.verb === 'create' || run.verb === 'apply') {
|
|
60
|
+
return runTeamAgentDefine(ctx, run, run.verb);
|
|
61
|
+
}
|
|
45
62
|
const key = requireOperand(run.operands[1], 'agent key', 'agents');
|
|
46
63
|
const path = `${base}/${encodeURIComponent(key)}`;
|
|
47
64
|
switch (run.verb) {
|
|
@@ -57,7 +74,7 @@ export async function runTeamAgentsArea(ctx, run) {
|
|
|
57
74
|
if (draft)
|
|
58
75
|
requireDraftHost(result, 'enabled');
|
|
59
76
|
return ctx.succeed(Object.assign({ host: run.host }, result), describeChange(result, `${draft
|
|
60
|
-
? `Testing draft v${(
|
|
77
|
+
? `Testing draft v${(_e = result.version) !== null && _e !== void 0 ? _e : '?'} of ${result.slug} on ${result.team.slug}`
|
|
61
78
|
: `Turned on ${result.slug} for ${result.team.slug}`}${confirmAccess && result.accessConfirmed ? ', and you confirmed what it may use' : ''}`, run.source, { confirmRequested: confirmAccess }));
|
|
62
79
|
}
|
|
63
80
|
case 'confirm': {
|
|
@@ -84,7 +101,7 @@ export async function runTeamAgentsArea(ctx, run) {
|
|
|
84
101
|
draft: true,
|
|
85
102
|
});
|
|
86
103
|
requireDraftHost(result, 'pinned');
|
|
87
|
-
return ctx.succeed(Object.assign({ host: run.host }, result), describeChange(result, `Testing draft v${(
|
|
104
|
+
return ctx.succeed(Object.assign({ host: run.host }, result), describeChange(result, `Testing draft v${(_f = result.version) !== null && _f !== void 0 ? _f : '?'} of ${result.slug} on ${result.team.slug}`, run.source));
|
|
88
105
|
}
|
|
89
106
|
expectOperands(run, 3);
|
|
90
107
|
const version = Number(run.operands[2]);
|
|
@@ -94,13 +111,40 @@ export async function runTeamAgentsArea(ctx, run) {
|
|
|
94
111
|
: 'Name the version to pin.', `e.g. "ekanos teams agents pin ${team} ${key} 3", or "--draft" to test the unpublished draft. "ekanos agents show ${key}" lists its versions.`);
|
|
95
112
|
}
|
|
96
113
|
const result = await change(run, `${path}/pin`, 'PUT', { version });
|
|
97
|
-
return ctx.succeed(Object.assign({ host: run.host }, result), describeChange(result, `${result.team.slug} stays on v${(
|
|
114
|
+
return ctx.succeed(Object.assign({ host: run.host }, result), describeChange(result, `${result.team.slug} stays on v${(_g = result.version) !== null && _g !== void 0 ? _g : version} of ${result.slug}`, run.source));
|
|
98
115
|
}
|
|
99
116
|
case 'unpin': {
|
|
100
117
|
expectOperands(run, 2);
|
|
101
118
|
const result = await change(run, `${path}/pin`, 'PUT', { version: null });
|
|
102
119
|
return ctx.succeed(Object.assign({ host: run.host }, result), describeChange(result, `${result.team.slug} follows each published version of ${result.slug}`, run.source));
|
|
103
120
|
}
|
|
121
|
+
case 'archive': {
|
|
122
|
+
expectOperands(run, 2);
|
|
123
|
+
// Asked before any request: a script or an agent run passes --yes.
|
|
124
|
+
if (!run.args.yes) {
|
|
125
|
+
await confirmChange(ctx, run.args, {
|
|
126
|
+
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.`,
|
|
127
|
+
command: `${cli()} teams agents archive ${team} ${key} --yes`,
|
|
128
|
+
question: `Archive ${key} on ${team}? [y/N]`,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
const result = await change(run, `${path}/archive`, 'POST', {});
|
|
132
|
+
return ctx.succeed(Object.assign({ host: run.host }, result), [
|
|
133
|
+
`✓ Archived ${result.slug} on ${result.team.slug}`,
|
|
134
|
+
` Bring it back, paused: ${cli()} teams agents unarchive ${result.team.slug} ${result.slug} --source ${run.source}`,
|
|
135
|
+
].join('\n'));
|
|
136
|
+
}
|
|
137
|
+
case 'unarchive': {
|
|
138
|
+
expectOperands(run, 2);
|
|
139
|
+
const result = await change(run, `${path}/unarchive`, 'POST', {});
|
|
140
|
+
return ctx.succeed(Object.assign({ host: run.host }, result), [
|
|
141
|
+
`✓ Unarchived ${result.slug} on ${result.team.slug}: it is paused`,
|
|
142
|
+
` runs as ${(_h = result.runsAs) !== null && _h !== void 0 ? _h : 'nobody'}`,
|
|
143
|
+
` Next: ${cli()} teams agents enable ${result.team.slug} ${result.slug} --source ${run.source}`,
|
|
144
|
+
].join('\n'));
|
|
145
|
+
}
|
|
146
|
+
case 'tags':
|
|
147
|
+
return tags(ctx, run, team, key, `${path}/tags`);
|
|
104
148
|
case 'policy':
|
|
105
149
|
return policy(ctx, run, team, key, `${path}/policy`);
|
|
106
150
|
case 'skills':
|
|
@@ -117,13 +161,22 @@ export async function runTeamAgentsArea(ctx, run) {
|
|
|
117
161
|
* activity reads still answers the rest.
|
|
118
162
|
*/
|
|
119
163
|
async function show(ctx, run, base, key) {
|
|
120
|
-
var _a
|
|
164
|
+
var _a;
|
|
165
|
+
var _b, _c, _d;
|
|
121
166
|
const list = await run.client.call((token) => call(run.host, token, TeamAgentListSchema, {
|
|
122
167
|
method: 'GET',
|
|
123
168
|
path: base,
|
|
124
169
|
source: run.source,
|
|
125
170
|
}));
|
|
126
171
|
const entry = list.agents.find((candidate) => candidate.key === key);
|
|
172
|
+
// The host finds an agent by its own slug first, as here: a team agent
|
|
173
|
+
// named like a template that is not turned on is the team agent.
|
|
174
|
+
const own = (entry === null || entry === void 0 ? void 0 : entry.agent)
|
|
175
|
+
? undefined
|
|
176
|
+
: (_a = list.ownAgents) === null || _a === void 0 ? void 0 : _a.find((candidate) => candidate.slug === key);
|
|
177
|
+
if (own) {
|
|
178
|
+
return ctx.succeed({ host: run.host, team: list.team, ownAgent: own }, describeOwnAgent(own, list.team.slug, run.source).trimStart());
|
|
179
|
+
}
|
|
127
180
|
if (!entry) {
|
|
128
181
|
throw notFoundError(`No agent "${key}" is provided for ${list.team.slug}.`, `"ekanos teams agents list ${list.team.slug}" lists the agents provided for it.`);
|
|
129
182
|
}
|
|
@@ -146,13 +199,13 @@ async function show(ctx, run, base, key) {
|
|
|
146
199
|
team: list.team,
|
|
147
200
|
agent: entry,
|
|
148
201
|
readiness,
|
|
149
|
-
lastRun: (
|
|
202
|
+
lastRun: (_b = runs === null || runs === void 0 ? void 0 : runs.runs[0]) !== null && _b !== void 0 ? _b : null,
|
|
150
203
|
recentEvents: events
|
|
151
204
|
? events.events.filter((event) => { var _a; return (_a = entry.agent) === null || _a === void 0 ? void 0 : _a.triggers.some((trigger) => trigger.eventId === event.eventId); })
|
|
152
205
|
: null,
|
|
153
206
|
}, describeAgentReadiness(entry, target, readiness, {
|
|
154
|
-
runs: (
|
|
155
|
-
events: (
|
|
207
|
+
runs: (_c = runs === null || runs === void 0 ? void 0 : runs.runs) !== null && _c !== void 0 ? _c : null,
|
|
208
|
+
events: (_d = events === null || events === void 0 ? void 0 : events.events) !== null && _d !== void 0 ? _d : null,
|
|
156
209
|
}, list.scope));
|
|
157
210
|
}
|
|
158
211
|
/** A read `show` can do without: on failure, say so and carry on. */
|
|
@@ -224,6 +277,57 @@ async function skills(ctx, run, team, key, path) {
|
|
|
224
277
|
const result = await run.client.call((token) => call(run.host, token, TeamAgentSkillsSchema, Object.assign({ method: change ? 'PUT' : 'GET', path, source: run.source }, (change ? { body: change } : {}))));
|
|
225
278
|
return ctx.succeed(Object.assign({ host: run.host }, result), describeSkills(ctx, result, change));
|
|
226
279
|
}
|
|
280
|
+
/**
|
|
281
|
+
* `teams agents tags <team> <key> [add|remove <tag>]` — the labels that
|
|
282
|
+
* organize the team's agents; they grant nothing. A tag the team does not
|
|
283
|
+
* have yet is made when it is added, as the app's New tag makes it.
|
|
284
|
+
*/
|
|
285
|
+
async function tags(ctx, run, team, key, path) {
|
|
286
|
+
const [action, tag, extra] = run.operands.slice(2);
|
|
287
|
+
if (extra !== undefined) {
|
|
288
|
+
throw usageError(`Unexpected argument "${extra}".`, 'Quote a tag name with spaces, e.g. "Customer support".');
|
|
289
|
+
}
|
|
290
|
+
let change = null;
|
|
291
|
+
if (action === 'add' || action === 'remove') {
|
|
292
|
+
if (!(tag === null || tag === void 0 ? void 0 : tag.trim())) {
|
|
293
|
+
throw usageError(`tags ${action} needs a tag.`, `e.g. ${cli()} teams agents tags ${team} ${key} ${action} "Customer support"`);
|
|
294
|
+
}
|
|
295
|
+
change = { [action]: tag.trim() };
|
|
296
|
+
}
|
|
297
|
+
else if (action !== undefined) {
|
|
298
|
+
throw usageError(`Unknown tags action "${action}".`, usageFor('agents'));
|
|
299
|
+
}
|
|
300
|
+
const result = await run.client.call((token) => call(run.host, token, TeamAgentTagsSchema, Object.assign({ method: change ? 'PUT' : 'GET', path, source: run.source }, (change ? { body: change } : {}))));
|
|
301
|
+
const title = (change === null || change === void 0 ? void 0 : change.add)
|
|
302
|
+
? `Tagged ${result.slug} on ${result.team.slug} "${change.add}"`
|
|
303
|
+
: (change === null || change === void 0 ? void 0 : change.remove)
|
|
304
|
+
? `Took the tag "${change.remove}" off ${result.slug} on ${result.team.slug}`
|
|
305
|
+
: `Tags of ${result.slug} on ${result.team.slug}`;
|
|
306
|
+
const lines = [
|
|
307
|
+
ctx.ui.result({
|
|
308
|
+
title,
|
|
309
|
+
tone: 'ok',
|
|
310
|
+
rows: [
|
|
311
|
+
[
|
|
312
|
+
'tags',
|
|
313
|
+
result.tags.length === 0
|
|
314
|
+
? 'none'
|
|
315
|
+
: result.tags.map((item) => item.name).join(', '),
|
|
316
|
+
],
|
|
317
|
+
],
|
|
318
|
+
notes: result.createdTag
|
|
319
|
+
? [
|
|
320
|
+
`${result.team.slug} had no tag "${result.createdTag.name}": it was made.`,
|
|
321
|
+
]
|
|
322
|
+
: [],
|
|
323
|
+
}),
|
|
324
|
+
];
|
|
325
|
+
const others = result.teamTags.filter((item) => !result.tags.some((on) => on.slug === item.slug));
|
|
326
|
+
if (!change && others.length > 0) {
|
|
327
|
+
lines.push(`\nThe team's other tags: ${others.map((item) => item.name).join(', ')}`);
|
|
328
|
+
}
|
|
329
|
+
return ctx.succeed(Object.assign({ host: run.host }, result), lines.join('\n'));
|
|
330
|
+
}
|
|
227
331
|
function describeSkills(ctx, result, change) {
|
|
228
332
|
const [verb, slug] = (change === null || change === void 0 ? void 0 : change.add)
|
|
229
333
|
? ['Attached', change.add[0]]
|
|
@@ -289,13 +393,19 @@ function describePolicy(ctx, policy, changed, source) {
|
|
|
289
393
|
* team's agent has no version to name.
|
|
290
394
|
*/
|
|
291
395
|
async function shownVersion(ctx, run, base, key) {
|
|
292
|
-
var _a;
|
|
396
|
+
var _a, _b;
|
|
397
|
+
var _c;
|
|
293
398
|
const list = await run.client.call((token) => call(run.host, token, TeamAgentListSchema, {
|
|
294
399
|
method: 'GET',
|
|
295
400
|
path: base,
|
|
296
401
|
source: run.source,
|
|
297
402
|
}));
|
|
298
|
-
const
|
|
403
|
+
const own = (_a = list.ownAgents) === null || _a === void 0 ? void 0 : _a.find((entry) => entry.slug === key);
|
|
404
|
+
if (own) {
|
|
405
|
+
ctx.log(`Confirming what ${key} v${own.version} on ${list.team.slug} may use (it runs as ${(_c = own.createdBy) !== null && _c !== void 0 ? _c : 'nobody'}).`);
|
|
406
|
+
return own.version;
|
|
407
|
+
}
|
|
408
|
+
const agent = (_b = list.agents.find((entry) => entry.key === key)) === null || _b === void 0 ? void 0 : _b.agent;
|
|
299
409
|
if (!agent || agent.version === null)
|
|
300
410
|
return null;
|
|
301
411
|
ctx.log(`Confirming what ${key} v${agent.version} on ${list.team.slug} may use${agent.runsAs ? ` (it runs as ${agent.runsAs})` : ''}.`);
|
|
@@ -330,6 +440,33 @@ function describeEntry(entry, team, source) {
|
|
|
330
440
|
lines.push(` ${liveLine(readiness)}${readiness.next ? ` · Next: ${readiness.next}` : ''}`);
|
|
331
441
|
return lines.join('\n');
|
|
332
442
|
}
|
|
443
|
+
/**
|
|
444
|
+
* One of the team's own agents, or a personal one: whose it is, its version
|
|
445
|
+
* (what `apply --base-version` names), its triggers, and the next step.
|
|
446
|
+
*/
|
|
447
|
+
function describeOwnAgent(agent, team, source) {
|
|
448
|
+
var _a, _b;
|
|
449
|
+
const personal = agent.ownership === 'personal';
|
|
450
|
+
const whose = personal
|
|
451
|
+
? `personal agent of ${agent.yours ? 'yours' : ((_a = agent.createdBy) !== null && _a !== void 0 ? _a : 'a former member')}`
|
|
452
|
+
: `team agent · runs as ${(_b = agent.createdBy) !== null && _b !== void 0 ? _b : 'nobody'}`;
|
|
453
|
+
const lines = [
|
|
454
|
+
`
|
|
455
|
+
${agent.slug} — ${agent.name}`,
|
|
456
|
+
` ${agent.status} · v${agent.version} · ${whose}${agent.accessConfirmed ? '' : ' · access not confirmed'}`,
|
|
457
|
+
` triggers: ${agent.triggers.length === 0 ? 'none' : agent.triggers.map((trigger) => `${trigger.type}${trigger.enabled ? '' : ' (off)'}`).join(', ')}`,
|
|
458
|
+
];
|
|
459
|
+
if (personal && !agent.yours) {
|
|
460
|
+
lines.push(' Only its creator changes it, runs it, decides its approvals or reads its runs.');
|
|
461
|
+
}
|
|
462
|
+
else if (agent.status !== 'active') {
|
|
463
|
+
lines.push(` Next: ekanos teams agents enable ${team} ${agent.slug} --source ${source}`);
|
|
464
|
+
}
|
|
465
|
+
else if (!agent.accessConfirmed) {
|
|
466
|
+
lines.push(` Next: ${confirmCommand(team, agent.slug, source)}`);
|
|
467
|
+
}
|
|
468
|
+
return lines.join('\n');
|
|
469
|
+
}
|
|
333
470
|
function versionLabel(agent) {
|
|
334
471
|
var _a, _b;
|
|
335
472
|
if (agent.draft)
|