@ekanos/cli 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +41 -4
  2. package/dist/auth/ekanos-api.d.ts +23 -0
  3. package/dist/auth/ekanos-api.js +33 -6
  4. package/dist/auth/ekanos-api.js.map +1 -1
  5. package/dist/commands/agents.d.ts +2 -2
  6. package/dist/commands/agents.js +14 -20
  7. package/dist/commands/agents.js.map +1 -1
  8. package/dist/commands/apps.d.ts +11 -3
  9. package/dist/commands/apps.js +86 -28
  10. package/dist/commands/apps.js.map +1 -1
  11. package/dist/commands/catalog.d.ts +4 -2
  12. package/dist/commands/catalog.js +166 -35
  13. package/dist/commands/catalog.js.map +1 -1
  14. package/dist/commands/login.d.ts +2 -0
  15. package/dist/commands/login.js +17 -0
  16. package/dist/commands/login.js.map +1 -1
  17. package/dist/commands/runs.d.ts +7 -3
  18. package/dist/commands/runs.js +24 -6
  19. package/dist/commands/runs.js.map +1 -1
  20. package/dist/commands/scope-notice.d.ts +7 -0
  21. package/dist/commands/scope-notice.js +4 -11
  22. package/dist/commands/scope-notice.js.map +1 -1
  23. package/dist/commands/sources-roles.d.ts +5 -0
  24. package/dist/commands/sources-roles.js +235 -0
  25. package/dist/commands/sources-roles.js.map +1 -0
  26. package/dist/commands/sources.d.ts +5 -0
  27. package/dist/commands/sources.js +6 -1
  28. package/dist/commands/sources.js.map +1 -1
  29. package/dist/commands/team-agent-readiness.d.ts +23 -17
  30. package/dist/commands/team-agent-readiness.js +57 -90
  31. package/dist/commands/team-agent-readiness.js.map +1 -1
  32. package/dist/commands/team-agents-agents.d.ts +8 -5
  33. package/dist/commands/team-agents-agents.js +173 -58
  34. package/dist/commands/team-agents-agents.js.map +1 -1
  35. package/dist/commands/team-agents-define.d.ts +31 -0
  36. package/dist/commands/team-agents-define.js +176 -0
  37. package/dist/commands/team-agents-define.js.map +1 -0
  38. package/dist/commands/team-agents-mcp.js +112 -10
  39. package/dist/commands/team-agents-mcp.js.map +1 -1
  40. package/dist/commands/team-agents-triggers.d.ts +1 -1
  41. package/dist/commands/team-agents-triggers.js +137 -5
  42. package/dist/commands/team-agents-triggers.js.map +1 -1
  43. package/dist/commands/team-agents.d.ts +4 -1
  44. package/dist/commands/team-agents.js +17 -4
  45. package/dist/commands/team-agents.js.map +1 -1
  46. package/dist/commands/team-llm-key.d.ts +14 -0
  47. package/dist/commands/team-llm-key.js +122 -0
  48. package/dist/commands/team-llm-key.js.map +1 -0
  49. package/dist/commands/teams-connect.js +123 -31
  50. package/dist/commands/teams-connect.js.map +1 -1
  51. package/dist/commands/teams-lifecycle.d.ts +90 -0
  52. package/dist/commands/teams-lifecycle.js +457 -0
  53. package/dist/commands/teams-lifecycle.js.map +1 -0
  54. package/dist/commands/teams-onboard.d.ts +14 -0
  55. package/dist/commands/teams-onboard.js +62 -13
  56. package/dist/commands/teams-onboard.js.map +1 -1
  57. package/dist/commands/teams-overview.js +7 -3
  58. package/dist/commands/teams-overview.js.map +1 -1
  59. package/dist/commands/teams.d.ts +25 -5
  60. package/dist/commands/teams.js +101 -39
  61. package/dist/commands/teams.js.map +1 -1
  62. package/dist/commands/workflows.d.ts +37 -0
  63. package/dist/commands/workflows.js +589 -0
  64. package/dist/commands/workflows.js.map +1 -0
  65. package/dist/connect-fields.d.ts +22 -0
  66. package/dist/connect-fields.js +115 -0
  67. package/dist/connect-fields.js.map +1 -0
  68. package/dist/context.d.ts +12 -0
  69. package/dist/context.js +32 -9
  70. package/dist/context.js.map +1 -1
  71. package/dist/index.d.ts +13 -0
  72. package/dist/index.js +367 -133
  73. package/dist/index.js.map +1 -1
  74. package/dist/invocation.d.ts +31 -0
  75. package/dist/invocation.js +58 -0
  76. package/dist/invocation.js.map +1 -0
  77. package/dist/runs-api.js +8 -3
  78. package/dist/runs-api.js.map +1 -1
  79. package/dist/safe-fs.d.ts +18 -0
  80. package/dist/safe-fs.js +57 -0
  81. package/dist/safe-fs.js.map +1 -1
  82. package/dist/secret-form.d.ts +48 -0
  83. package/dist/secret-form.js +212 -0
  84. package/dist/secret-form.js.map +1 -0
  85. package/dist/secret-input.d.ts +96 -0
  86. package/dist/secret-input.js +299 -0
  87. package/dist/secret-input.js.map +1 -0
  88. package/dist/team-connect-api.d.ts +78 -3
  89. package/dist/team-connect-api.js +17 -2
  90. package/dist/team-connect-api.js.map +1 -1
  91. package/dist/team-lifecycle-api.d.ts +435 -0
  92. package/dist/team-lifecycle-api.js +301 -0
  93. package/dist/team-lifecycle-api.js.map +1 -0
  94. package/dist/teams-api.d.ts +13 -1
  95. package/dist/teams-api.js +90 -31
  96. package/dist/teams-api.js.map +1 -1
  97. package/dist/unknown-command.d.ts +18 -0
  98. package/dist/unknown-command.js +50 -0
  99. package/dist/unknown-command.js.map +1 -0
  100. package/dist/workflows-api.d.ts +69 -0
  101. package/dist/workflows-api.js +182 -0
  102. package/dist/workflows-api.js.map +1 -0
  103. package/package.json +3 -3
  104. package/templates/AGENTS.md.tmpl +6 -4
  105. package/templates/claude-skill.md.tmpl +4 -1
  106. package/templates/package.json.tmpl +4 -4
  107. package/templates/skills/build-agent/SKILL.md +56 -22
  108. package/templates/skills/build-agent/references/agent-json.md +4 -1
  109. package/templates/skills/build-agent/references/app-setup.md +14 -7
  110. package/templates/skills/build-agent/references/rollout.md +40 -20
  111. package/templates/skills/build-agent/references/set-up-an-integration.md +46 -29
  112. package/templates/skills/build-agent/references/triggers.md +4 -3
  113. package/templates/skills/build-integration/references/widget-design.md +1 -1
  114. package/templates/skills/ekanos-platform/SKILL.md +77 -23
  115. package/templates/skills/polish-widgets/references/patterns.md +3 -3
