@ekanos/cli 0.16.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 +62 -4
- 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/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/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/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/scope-notice.d.ts +6 -0
- package/dist/commands/scope-notice.js +15 -0
- package/dist/commands/scope-notice.js.map +1 -1
- package/dist/commands/sources.js +2 -0
- 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/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-scope.js +4 -0
- package/dist/commands/teams-scope.js.map +1 -1
- package/dist/commands/teams.d.ts +1 -1
- package/dist/commands/teams.js +6 -1
- package/dist/commands/teams.js.map +1 -1
- package/dist/compatibility.d.ts +10 -1
- package/dist/compatibility.js +10 -1
- package/dist/compatibility.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.js +139 -7
- package/dist/index.js.map +1 -1
- 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/teams-api.d.ts +37 -1
- package/dist/teams-api.js +62 -1
- package/dist/teams-api.js.map +1 -1
- package/dist/validate-findings.js +2 -1
- package/dist/validate-findings.js.map +1 -1
- package/package.json +2 -2
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/repo/publish.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Finding } from '@ekanos/integration-schema';\nimport {\n type RepoDiscovery,\n type RepoPackage,\n RepoManifestError,\n describeAvailability,\n discoverRepo,\n packageContaining,\n planRepoOrder,\n} from '@ekanos/integration-schema/repo';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport {\n type PublishArgs,\n buildManifest,\n escalateForPublish,\n prepareIntegrationSubmission,\n readProjectVersion,\n submitPrepared,\n} from '../commands/publish';\nimport type { CliContext } from '../context';\nimport {\n CliError,\n gateFailedError,\n preconditionError,\n usageError,\n validationError,\n} from '../errors';\nimport type { ExitCode } from '../exit-codes';\nimport {\n EXPERIENCE_NOT_SUPPORTED,\n gateExperience,\n packExperience,\n} from '../experience/publish';\nimport { packProject } from '../pack';\nimport { loadProject } from '../project';\nimport { shortHost } from '../ui';\nimport { collectAllFindings } from '../validate-findings';\n\nexport const PUBLISH_ARTIFACT_DIR = path.join('.ekanos', 'publish');\n\nexport interface RepoPublishArgs {\n repoRoot: string;\n /** Where the command was run: inside a package it narrows the selection. */\n cwd: string;\n /** Package names given on the command line. */\n names: readonly string[];\n all: boolean;\n /** The single-project publish arguments, reused for every integration. */\n publish: PublishArgs;\n}\n\nexport type PackageStatus =\n | 'ready'\n | 'built'\n | 'gate failed'\n | 'refused'\n | 'submitted'\n | 'failed'\n | 'not attempted'\n | 'not supported by the host';\n\nexport interface PackageRow {\n name: string;\n kind: 'integration' | 'experience';\n version: string;\n availability: string;\n /** Artifact directory relative to the repo root, when one was built. */\n artifact: string | null;\n status: PackageStatus;\n /** Why the status is not a success, one line. */\n detail?: string;\n findings?: Finding[];\n /** Integration submissions: what the host answered. */\n receipt?: Record<string, unknown>;\n}\n\nconst AVAILABILITY_NOTE =\n 'availability is set by a super admin today; the host does not take it at submission';\n\nfunction loadRepo(root: string): RepoDiscovery {\n try {\n return discoverRepo(root);\n } catch (error) {\n if (error instanceof RepoManifestError) {\n throw validationError(\n error.message,\n 'Fix the root ekanos.json: { \"kind\": \"repo\", \"packages\": [\"integrations/*\", \"experiences/*\"] }.',\n );\n }\n throw error;\n }\n}\n\nfunction select(repo: RepoDiscovery, args: RepoPublishArgs): string[] {\n if (args.all && args.names.length > 0) {\n throw usageError(\n 'Pass package names or --all, not both.',\n 'e.g. \"ekanos publish acme-crm\" or \"ekanos publish --all\".',\n );\n }\n if (args.names.length > 0) return [...args.names];\n if (args.all) return [];\n const here = packageContaining(repo, args.cwd);\n if (here) return [here.name];\n throw usageError(\n 'This is a repo: say what to publish.',\n `Name packages (\"ekanos publish ${repo.packages[0]?.name ?? '<package>'}\"), pass --all, or run it from inside a package. Packages: ${repo.packages.map((p) => p.name).join(', ') || '(none yet; \"ekanos new integration <slug>\")'}.`,\n );\n}\n\nfunction artifactName(pkg: RepoPackage): string {\n return `${pkg.name}-${pkg.version}`;\n}\n\nfunction renderTable(ctx: CliContext, rows: readonly PackageRow[]): string {\n return ctx.ui.table(\n ['package', 'kind', 'version', 'availability', 'artifact', 'status'],\n rows.map((row) => [\n row.name,\n row.kind,\n row.version,\n row.availability,\n row.artifact ?? '-',\n row.detail ? `${row.status}: ${row.detail}` : row.status,\n ]),\n );\n}\n\n/** Gate one integration and, when asked, build its artifact. No network. */\nasync function checkIntegration(\n pkg: RepoPackage,\n repoRoot: string,\n build: boolean,\n): Promise<PackageRow> {\n const row: PackageRow = {\n name: pkg.name,\n kind: 'integration',\n version: pkg.version,\n availability: describeAvailability(pkg.availability),\n artifact: null,\n status: 'ready',\n };\n try {\n readProjectVersion(pkg.dir);\n const loaded = loadProject(pkg.dir);\n const findings = escalateForPublish(await collectAllFindings(loaded));\n const errors = findings.filter((f) => f.severity === 'error');\n if (errors.length > 0) {\n return {\n ...row,\n status: 'gate failed',\n detail: `${errors.length} error${errors.length === 1 ? '' : 's'}; run \"ekanos validate\" in ${pkg.relDir}`,\n findings,\n };\n }\n if (!build) return row;\n\n const packed = packProject(loaded.projectDir);\n const dir = path.join(repoRoot, PUBLISH_ARTIFACT_DIR, artifactName(pkg));\n fs.rmSync(dir, { recursive: true, force: true });\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(\n path.join(dir, `${artifactName(pkg)}.tgz`),\n packed.archive,\n );\n fs.writeFileSync(\n path.join(dir, 'manifest.json'),\n `${buildManifest(loaded, packed.files)}\\n`,\n );\n const contract = path.join(pkg.dir, 'contract.json');\n if (fs.existsSync(contract)) {\n fs.copyFileSync(contract, path.join(dir, 'contract.json'));\n }\n\n return {\n ...row,\n status: 'built',\n artifact: path.relative(repoRoot, dir).split(path.sep).join('/'),\n ...(findings.length > 0 ? { findings } : {}),\n };\n } catch (error) {\n if (error instanceof CliError) {\n return { ...row, status: 'refused', detail: error.message };\n }\n throw error;\n }\n}\n\n/** Gate one experience and, when asked, build and pack it. No network. */\nasync function checkExperience(\n pkg: RepoPackage,\n repoRoot: string,\n build: boolean,\n env: Record<string, string | undefined>,\n): Promise<PackageRow> {\n const row: PackageRow = {\n name: pkg.name,\n kind: 'experience',\n version: pkg.version,\n availability: describeAvailability(pkg.availability),\n artifact: null,\n status: 'ready',\n };\n try {\n const gate = await gateExperience({ dir: pkg.dir, dryRun: true, env });\n const errors = gate.result.findings.filter((f) => f.severity === 'error');\n if (errors.length > 0) {\n return {\n ...row,\n status: 'gate failed',\n detail: `${errors.length} error${errors.length === 1 ? '' : 's'}; run \"ekanos check\" in ${pkg.relDir}`,\n findings: gate.result.findings,\n };\n }\n if (!build) return row;\n\n const dir = path.join(repoRoot, PUBLISH_ARTIFACT_DIR, artifactName(pkg));\n fs.rmSync(dir, { recursive: true, force: true });\n const packed = await packExperience(gate, dir);\n const manifest = path.join(pkg.dir, 'manifest.json');\n if (fs.existsSync(manifest)) {\n fs.copyFileSync(manifest, path.join(dir, 'manifest.json'));\n }\n\n return {\n ...row,\n version: packed.version,\n status: 'built',\n artifact: path.relative(repoRoot, dir).split(path.sep).join('/'),\n };\n } catch (error) {\n if (error instanceof CliError) {\n return { ...row, status: 'refused', detail: error.message };\n }\n throw error;\n }\n}\n\n/**\n * `ekanos publish [name...] | --all [--dry-run]` in a repo.\n *\n * The plan is the selected packages, integrations before the experiences that\n * use them (a same-repo integration is not an override, so it is ordered\n * first, never refused). Every package passes its own gate before anything is\n * sent. `--dry-run` also builds each artifact under `.ekanos/publish/` and\n * touches no network. A real run submits the integrations in order through the\n * existing path; the host cannot admit an experience yet, so selected\n * experiences end the run with that refusal.\n */\nexport async function runRepoPublish(\n ctx: CliContext,\n args: RepoPublishArgs,\n): Promise<ExitCode> {\n const repo = loadRepo(args.repoRoot);\n const names = select(repo, args);\n const plan = planRepoOrder(repo, names);\n\n if (plan.unknown.length > 0) {\n throw usageError(\n `No package named ${plan.unknown.map((n) => `\"${n}\"`).join(', ')} in this repo.`,\n `Packages: ${repo.packages.map((p) => p.name).join(', ') || '(none)'}.`,\n );\n }\n if (args.all && repo.problems.length > 0) {\n throw validationError(\n `${repo.problems.length} package${repo.problems.length === 1 ? ' is' : 's are'} unreadable: ${repo.problems.map((p) => `${p.where} (${p.message})`).join('; ')}`,\n 'Fix or remove them, then re-run \"ekanos publish --all\".',\n );\n }\n if (plan.order.length === 0) {\n throw preconditionError(\n 'This repo has no packages yet.',\n 'Add one with \"ekanos new integration <slug>\" or \"ekanos new experience <slug>\".',\n );\n }\n\n const dryRun = args.publish.dryRun === true;\n const warnings = plan.unselectedDependencies.map(\n (dep) =>\n `${dep.experience} uses ${dep.integration}, which is in this repo but not in this publish: publish ${dep.integration} first, or make sure it is already published at a compatible version.`,\n );\n const notes = plan.order.flatMap((pkg) =>\n pkg.kind === 'integration' && pkg.availability\n ? [\n `${pkg.name}: ${describeAvailability(pkg.availability)} - ${AVAILABILITY_NOTE}.`,\n ]\n : [],\n );\n\n if (!ctx.jsonMode) {\n ctx.log(\n `${dryRun ? 'Dry run: ' : ''}publishing ${plan.order.length} package${plan.order.length === 1 ? '' : 's'} in this order:`,\n );\n plan.order.forEach((pkg, index) =>\n ctx.log(\n ` ${index + 1}. ${pkg.name} (${pkg.kind} ${pkg.version}, ${describeAvailability(pkg.availability)})`,\n ),\n );\n for (const warning of warnings) ctx.warn(` warning: ${warning}`);\n }\n\n // Gate (and, on a dry run, build) every package before anything is sent.\n const rows: PackageRow[] = [];\n for (const pkg of plan.order) {\n rows.push(\n pkg.kind === 'integration'\n ? await checkIntegration(pkg, repo.root, dryRun)\n : await checkExperience(pkg, repo.root, dryRun, args.publish.env),\n );\n }\n\n const data = (extra: Record<string, unknown> = {}) => ({\n repo: repo.root,\n dryRun,\n order: plan.order.map((p) => p.name),\n warnings,\n notes,\n packages: rows,\n ...extra,\n });\n const summary = (title: string) =>\n [title, '', renderTable(ctx, rows), ...notes.map((n) => `note: ${n}`)].join(\n '\\n',\n );\n\n const failed = rows.filter(\n (row) => row.status === 'gate failed' || row.status === 'refused',\n );\n if (failed.length > 0) {\n if (!ctx.jsonMode) ctx.log(summary('Nothing was published.'));\n return ctx.fail(\n gateFailedError(\n `${failed.length} of ${rows.length} package${rows.length === 1 ? '' : 's'} did not pass: ${failed.map((r) => r.name).join(', ')}.`,\n 'Fix the packages named above (the status column says what), then re-run \"ekanos publish\". Nothing was submitted.',\n ),\n data(),\n );\n }\n\n if (dryRun) {\n return ctx.succeed(\n data({ published: false }),\n summary(\n `Dry run: ${rows.length} package${rows.length === 1 ? '' : 's'} built under ${PUBLISH_ARTIFACT_DIR}. Nothing was published.`,\n ),\n );\n }\n\n // Real publish: integrations in plan order through the existing path.\n let stop: CliError | null = null;\n let host: string | null = null;\n for (const [index, pkg] of plan.order.entries()) {\n const row = rows[index] as PackageRow;\n if (pkg.kind === 'experience') {\n row.status = 'not supported by the host';\n continue;\n }\n if (stop) {\n row.status = 'not attempted';\n continue;\n }\n try {\n const single: PublishArgs = { ...args.publish, dir: pkg.dir };\n const prepared = await prepareIntegrationSubmission(ctx, single);\n host = prepared.env.host;\n const submitted = await submitPrepared(ctx, single, prepared);\n row.status = 'submitted';\n row.receipt = submitted.data;\n if (!ctx.jsonMode) ctx.log(submitted.human);\n } catch (error) {\n if (!(error instanceof CliError)) throw error;\n row.status = 'failed';\n row.detail = error.message;\n stop = error;\n }\n }\n\n const hostNote = host ? ` to ${shortHost(host)}` : '';\n if (stop) {\n if (!ctx.jsonMode) ctx.log(summary('Publish stopped.'));\n return ctx.fail(stop, data());\n }\n if (rows.some((row) => row.status === 'not supported by the host')) {\n if (!ctx.jsonMode) ctx.log(summary(`Submitted${hostNote}.`));\n return ctx.fail(\n gateFailedError(\n EXPERIENCE_NOT_SUPPORTED,\n 'The integrations in this publish were submitted; run \"ekanos publish --dry-run\" to build and pack the experiences. The host has no admission path for experiences until it ships one.',\n ),\n data({ published: true }),\n );\n }\n\n return ctx.succeed(\n data({ published: true }),\n summary(\n `Submitted ${rows.length} package${rows.length === 1 ? '' : 's'}${hostNote}.`,\n ),\n );\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { CliContext } from '../context.js';
|
|
2
|
+
import type { ExitCode } from '../exit-codes.js';
|
|
3
|
+
export declare const REPO_PACKAGE_GLOBS: readonly ['integrations/*', 'experiences/*'];
|
|
4
|
+
/** Where `ekanos new <kind>` puts a package, relative to the repo root. */
|
|
5
|
+
export declare const REPO_PACKAGE_DIR: {
|
|
6
|
+
readonly integration: 'integrations';
|
|
7
|
+
readonly experience: 'experiences';
|
|
8
|
+
};
|
|
9
|
+
export interface InitRepoArgs {
|
|
10
|
+
slug?: string;
|
|
11
|
+
dir?: string;
|
|
12
|
+
cwd: string;
|
|
13
|
+
force: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** `ekanos init --kind repo`: a root that holds many integrations and experiences. */
|
|
16
|
+
export declare function runInitRepo(ctx: CliContext, args: InitRepoArgs): ExitCode;
|
|
17
|
+
export interface NewPackageArgs {
|
|
18
|
+
kind: string | undefined;
|
|
19
|
+
slug: string | undefined;
|
|
20
|
+
cwd: string;
|
|
21
|
+
force: boolean;
|
|
22
|
+
/** Runs the per-kind scaffold; injected by the command to avoid an import cycle with init. */
|
|
23
|
+
scaffold: (args: {
|
|
24
|
+
kind: 'integration' | 'experience';
|
|
25
|
+
slug: string;
|
|
26
|
+
dir: string;
|
|
27
|
+
}) => Promise<ExitCode>;
|
|
28
|
+
}
|
|
29
|
+
/** `ekanos new integration|experience <slug>`: scaffold a package into the right folder of the repo. */
|
|
30
|
+
export declare function runNewPackage(ctx: CliContext, args: NewPackageArgs): Promise<ExitCode>;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { discoverRepo, findRepoRoot, matchesPackageGlob, } from '@ekanos/integration-schema/repo';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { invalidStateError, preconditionError, usageError, validationError, } from '../errors.js';
|
|
5
|
+
import { classifyPath, writeFileNoFollow } from '../safe-fs.js';
|
|
6
|
+
import { readTemplateSource } from '../templates.js';
|
|
7
|
+
const SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
8
|
+
export const REPO_PACKAGE_GLOBS = ['integrations/*', 'experiences/*'];
|
|
9
|
+
/** Where `ekanos new <kind>` puts a package, relative to the repo root. */
|
|
10
|
+
export const REPO_PACKAGE_DIR = {
|
|
11
|
+
integration: 'integrations',
|
|
12
|
+
experience: 'experiences',
|
|
13
|
+
};
|
|
14
|
+
function formatJson(value) {
|
|
15
|
+
return `${JSON.stringify(value, null, 2)}\n`;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* What the repo-root harness shell resolves upward into the root's
|
|
19
|
+
* node_modules: Next, React and the @ekanos packages. The pins come from the
|
|
20
|
+
* integration template, so there is one source of truth.
|
|
21
|
+
*/
|
|
22
|
+
const HARNESS_DEV_DEPS = [
|
|
23
|
+
'@ekanos/cli',
|
|
24
|
+
'@ekanos/harness',
|
|
25
|
+
'@tailwindcss/postcss',
|
|
26
|
+
'@tanstack/react-query',
|
|
27
|
+
'@types/react',
|
|
28
|
+
'@types/react-dom',
|
|
29
|
+
'next',
|
|
30
|
+
'next-intl',
|
|
31
|
+
'react',
|
|
32
|
+
'react-dom',
|
|
33
|
+
'tailwindcss',
|
|
34
|
+
'typescript',
|
|
35
|
+
];
|
|
36
|
+
const HARNESS_DEPS = ['@ekanos/sdk', '@ekanos/ui'];
|
|
37
|
+
/** Next type-checks its own config and offers to install this when it is missing. */
|
|
38
|
+
const NODE_TYPES_PIN = '^22.10.0';
|
|
39
|
+
function templatePins(section, names) {
|
|
40
|
+
const template = JSON.parse(readTemplateSource('package.json.tmpl'));
|
|
41
|
+
return Object.fromEntries(names.flatMap((name) => {
|
|
42
|
+
const range = template[section][name];
|
|
43
|
+
return range ? [[name, range]] : [];
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
function harnessDevDependencies() {
|
|
47
|
+
return Object.fromEntries(Object.entries(Object.assign(Object.assign({}, templatePins('devDependencies', HARNESS_DEV_DEPS)), { '@types/node': NODE_TYPES_PIN })).sort(([left], [right]) => left.localeCompare(right)));
|
|
48
|
+
}
|
|
49
|
+
const REPO_GITIGNORE = `# Dependencies
|
|
50
|
+
node_modules/
|
|
51
|
+
|
|
52
|
+
# Build output
|
|
53
|
+
dist/
|
|
54
|
+
*.tsbuildinfo
|
|
55
|
+
|
|
56
|
+
# Ekanos dev harness and publish artifacts (generated)
|
|
57
|
+
.ekanos/
|
|
58
|
+
|
|
59
|
+
# Per-developer integration overrides and credentials
|
|
60
|
+
ekanos.local.json
|
|
61
|
+
|
|
62
|
+
# Logs
|
|
63
|
+
*.log
|
|
64
|
+
`;
|
|
65
|
+
function repoPnpmWorkspace() {
|
|
66
|
+
return `${readTemplateSource('pnpm-workspace.yaml.tmpl').trimEnd()}
|
|
67
|
+
|
|
68
|
+
packages:
|
|
69
|
+
${REPO_PACKAGE_GLOBS.map((glob) => ` - '${glob}'`).join('\n')}
|
|
70
|
+
`;
|
|
71
|
+
}
|
|
72
|
+
/** `ekanos init --kind repo`: a root that holds many integrations and experiences. */
|
|
73
|
+
export function runInitRepo(ctx, args) {
|
|
74
|
+
var _a;
|
|
75
|
+
const slug = args.slug;
|
|
76
|
+
if (slug !== undefined && !SLUG_PATTERN.test(slug)) {
|
|
77
|
+
throw usageError(`Invalid slug "${slug}".`, 'Use kebab-case, e.g. "ekanos init --kind repo --slug acme-platform".');
|
|
78
|
+
}
|
|
79
|
+
if (!slug && args.dir === undefined) {
|
|
80
|
+
throw usageError('init --kind repo needs a name or a directory.', 'Pass "--slug <name>" (creates ./<name>) or "--dir ." to scaffold in place.');
|
|
81
|
+
}
|
|
82
|
+
const targetDir = path.resolve(args.cwd, (_a = args.dir) !== null && _a !== void 0 ? _a : slug);
|
|
83
|
+
if (fs.existsSync(targetDir) && fs.lstatSync(targetDir).isSymbolicLink()) {
|
|
84
|
+
throw invalidStateError(`The target directory ${targetDir} is a symlink.`, 'Scaffold into the real directory.');
|
|
85
|
+
}
|
|
86
|
+
if (findRepoRoot(targetDir) !== null && !args.force) {
|
|
87
|
+
throw invalidStateError(`${targetDir} is already inside an Ekanos repo.`, 'Add packages with "ekanos new integration <slug>" or "ekanos new experience <slug>".');
|
|
88
|
+
}
|
|
89
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
90
|
+
const name = slug !== null && slug !== void 0 ? slug : path.basename(targetDir);
|
|
91
|
+
const files = [
|
|
92
|
+
{
|
|
93
|
+
dest: 'ekanos.json',
|
|
94
|
+
content: formatJson({
|
|
95
|
+
kind: 'repo',
|
|
96
|
+
packages: [...REPO_PACKAGE_GLOBS],
|
|
97
|
+
}),
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
dest: 'package.json',
|
|
101
|
+
content: formatJson({
|
|
102
|
+
name: SLUG_PATTERN.test(name) ? name : 'ekanos-repo',
|
|
103
|
+
version: '0.0.0',
|
|
104
|
+
private: true,
|
|
105
|
+
type: 'module',
|
|
106
|
+
description: 'Ekanos integrations and experiences in one repo.',
|
|
107
|
+
scripts: { dev: 'ekanos dev --start' },
|
|
108
|
+
dependencies: templatePins('dependencies', HARNESS_DEPS),
|
|
109
|
+
devDependencies: harnessDevDependencies(),
|
|
110
|
+
}),
|
|
111
|
+
},
|
|
112
|
+
{ dest: 'pnpm-workspace.yaml', content: repoPnpmWorkspace() },
|
|
113
|
+
{ dest: '.gitignore', content: REPO_GITIGNORE },
|
|
114
|
+
{ dest: 'integrations/.gitkeep', content: '' },
|
|
115
|
+
{ dest: 'experiences/.gitkeep', content: '' },
|
|
116
|
+
];
|
|
117
|
+
const created = [];
|
|
118
|
+
const skipped = [];
|
|
119
|
+
for (const { dest, content } of files) {
|
|
120
|
+
const destPath = path.join(targetDir, dest);
|
|
121
|
+
const kind = classifyPath(destPath);
|
|
122
|
+
if (kind !== 'missing' && kind !== 'symlink' && !args.force) {
|
|
123
|
+
skipped.push(dest);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
writeFileNoFollow(targetDir, destPath, content);
|
|
127
|
+
created.push(dest);
|
|
128
|
+
}
|
|
129
|
+
for (const file of created)
|
|
130
|
+
ctx.log(` created ${file}`);
|
|
131
|
+
for (const file of skipped) {
|
|
132
|
+
ctx.log(` skipped ${file} (already exists; --force overwrites)`);
|
|
133
|
+
}
|
|
134
|
+
const rel = path.relative(args.cwd, targetDir) || '.';
|
|
135
|
+
return ctx.succeed({ kind: 'repo', name, dir: targetDir, created, skipped }, `Scaffolded repo "${name}". Next: ${rel === '.' ? '' : `cd ${rel} && `}ekanos new integration <slug> and ekanos new experience <slug>.`);
|
|
136
|
+
}
|
|
137
|
+
/** `ekanos new integration|experience <slug>`: scaffold a package into the right folder of the repo. */
|
|
138
|
+
export async function runNewPackage(ctx, args) {
|
|
139
|
+
const kind = args.kind;
|
|
140
|
+
if (kind !== 'integration' && kind !== 'experience') {
|
|
141
|
+
throw usageError(kind ? `Unknown package kind "${kind}".` : 'new needs a package kind.', 'Use "ekanos new integration <slug>" or "ekanos new experience <slug>".');
|
|
142
|
+
}
|
|
143
|
+
const slug = args.slug;
|
|
144
|
+
if (!slug || !SLUG_PATTERN.test(slug)) {
|
|
145
|
+
throw usageError(slug ? `Invalid slug "${slug}".` : 'new needs a slug.', `Pass kebab-case, e.g. "ekanos new ${kind} acme-${kind === 'integration' ? 'crm' : 'queue'}".`);
|
|
146
|
+
}
|
|
147
|
+
const root = findRepoRoot(args.cwd);
|
|
148
|
+
if (!root) {
|
|
149
|
+
throw preconditionError('This directory is not inside an Ekanos repo.', 'Run "ekanos init --kind repo --slug <name>" first, or run this from inside one.');
|
|
150
|
+
}
|
|
151
|
+
const repo = discoverRepo(root);
|
|
152
|
+
const clash = repo.packages.find((pkg) => pkg.name === slug);
|
|
153
|
+
if (clash) {
|
|
154
|
+
throw validationError(`"${slug}" is already a ${clash.kind} in this repo (${clash.relDir}).`, 'Pick a different slug; a package is addressed by its slug.');
|
|
155
|
+
}
|
|
156
|
+
const dir = path.join(root, REPO_PACKAGE_DIR[kind], slug);
|
|
157
|
+
const globs = repo.manifest.packages;
|
|
158
|
+
const rel = path.relative(root, dir).split(path.sep).join('/');
|
|
159
|
+
const covered = globs.some((glob) => matchesPackageGlob(rel, glob));
|
|
160
|
+
if (!covered) {
|
|
161
|
+
throw validationError(`${rel} is not matched by the repo's "packages" globs (${globs.join(', ')}).`, 'Add a glob that covers it to the root ekanos.json, then re-run.');
|
|
162
|
+
}
|
|
163
|
+
return args.scaffold({ kind, slug, dir });
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/repo/scaffold.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n discoverRepo,\n findRepoRoot,\n matchesPackageGlob,\n} from '@ekanos/integration-schema/repo';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { CliContext } from '../context';\nimport {\n invalidStateError,\n preconditionError,\n usageError,\n validationError,\n} from '../errors';\nimport type { ExitCode } from '../exit-codes';\nimport { classifyPath, writeFileNoFollow } from '../safe-fs';\nimport { readTemplateSource } from '../templates';\n\nconst SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\nexport const REPO_PACKAGE_GLOBS = ['integrations/*', 'experiences/*'] as const;\n\n/** Where `ekanos new <kind>` puts a package, relative to the repo root. */\nexport const REPO_PACKAGE_DIR = {\n integration: 'integrations',\n experience: 'experiences',\n} as const;\n\nfunction formatJson(value: unknown): string {\n return `${JSON.stringify(value, null, 2)}\\n`;\n}\n\n/**\n * What the repo-root harness shell resolves upward into the root's\n * node_modules: Next, React and the @ekanos packages. The pins come from the\n * integration template, so there is one source of truth.\n */\nconst HARNESS_DEV_DEPS = [\n '@ekanos/cli',\n '@ekanos/harness',\n '@tailwindcss/postcss',\n '@tanstack/react-query',\n '@types/react',\n '@types/react-dom',\n 'next',\n 'next-intl',\n 'react',\n 'react-dom',\n 'tailwindcss',\n 'typescript',\n] as const;\n\nconst HARNESS_DEPS = ['@ekanos/sdk', '@ekanos/ui'] as const;\n\n/** Next type-checks its own config and offers to install this when it is missing. */\nconst NODE_TYPES_PIN = '^22.10.0';\n\nfunction templatePins(\n section: 'dependencies' | 'devDependencies',\n names: readonly string[],\n): Record<string, string> {\n const template = JSON.parse(\n readTemplateSource('package.json.tmpl'),\n ) as Record<'dependencies' | 'devDependencies', Record<string, string>>;\n\n return Object.fromEntries(\n names.flatMap((name) => {\n const range = template[section][name];\n return range ? [[name, range] as const] : [];\n }),\n );\n}\n\nfunction harnessDevDependencies(): Record<string, string> {\n return Object.fromEntries(\n Object.entries({\n ...templatePins('devDependencies', HARNESS_DEV_DEPS),\n '@types/node': NODE_TYPES_PIN,\n }).sort(([left], [right]) => left.localeCompare(right)),\n );\n}\n\nconst REPO_GITIGNORE = `# Dependencies\nnode_modules/\n\n# Build output\ndist/\n*.tsbuildinfo\n\n# Ekanos dev harness and publish artifacts (generated)\n.ekanos/\n\n# Per-developer integration overrides and credentials\nekanos.local.json\n\n# Logs\n*.log\n`;\n\nfunction repoPnpmWorkspace(): string {\n return `${readTemplateSource('pnpm-workspace.yaml.tmpl').trimEnd()}\n\npackages:\n${REPO_PACKAGE_GLOBS.map((glob) => ` - '${glob}'`).join('\\n')}\n`;\n}\n\nexport interface InitRepoArgs {\n slug?: string;\n dir?: string;\n cwd: string;\n force: boolean;\n}\n\n/** `ekanos init --kind repo`: a root that holds many integrations and experiences. */\nexport function runInitRepo(ctx: CliContext, args: InitRepoArgs): ExitCode {\n const slug = args.slug;\n if (slug !== undefined && !SLUG_PATTERN.test(slug)) {\n throw usageError(\n `Invalid slug \"${slug}\".`,\n 'Use kebab-case, e.g. \"ekanos init --kind repo --slug acme-platform\".',\n );\n }\n if (!slug && args.dir === undefined) {\n throw usageError(\n 'init --kind repo needs a name or a directory.',\n 'Pass \"--slug <name>\" (creates ./<name>) or \"--dir .\" to scaffold in place.',\n );\n }\n\n const targetDir = path.resolve(args.cwd, args.dir ?? (slug as string));\n if (fs.existsSync(targetDir) && fs.lstatSync(targetDir).isSymbolicLink()) {\n throw invalidStateError(\n `The target directory ${targetDir} is a symlink.`,\n 'Scaffold into the real directory.',\n );\n }\n if (findRepoRoot(targetDir) !== null && !args.force) {\n throw invalidStateError(\n `${targetDir} is already inside an Ekanos repo.`,\n 'Add packages with \"ekanos new integration <slug>\" or \"ekanos new experience <slug>\".',\n );\n }\n fs.mkdirSync(targetDir, { recursive: true });\n\n const name = slug ?? path.basename(targetDir);\n const files: Array<{ dest: string; content: string }> = [\n {\n dest: 'ekanos.json',\n content: formatJson({\n kind: 'repo',\n packages: [...REPO_PACKAGE_GLOBS],\n }),\n },\n {\n dest: 'package.json',\n content: formatJson({\n name: SLUG_PATTERN.test(name) ? name : 'ekanos-repo',\n version: '0.0.0',\n private: true,\n type: 'module',\n description: 'Ekanos integrations and experiences in one repo.',\n scripts: { dev: 'ekanos dev --start' },\n dependencies: templatePins('dependencies', HARNESS_DEPS),\n devDependencies: harnessDevDependencies(),\n }),\n },\n { dest: 'pnpm-workspace.yaml', content: repoPnpmWorkspace() },\n { dest: '.gitignore', content: REPO_GITIGNORE },\n { dest: 'integrations/.gitkeep', content: '' },\n { dest: 'experiences/.gitkeep', content: '' },\n ];\n\n const created: string[] = [];\n const skipped: string[] = [];\n for (const { dest, content } of files) {\n const destPath = path.join(targetDir, dest);\n const kind = classifyPath(destPath);\n if (kind !== 'missing' && kind !== 'symlink' && !args.force) {\n skipped.push(dest);\n continue;\n }\n writeFileNoFollow(targetDir, destPath, content);\n created.push(dest);\n }\n\n for (const file of created) ctx.log(` created ${file}`);\n for (const file of skipped) {\n ctx.log(` skipped ${file} (already exists; --force overwrites)`);\n }\n\n const rel = path.relative(args.cwd, targetDir) || '.';\n\n return ctx.succeed(\n { kind: 'repo', name, dir: targetDir, created, skipped },\n `Scaffolded repo \"${name}\". Next: ${rel === '.' ? '' : `cd ${rel} && `}ekanos new integration <slug> and ekanos new experience <slug>.`,\n );\n}\n\nexport interface NewPackageArgs {\n kind: string | undefined;\n slug: string | undefined;\n cwd: string;\n force: boolean;\n /** Runs the per-kind scaffold; injected by the command to avoid an import cycle with init. */\n scaffold: (args: {\n kind: 'integration' | 'experience';\n slug: string;\n dir: string;\n }) => Promise<ExitCode>;\n}\n\n/** `ekanos new integration|experience <slug>`: scaffold a package into the right folder of the repo. */\nexport async function runNewPackage(\n ctx: CliContext,\n args: NewPackageArgs,\n): Promise<ExitCode> {\n const kind = args.kind;\n if (kind !== 'integration' && kind !== 'experience') {\n throw usageError(\n kind ? `Unknown package kind \"${kind}\".` : 'new needs a package kind.',\n 'Use \"ekanos new integration <slug>\" or \"ekanos new experience <slug>\".',\n );\n }\n const slug = args.slug;\n if (!slug || !SLUG_PATTERN.test(slug)) {\n throw usageError(\n slug ? `Invalid slug \"${slug}\".` : 'new needs a slug.',\n `Pass kebab-case, e.g. \"ekanos new ${kind} acme-${kind === 'integration' ? 'crm' : 'queue'}\".`,\n );\n }\n\n const root = findRepoRoot(args.cwd);\n if (!root) {\n throw preconditionError(\n 'This directory is not inside an Ekanos repo.',\n 'Run \"ekanos init --kind repo --slug <name>\" first, or run this from inside one.',\n );\n }\n\n const repo = discoverRepo(root);\n const clash = repo.packages.find((pkg) => pkg.name === slug);\n if (clash) {\n throw validationError(\n `\"${slug}\" is already a ${clash.kind} in this repo (${clash.relDir}).`,\n 'Pick a different slug; a package is addressed by its slug.',\n );\n }\n\n const dir = path.join(root, REPO_PACKAGE_DIR[kind], slug);\n const globs = repo.manifest.packages;\n const rel = path.relative(root, dir).split(path.sep).join('/');\n const covered = globs.some((glob) => matchesPackageGlob(rel, glob));\n if (!covered) {\n throw validationError(\n `${rel} is not matched by the repo's \"packages\" globs (${globs.join(', ')}).`,\n 'Add a glob that covers it to the root ekanos.json, then re-run.',\n );\n }\n\n return args.scaffold({ kind, slug, dir });\n}\n"]}
|
package/dist/teams-api.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ProductScopeList, type ProductScopeProductChange, type TeamScopes, type TeamScopesSetResult, type TeamAppSetResult, type TeamCreateRequest, type TeamCreateResult, type TeamDisconnectResult, type TeamMemberChangeResult, type TeamMemberAddResult, type TeamMemberInviteResult, type TeamMemberList, type TeamRenameResult, type TeamRoles, type TeamIntegrationStatus, type TeamIntegrationEventList, type TeamList, type TeamWebhookMintResult } from '@ekanos/integration-schema';
|
|
1
|
+
import { type AudienceCreateRequest, type AudienceListResponse, type AudienceResponse, type AudienceUpdateRequest, type MemberAudience, type MemberAudienceSetResult, type TeamAudience, type TeamAudienceSetResult, type ProductScopeList, type ProductScopeProductChange, type TeamScopes, type TeamScopesSetResult, type TeamAppSetResult, type TeamCreateRequest, type TeamCreateResult, type TeamDisconnectResult, type TeamMemberChangeResult, type TeamMemberAddResult, type TeamMemberInviteResult, type TeamMemberList, type TeamRenameResult, type TeamRoles, type TeamIntegrationStatus, type TeamIntegrationEventList, type TeamList, type TeamWebhookMintResult } from '@ekanos/integration-schema';
|
|
2
2
|
import type { z } from 'zod';
|
|
3
3
|
/**
|
|
4
4
|
* The CLI's client for a Source's teams and their integration setup — the
|
|
@@ -22,6 +22,13 @@ import type { z } from 'zod';
|
|
|
22
22
|
* GET /api/partner/scopes?source=<slug> → ProductScopeList
|
|
23
23
|
* PUT | DELETE /api/partner/scopes/<scope>/products/<product>?source=<slug>
|
|
24
24
|
* → ProductScopeProductChange
|
|
25
|
+
* GET /api/partner/audiences?source=<slug> → AudienceListResponse
|
|
26
|
+
* GET | PATCH /api/partner/audiences/<audience>?source=<slug> → AudienceResponse
|
|
27
|
+
* POST /api/partner/audiences?source=<slug> { name, … } → AudienceResponse
|
|
28
|
+
* GET | PUT /api/partner/teams/<team>/audience?source=<slug> { audienceId }
|
|
29
|
+
* → TeamAudience | TeamAudienceSetResult
|
|
30
|
+
* GET | PUT …/<team>/members/<email>/audience?source=<slug> { audienceId | null }
|
|
31
|
+
* → MemberAudience | MemberAudienceSetResult
|
|
25
32
|
* GET /api/partner/teams/<team>/scopes?source=<slug> → TeamScopes
|
|
26
33
|
* PUT /api/partner/teams/<team>/scopes?source=<slug> { scopes } → TeamScopesSetResult
|
|
27
34
|
*
|
|
@@ -117,6 +124,35 @@ export declare function setTeamScopes(host: string, accessToken: string, target:
|
|
|
117
124
|
source: string;
|
|
118
125
|
team: string;
|
|
119
126
|
}, scopes: string[]): Promise<TeamsApiResult<TeamScopesSetResult>>;
|
|
127
|
+
export declare function listAudiences(host: string, accessToken: string, source: string): Promise<TeamsApiResult<AudienceListResponse>>;
|
|
128
|
+
export declare function showAudience(host: string, accessToken: string, target: {
|
|
129
|
+
source: string;
|
|
130
|
+
audience: string;
|
|
131
|
+
}): Promise<TeamsApiResult<AudienceResponse>>;
|
|
132
|
+
export declare function createAudience(host: string, accessToken: string, source: string, body: AudienceCreateRequest): Promise<TeamsApiResult<AudienceResponse>>;
|
|
133
|
+
export declare function updateAudience(host: string, accessToken: string, target: {
|
|
134
|
+
source: string;
|
|
135
|
+
audience: string;
|
|
136
|
+
}, body: AudienceUpdateRequest): Promise<TeamsApiResult<AudienceResponse>>;
|
|
137
|
+
export declare function showTeamAudience(host: string, accessToken: string, target: {
|
|
138
|
+
source: string;
|
|
139
|
+
team: string;
|
|
140
|
+
}): Promise<TeamsApiResult<TeamAudience>>;
|
|
141
|
+
export declare function setTeamAudience(host: string, accessToken: string, target: {
|
|
142
|
+
source: string;
|
|
143
|
+
team: string;
|
|
144
|
+
}, audienceId: string): Promise<TeamsApiResult<TeamAudienceSetResult>>;
|
|
145
|
+
export declare function showMemberAudience(host: string, accessToken: string, target: {
|
|
146
|
+
source: string;
|
|
147
|
+
team: string;
|
|
148
|
+
email: string;
|
|
149
|
+
}): Promise<TeamsApiResult<MemberAudience>>;
|
|
150
|
+
/** `audienceId: null` clears the member's own audience. */
|
|
151
|
+
export declare function setMemberAudience(host: string, accessToken: string, target: {
|
|
152
|
+
source: string;
|
|
153
|
+
team: string;
|
|
154
|
+
email: string;
|
|
155
|
+
}, audienceId: string | null): Promise<TeamsApiResult<MemberAudienceSetResult>>;
|
|
120
156
|
export declare function listTeamRoles(host: string, accessToken: string, target: {
|
|
121
157
|
source: string;
|
|
122
158
|
team: string;
|
package/dist/teams-api.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ProductScopeListSchema, ProductScopeProductChangeSchema, TeamScopesSchema, TeamScopesSetResultSchema, TeamAppSetResultSchema, TeamCreateResultSchema, TeamDisconnectResultSchema, TeamMemberChangeResultSchema, TeamMemberAddResultSchema, TeamMemberInviteResultSchema, TeamMemberListSchema, TeamRenameResultSchema, TeamRolesSchema, TeamIntegrationStatusSchema, TeamIntegrationEventListSchema, TeamListSchema, TeamWebhookMintResultSchema, } from '@ekanos/integration-schema';
|
|
1
|
+
import { AudienceListResponseSchema, AudienceResponseSchema, MemberAudienceSchema, MemberAudienceSetResultSchema, TeamAudienceSchema, TeamAudienceSetResultSchema, ProductScopeListSchema, ProductScopeProductChangeSchema, TeamScopesSchema, TeamScopesSetResultSchema, TeamAppSetResultSchema, TeamCreateResultSchema, TeamDisconnectResultSchema, TeamMemberChangeResultSchema, TeamMemberAddResultSchema, TeamMemberInviteResultSchema, TeamMemberListSchema, TeamRenameResultSchema, TeamRolesSchema, TeamIntegrationStatusSchema, TeamIntegrationEventListSchema, TeamListSchema, TeamWebhookMintResultSchema, } from '@ekanos/integration-schema';
|
|
2
2
|
import { request } from './auth/ekanos-api.js';
|
|
3
3
|
import { authRequiredError, forbiddenError, invalidStateError, networkError, notFoundError, usageError, validationError, } from './errors.js';
|
|
4
4
|
export function listTeams(host, accessToken, source) {
|
|
@@ -122,6 +122,67 @@ export function setTeamScopes(host, accessToken, target, scopes) {
|
|
|
122
122
|
body: { scopes },
|
|
123
123
|
});
|
|
124
124
|
}
|
|
125
|
+
export function listAudiences(host, accessToken, source) {
|
|
126
|
+
return call(host, accessToken, AudienceListResponseSchema, {
|
|
127
|
+
method: 'GET',
|
|
128
|
+
path: '/api/partner/audiences',
|
|
129
|
+
source,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
export function showAudience(host, accessToken, target) {
|
|
133
|
+
return call(host, accessToken, AudienceResponseSchema, {
|
|
134
|
+
method: 'GET',
|
|
135
|
+
path: `/api/partner/audiences/${encodeURIComponent(target.audience)}`,
|
|
136
|
+
source: target.source,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
export function createAudience(host, accessToken, source, body) {
|
|
140
|
+
return call(host, accessToken, AudienceResponseSchema, {
|
|
141
|
+
method: 'POST',
|
|
142
|
+
path: '/api/partner/audiences',
|
|
143
|
+
source,
|
|
144
|
+
body,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
export function updateAudience(host, accessToken, target, body) {
|
|
148
|
+
return call(host, accessToken, AudienceResponseSchema, {
|
|
149
|
+
method: 'PATCH',
|
|
150
|
+
path: `/api/partner/audiences/${encodeURIComponent(target.audience)}`,
|
|
151
|
+
source: target.source,
|
|
152
|
+
body,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
export function showTeamAudience(host, accessToken, target) {
|
|
156
|
+
return call(host, accessToken, TeamAudienceSchema, {
|
|
157
|
+
method: 'GET',
|
|
158
|
+
path: `/api/partner/teams/${encodeURIComponent(target.team)}/audience`,
|
|
159
|
+
source: target.source,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
export function setTeamAudience(host, accessToken, target, audienceId) {
|
|
163
|
+
return call(host, accessToken, TeamAudienceSetResultSchema, {
|
|
164
|
+
method: 'PUT',
|
|
165
|
+
path: `/api/partner/teams/${encodeURIComponent(target.team)}/audience`,
|
|
166
|
+
source: target.source,
|
|
167
|
+
body: { audienceId },
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
export function showMemberAudience(host, accessToken, target) {
|
|
171
|
+
return call(host, accessToken, MemberAudienceSchema, {
|
|
172
|
+
method: 'GET',
|
|
173
|
+
path: `${membersPath(target.team)}/${encodeURIComponent(target.email)}/audience`,
|
|
174
|
+
source: target.source,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
/** `audienceId: null` clears the member's own audience. */
|
|
178
|
+
export function setMemberAudience(host, accessToken, target, audienceId) {
|
|
179
|
+
return call(host, accessToken, MemberAudienceSetResultSchema, {
|
|
180
|
+
method: 'PUT',
|
|
181
|
+
path: `${membersPath(target.team)}/${encodeURIComponent(target.email)}/audience`,
|
|
182
|
+
source: target.source,
|
|
183
|
+
body: { audienceId },
|
|
184
|
+
});
|
|
185
|
+
}
|
|
125
186
|
export function listTeamRoles(host, accessToken, target) {
|
|
126
187
|
return call(host, accessToken, TeamRolesSchema, {
|
|
127
188
|
method: 'GET',
|
package/dist/teams-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"teams-api.js","sourceRoot":"","sources":["../src/teams-api.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type ProductScopeList,\n ProductScopeListSchema,\n type ProductScopeProductChange,\n ProductScopeProductChangeSchema,\n type TeamScopes,\n TeamScopesSchema,\n type TeamScopesSetResult,\n TeamScopesSetResultSchema,\n type TeamAppSetResult,\n TeamAppSetResultSchema,\n type TeamCreateRequest,\n type TeamCreateResult,\n TeamCreateResultSchema,\n type TeamDisconnectResult,\n TeamDisconnectResultSchema,\n type TeamMemberChangeResult,\n TeamMemberChangeResultSchema,\n type TeamMemberAddResult,\n TeamMemberAddResultSchema,\n type TeamMemberInviteResult,\n TeamMemberInviteResultSchema,\n type TeamMemberList,\n TeamMemberListSchema,\n type TeamRenameResult,\n TeamRenameResultSchema,\n type TeamRoles,\n TeamRolesSchema,\n type TeamIntegrationStatus,\n TeamIntegrationStatusSchema,\n type TeamIntegrationEventList,\n TeamIntegrationEventListSchema,\n type TeamList,\n TeamListSchema,\n type TeamWebhookMintResult,\n TeamWebhookMintResultSchema,\n} from '@ekanos/integration-schema';\nimport type { z } from 'zod';\n\nimport { request } from './auth/ekanos-api';\nimport {\n authRequiredError,\n forbiddenError,\n invalidStateError,\n networkError,\n notFoundError,\n usageError,\n validationError,\n} from './errors';\n\n/**\n * The CLI's client for a Source's teams and their integration setup — the\n * team-level counterpart of `apps-api.ts`.\n *\n * GET /api/partner/teams?source=<slug> → TeamList\n * GET /api/partner/teams/<team>/integrations/<product>?source=<slug> → TeamIntegrationStatus\n * PUT …/integrations/<product>/app?source=<slug> { connectionId?, fields }\n * → TeamAppSetResult\n * POST …/integrations/<product>/webhooks/<id>?source=<slug> → TeamWebhookMintResult\n * DELETE /api/partner/teams/<team>/integrations/<product>?source=<slug> → TeamDisconnectResult\n * POST /api/partner/teams?source=<slug> { name, slug?, ownerEmail? } → TeamCreateResult\n * PATCH /api/partner/teams/<team>?source=<slug> { name } → TeamRenameResult\n * GET /api/partner/teams/<team>/members?source=<slug> → TeamMemberList\n * POST …/<team>/members?source=<slug> { email, role } → TeamMemberInviteResult\n * PATCH …/<team>/members/<email>?source=<slug> { role } → TeamMemberChangeResult\n * DELETE …/<team>/members/<email>?source=<slug> → TeamMemberChangeResult\n * GET /api/partner/teams/<team>/roles?source=<slug> → TeamRoles\n * GET /api/partner/teams/<team>/events?source=<slug>[&product=<slug>]\n * [&since=<iso>][&limit=<n>] → TeamIntegrationEventList\n * GET /api/partner/scopes?source=<slug> → ProductScopeList\n * PUT | DELETE /api/partner/scopes/<scope>/products/<product>?source=<slug>\n * → ProductScopeProductChange\n * GET /api/partner/teams/<team>/scopes?source=<slug> → TeamScopes\n * PUT /api/partner/teams/<team>/scopes?source=<slug> { scopes } → TeamScopesSetResult\n *\n * → 401 / 3xx refresh once and retry\n * → 403 { code: \"SOURCE_ADMIN_REQUIRED\" | \"MFA_REQUIRED\" | \"FORBIDDEN\" }\n * → 404 { code: \"TEAM_NOT_FOUND\" | \"PRODUCT_NOT_ENTITLED\" | \"WEBHOOK_NOT_FOUND\"\n * | \"CONNECTION_NOT_FOUND\" | \"SOURCE_NOT_FOUND\" }\n * | \"MEMBER_NOT_FOUND\" }\n * → 409 { code: \"NO_TEAM_APP\" | \"SLUG_TAKEN\" | \"TEAM_ACCOUNTS_DISABLED\"\n * | \"ALREADY_MEMBER\" | \"ALREADY_INVITED\" | \"PRIMARY_OWNER\" }\n * → 400 { code: \"INVALID_FIELDS\" | \"INVALID_REQUEST\" | \"UNKNOWN_ROLE\" }\n */\n\nexport type TeamsApiResult<T> =\n | { status: 'ok'; data: T }\n | { status: 'unauthorized' };\n\nexport function listTeams(\n host: string,\n accessToken: string,\n source: string,\n): Promise<TeamsApiResult<TeamList>> {\n return call(host, accessToken, TeamListSchema, {\n method: 'GET',\n path: '/api/partner/teams',\n source,\n });\n}\n\nexport function showTeamIntegration(\n host: string,\n accessToken: string,\n target: { source: string; team: string; product: string },\n): Promise<TeamsApiResult<TeamIntegrationStatus>> {\n return call(host, accessToken, TeamIntegrationStatusSchema, {\n method: 'GET',\n path: integrationPath(target),\n source: target.source,\n });\n}\n\nexport function setTeamApp(\n host: string,\n accessToken: string,\n target: { source: string; team: string; product: string },\n body: {\n connectionId?: string;\n fields: Record<string, string>;\n clear?: string[];\n },\n): Promise<TeamsApiResult<TeamAppSetResult>> {\n return call(host, accessToken, TeamAppSetResultSchema, {\n method: 'PUT',\n path: `${integrationPath(target)}/app`,\n source: target.source,\n body,\n });\n}\n\nexport function mintTeamWebhook(\n host: string,\n accessToken: string,\n target: { source: string; team: string; product: string },\n webhookId: string,\n): Promise<TeamsApiResult<TeamWebhookMintResult>> {\n return call(host, accessToken, TeamWebhookMintResultSchema, {\n method: 'POST',\n path: `${integrationPath(target)}/webhooks/${encodeURIComponent(webhookId)}`,\n source: target.source,\n });\n}\n\nexport function disconnectTeamIntegration(\n host: string,\n accessToken: string,\n target: { source: string; team: string; product: string; mine?: boolean },\n): Promise<TeamsApiResult<TeamDisconnectResult>> {\n return call(host, accessToken, TeamDisconnectResultSchema, {\n method: 'DELETE',\n // `--mine`: the caller's own personal connection, never another's.\n path: `${integrationPath(target)}${target.mine ? '/mine' : ''}`,\n source: target.source,\n });\n}\n\nexport function createTeam(\n host: string,\n accessToken: string,\n source: string,\n body: TeamCreateRequest,\n): Promise<TeamsApiResult<TeamCreateResult>> {\n return call(host, accessToken, TeamCreateResultSchema, {\n method: 'POST',\n path: '/api/partner/teams',\n source,\n body,\n });\n}\n\nexport function renameTeam(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n name: string,\n): Promise<TeamsApiResult<TeamRenameResult>> {\n return call(host, accessToken, TeamRenameResultSchema, {\n method: 'PATCH',\n path: `/api/partner/teams/${encodeURIComponent(target.team)}`,\n source: target.source,\n body: { name },\n });\n}\n\nexport function listTeamMembers(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n): Promise<TeamsApiResult<TeamMemberList>> {\n return call(host, accessToken, TeamMemberListSchema, {\n method: 'GET',\n path: membersPath(target.team),\n source: target.source,\n });\n}\n\nexport function inviteTeamMember(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n body: { email: string; role: string },\n): Promise<TeamsApiResult<TeamMemberInviteResult>> {\n return call(host, accessToken, TeamMemberInviteResultSchema, {\n method: 'POST',\n path: membersPath(target.team),\n source: target.source,\n body,\n });\n}\n\n/** `teams members add`: a member now, no invitation email (`PUT`). */\nexport function addTeamMember(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n body: { self: true; role?: string } | { email: string; role?: string },\n): Promise<TeamsApiResult<TeamMemberAddResult>> {\n return call(host, accessToken, TeamMemberAddResultSchema, {\n method: 'PUT',\n path: membersPath(target.team),\n source: target.source,\n body,\n });\n}\n\nexport function setTeamMemberRole(\n host: string,\n accessToken: string,\n target: { source: string; team: string; email: string },\n role: string,\n): Promise<TeamsApiResult<TeamMemberChangeResult>> {\n return call(host, accessToken, TeamMemberChangeResultSchema, {\n method: 'PATCH',\n path: `${membersPath(target.team)}/${encodeURIComponent(target.email)}`,\n source: target.source,\n body: { role },\n });\n}\n\nexport function removeTeamMember(\n host: string,\n accessToken: string,\n target: { source: string; team: string; email: string },\n): Promise<TeamsApiResult<TeamMemberChangeResult>> {\n return call(host, accessToken, TeamMemberChangeResultSchema, {\n method: 'DELETE',\n path: `${membersPath(target.team)}/${encodeURIComponent(target.email)}`,\n source: target.source,\n });\n}\n\nexport function listProductScopes(\n host: string,\n accessToken: string,\n source: string,\n): Promise<TeamsApiResult<ProductScopeList>> {\n return call(host, accessToken, ProductScopeListSchema, {\n method: 'GET',\n path: '/api/partner/scopes',\n source,\n });\n}\n\nexport function setScopeProduct(\n host: string,\n accessToken: string,\n target: { source: string; scope: string; product: string },\n included: boolean,\n): Promise<TeamsApiResult<ProductScopeProductChange>> {\n return call(host, accessToken, ProductScopeProductChangeSchema, {\n method: included ? 'PUT' : 'DELETE',\n path: `/api/partner/scopes/${encodeURIComponent(target.scope)}/products/${encodeURIComponent(target.product)}`,\n source: target.source,\n });\n}\n\nexport function showTeamScopes(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n): Promise<TeamsApiResult<TeamScopes>> {\n return call(host, accessToken, TeamScopesSchema, {\n method: 'GET',\n path: `/api/partner/teams/${encodeURIComponent(target.team)}/scopes`,\n source: target.source,\n });\n}\n\nexport function setTeamScopes(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n scopes: string[],\n): Promise<TeamsApiResult<TeamScopesSetResult>> {\n return call(host, accessToken, TeamScopesSetResultSchema, {\n method: 'PUT',\n path: `/api/partner/teams/${encodeURIComponent(target.team)}/scopes`,\n source: target.source,\n body: { scopes },\n });\n}\n\nexport function listTeamRoles(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n): Promise<TeamsApiResult<TeamRoles>> {\n return call(host, accessToken, TeamRolesSchema, {\n method: 'GET',\n path: `/api/partner/teams/${encodeURIComponent(target.team)}/roles`,\n source: target.source,\n });\n}\n\nexport function listTeamEvents(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n filters: { product?: string; since?: string; limit?: number },\n): Promise<TeamsApiResult<TeamIntegrationEventList>> {\n const query = new URLSearchParams();\n if (filters.product) query.set('product', filters.product);\n if (filters.since) query.set('since', filters.since);\n if (filters.limit !== undefined) query.set('limit', String(filters.limit));\n const encoded = query.toString();\n const suffix = encoded ? `?${encoded}` : '';\n return call(host, accessToken, TeamIntegrationEventListSchema, {\n method: 'GET',\n path: `/api/partner/teams/${encodeURIComponent(target.team)}/events${suffix}`,\n source: target.source,\n });\n}\n\nfunction membersPath(team: string): string {\n return `/api/partner/teams/${encodeURIComponent(team)}/members`;\n}\n\nfunction integrationPath(target: { team: string; product: string }): string {\n return `/api/partner/teams/${encodeURIComponent(target.team)}/integrations/${encodeURIComponent(target.product)}`;\n}\n\n/** One partner teams call; shared by the team-agent clients (`team-agents-api.ts`). */\nexport async function call<T>(\n host: string,\n accessToken: string,\n schema: z.ZodType<T>,\n init: {\n method: 'GET' | 'PUT' | 'POST' | 'PATCH' | 'DELETE';\n path: string;\n source: string;\n body?: unknown;\n },\n): Promise<TeamsApiResult<T>> {\n const response = await request(\n `${host}${init.path}${init.path.includes('?') ? '&' : '?'}${new URLSearchParams({ source: init.source })}`,\n {\n method: init.method,\n headers: {\n accept: 'application/json',\n authorization: `Bearer ${accessToken}`,\n ...(init.body === undefined\n ? {}\n : { 'content-type': 'application/json' }),\n },\n body: init.body === undefined ? undefined : JSON.stringify(init.body),\n },\n );\n\n if (\n response.status === 401 ||\n (response.status >= 300 && response.status < 400)\n ) {\n return { status: 'unauthorized' };\n }\n\n const body = await readOptionalJson(response);\n const code = typeof body.code === 'string' ? body.code : null;\n const message =\n typeof body.error === 'string' && body.error ? body.error : null;\n\n if (response.status === 403 && code === 'MFA_REQUIRED') {\n throw authRequiredError(\n message ?? `${host} requires multi-factor authentication.`,\n 'Complete MFA in the browser, then run \"ekanos login\" again.',\n );\n }\n if (response.status === 403) {\n throw forbiddenError(\n message ?? 'Not permitted on this Source.',\n code === 'SOURCE_ADMIN_REQUIRED'\n ? \"Only a Source admin manages its teams' integrations. Ask one to run it.\"\n : code === 'CONFIRM_NOT_PERMITTED'\n ? \"Only a Source admin of the team's Source, or someone who manages the team's agents, confirms what an agent may use.\"\n : code === 'PERSONAL_AGENT_CREATOR_ONLY'\n ? 'A personal agent acts with its creator\\'s own connections, so only they change it, run it, decide its approvals or cancel its runs. \"ekanos teams agents list <team>\" shows whose each agent is.'\n : code === 'NOT_A_TEAM_MEMBER'\n ? 'Add yourself to the team first (\"ekanos teams members add <team> --self\"), then run this again.'\n : code === 'AGENTS_MANAGE_REQUIRED'\n ? 'Take a role on the team that holds agents.manage (\"ekanos teams roles list <team>\"), or make it your own agent with --personal.'\n : code === 'PERSONAL_AGENT_CHANNEL_TRIGGER'\n ? 'Add a schedule or a webhook trigger instead: \"ekanos teams triggers add <team> <key> schedule|webhook --prompt ...\".'\n : 'Run \"ekanos sources\" to list the sources you hold a seat on.',\n );\n }\n if (response.status === 404) {\n throw notFoundError(\n message ?? 'Not found.',\n (code ? LIFECYCLE_HINTS[code] : undefined) ??\n (code === 'TEAM_NOT_FOUND'\n ? 'Run \"ekanos teams list\" to see the teams on this Source.'\n : code === 'PRODUCT_NOT_ENTITLED'\n ? '\"ekanos sources products\" shows what this Source has; only a super-admin enables a product for a Source (in /admin).'\n : code === 'SCOPE_NOT_FOUND' || code === 'PRODUCT_NOT_IN_SCOPE'\n ? 'Run \"ekanos sources scopes\" to see the Source\\'s product scopes and their products.'\n : code === 'WEBHOOK_NOT_FOUND' || code === 'CONNECTION_NOT_FOUND'\n ? 'Run \"ekanos teams show <team> <product>\" to see its team apps and webhooks.'\n : code === 'MEMBER_NOT_FOUND'\n ? 'Run \"ekanos teams members list <team>\" to see its members and invitations.'\n : code === 'NOT_A_SOURCE_USER'\n ? 'Invite them instead, by email: \"ekanos teams members invite <team> <email> --role <role>\".'\n : code === 'SKILL_NOT_FOUND'\n ? 'Run \"ekanos skills list --team <team>\" (and \"ekanos skills list\") to see the skills this team can use.'\n : code?.startsWith('AGENT_') ||\n code === 'TEMPLATE_NOT_FOUND'\n ? 'Run \"ekanos teams agents list <team>\" to see the team\\'s agents.'\n : /^(TRIGGER|LINK|MCP)_/.test(code ?? '')\n ? 'List them first: \"ekanos teams triggers|links|mcp list <team> ...\"'\n : 'Run \"ekanos sources\" to list the sources you hold a seat on.'),\n );\n }\n if (response.status === 409 && code === 'NO_TEAM_APP') {\n throw invalidStateError(\n message ?? 'This integration takes no team app.',\n 'Teams connect through the Source\\'s app: \"ekanos apps show <product>\".',\n );\n }\n if (response.status === 409 || response.status === 422) {\n throw invalidStateError(\n message ?? 'The host refused the change.',\n (code ? LIFECYCLE_HINTS[code] : undefined) ??\n (code === 'SLUG_TAKEN'\n ? 'Pick another with --slug, or run \"ekanos teams list\" to see the teams.'\n : code === 'AGENT_VERSION_CHANGED'\n ? 'A newer version was published since it was shown to you. Review it with \"ekanos teams agents show <team> <key>\", then run \"ekanos teams agents confirm\" again.'\n : code === 'ROLE_NEEDS_ACCEPTANCE'\n ? 'Add them with a lower role (--role admin), or invite them to the top role so they accept it: \"ekanos teams members invite <team> <email> --role owner\".'\n : code === 'AGENT_VERSION_CONFLICT'\n ? `Review it with \"ekanos teams agents show <team> <key>\", then apply with --base-version ${typeof body.latestVersion === 'number' ? body.latestVersion : '<its version>'} (or --overwrite to replace it anyway).`\n : code === 'ALREADY_MEMBER' || code === 'ALREADY_INVITED'\n ? 'Run \"ekanos teams members list <team>\"; change a role with \"ekanos teams members role <team> <email> <role>\".'\n : code === 'PRIMARY_OWNER'\n ? \"The primary owner's ownership is transferred in the app (team Settings → Members).\"\n : code === 'TEAM_ACCOUNTS_DISABLED'\n ? 'Ekanos switches team accounts on for a Source; ask a super-admin.'\n : code === 'PERSONAL_CONNECTION'\n ? 'Each member disconnects their own: \"ekanos teams disconnect <team> <product> --mine\".'\n : code === 'MCP_SERVER_FROM_TEMPLATE'\n ? 'It stays while the agent template declares it: change the template, apply and publish.'\n : code === 'PRODUCT_NOT_ENTITLED'\n ? '\"ekanos sources products\" shows what this Source has; only those can be in its scopes.'\n : code === 'TEMPLATE_ARCHIVED'\n ? 'Unarchive it first: \"ekanos agents unarchive <key>\".'\n : 'See \"ekanos teams --help\".'),\n );\n }\n if (response.status === 400 && code === 'INVALID_AGENT') {\n const issues = Array.isArray(body.issues)\n ? body.issues.flatMap((issue: unknown) =>\n typeof issue === 'object' &&\n issue !== null &&\n typeof (issue as { message?: unknown }).message === 'string'\n ? [\n ` ${String((issue as { path?: unknown }).path ?? '(root)')}: ${(issue as { message: string }).message}`,\n ]\n : [],\n )\n : [];\n throw validationError(\n [message ?? 'The agent is not valid.', ...issues].join('\\n'),\n 'Fix agent.json and run it again.',\n );\n }\n if (response.status === 400 && code === 'UNKNOWN_ROLE') {\n throw validationError(\n message ?? 'No such role.',\n 'Run \"ekanos teams roles list <team>\" for the roles this Source uses.',\n );\n }\n if (response.status === 400 && code === 'INVALID_FIELDS') {\n throw validationError(\n message ?? 'The host refused the fields.',\n 'Run \"ekanos teams app set <team> <product>\" again.',\n );\n }\n if (response.status === 400 && code === 'SECRET_AS_ARGUMENT') {\n throw usageError(\n message ?? 'A secret was passed as an argument.',\n 'Leave that field out of --set: pass it with --set-secret <field>=env:<NAME>|file:<path>|stdin or --browser, or run the command at your terminal, which asks for it hidden.',\n );\n }\n if (response.status === 400) {\n throw usageError(\n message ?? 'The host refused the request.',\n 'See \"ekanos teams --help\".',\n );\n }\n if (response.status >= 500 && code && message) {\n throw networkError(message, 'The host could not finish it; retry shortly.');\n }\n if (!response.ok) {\n throw networkError(\n `${host}${init.path} responded ${response.status}.`,\n response.status >= 500\n ? 'The Ekanos deployment returned a server error. Retry shortly.'\n : 'Confirm the host runs a build that includes the teams routes.',\n );\n }\n\n const parsed = schema.safeParse(body.data);\n if (!parsed.success) {\n throw networkError(\n `${host}/api/partner/teams answered in a shape this CLI does not read.`,\n 'Run \"ekanos upgrade\" — the CLI and the host disagree on the teams contract.',\n );\n }\n return { status: 'ok', data: parsed.data };\n}\n\n/** Next steps for the refusals of the team lifecycle, roles and groups calls. */\nconst LIFECYCLE_HINTS: Record<string, string> = {\n GROUP_NOT_FOUND:\n 'Run \"ekanos teams groups list <team>\" to see its groups (name one by name or id).',\n GROUP_AMBIGUOUS:\n 'Run \"ekanos teams groups list <team> --json\" and name the group by its id.',\n GROUP_EXISTS:\n 'Pick another name, or change that group: \"ekanos teams groups update <team> <group> …\".',\n ROLE_NOT_FOUND: 'Run \"ekanos sources roles list\" to see the Source\\'s roles.',\n ROLE_EXISTS:\n 'Change it instead: \"ekanos sources roles update <role> …\", or pick another name.',\n SYSTEM_ROLE:\n 'Owner, admin and member are fixed; create a custom role with \"ekanos sources roles create <name> …\".',\n ROLE_IN_USE:\n 'Give its members another role first: \"ekanos teams members role <team> <email> <role>\"; \"ekanos sources people\" shows who holds what.',\n WORKSPACE_NOT_FOUND:\n 'Run \"ekanos teams workspace list <team>\" to see its workspaces.',\n WORKSPACES_DISABLED:\n 'Workspaces are a Source Flag (enable_workspaces) only a super-admin switches.',\n NOT_A_MEMBER:\n 'Run \"ekanos teams members list <team>\" to see who is on it; you leave only a team you are a member of.',\n NOT_CONNECTED:\n 'Connect it first: \"ekanos teams connect <team> <product>\"; \"ekanos teams health <team>\" lists what it has.',\n USER_SCOPED:\n 'Each person connects it for themselves and checks it on their own Integrations → Health page.',\n NO_HEALTH_CHECK:\n 'The product has no package on this deployment; \"ekanos sources products\" shows what is registered.',\n PRODUCT_NOT_VISIBLE_TO_TEAM:\n 'Run \"ekanos teams scope show <team>\" for the products the team sees.',\n};\n\nasync function readOptionalJson(\n response: Response,\n): Promise<Record<string, unknown>> {\n try {\n const parsed: unknown = await response.json();\n return typeof parsed === 'object' && parsed !== null\n ? (parsed as Record<string, unknown>)\n : {};\n } catch {\n return {};\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"teams-api.js","sourceRoot":"","sources":["../src/teams-api.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type AudienceCreateRequest,\n type AudienceListResponse,\n AudienceListResponseSchema,\n type AudienceResponse,\n AudienceResponseSchema,\n type AudienceUpdateRequest,\n type MemberAudience,\n MemberAudienceSchema,\n type MemberAudienceSetResult,\n MemberAudienceSetResultSchema,\n type TeamAudience,\n TeamAudienceSchema,\n type TeamAudienceSetResult,\n TeamAudienceSetResultSchema,\n type ProductScopeList,\n ProductScopeListSchema,\n type ProductScopeProductChange,\n ProductScopeProductChangeSchema,\n type TeamScopes,\n TeamScopesSchema,\n type TeamScopesSetResult,\n TeamScopesSetResultSchema,\n type TeamAppSetResult,\n TeamAppSetResultSchema,\n type TeamCreateRequest,\n type TeamCreateResult,\n TeamCreateResultSchema,\n type TeamDisconnectResult,\n TeamDisconnectResultSchema,\n type TeamMemberChangeResult,\n TeamMemberChangeResultSchema,\n type TeamMemberAddResult,\n TeamMemberAddResultSchema,\n type TeamMemberInviteResult,\n TeamMemberInviteResultSchema,\n type TeamMemberList,\n TeamMemberListSchema,\n type TeamRenameResult,\n TeamRenameResultSchema,\n type TeamRoles,\n TeamRolesSchema,\n type TeamIntegrationStatus,\n TeamIntegrationStatusSchema,\n type TeamIntegrationEventList,\n TeamIntegrationEventListSchema,\n type TeamList,\n TeamListSchema,\n type TeamWebhookMintResult,\n TeamWebhookMintResultSchema,\n} from '@ekanos/integration-schema';\nimport type { z } from 'zod';\n\nimport { request } from './auth/ekanos-api';\nimport {\n authRequiredError,\n forbiddenError,\n invalidStateError,\n networkError,\n notFoundError,\n usageError,\n validationError,\n} from './errors';\n\n/**\n * The CLI's client for a Source's teams and their integration setup — the\n * team-level counterpart of `apps-api.ts`.\n *\n * GET /api/partner/teams?source=<slug> → TeamList\n * GET /api/partner/teams/<team>/integrations/<product>?source=<slug> → TeamIntegrationStatus\n * PUT …/integrations/<product>/app?source=<slug> { connectionId?, fields }\n * → TeamAppSetResult\n * POST …/integrations/<product>/webhooks/<id>?source=<slug> → TeamWebhookMintResult\n * DELETE /api/partner/teams/<team>/integrations/<product>?source=<slug> → TeamDisconnectResult\n * POST /api/partner/teams?source=<slug> { name, slug?, ownerEmail? } → TeamCreateResult\n * PATCH /api/partner/teams/<team>?source=<slug> { name } → TeamRenameResult\n * GET /api/partner/teams/<team>/members?source=<slug> → TeamMemberList\n * POST …/<team>/members?source=<slug> { email, role } → TeamMemberInviteResult\n * PATCH …/<team>/members/<email>?source=<slug> { role } → TeamMemberChangeResult\n * DELETE …/<team>/members/<email>?source=<slug> → TeamMemberChangeResult\n * GET /api/partner/teams/<team>/roles?source=<slug> → TeamRoles\n * GET /api/partner/teams/<team>/events?source=<slug>[&product=<slug>]\n * [&since=<iso>][&limit=<n>] → TeamIntegrationEventList\n * GET /api/partner/scopes?source=<slug> → ProductScopeList\n * PUT | DELETE /api/partner/scopes/<scope>/products/<product>?source=<slug>\n * → ProductScopeProductChange\n * GET /api/partner/audiences?source=<slug> → AudienceListResponse\n * GET | PATCH /api/partner/audiences/<audience>?source=<slug> → AudienceResponse\n * POST /api/partner/audiences?source=<slug> { name, … } → AudienceResponse\n * GET | PUT /api/partner/teams/<team>/audience?source=<slug> { audienceId }\n * → TeamAudience | TeamAudienceSetResult\n * GET | PUT …/<team>/members/<email>/audience?source=<slug> { audienceId | null }\n * → MemberAudience | MemberAudienceSetResult\n * GET /api/partner/teams/<team>/scopes?source=<slug> → TeamScopes\n * PUT /api/partner/teams/<team>/scopes?source=<slug> { scopes } → TeamScopesSetResult\n *\n * → 401 / 3xx refresh once and retry\n * → 403 { code: \"SOURCE_ADMIN_REQUIRED\" | \"MFA_REQUIRED\" | \"FORBIDDEN\" }\n * → 404 { code: \"TEAM_NOT_FOUND\" | \"PRODUCT_NOT_ENTITLED\" | \"WEBHOOK_NOT_FOUND\"\n * | \"CONNECTION_NOT_FOUND\" | \"SOURCE_NOT_FOUND\" }\n * | \"MEMBER_NOT_FOUND\" }\n * → 409 { code: \"NO_TEAM_APP\" | \"SLUG_TAKEN\" | \"TEAM_ACCOUNTS_DISABLED\"\n * | \"ALREADY_MEMBER\" | \"ALREADY_INVITED\" | \"PRIMARY_OWNER\" }\n * → 400 { code: \"INVALID_FIELDS\" | \"INVALID_REQUEST\" | \"UNKNOWN_ROLE\" }\n */\n\nexport type TeamsApiResult<T> =\n | { status: 'ok'; data: T }\n | { status: 'unauthorized' };\n\nexport function listTeams(\n host: string,\n accessToken: string,\n source: string,\n): Promise<TeamsApiResult<TeamList>> {\n return call(host, accessToken, TeamListSchema, {\n method: 'GET',\n path: '/api/partner/teams',\n source,\n });\n}\n\nexport function showTeamIntegration(\n host: string,\n accessToken: string,\n target: { source: string; team: string; product: string },\n): Promise<TeamsApiResult<TeamIntegrationStatus>> {\n return call(host, accessToken, TeamIntegrationStatusSchema, {\n method: 'GET',\n path: integrationPath(target),\n source: target.source,\n });\n}\n\nexport function setTeamApp(\n host: string,\n accessToken: string,\n target: { source: string; team: string; product: string },\n body: {\n connectionId?: string;\n fields: Record<string, string>;\n clear?: string[];\n },\n): Promise<TeamsApiResult<TeamAppSetResult>> {\n return call(host, accessToken, TeamAppSetResultSchema, {\n method: 'PUT',\n path: `${integrationPath(target)}/app`,\n source: target.source,\n body,\n });\n}\n\nexport function mintTeamWebhook(\n host: string,\n accessToken: string,\n target: { source: string; team: string; product: string },\n webhookId: string,\n): Promise<TeamsApiResult<TeamWebhookMintResult>> {\n return call(host, accessToken, TeamWebhookMintResultSchema, {\n method: 'POST',\n path: `${integrationPath(target)}/webhooks/${encodeURIComponent(webhookId)}`,\n source: target.source,\n });\n}\n\nexport function disconnectTeamIntegration(\n host: string,\n accessToken: string,\n target: { source: string; team: string; product: string; mine?: boolean },\n): Promise<TeamsApiResult<TeamDisconnectResult>> {\n return call(host, accessToken, TeamDisconnectResultSchema, {\n method: 'DELETE',\n // `--mine`: the caller's own personal connection, never another's.\n path: `${integrationPath(target)}${target.mine ? '/mine' : ''}`,\n source: target.source,\n });\n}\n\nexport function createTeam(\n host: string,\n accessToken: string,\n source: string,\n body: TeamCreateRequest,\n): Promise<TeamsApiResult<TeamCreateResult>> {\n return call(host, accessToken, TeamCreateResultSchema, {\n method: 'POST',\n path: '/api/partner/teams',\n source,\n body,\n });\n}\n\nexport function renameTeam(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n name: string,\n): Promise<TeamsApiResult<TeamRenameResult>> {\n return call(host, accessToken, TeamRenameResultSchema, {\n method: 'PATCH',\n path: `/api/partner/teams/${encodeURIComponent(target.team)}`,\n source: target.source,\n body: { name },\n });\n}\n\nexport function listTeamMembers(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n): Promise<TeamsApiResult<TeamMemberList>> {\n return call(host, accessToken, TeamMemberListSchema, {\n method: 'GET',\n path: membersPath(target.team),\n source: target.source,\n });\n}\n\nexport function inviteTeamMember(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n body: { email: string; role: string },\n): Promise<TeamsApiResult<TeamMemberInviteResult>> {\n return call(host, accessToken, TeamMemberInviteResultSchema, {\n method: 'POST',\n path: membersPath(target.team),\n source: target.source,\n body,\n });\n}\n\n/** `teams members add`: a member now, no invitation email (`PUT`). */\nexport function addTeamMember(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n body: { self: true; role?: string } | { email: string; role?: string },\n): Promise<TeamsApiResult<TeamMemberAddResult>> {\n return call(host, accessToken, TeamMemberAddResultSchema, {\n method: 'PUT',\n path: membersPath(target.team),\n source: target.source,\n body,\n });\n}\n\nexport function setTeamMemberRole(\n host: string,\n accessToken: string,\n target: { source: string; team: string; email: string },\n role: string,\n): Promise<TeamsApiResult<TeamMemberChangeResult>> {\n return call(host, accessToken, TeamMemberChangeResultSchema, {\n method: 'PATCH',\n path: `${membersPath(target.team)}/${encodeURIComponent(target.email)}`,\n source: target.source,\n body: { role },\n });\n}\n\nexport function removeTeamMember(\n host: string,\n accessToken: string,\n target: { source: string; team: string; email: string },\n): Promise<TeamsApiResult<TeamMemberChangeResult>> {\n return call(host, accessToken, TeamMemberChangeResultSchema, {\n method: 'DELETE',\n path: `${membersPath(target.team)}/${encodeURIComponent(target.email)}`,\n source: target.source,\n });\n}\n\nexport function listProductScopes(\n host: string,\n accessToken: string,\n source: string,\n): Promise<TeamsApiResult<ProductScopeList>> {\n return call(host, accessToken, ProductScopeListSchema, {\n method: 'GET',\n path: '/api/partner/scopes',\n source,\n });\n}\n\nexport function setScopeProduct(\n host: string,\n accessToken: string,\n target: { source: string; scope: string; product: string },\n included: boolean,\n): Promise<TeamsApiResult<ProductScopeProductChange>> {\n return call(host, accessToken, ProductScopeProductChangeSchema, {\n method: included ? 'PUT' : 'DELETE',\n path: `/api/partner/scopes/${encodeURIComponent(target.scope)}/products/${encodeURIComponent(target.product)}`,\n source: target.source,\n });\n}\n\nexport function showTeamScopes(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n): Promise<TeamsApiResult<TeamScopes>> {\n return call(host, accessToken, TeamScopesSchema, {\n method: 'GET',\n path: `/api/partner/teams/${encodeURIComponent(target.team)}/scopes`,\n source: target.source,\n });\n}\n\nexport function setTeamScopes(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n scopes: string[],\n): Promise<TeamsApiResult<TeamScopesSetResult>> {\n return call(host, accessToken, TeamScopesSetResultSchema, {\n method: 'PUT',\n path: `/api/partner/teams/${encodeURIComponent(target.team)}/scopes`,\n source: target.source,\n body: { scopes },\n });\n}\n\nexport function listAudiences(\n host: string,\n accessToken: string,\n source: string,\n): Promise<TeamsApiResult<AudienceListResponse>> {\n return call(host, accessToken, AudienceListResponseSchema, {\n method: 'GET',\n path: '/api/partner/audiences',\n source,\n });\n}\n\nexport function showAudience(\n host: string,\n accessToken: string,\n target: { source: string; audience: string },\n): Promise<TeamsApiResult<AudienceResponse>> {\n return call(host, accessToken, AudienceResponseSchema, {\n method: 'GET',\n path: `/api/partner/audiences/${encodeURIComponent(target.audience)}`,\n source: target.source,\n });\n}\n\nexport function createAudience(\n host: string,\n accessToken: string,\n source: string,\n body: AudienceCreateRequest,\n): Promise<TeamsApiResult<AudienceResponse>> {\n return call(host, accessToken, AudienceResponseSchema, {\n method: 'POST',\n path: '/api/partner/audiences',\n source,\n body,\n });\n}\n\nexport function updateAudience(\n host: string,\n accessToken: string,\n target: { source: string; audience: string },\n body: AudienceUpdateRequest,\n): Promise<TeamsApiResult<AudienceResponse>> {\n return call(host, accessToken, AudienceResponseSchema, {\n method: 'PATCH',\n path: `/api/partner/audiences/${encodeURIComponent(target.audience)}`,\n source: target.source,\n body,\n });\n}\n\nexport function showTeamAudience(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n): Promise<TeamsApiResult<TeamAudience>> {\n return call(host, accessToken, TeamAudienceSchema, {\n method: 'GET',\n path: `/api/partner/teams/${encodeURIComponent(target.team)}/audience`,\n source: target.source,\n });\n}\n\nexport function setTeamAudience(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n audienceId: string,\n): Promise<TeamsApiResult<TeamAudienceSetResult>> {\n return call(host, accessToken, TeamAudienceSetResultSchema, {\n method: 'PUT',\n path: `/api/partner/teams/${encodeURIComponent(target.team)}/audience`,\n source: target.source,\n body: { audienceId },\n });\n}\n\nexport function showMemberAudience(\n host: string,\n accessToken: string,\n target: { source: string; team: string; email: string },\n): Promise<TeamsApiResult<MemberAudience>> {\n return call(host, accessToken, MemberAudienceSchema, {\n method: 'GET',\n path: `${membersPath(target.team)}/${encodeURIComponent(target.email)}/audience`,\n source: target.source,\n });\n}\n\n/** `audienceId: null` clears the member's own audience. */\nexport function setMemberAudience(\n host: string,\n accessToken: string,\n target: { source: string; team: string; email: string },\n audienceId: string | null,\n): Promise<TeamsApiResult<MemberAudienceSetResult>> {\n return call(host, accessToken, MemberAudienceSetResultSchema, {\n method: 'PUT',\n path: `${membersPath(target.team)}/${encodeURIComponent(target.email)}/audience`,\n source: target.source,\n body: { audienceId },\n });\n}\n\nexport function listTeamRoles(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n): Promise<TeamsApiResult<TeamRoles>> {\n return call(host, accessToken, TeamRolesSchema, {\n method: 'GET',\n path: `/api/partner/teams/${encodeURIComponent(target.team)}/roles`,\n source: target.source,\n });\n}\n\nexport function listTeamEvents(\n host: string,\n accessToken: string,\n target: { source: string; team: string },\n filters: { product?: string; since?: string; limit?: number },\n): Promise<TeamsApiResult<TeamIntegrationEventList>> {\n const query = new URLSearchParams();\n if (filters.product) query.set('product', filters.product);\n if (filters.since) query.set('since', filters.since);\n if (filters.limit !== undefined) query.set('limit', String(filters.limit));\n const encoded = query.toString();\n const suffix = encoded ? `?${encoded}` : '';\n return call(host, accessToken, TeamIntegrationEventListSchema, {\n method: 'GET',\n path: `/api/partner/teams/${encodeURIComponent(target.team)}/events${suffix}`,\n source: target.source,\n });\n}\n\nfunction membersPath(team: string): string {\n return `/api/partner/teams/${encodeURIComponent(team)}/members`;\n}\n\nfunction integrationPath(target: { team: string; product: string }): string {\n return `/api/partner/teams/${encodeURIComponent(target.team)}/integrations/${encodeURIComponent(target.product)}`;\n}\n\n/** One partner teams call; shared by the team-agent clients (`team-agents-api.ts`). */\nexport async function call<T>(\n host: string,\n accessToken: string,\n schema: z.ZodType<T>,\n init: {\n method: 'GET' | 'PUT' | 'POST' | 'PATCH' | 'DELETE';\n path: string;\n source: string;\n body?: unknown;\n },\n): Promise<TeamsApiResult<T>> {\n const response = await request(\n `${host}${init.path}${init.path.includes('?') ? '&' : '?'}${new URLSearchParams({ source: init.source })}`,\n {\n method: init.method,\n headers: {\n accept: 'application/json',\n authorization: `Bearer ${accessToken}`,\n ...(init.body === undefined\n ? {}\n : { 'content-type': 'application/json' }),\n },\n body: init.body === undefined ? undefined : JSON.stringify(init.body),\n },\n );\n\n if (\n response.status === 401 ||\n (response.status >= 300 && response.status < 400)\n ) {\n return { status: 'unauthorized' };\n }\n\n const body = await readOptionalJson(response);\n const code = typeof body.code === 'string' ? body.code : null;\n const message =\n typeof body.error === 'string' && body.error ? body.error : null;\n\n if (response.status === 403 && code === 'MFA_REQUIRED') {\n throw authRequiredError(\n message ?? `${host} requires multi-factor authentication.`,\n 'Complete MFA in the browser, then run \"ekanos login\" again.',\n );\n }\n if (response.status === 403) {\n throw forbiddenError(\n message ?? 'Not permitted on this Source.',\n code === 'SOURCE_ADMIN_REQUIRED'\n ? \"Only a Source admin manages its teams' integrations. Ask one to run it.\"\n : code === 'CONFIRM_NOT_PERMITTED'\n ? \"Only a Source admin of the team's Source, or someone who manages the team's agents, confirms what an agent may use.\"\n : code === 'PERSONAL_AGENT_CREATOR_ONLY'\n ? 'A personal agent acts with its creator\\'s own connections, so only they change it, run it, decide its approvals or cancel its runs. \"ekanos teams agents list <team>\" shows whose each agent is.'\n : code === 'NOT_A_TEAM_MEMBER'\n ? 'Add yourself to the team first (\"ekanos teams members add <team> --self\"), then run this again.'\n : code === 'AGENTS_MANAGE_REQUIRED'\n ? 'Take a role on the team that holds agents.manage (\"ekanos teams roles list <team>\"), or make it your own agent with --personal.'\n : code === 'PERSONAL_AGENT_CHANNEL_TRIGGER'\n ? 'Add a schedule or a webhook trigger instead: \"ekanos teams triggers add <team> <key> schedule|webhook --prompt ...\".'\n : 'Run \"ekanos sources\" to list the sources you hold a seat on.',\n );\n }\n if (response.status === 404) {\n throw notFoundError(\n message ?? 'Not found.',\n (code ? LIFECYCLE_HINTS[code] : undefined) ??\n (code === 'TEAM_NOT_FOUND'\n ? 'Run \"ekanos teams list\" to see the teams on this Source.'\n : code === 'PRODUCT_NOT_ENTITLED'\n ? '\"ekanos sources products\" shows what this Source has; only a super-admin enables a product for a Source (in /admin).'\n : code === 'SCOPE_NOT_FOUND' || code === 'PRODUCT_NOT_IN_SCOPE'\n ? 'Run \"ekanos sources scopes\" to see the Source\\'s product scopes and their products.'\n : code === 'WEBHOOK_NOT_FOUND' || code === 'CONNECTION_NOT_FOUND'\n ? 'Run \"ekanos teams show <team> <product>\" to see its team apps and webhooks.'\n : code === 'MEMBER_NOT_FOUND'\n ? 'Run \"ekanos teams members list <team>\" to see its members and invitations.'\n : code === 'NOT_A_SOURCE_USER'\n ? 'Invite them instead, by email: \"ekanos teams members invite <team> <email> --role <role>\".'\n : code === 'SKILL_NOT_FOUND'\n ? 'Run \"ekanos skills list --team <team>\" (and \"ekanos skills list\") to see the skills this team can use.'\n : code?.startsWith('AGENT_') ||\n code === 'TEMPLATE_NOT_FOUND'\n ? 'Run \"ekanos teams agents list <team>\" to see the team\\'s agents.'\n : /^(TRIGGER|LINK|MCP)_/.test(code ?? '')\n ? 'List them first: \"ekanos teams triggers|links|mcp list <team> ...\"'\n : 'Run \"ekanos sources\" to list the sources you hold a seat on.'),\n );\n }\n if (response.status === 409 && code === 'NO_TEAM_APP') {\n throw invalidStateError(\n message ?? 'This integration takes no team app.',\n 'Teams connect through the Source\\'s app: \"ekanos apps show <product>\".',\n );\n }\n if (response.status === 409 || response.status === 422) {\n throw invalidStateError(\n message ?? 'The host refused the change.',\n (code ? LIFECYCLE_HINTS[code] : undefined) ??\n (code === 'SLUG_TAKEN'\n ? 'Pick another with --slug, or run \"ekanos teams list\" to see the teams.'\n : code === 'AGENT_VERSION_CHANGED'\n ? 'A newer version was published since it was shown to you. Review it with \"ekanos teams agents show <team> <key>\", then run \"ekanos teams agents confirm\" again.'\n : code === 'ROLE_NEEDS_ACCEPTANCE'\n ? 'Add them with a lower role (--role admin), or invite them to the top role so they accept it: \"ekanos teams members invite <team> <email> --role owner\".'\n : code === 'AGENT_VERSION_CONFLICT'\n ? `Review it with \"ekanos teams agents show <team> <key>\", then apply with --base-version ${typeof body.latestVersion === 'number' ? body.latestVersion : '<its version>'} (or --overwrite to replace it anyway).`\n : code === 'ALREADY_MEMBER' || code === 'ALREADY_INVITED'\n ? 'Run \"ekanos teams members list <team>\"; change a role with \"ekanos teams members role <team> <email> <role>\".'\n : code === 'PRIMARY_OWNER'\n ? \"The primary owner's ownership is transferred in the app (team Settings → Members).\"\n : code === 'TEAM_ACCOUNTS_DISABLED'\n ? 'Ekanos switches team accounts on for a Source; ask a super-admin.'\n : code === 'PERSONAL_CONNECTION'\n ? 'Each member disconnects their own: \"ekanos teams disconnect <team> <product> --mine\".'\n : code === 'MCP_SERVER_FROM_TEMPLATE'\n ? 'It stays while the agent template declares it: change the template, apply and publish.'\n : code === 'PRODUCT_NOT_ENTITLED'\n ? '\"ekanos sources products\" shows what this Source has; only those can be in its scopes.'\n : code === 'TEMPLATE_ARCHIVED'\n ? 'Unarchive it first: \"ekanos agents unarchive <key>\".'\n : 'See \"ekanos teams --help\".'),\n );\n }\n if (response.status === 400 && code === 'INVALID_AGENT') {\n const issues = Array.isArray(body.issues)\n ? body.issues.flatMap((issue: unknown) =>\n typeof issue === 'object' &&\n issue !== null &&\n typeof (issue as { message?: unknown }).message === 'string'\n ? [\n ` ${String((issue as { path?: unknown }).path ?? '(root)')}: ${(issue as { message: string }).message}`,\n ]\n : [],\n )\n : [];\n throw validationError(\n [message ?? 'The agent is not valid.', ...issues].join('\\n'),\n 'Fix agent.json and run it again.',\n );\n }\n if (response.status === 400 && code === 'UNKNOWN_ROLE') {\n throw validationError(\n message ?? 'No such role.',\n 'Run \"ekanos teams roles list <team>\" for the roles this Source uses.',\n );\n }\n if (response.status === 400 && code === 'INVALID_FIELDS') {\n throw validationError(\n message ?? 'The host refused the fields.',\n 'Run \"ekanos teams app set <team> <product>\" again.',\n );\n }\n if (response.status === 400 && code === 'SECRET_AS_ARGUMENT') {\n throw usageError(\n message ?? 'A secret was passed as an argument.',\n 'Leave that field out of --set: pass it with --set-secret <field>=env:<NAME>|file:<path>|stdin or --browser, or run the command at your terminal, which asks for it hidden.',\n );\n }\n if (response.status === 400) {\n throw usageError(\n message ?? 'The host refused the request.',\n 'See \"ekanos teams --help\".',\n );\n }\n if (response.status >= 500 && code && message) {\n throw networkError(message, 'The host could not finish it; retry shortly.');\n }\n if (!response.ok) {\n throw networkError(\n `${host}${init.path} responded ${response.status}.`,\n response.status >= 500\n ? 'The Ekanos deployment returned a server error. Retry shortly.'\n : 'Confirm the host runs a build that includes the teams routes.',\n );\n }\n\n const parsed = schema.safeParse(body.data);\n if (!parsed.success) {\n throw networkError(\n `${host}/api/partner/teams answered in a shape this CLI does not read.`,\n 'Run \"ekanos upgrade\" — the CLI and the host disagree on the teams contract.',\n );\n }\n return { status: 'ok', data: parsed.data };\n}\n\n/** Next steps for the refusals of the team lifecycle, roles and groups calls. */\nconst LIFECYCLE_HINTS: Record<string, string> = {\n GROUP_NOT_FOUND:\n 'Run \"ekanos teams groups list <team>\" to see its groups (name one by name or id).',\n GROUP_AMBIGUOUS:\n 'Run \"ekanos teams groups list <team> --json\" and name the group by its id.',\n GROUP_EXISTS:\n 'Pick another name, or change that group: \"ekanos teams groups update <team> <group> …\".',\n ROLE_NOT_FOUND: 'Run \"ekanos sources roles list\" to see the Source\\'s roles.',\n ROLE_EXISTS:\n 'Change it instead: \"ekanos sources roles update <role> …\", or pick another name.',\n SYSTEM_ROLE:\n 'Owner, admin and member are fixed; create a custom role with \"ekanos sources roles create <name> …\".',\n ROLE_IN_USE:\n 'Give its members another role first: \"ekanos teams members role <team> <email> <role>\"; \"ekanos sources people\" shows who holds what.',\n WORKSPACE_NOT_FOUND:\n 'Run \"ekanos teams workspace list <team>\" to see its workspaces.',\n WORKSPACES_DISABLED:\n 'Workspaces are a Source Flag (enable_workspaces) only a super-admin switches.',\n NOT_A_MEMBER:\n 'Run \"ekanos teams members list <team>\" to see who is on it; you leave only a team you are a member of.',\n NOT_CONNECTED:\n 'Connect it first: \"ekanos teams connect <team> <product>\"; \"ekanos teams health <team>\" lists what it has.',\n USER_SCOPED:\n 'Each person connects it for themselves and checks it on their own Integrations → Health page.',\n NO_HEALTH_CHECK:\n 'The product has no package on this deployment; \"ekanos sources products\" shows what is registered.',\n PRODUCT_NOT_VISIBLE_TO_TEAM:\n 'Run \"ekanos teams scope show <team>\" for the products the team sees.',\n};\n\nasync function readOptionalJson(\n response: Response,\n): Promise<Record<string, unknown>> {\n try {\n const parsed: unknown = await response.json();\n return typeof parsed === 'object' && parsed !== null\n ? (parsed as Record<string, unknown>)\n : {};\n } catch {\n return {};\n }\n}\n"]}
|