@@ -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 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 },\n): Promise<TeamsApiResult<TeamDisconnectResult>> {\n return call(host, accessToken, TeamDisconnectResultSchema, {\n method: 'DELETE',\n path: integrationPath(target),\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\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 === 'NOT_RUNS_AS'\n ? 'Consent is personal: the person it runs as gives it, signed in as themselves. \"ekanos teams agents list <team>\" shows who that is.'\n : code === 'AGENTS_MANAGE_REQUIRED'\n ? 'Ask a team owner for a role that manages agents, then confirm again.'\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 === '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 === '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_') || 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 === '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 === '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 ? \"The member who made it disconnects it on the team's Integrations page in the app.\"\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 === '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) {\n throw usageError(\n message ?? 'The host refused the request.',\n 'See \"ekanos teams --help\".',\n );\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\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 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"]}
@@ -0,0 +1,18 @@
1
+ import { type CliError } from './errors.js';
2
+ /**
3
+ * The error for a first argument that is not a command, with the one fix
4
+ * most likely meant:
5
+ *
6
+ * - a whole command passed as ONE argument (`ekanos "teams list"`, which a
7
+ * shell or an agent's tool call produces when it quotes the line), whose
8
+ * first word is a command → the same words as separate arguments;
9
+ * - a typo of a command (`ekanos tems`) → the closest command;
10
+ * - otherwise the command list.
11
+ *
12
+ * `suggestion` is the corrected command line, or null when there is none to
13
+ * offer. It is also what the `claude-code-hint` line carries.
14
+ */
15
+ export declare function unknownCommand(given: string, rest: readonly string[], commands: readonly string[]): {
16
+ error: CliError;
17
+ suggestion: string | null;
18
+ };
@@ -0,0 +1,50 @@
1
+ import { suggestKey } from './did-you-mean.js';
2
+ import { usageError } from './errors.js';
3
+ /**
4
+ * The error for a first argument that is not a command, with the one fix
5
+ * most likely meant:
6
+ *
7
+ * - a whole command passed as ONE argument (`ekanos "teams list"`, which a
8
+ * shell or an agent's tool call produces when it quotes the line), whose
9
+ * first word is a command → the same words as separate arguments;
10
+ * - a typo of a command (`ekanos tems`) → the closest command;
11
+ * - otherwise the command list.
12
+ *
13
+ * `suggestion` is the corrected command line, or null when there is none to
14
+ * offer. It is also what the `claude-code-hint` line carries.
15
+ */
16
+ export function unknownCommand(given, rest, commands) {
17
+ const suggestion = suggestCommandLine(given, rest, commands);
18
+ const message = `Unknown command "${given}".`;
19
+ if (suggestion && /\s/.test(given.trim())) {
20
+ return {
21
+ suggestion,
22
+ error: usageError(message, `Did you mean "${suggestion}"? Each word is its own argument — ` +
23
+ `do not put the command in quotes.`),
24
+ };
25
+ }
26
+ if (suggestion) {
27
+ return {
28
+ suggestion,
29
+ error: usageError(message, `Did you mean "${suggestion}"?`),
30
+ };
31
+ }
32
+ return {
33
+ suggestion: null,
34
+ error: usageError(message, `Run one of: ${commands.join(', ')}. See "ekanos --help".`),
35
+ };
36
+ }
37
+ function suggestCommandLine(given, rest, commands) {
38
+ var _a;
39
+ const words = given.trim().split(/\s+/);
40
+ const head = (_a = words[0]) !== null && _a !== void 0 ? _a : '';
41
+ const corrected = commands.includes(head) ? head : suggestKey(head, commands);
42
+ if (!corrected)
43
+ return null;
44
+ return ['ekanos', corrected, ...words.slice(1), ...rest.map(shellWord)].join(' ');
45
+ }
46
+ /** A token as it would be typed: quoted when it holds whitespace. */
47
+ function shellWord(token) {
48
+ return /\s/.test(token) ? JSON.stringify(token) : token;
49
+ }
50
+ //# sourceMappingURL=unknown-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unknown-command.js","sourceRoot":"","sources":["../src/unknown-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAiB,UAAU,EAAE,MAAM,UAAU,CAAC;AAErD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAa,EACb,IAAuB,EACvB,QAA2B;IAE3B,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,oBAAoB,KAAK,IAAI,CAAC;IAE9C,IAAI,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC1C,OAAO;YACL,UAAU;YACV,KAAK,EAAE,UAAU,CACf,OAAO,EACP,iBAAiB,UAAU,qCAAqC;gBAC9D,mCAAmC,CACtC;SACF,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,OAAO;YACL,UAAU;YACV,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,iBAAiB,UAAU,IAAI,CAAC;SAC5D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,UAAU,CACf,OAAO,EACP,eAAe,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAC3D;KACF,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAa,EACb,IAAuB,EACvB,QAA2B;;IAE3B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,IAAI,SAAG,KAAK,CAAC,CAAC,CAAC,mCAAI,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE9E,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAC1E,GAAG,CACJ,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1D,CAAC","sourcesContent":["import { suggestKey } from './did-you-mean';\nimport { type CliError, usageError } from './errors';\n\n/**\n * The error for a first argument that is not a command, with the one fix\n * most likely meant:\n *\n * - a whole command passed as ONE argument (`ekanos \"teams list\"`, which a\n * shell or an agent's tool call produces when it quotes the line), whose\n * first word is a command → the same words as separate arguments;\n * - a typo of a command (`ekanos tems`) → the closest command;\n * - otherwise the command list.\n *\n * `suggestion` is the corrected command line, or null when there is none to\n * offer. It is also what the `claude-code-hint` line carries.\n */\nexport function unknownCommand(\n given: string,\n rest: readonly string[],\n commands: readonly string[],\n): { error: CliError; suggestion: string | null } {\n const suggestion = suggestCommandLine(given, rest, commands);\n const message = `Unknown command \"${given}\".`;\n\n if (suggestion && /\\s/.test(given.trim())) {\n return {\n suggestion,\n error: usageError(\n message,\n `Did you mean \"${suggestion}\"? Each word is its own argument — ` +\n `do not put the command in quotes.`,\n ),\n };\n }\n\n if (suggestion) {\n return {\n suggestion,\n error: usageError(message, `Did you mean \"${suggestion}\"?`),\n };\n }\n\n return {\n suggestion: null,\n error: usageError(\n message,\n `Run one of: ${commands.join(', ')}. See \"ekanos --help\".`,\n ),\n };\n}\n\nfunction suggestCommandLine(\n given: string,\n rest: readonly string[],\n commands: readonly string[],\n): string | null {\n const words = given.trim().split(/\\s+/);\n const head = words[0] ?? '';\n const corrected = commands.includes(head) ? head : suggestKey(head, commands);\n\n if (!corrected) return null;\n\n return ['ekanos', corrected, ...words.slice(1), ...rest.map(shellWord)].join(\n ' ',\n );\n}\n\n/** A token as it would be typed: quoted when it holds whitespace. */\nfunction shellWord(token: string): string {\n return /\\s/.test(token) ? JSON.stringify(token) : token;\n}\n"]}
@@ -0,0 +1,69 @@
1
+ import { type TeamWorkflowApplied, type TeamWorkflowApplyRequest, type TeamWorkflowApprovalDecideRequest, type TeamWorkflowApprovalDecided, type TeamWorkflowApprovalList, type TeamWorkflowDetail, type TeamWorkflowList, type TeamWorkflowRunCancelled, type TeamWorkflowRunDetail, type TeamWorkflowRunList, type TeamWorkflowRunStartRequest, type TeamWorkflowRunStarted, type TeamWorkflowStatusChanged, type TeamWorkflowStatusRequest } from '@ekanos/integration-schema';
2
+ /**
3
+ * The CLI's client for a team's workflows — `ekanos workflows`.
4
+ *
5
+ * GET /api/partner/teams/<team>/workflows → TeamWorkflowList
6
+ * POST /api/partner/teams/<team>/workflows → TeamWorkflowApplied
7
+ * GET /api/partner/teams/<team>/workflows/<id> → TeamWorkflowDetail
8
+ * POST /api/partner/teams/<team>/workflows/<id>/status → TeamWorkflowStatusChanged
9
+ * POST /api/partner/teams/<team>/workflows/<id>/runs → TeamWorkflowRunStarted
10
+ * GET /api/partner/teams/<team>/workflows/runs → TeamWorkflowRunList
11
+ * GET /api/partner/teams/<team>/workflows/runs/<id> → TeamWorkflowRunDetail
12
+ * POST /api/partner/teams/<team>/workflows/runs/<id>/cancel → TeamWorkflowRunCancelled
13
+ * GET /api/partner/teams/<team>/workflows/approvals → TeamWorkflowApprovalList
14
+ * POST /api/partner/teams/<team>/workflows/approvals/<id> → TeamWorkflowApprovalDecided
15
+ *
16
+ * Every path carries `?source=<slug>`.
17
+ */
18
+ export type WorkflowsApiResult<T> = {
19
+ status: 'ok';
20
+ data: T;
21
+ } | {
22
+ status: 'unauthorized';
23
+ }
24
+ /** Activation stopped only on what Custom Code reaches: ask, then resend. */
25
+ | {
26
+ status: 'needs-access';
27
+ error: string;
28
+ codeAccess: CodeAccess[];
29
+ };
30
+ export interface CodeAccess {
31
+ stepId: string;
32
+ effect: 'read' | 'write';
33
+ egressHosts: string[];
34
+ tools: string[];
35
+ dependencies: string[];
36
+ reviewSummary: string | null;
37
+ }
38
+ interface TeamTarget {
39
+ source: string;
40
+ team: string;
41
+ }
42
+ export declare function listWorkflows(host: string, accessToken: string, target: TeamTarget & {
43
+ all: boolean;
44
+ }): Promise<WorkflowsApiResult<TeamWorkflowList>>;
45
+ export declare function showWorkflow(host: string, accessToken: string, target: TeamTarget & {
46
+ workflow: string;
47
+ }): Promise<WorkflowsApiResult<TeamWorkflowDetail>>;
48
+ export declare function applyWorkflow(host: string, accessToken: string, target: TeamTarget, body: TeamWorkflowApplyRequest): Promise<WorkflowsApiResult<TeamWorkflowApplied>>;
49
+ export declare function setWorkflowStatus(host: string, accessToken: string, target: TeamTarget & {
50
+ workflow: string;
51
+ }, body: TeamWorkflowStatusRequest): Promise<WorkflowsApiResult<TeamWorkflowStatusChanged>>;
52
+ export declare function startWorkflowRun(host: string, accessToken: string, target: TeamTarget & {
53
+ workflow: string;
54
+ }, body: TeamWorkflowRunStartRequest): Promise<WorkflowsApiResult<TeamWorkflowRunStarted>>;
55
+ export declare function listWorkflowRuns(host: string, accessToken: string, target: TeamTarget & {
56
+ workflow?: string;
57
+ status?: string;
58
+ }): Promise<WorkflowsApiResult<TeamWorkflowRunList>>;
59
+ export declare function showWorkflowRun(host: string, accessToken: string, target: TeamTarget & {
60
+ runId: string;
61
+ }): Promise<WorkflowsApiResult<TeamWorkflowRunDetail>>;
62
+ export declare function cancelWorkflowRun(host: string, accessToken: string, target: TeamTarget & {
63
+ runId: string;
64
+ }): Promise<WorkflowsApiResult<TeamWorkflowRunCancelled>>;
65
+ export declare function listWorkflowApprovals(host: string, accessToken: string, target: TeamTarget): Promise<WorkflowsApiResult<TeamWorkflowApprovalList>>;
66
+ export declare function decideWorkflowApproval(host: string, accessToken: string, target: TeamTarget & {
67
+ approvalId: string;
68
+ }, body: TeamWorkflowApprovalDecideRequest): Promise<WorkflowsApiResult<TeamWorkflowApprovalDecided>>;
69
+ export {};
@@ -0,0 +1,182 @@
1
+ import { TeamWorkflowAppliedSchema, TeamWorkflowApprovalDecidedSchema, TeamWorkflowApprovalListSchema, TeamWorkflowDetailSchema, TeamWorkflowListSchema, TeamWorkflowRunCancelledSchema, TeamWorkflowRunDetailSchema, TeamWorkflowRunListSchema, TeamWorkflowRunStartedSchema, TeamWorkflowStatusChangedSchema, } from '@ekanos/integration-schema';
2
+ import { request } from './auth/ekanos-api.js';
3
+ import { authRequiredError, forbiddenError, invalidStateError, networkError, notFoundError, usageError, validationError, } from './errors.js';
4
+ const segment = encodeURIComponent;
5
+ export function listWorkflows(host, accessToken, target) {
6
+ return call(host, accessToken, TeamWorkflowListSchema, {
7
+ method: 'GET',
8
+ path: base(target),
9
+ query: Object.assign({ source: target.source }, (target.all ? { all: '1' } : {})),
10
+ });
11
+ }
12
+ export function showWorkflow(host, accessToken, target) {
13
+ return call(host, accessToken, TeamWorkflowDetailSchema, {
14
+ method: 'GET',
15
+ path: `${base(target)}/${segment(target.workflow)}`,
16
+ query: { source: target.source },
17
+ });
18
+ }
19
+ export function applyWorkflow(host, accessToken, target, body) {
20
+ return call(host, accessToken, TeamWorkflowAppliedSchema, {
21
+ method: 'POST',
22
+ path: base(target),
23
+ query: { source: target.source },
24
+ body,
25
+ });
26
+ }
27
+ export function setWorkflowStatus(host, accessToken, target, body) {
28
+ return call(host, accessToken, TeamWorkflowStatusChangedSchema, {
29
+ method: 'POST',
30
+ path: `${base(target)}/${segment(target.workflow)}/status`,
31
+ query: { source: target.source },
32
+ body,
33
+ });
34
+ }
35
+ export function startWorkflowRun(host, accessToken, target, body) {
36
+ return call(host, accessToken, TeamWorkflowRunStartedSchema, {
37
+ method: 'POST',
38
+ path: `${base(target)}/${segment(target.workflow)}/runs`,
39
+ query: { source: target.source },
40
+ body,
41
+ });
42
+ }
43
+ export function listWorkflowRuns(host, accessToken, target) {
44
+ return call(host, accessToken, TeamWorkflowRunListSchema, {
45
+ method: 'GET',
46
+ path: `${base(target)}/runs`,
47
+ query: Object.assign(Object.assign({ source: target.source }, (target.workflow ? { workflow: target.workflow } : {})), (target.status ? { status: target.status } : {})),
48
+ });
49
+ }
50
+ export function showWorkflowRun(host, accessToken, target) {
51
+ return call(host, accessToken, TeamWorkflowRunDetailSchema, {
52
+ method: 'GET',
53
+ path: `${base(target)}/runs/${segment(target.runId)}`,
54
+ query: { source: target.source },
55
+ });
56
+ }
57
+ export function cancelWorkflowRun(host, accessToken, target) {
58
+ return call(host, accessToken, TeamWorkflowRunCancelledSchema, {
59
+ method: 'POST',
60
+ path: `${base(target)}/runs/${segment(target.runId)}/cancel`,
61
+ query: { source: target.source },
62
+ });
63
+ }
64
+ export function listWorkflowApprovals(host, accessToken, target) {
65
+ return call(host, accessToken, TeamWorkflowApprovalListSchema, {
66
+ method: 'GET',
67
+ path: `${base(target)}/approvals`,
68
+ query: { source: target.source },
69
+ });
70
+ }
71
+ export function decideWorkflowApproval(host, accessToken, target, body) {
72
+ return call(host, accessToken, TeamWorkflowApprovalDecidedSchema, {
73
+ method: 'POST',
74
+ path: `${base(target)}/approvals/${segment(target.approvalId)}`,
75
+ query: { source: target.source },
76
+ body,
77
+ });
78
+ }
79
+ function base(target) {
80
+ return `/api/partner/teams/${segment(target.team)}/workflows`;
81
+ }
82
+ async function call(host, accessToken, schema, init) {
83
+ const response = await request(`${host}${init.path}?${new URLSearchParams(init.query)}`, {
84
+ method: init.method,
85
+ headers: Object.assign({ accept: 'application/json', authorization: `Bearer ${accessToken}` }, (init.body === undefined
86
+ ? {}
87
+ : { 'content-type': 'application/json' })),
88
+ body: init.body === undefined ? undefined : JSON.stringify(init.body),
89
+ });
90
+ if (response.status === 401 ||
91
+ (response.status >= 300 && response.status < 400)) {
92
+ return { status: 'unauthorized' };
93
+ }
94
+ const body = await readOptionalJson(response);
95
+ const code = typeof body.code === 'string' ? body.code : null;
96
+ const message = typeof body.error === 'string' && body.error ? body.error : null;
97
+ if (response.status === 403 && code === 'MFA_REQUIRED') {
98
+ throw authRequiredError(message !== null && message !== void 0 ? message : `${host} requires multi-factor authentication.`, 'Complete MFA in the browser, then run "ekanos login" again.');
99
+ }
100
+ if (response.status === 403) {
101
+ throw forbiddenError(message !== null && message !== void 0 ? message : 'Not permitted on this Source.', code === 'SOURCE_ADMIN_REQUIRED'
102
+ ? "Only a Source admin manages its teams' workflows."
103
+ : 'Run "ekanos sources" to list the sources you hold a seat on.');
104
+ }
105
+ if (response.status === 404) {
106
+ throw notFoundError(message !== null && message !== void 0 ? message : 'Not found.', code === 'TEAM_NOT_FOUND'
107
+ ? 'Run "ekanos teams list" to see the teams on this Source.'
108
+ : code === 'WORKFLOW_NOT_FOUND'
109
+ ? 'Run "ekanos workflows list --team <slug>" for the team\'s workflows (a member\'s personal workflow is theirs alone).'
110
+ : code === 'RUN_NOT_FOUND'
111
+ ? 'Run "ekanos workflows runs list --team <slug>" for the team\'s runs.'
112
+ : code === 'APPROVAL_NOT_FOUND'
113
+ ? 'Run "ekanos workflows approvals list --team <slug>" for what is waiting.'
114
+ : 'Run "ekanos sources" to list the sources you hold a seat on.');
115
+ }
116
+ if (response.status === 409 && code === 'CODE_ACCESS_NEEDS_APPROVAL') {
117
+ const details = Array.isArray(body.codeAccess) ? body.codeAccess : [];
118
+ return {
119
+ status: 'needs-access',
120
+ error: message !== null && message !== void 0 ? message : 'Custom Code access needs your approval.',
121
+ codeAccess: details.filter(isCodeAccess),
122
+ };
123
+ }
124
+ if (response.status === 422) {
125
+ throw validationError(message !== null && message !== void 0 ? message : 'The host refused the workflow definition.', code === 'INVALID_DEFINITION'
126
+ ? 'Fix the definition and apply it again; nothing was saved.'
127
+ : 'The stored definition no longer validates: fix it with "ekanos workflows apply <file> --update <id>".');
128
+ }
129
+ if (response.status === 409 || response.status === 502) {
130
+ throw invalidStateError(message !== null && message !== void 0 ? message : 'The host refused the request in its current state.', code === 'WORKFLOWS_EXPERIENCE_OFF'
131
+ ? 'Ask Ekanos to turn on Workflows for this Source: only a super-admin can ("ekanos sources products" shows it as off).'
132
+ : code === 'AMBIGUOUS_WORKFLOW'
133
+ ? 'Name it by id: "ekanos workflows list --team <slug>" shows each one\'s.'
134
+ : code === 'WORKFLOW_ARCHIVED'
135
+ ? 'Restore it in the app first, or apply without --update to create a new draft.'
136
+ : code === 'ALREADY_DECIDED' || code === 'APPROVAL_EXPIRED'
137
+ ? 'Run "ekanos workflows approvals list --team <slug>" for what is still waiting.'
138
+ : code === 'RUN_FINISHED'
139
+ ? 'Nothing to stop. "ekanos workflows runs show <run-id> --team <slug>" shows how it ended.'
140
+ : code === 'CANCEL_FAILED'
141
+ ? 'Its status is reconciled automatically; check "ekanos workflows runs show <run-id>" shortly.'
142
+ : code === 'RESUME_FAILED'
143
+ ? 'The decision is saved; the run picks it up shortly. Check with "ekanos workflows runs show <run-id>".'
144
+ : code === 'RUN_REFUSED'
145
+ ? 'A live run needs an active workflow ("ekanos workflows enable"); "--dry-run" rehearses a draft.'
146
+ : 'Run "ekanos workflows show <id> --team <slug>" for its status and what blocks it.');
147
+ }
148
+ if (response.status === 400) {
149
+ throw usageError(message !== null && message !== void 0 ? message : 'The host refused the request.', 'See "ekanos workflows --help".');
150
+ }
151
+ if (!response.ok) {
152
+ throw networkError(`${host}${init.path} responded ${response.status}.`, response.status >= 500
153
+ ? 'The Ekanos deployment returned a server error. Retry shortly.'
154
+ : 'Confirm the host runs a build that includes the workflows routes.');
155
+ }
156
+ const parsed = schema.safeParse(body.data);
157
+ if (!parsed.success) {
158
+ throw networkError(`${host}${init.path} answered in a shape this CLI does not read.`, 'Run "ekanos upgrade" — the CLI and the host disagree on the workflows contract.');
159
+ }
160
+ return { status: 'ok', data: parsed.data };
161
+ }
162
+ function isCodeAccess(value) {
163
+ if (typeof value !== 'object' || value === null)
164
+ return false;
165
+ const entry = value;
166
+ return (typeof entry.stepId === 'string' &&
167
+ (entry.effect === 'read' || entry.effect === 'write') &&
168
+ Array.isArray(entry.egressHosts) &&
169
+ Array.isArray(entry.tools));
170
+ }
171
+ async function readOptionalJson(response) {
172
+ try {
173
+ const parsed = await response.json();
174
+ return typeof parsed === 'object' && parsed !== null
175
+ ? parsed
176
+ : {};
177
+ }
178
+ catch (_a) {
179
+ return {};
180
+ }
181
+ }
182
+ //# sourceMappingURL=workflows-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows-api.js","sourceRoot":"","sources":["../src/workflows-api.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type TeamWorkflowApplied,\n TeamWorkflowAppliedSchema,\n type TeamWorkflowApplyRequest,\n type TeamWorkflowApprovalDecideRequest,\n type TeamWorkflowApprovalDecided,\n TeamWorkflowApprovalDecidedSchema,\n type TeamWorkflowApprovalList,\n TeamWorkflowApprovalListSchema,\n type TeamWorkflowDetail,\n TeamWorkflowDetailSchema,\n type TeamWorkflowList,\n TeamWorkflowListSchema,\n type TeamWorkflowRunCancelled,\n TeamWorkflowRunCancelledSchema,\n type TeamWorkflowRunDetail,\n TeamWorkflowRunDetailSchema,\n type TeamWorkflowRunList,\n TeamWorkflowRunListSchema,\n type TeamWorkflowRunStartRequest,\n type TeamWorkflowRunStarted,\n TeamWorkflowRunStartedSchema,\n type TeamWorkflowStatusChanged,\n TeamWorkflowStatusChangedSchema,\n type TeamWorkflowStatusRequest,\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 team's workflows — `ekanos workflows`.\n *\n * GET /api/partner/teams/<team>/workflows → TeamWorkflowList\n * POST /api/partner/teams/<team>/workflows → TeamWorkflowApplied\n * GET /api/partner/teams/<team>/workflows/<id> → TeamWorkflowDetail\n * POST /api/partner/teams/<team>/workflows/<id>/status → TeamWorkflowStatusChanged\n * POST /api/partner/teams/<team>/workflows/<id>/runs → TeamWorkflowRunStarted\n * GET /api/partner/teams/<team>/workflows/runs → TeamWorkflowRunList\n * GET /api/partner/teams/<team>/workflows/runs/<id> → TeamWorkflowRunDetail\n * POST /api/partner/teams/<team>/workflows/runs/<id>/cancel → TeamWorkflowRunCancelled\n * GET /api/partner/teams/<team>/workflows/approvals → TeamWorkflowApprovalList\n * POST /api/partner/teams/<team>/workflows/approvals/<id> → TeamWorkflowApprovalDecided\n *\n * Every path carries `?source=<slug>`.\n */\n\nexport type WorkflowsApiResult<T> =\n | { status: 'ok'; data: T }\n | { status: 'unauthorized' }\n /** Activation stopped only on what Custom Code reaches: ask, then resend. */\n | { status: 'needs-access'; error: string; codeAccess: CodeAccess[] };\n\nexport interface CodeAccess {\n stepId: string;\n effect: 'read' | 'write';\n egressHosts: string[];\n tools: string[];\n dependencies: string[];\n reviewSummary: string | null;\n}\n\ninterface TeamTarget {\n source: string;\n team: string;\n}\n\nconst segment = encodeURIComponent;\n\nexport function listWorkflows(\n host: string,\n accessToken: string,\n target: TeamTarget & { all: boolean },\n): Promise<WorkflowsApiResult<TeamWorkflowList>> {\n return call(host, accessToken, TeamWorkflowListSchema, {\n method: 'GET',\n path: base(target),\n query: { source: target.source, ...(target.all ? { all: '1' } : {}) },\n });\n}\n\nexport function showWorkflow(\n host: string,\n accessToken: string,\n target: TeamTarget & { workflow: string },\n): Promise<WorkflowsApiResult<TeamWorkflowDetail>> {\n return call(host, accessToken, TeamWorkflowDetailSchema, {\n method: 'GET',\n path: `${base(target)}/${segment(target.workflow)}`,\n query: { source: target.source },\n });\n}\n\nexport function applyWorkflow(\n host: string,\n accessToken: string,\n target: TeamTarget,\n body: TeamWorkflowApplyRequest,\n): Promise<WorkflowsApiResult<TeamWorkflowApplied>> {\n return call(host, accessToken, TeamWorkflowAppliedSchema, {\n method: 'POST',\n path: base(target),\n query: { source: target.source },\n body,\n });\n}\n\nexport function setWorkflowStatus(\n host: string,\n accessToken: string,\n target: TeamTarget & { workflow: string },\n body: TeamWorkflowStatusRequest,\n): Promise<WorkflowsApiResult<TeamWorkflowStatusChanged>> {\n return call(host, accessToken, TeamWorkflowStatusChangedSchema, {\n method: 'POST',\n path: `${base(target)}/${segment(target.workflow)}/status`,\n query: { source: target.source },\n body,\n });\n}\n\nexport function startWorkflowRun(\n host: string,\n accessToken: string,\n target: TeamTarget & { workflow: string },\n body: TeamWorkflowRunStartRequest,\n): Promise<WorkflowsApiResult<TeamWorkflowRunStarted>> {\n return call(host, accessToken, TeamWorkflowRunStartedSchema, {\n method: 'POST',\n path: `${base(target)}/${segment(target.workflow)}/runs`,\n query: { source: target.source },\n body,\n });\n}\n\nexport function listWorkflowRuns(\n host: string,\n accessToken: string,\n target: TeamTarget & { workflow?: string; status?: string },\n): Promise<WorkflowsApiResult<TeamWorkflowRunList>> {\n return call(host, accessToken, TeamWorkflowRunListSchema, {\n method: 'GET',\n path: `${base(target)}/runs`,\n query: {\n source: target.source,\n ...(target.workflow ? { workflow: target.workflow } : {}),\n ...(target.status ? { status: target.status } : {}),\n },\n });\n}\n\nexport function showWorkflowRun(\n host: string,\n accessToken: string,\n target: TeamTarget & { runId: string },\n): Promise<WorkflowsApiResult<TeamWorkflowRunDetail>> {\n return call(host, accessToken, TeamWorkflowRunDetailSchema, {\n method: 'GET',\n path: `${base(target)}/runs/${segment(target.runId)}`,\n query: { source: target.source },\n });\n}\n\nexport function cancelWorkflowRun(\n host: string,\n accessToken: string,\n target: TeamTarget & { runId: string },\n): Promise<WorkflowsApiResult<TeamWorkflowRunCancelled>> {\n return call(host, accessToken, TeamWorkflowRunCancelledSchema, {\n method: 'POST',\n path: `${base(target)}/runs/${segment(target.runId)}/cancel`,\n query: { source: target.source },\n });\n}\n\nexport function listWorkflowApprovals(\n host: string,\n accessToken: string,\n target: TeamTarget,\n): Promise<WorkflowsApiResult<TeamWorkflowApprovalList>> {\n return call(host, accessToken, TeamWorkflowApprovalListSchema, {\n method: 'GET',\n path: `${base(target)}/approvals`,\n query: { source: target.source },\n });\n}\n\nexport function decideWorkflowApproval(\n host: string,\n accessToken: string,\n target: TeamTarget & { approvalId: string },\n body: TeamWorkflowApprovalDecideRequest,\n): Promise<WorkflowsApiResult<TeamWorkflowApprovalDecided>> {\n return call(host, accessToken, TeamWorkflowApprovalDecidedSchema, {\n method: 'POST',\n path: `${base(target)}/approvals/${segment(target.approvalId)}`,\n query: { source: target.source },\n body,\n });\n}\n\nfunction base(target: TeamTarget): string {\n return `/api/partner/teams/${segment(target.team)}/workflows`;\n}\n\nasync function call<T>(\n host: string,\n accessToken: string,\n schema: z.ZodType<T>,\n init: {\n method: 'GET' | 'POST';\n path: string;\n query: Record<string, string>;\n body?: unknown;\n },\n): Promise<WorkflowsApiResult<T>> {\n const response = await request(\n `${host}${init.path}?${new URLSearchParams(init.query)}`,\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' workflows.\"\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 === 'TEAM_NOT_FOUND'\n ? 'Run \"ekanos teams list\" to see the teams on this Source.'\n : code === 'WORKFLOW_NOT_FOUND'\n ? 'Run \"ekanos workflows list --team <slug>\" for the team\\'s workflows (a member\\'s personal workflow is theirs alone).'\n : code === 'RUN_NOT_FOUND'\n ? 'Run \"ekanos workflows runs list --team <slug>\" for the team\\'s runs.'\n : code === 'APPROVAL_NOT_FOUND'\n ? 'Run \"ekanos workflows approvals list --team <slug>\" for what is waiting.'\n : 'Run \"ekanos sources\" to list the sources you hold a seat on.',\n );\n }\n if (response.status === 409 && code === 'CODE_ACCESS_NEEDS_APPROVAL') {\n const details = Array.isArray(body.codeAccess) ? body.codeAccess : [];\n return {\n status: 'needs-access',\n error: message ?? 'Custom Code access needs your approval.',\n codeAccess: details.filter(isCodeAccess),\n };\n }\n if (response.status === 422) {\n throw validationError(\n message ?? 'The host refused the workflow definition.',\n code === 'INVALID_DEFINITION'\n ? 'Fix the definition and apply it again; nothing was saved.'\n : 'The stored definition no longer validates: fix it with \"ekanos workflows apply <file> --update <id>\".',\n );\n }\n if (response.status === 409 || response.status === 502) {\n throw invalidStateError(\n message ?? 'The host refused the request in its current state.',\n code === 'WORKFLOWS_EXPERIENCE_OFF'\n ? 'Ask Ekanos to turn on Workflows for this Source: only a super-admin can (\"ekanos sources products\" shows it as off).'\n : code === 'AMBIGUOUS_WORKFLOW'\n ? 'Name it by id: \"ekanos workflows list --team <slug>\" shows each one\\'s.'\n : code === 'WORKFLOW_ARCHIVED'\n ? 'Restore it in the app first, or apply without --update to create a new draft.'\n : code === 'ALREADY_DECIDED' || code === 'APPROVAL_EXPIRED'\n ? 'Run \"ekanos workflows approvals list --team <slug>\" for what is still waiting.'\n : code === 'RUN_FINISHED'\n ? 'Nothing to stop. \"ekanos workflows runs show <run-id> --team <slug>\" shows how it ended.'\n : code === 'CANCEL_FAILED'\n ? 'Its status is reconciled automatically; check \"ekanos workflows runs show <run-id>\" shortly.'\n : code === 'RESUME_FAILED'\n ? 'The decision is saved; the run picks it up shortly. Check with \"ekanos workflows runs show <run-id>\".'\n : code === 'RUN_REFUSED'\n ? 'A live run needs an active workflow (\"ekanos workflows enable\"); \"--dry-run\" rehearses a draft.'\n : 'Run \"ekanos workflows show <id> --team <slug>\" for its status and what blocks it.',\n );\n }\n if (response.status === 400) {\n throw usageError(\n message ?? 'The host refused the request.',\n 'See \"ekanos workflows --help\".',\n );\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 workflows routes.',\n );\n }\n\n const parsed = schema.safeParse(body.data);\n if (!parsed.success) {\n throw networkError(\n `${host}${init.path} answered in a shape this CLI does not read.`,\n 'Run \"ekanos upgrade\" — the CLI and the host disagree on the workflows contract.',\n );\n }\n return { status: 'ok', data: parsed.data };\n}\n\nfunction isCodeAccess(value: unknown): value is CodeAccess {\n if (typeof value !== 'object' || value === null) return false;\n const entry = value as Record<string, unknown>;\n return (\n typeof entry.stepId === 'string' &&\n (entry.effect === 'read' || entry.effect === 'write') &&\n Array.isArray(entry.egressHosts) &&\n Array.isArray(entry.tools)\n );\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ekanos/cli",
3
- "version": "0.14.0",
3
+ "version": "0.16.0",
4
4
  "private": false,
5
5
  "description": "The Ekanos partner toolchain CLI: scaffold, validate, and test an Ekanos integration against the published @ekanos packages. Agent-native — every verb speaks JSON with a stable exit-code taxonomy.",
6
6
  "keywords": [
@@ -35,7 +35,7 @@
35
35
  },
36
36
  "dependencies": {
37
37
  "@clack/prompts": "1.7.0",
38
- "@ekanos/integration-schema": "0.16.0",
38
+ "@ekanos/integration-schema": "0.18.0",
39
39
  "esbuild": "0.28.1",
40
40
  "picocolors": "1.1.1"
41
41
  },
@@ -44,7 +44,7 @@
44
44
  "@types/node": "25.0.1",
45
45
  "typescript": "^7.0.2",
46
46
  "vitest": "4.1.10",
47
- "zod": "4.6.5"
47
+ "zod": "4.6.7"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "zod": "^3.25.76 || ^4.0.0"
@@ -431,10 +431,12 @@ Icons are Font Awesome glyph names via `@ekanos/ui/icon`. This generated shell l
431
431
  (`@fortawesome/fontawesome-free`) — a much smaller set than the Pro kit Ekanos
432
432
  itself runs — so a name that's Pro-only (or just mistyped) renders a
433
433
  circle-question disc instead of vanishing, and dev builds `console.warn` once
434
- per name to catch it before a screenshot review does. `fa-light` / `fa-duotone`
435
- / `fa-thin` are rewritten to `fa-solid`, the one weight Free ships, so author
436
- `fa-light` anyway — it degrades harmlessly today, and the intended weight
437
- survives if this host ever loads Pro instead. Verify a glyph name against the
434
+ per name to catch it before a screenshot review does. Write icon names
435
+ family-less (`fa-gear`, not `fa-light fa-gear`): the host's theme picks the
436
+ family, so a Source's icon style reaches your icons too, and
437
+ `design/no-default-icon-family` rejects `fa-light` / `fa-regular`. On Free,
438
+ families it lacks (`fa-light`, `fa-duotone`, `fa-thin`) still render as
439
+ `fa-solid`. Verify a glyph name against the
438
440
  Free set (`pnpm --filter @ekanos/ui check:fa-free-names`, or
439
441
  https://fontawesome.com/search?o=r&s=solid,regular,brands) before relying on
440
442
  it looking like anything in particular.
@@ -30,7 +30,10 @@ and after upgrading `@ekanos/*` packages. The topic → URL map is in AGENTS.md.
30
30
  tools and agent triggers, and the steps left to set each one up. If a product
31
31
  already does what the user wants, propose setting it up (walk its
32
32
  `setupSteps`, naming who does each one) instead of building it again.
33
- `npx ekanos catalog <product> --json` shows one in full.
33
+ `npx ekanos catalog <product> --json` shows one in full: each tool's
34
+ `inputSchema` (so you can see which other tool returns an id a tool needs)
35
+ and `connection` — who connects the product and whose connection an agent
36
+ run uses.
34
37
 
35
38
  ## Managed agents live in Ekanos
36
39
 
@@ -12,12 +12,12 @@
12
12
  "prepare": "node scripts/setup-hooks.mjs"
13
13
  },
14
14
  "dependencies": {
15
- "@ekanos/sdk": "^0.16.0",
16
- "@ekanos/ui": "^0.16.0"
15
+ "@ekanos/sdk": "^0.18.0",
16
+ "@ekanos/ui": "^0.18.0"
17
17
  },
18
18
  "devDependencies": {
19
- "@ekanos/cli": "^0.14.0",
20
- "@ekanos/harness": "^0.16.0",
19
+ "@ekanos/cli": "^0.16.0",
20
+ "@ekanos/harness": "^0.18.0",
21
21
  "@hookform/resolvers": "^5.2.2",
22
22
  "@tailwindcss/postcss": "^4.3.3",
23
23
  "@tanstack/react-query": "^5.101.4",