@ekanos/cli 0.11.0 → 0.13.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 (57) hide show
  1. package/dist/apps-api.d.ts +3 -2
  2. package/dist/apps-api.js +1 -5
  3. package/dist/apps-api.js.map +1 -1
  4. package/dist/commands/agents-edit.js +1 -1
  5. package/dist/commands/agents-edit.js.map +1 -1
  6. package/dist/commands/apps.d.ts +19 -6
  7. package/dist/commands/apps.js +366 -43
  8. package/dist/commands/apps.js.map +1 -1
  9. package/dist/commands/knowledge.d.ts +37 -0
  10. package/dist/commands/knowledge.js +364 -0
  11. package/dist/commands/knowledge.js.map +1 -0
  12. package/dist/commands/routes.d.ts +23 -0
  13. package/dist/commands/routes.js +277 -0
  14. package/dist/commands/routes.js.map +1 -0
  15. package/dist/commands/sources.d.ts +4 -0
  16. package/dist/commands/sources.js +115 -1
  17. package/dist/commands/sources.js.map +1 -1
  18. package/dist/commands/team-agents-triggers.js +2 -1
  19. package/dist/commands/team-agents-triggers.js.map +1 -1
  20. package/dist/commands/teams-connect.d.ts +25 -0
  21. package/dist/commands/teams-connect.js +242 -0
  22. package/dist/commands/teams-connect.js.map +1 -0
  23. package/dist/commands/teams-onboard.d.ts +5 -2
  24. package/dist/commands/teams-onboard.js +12 -40
  25. package/dist/commands/teams-onboard.js.map +1 -1
  26. package/dist/commands/teams.d.ts +60 -5
  27. package/dist/commands/teams.js +141 -46
  28. package/dist/commands/teams.js.map +1 -1
  29. package/dist/connections-api.d.ts +125 -0
  30. package/dist/connections-api.js +156 -0
  31. package/dist/connections-api.js.map +1 -0
  32. package/dist/index.js +90 -6
  33. package/dist/index.js.map +1 -1
  34. package/dist/knowledge-api.d.ts +129 -0
  35. package/dist/knowledge-api.js +138 -0
  36. package/dist/knowledge-api.js.map +1 -0
  37. package/dist/routes-api.d.ts +105 -0
  38. package/dist/routes-api.js +147 -0
  39. package/dist/routes-api.js.map +1 -0
  40. package/dist/source-products-api.d.ts +59 -0
  41. package/dist/source-products-api.js +113 -0
  42. package/dist/source-products-api.js.map +1 -0
  43. package/dist/team-connect-api.d.ts +244 -0
  44. package/dist/team-connect-api.js +95 -0
  45. package/dist/team-connect-api.js.map +1 -0
  46. package/dist/teams-api.d.ts +1 -0
  47. package/dist/teams-api.js +1 -1
  48. package/dist/teams-api.js.map +1 -1
  49. package/package.json +2 -2
  50. package/templates/package.json.tmpl +4 -4
  51. package/templates/skills/build-agent/SKILL.md +18 -3
  52. package/templates/skills/build-agent/references/agent-json.md +29 -8
  53. package/templates/skills/build-agent/references/app-setup.md +2 -1
  54. package/templates/skills/build-agent/references/set-up-an-integration.md +76 -10
  55. package/templates/skills/build-agent/references/skills.md +7 -4
  56. package/templates/skills/build-agent/references/triggers.md +44 -15
  57. package/templates/skills/ekanos-platform/SKILL.md +40 -8
@@ -22,6 +22,7 @@ export declare function showProviderApp(host: string, accessToken: string, sourc
22
22
  export declare function setProviderApp(host: string, accessToken: string, body: {
23
23
  source: string;
24
24
  product: string;
25
- clientId: string;
26
- clientSecret: string;
25
+ /** Either or both: one left out keeps what is stored. */
26
+ clientId?: string;
27
+ clientSecret?: string;
27
28
  }): Promise<AppsApiResult<ProviderAppSetResult>>;
package/dist/apps-api.js CHANGED
@@ -11,11 +11,7 @@ export function setProviderApp(host, accessToken, body) {
11
11
  return call(host, accessToken, ProviderAppSetResultSchema, body.product, {
12
12
  method: 'PUT',
13
13
  path: route(body.product),
14
- body: {
15
- source: body.source,
16
- clientId: body.clientId,
17
- clientSecret: body.clientSecret,
18
- },
14
+ body: Object.assign(Object.assign({ source: body.source }, (body.clientId ? { clientId: body.clientId } : {})), (body.clientSecret ? { clientSecret: body.clientSecret } : {})),
19
15
  });
20
16
  }
21
17
  function route(product) {
@@ -1 +1 @@
1
- {"version":3,"file":"apps-api.js","sourceRoot":"","sources":["../src/apps-api.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type ProviderAppSetResult,\n ProviderAppSetResultSchema,\n type ProviderAppStatus,\n ProviderAppStatusSchema,\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} from './errors';\n\n/**\n * The CLI's client for a Source's provider apps — the OAuth client an\n * integration signs every team in through.\n *\n * GET /api/partner/apps/<product>?source=<slug|id> → { ok, data: ProviderAppStatus }\n * PUT /api/partner/apps/<product> { source, clientId, clientSecret }\n * → { ok, data: ProviderAppStatus & { replaced } }\n *\n * → 401 / 3xx refresh once and retry\n * → 403 { code: \"SOURCE_ADMIN_REQUIRED\" | \"MFA_REQUIRED\" | \"FORBIDDEN\" }\n * → 404 { code: \"PRODUCT_NOT_ENTITLED\" | \"SOURCE_NOT_FOUND\" }\n * → 409 { code: \"NO_PROVIDER_APP\" }\n */\n\nexport type AppsApiResult<T> =\n | { status: 'ok'; data: T }\n | { status: 'unauthorized' };\n\nexport function showProviderApp(\n host: string,\n accessToken: string,\n source: string,\n product: string,\n): Promise<AppsApiResult<ProviderAppStatus>> {\n return call(host, accessToken, ProviderAppStatusSchema, product, {\n method: 'GET',\n path: `${route(product)}?${new URLSearchParams({ source })}`,\n });\n}\n\nexport function setProviderApp(\n host: string,\n accessToken: string,\n body: {\n source: string;\n product: string;\n clientId: string;\n clientSecret: string;\n },\n): Promise<AppsApiResult<ProviderAppSetResult>> {\n return call(host, accessToken, ProviderAppSetResultSchema, body.product, {\n method: 'PUT',\n path: route(body.product),\n body: {\n source: body.source,\n clientId: body.clientId,\n clientSecret: body.clientSecret,\n },\n });\n}\n\nfunction route(product: string): string {\n return `/api/partner/apps/${encodeURIComponent(product)}`;\n}\n\nasync function call<T>(\n host: string,\n accessToken: string,\n schema: z.ZodType<T>,\n product: string,\n init: { method: 'GET' | 'PUT'; path: string; body?: unknown },\n): Promise<AppsApiResult<T>> {\n const response = await request(`${host}${init.path}`, {\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 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 the Source's apps. Ask one to run it.\"\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 ?? `\"${product}\" was not found.`,\n code === 'PRODUCT_NOT_ENTITLED'\n ? `\"ekanos catalog\" lists what this Source has; Ekanos enables a product for a Source.`\n : 'Run \"ekanos sources\" to list the sources you hold a seat on.',\n );\n }\n if (response.status === 409 && code === 'NO_PROVIDER_APP') {\n throw invalidStateError(\n message ?? `\"${product}\" has no app for the Source to set up.`,\n `Each team connects ${product} with its own app, from the team's Integrations page. \"ekanos catalog ${product}\" shows its setup steps.`,\n );\n }\n if (response.status === 400) {\n throw usageError(\n message ?? 'The host refused the request.',\n 'See \"ekanos apps --help\".',\n );\n }\n if (!response.ok) {\n throw networkError(\n `${host}${init.path.split('?')[0]} 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 apps routes.',\n );\n }\n\n const parsed = schema.safeParse(body.data);\n if (!parsed.success) {\n throw networkError(\n `${host}/api/partner/apps answered in a shape this CLI does not read.`,\n 'Run \"ekanos upgrade\" — the CLI and the host disagree on the apps 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":"apps-api.js","sourceRoot":"","sources":["../src/apps-api.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type ProviderAppSetResult,\n ProviderAppSetResultSchema,\n type ProviderAppStatus,\n ProviderAppStatusSchema,\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} from './errors';\n\n/**\n * The CLI's client for a Source's provider apps — the OAuth client an\n * integration signs every team in through.\n *\n * GET /api/partner/apps/<product>?source=<slug|id> → { ok, data: ProviderAppStatus }\n * PUT /api/partner/apps/<product> { source, clientId, clientSecret }\n * → { ok, data: ProviderAppStatus & { replaced } }\n *\n * → 401 / 3xx refresh once and retry\n * → 403 { code: \"SOURCE_ADMIN_REQUIRED\" | \"MFA_REQUIRED\" | \"FORBIDDEN\" }\n * → 404 { code: \"PRODUCT_NOT_ENTITLED\" | \"SOURCE_NOT_FOUND\" }\n * → 409 { code: \"NO_PROVIDER_APP\" }\n */\n\nexport type AppsApiResult<T> =\n | { status: 'ok'; data: T }\n | { status: 'unauthorized' };\n\nexport function showProviderApp(\n host: string,\n accessToken: string,\n source: string,\n product: string,\n): Promise<AppsApiResult<ProviderAppStatus>> {\n return call(host, accessToken, ProviderAppStatusSchema, product, {\n method: 'GET',\n path: `${route(product)}?${new URLSearchParams({ source })}`,\n });\n}\n\nexport function setProviderApp(\n host: string,\n accessToken: string,\n body: {\n source: string;\n product: string;\n /** Either or both: one left out keeps what is stored. */\n clientId?: string;\n clientSecret?: string;\n },\n): Promise<AppsApiResult<ProviderAppSetResult>> {\n return call(host, accessToken, ProviderAppSetResultSchema, body.product, {\n method: 'PUT',\n path: route(body.product),\n body: {\n source: body.source,\n ...(body.clientId ? { clientId: body.clientId } : {}),\n ...(body.clientSecret ? { clientSecret: body.clientSecret } : {}),\n },\n });\n}\n\nfunction route(product: string): string {\n return `/api/partner/apps/${encodeURIComponent(product)}`;\n}\n\nasync function call<T>(\n host: string,\n accessToken: string,\n schema: z.ZodType<T>,\n product: string,\n init: { method: 'GET' | 'PUT'; path: string; body?: unknown },\n): Promise<AppsApiResult<T>> {\n const response = await request(`${host}${init.path}`, {\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 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 the Source's apps. Ask one to run it.\"\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 ?? `\"${product}\" was not found.`,\n code === 'PRODUCT_NOT_ENTITLED'\n ? `\"ekanos catalog\" lists what this Source has; Ekanos enables a product for a Source.`\n : 'Run \"ekanos sources\" to list the sources you hold a seat on.',\n );\n }\n if (response.status === 409 && code === 'NO_PROVIDER_APP') {\n throw invalidStateError(\n message ?? `\"${product}\" has no app for the Source to set up.`,\n `Each team connects ${product} with its own app, from the team's Integrations page. \"ekanos catalog ${product}\" shows its setup steps.`,\n );\n }\n if (response.status === 400) {\n throw usageError(\n message ?? 'The host refused the request.',\n 'See \"ekanos apps --help\".',\n );\n }\n if (!response.ok) {\n throw networkError(\n `${host}${init.path.split('?')[0]} 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 apps routes.',\n );\n }\n\n const parsed = schema.safeParse(body.data);\n if (!parsed.success) {\n throw networkError(\n `${host}/api/partner/apps answered in a shape this CLI does not read.`,\n 'Run \"ekanos upgrade\" — the CLI and the host disagree on the apps 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"]}
@@ -264,7 +264,7 @@ export function parseFilters(raw) {
264
264
  for (const entry of raw) {
265
265
  const at = entry.indexOf('=');
266
266
  if (at <= 0) {
267
- throw usageError(`--filter "${entry}" must be field=value.`, 'e.g. --filter tags=vip,urgent --filter reply_as=internal_note');
267
+ throw usageError(`--filter "${entry}" must be field=value.`, 'e.g. --filter tags=vip,urgent --filter labels=feedback');
268
268
  }
269
269
  const field = entry.slice(0, at).trim();
270
270
  const value = entry.slice(at + 1).trim();
@@ -1 +1 @@
1
- {"version":3,"file":"agents-edit.js","sourceRoot":"","sources":["../../src/commands/agents-edit.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type AgentTemplateBody,\n AgentTemplateBodySchema,\n type AgentTemplateDetail,\n AgentTemplateKeySchema,\n type AgentTemplateLink,\n type AgentTemplateResult,\n type AgentTemplateTrigger,\n resolveAgentTemplateTeamOverrides,\n} from '@ekanos/integration-schema';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { CliContext } from '../context';\nimport { invalidStateError, usageError, validationError } from '../errors';\nimport type { ExitCode } from '../exit-codes';\nimport { classifyPath } from '../safe-fs';\nimport type { ResultRow } from '../ui';\n\n/**\n * Direct edits to one template (plan 239.10): `agents policy | triggers |\n * links | overrides <key> …`. Each reads the latest version, changes the\n * body, and stores it as the next version — a draft, exactly as `apply`\n * would — then `--publish` rolls it out. Nothing local is written: a pulled\n * `agent.json` is left alone, and the result says when it fell behind.\n */\n\nexport type TemplateEditSubcommand =\n | 'policy'\n | 'triggers'\n | 'links'\n | 'overrides';\n\nexport interface TemplateEditArgs {\n subcommand: TemplateEditSubcommand;\n key: string;\n /** Positionals after the key: an action and its arguments. */\n rest: string[];\n event?: string;\n filter?: string[];\n prompt?: string;\n disabled: boolean;\n cron?: string;\n timezone?: string;\n kind?: string;\n mode?: string;\n reads?: string;\n writes?: string;\n publish: boolean;\n dir: string;\n}\n\nexport interface TemplateEditDeps {\n host: string;\n source: string;\n show: () => Promise<AgentTemplateDetail>;\n apply: (\n body: AgentTemplateBody,\n baseVersion: number,\n ) => Promise<AgentTemplateResult>;\n /** Confirms (or refuses without --yes) and publishes `version`. */\n publish: (version: number) => Promise<AgentTemplateResult>;\n summarize: (result: AgentTemplateResult) => string;\n}\n\ntype Edit = { body: AgentTemplateBody; change: string };\n\nconst AREAS = ['policy', 'triggers', 'links'] as const;\n\nexport async function runTemplateEdit(\n ctx: CliContext,\n args: TemplateEditArgs,\n deps: TemplateEditDeps,\n): Promise<ExitCode> {\n const template = await deps.show();\n const [action, ...params] = args.rest;\n const showing =\n action === undefined || action === 'list' || action === 'show';\n\n if (\n showing &&\n !(args.subcommand === 'policy' && (args.reads || args.writes))\n ) {\n if (params.length > 0) {\n throw usageError(\n `\"agents ${args.subcommand} ${args.key} ${action}\" takes no more arguments.`,\n HELP[args.subcommand],\n );\n }\n return showArea(ctx, args.subcommand, template, deps.host);\n }\n\n const edit = editBody(args, template, action, params);\n const parsed = AgentTemplateBodySchema.safeParse(edit.body);\n if (!parsed.success) {\n throw validationError(\n [\n `That change would make ${args.key} invalid:`,\n ...parsed.error.issues.map(\n (issue) => ` ${issue.path.join('.') || '(root)'}: ${issue.message}`,\n ),\n ].join('\\n'),\n HELP[args.subcommand],\n );\n }\n\n const applied = await deps.apply(parsed.data, template.latestVersion);\n const published =\n args.publish && applied.outcome !== 'unchanged'\n ? await deps.publish(applied.version)\n : null;\n const stale = staleLocalFile(args.dir, args.key, applied.version);\n\n const notes = [\n published\n ? null\n : applied.outcome === 'unchanged'\n ? 'Nothing changed.'\n : `Teams still run the published version. Run \"ekanos agents publish ${args.key}\" to roll it out to teams.`,\n stale\n ? `${stale} is now behind the host (v${applied.version}). \"ekanos agents pull ${args.key}\" refreshes it.`\n : null,\n ].filter((note): note is string => note !== null);\n\n const human = [\n ctx.ui.result({\n title: `${edit.change} (${args.key} v${applied.version})`,\n tone: applied.outcome === 'unchanged' ? 'warn' : 'ok',\n rows: areaRows(args.subcommand, parsed.data),\n notes,\n }),\n published ? deps.summarize(published) : null,\n ]\n .filter(Boolean)\n .join('\\n\\n');\n\n return ctx.succeed(\n {\n host: deps.host,\n change: edit.change,\n ...applied,\n published: published ?? null,\n },\n human,\n );\n}\n\nfunction showArea(\n ctx: CliContext,\n subcommand: TemplateEditSubcommand,\n template: AgentTemplateDetail,\n host: string,\n): ExitCode {\n const { body } = template;\n const switches = resolveAgentTemplateTeamOverrides(body);\n const data = {\n host,\n key: template.key,\n version: template.latestVersion,\n publishedVersion: template.publishedVersion,\n teamOverrides: switches,\n ...(subcommand === 'policy' ? { policy: body.policy } : {}),\n ...(subcommand === 'triggers' ? { triggers: body.triggers ?? [] } : {}),\n ...(subcommand === 'links' ? { links: body.links ?? [] } : {}),\n };\n return ctx.succeed(\n data,\n ctx.ui.result({\n title: `${TITLE[subcommand]} of ${template.key} (v${template.latestVersion} latest)`,\n rows: areaRows(subcommand, body),\n notes:\n template.publishedVersion === template.latestVersion\n ? []\n : [\n `Teams run v${template.publishedVersion ?? 'none'}; this is the latest draft.`,\n ],\n }),\n );\n}\n\nconst TITLE: Record<TemplateEditSubcommand, string> = {\n policy: 'Approvals',\n triggers: 'Triggers',\n links: 'Links',\n overrides: 'Team overrides',\n};\n\nexport function areaRows(\n subcommand: TemplateEditSubcommand,\n body: AgentTemplateBody,\n): ResultRow[] {\n const switches = resolveAgentTemplateTeamOverrides(body);\n const teams = (area: (typeof AREAS)[number]) =>\n switches[area]\n ? 'may keep their own differences'\n : 'follow the template exactly';\n switch (subcommand) {\n case 'policy':\n return [\n ['Reads', body.policy.reads],\n ['Writes', body.policy.writes],\n [\n 'Per tool',\n Object.keys(body.policy.overrides).length > 0\n ? Object.entries(body.policy.overrides).map(\n ([tool, mode]) => `${tool}: ${mode}`,\n )\n : 'none',\n ],\n ['Teams', teams('policy')],\n ];\n case 'triggers':\n return [\n [\n 'Triggers',\n body.triggers === undefined\n ? 'none declared (each team sets its own)'\n : body.triggers.length > 0\n ? body.triggers.map(describeTrigger)\n : 'none',\n ],\n ['Teams', teams('triggers')],\n ];\n case 'links':\n return [\n [\n 'Links',\n body.links === undefined\n ? 'none declared (each team sets its own)'\n : body.links.length > 0\n ? body.links.map(describeLink)\n : 'none',\n ],\n ['Teams', teams('links')],\n ];\n case 'overrides':\n return AREAS.map((area): ResultRow => [\n area,\n `${switches[area] ? 'on' : 'off'} — teams ${teams(area)}` +\n (body.teamOverrides?.[area] === undefined ? ' (default)' : ''),\n ]);\n }\n}\n\nexport function describeTrigger(trigger: AgentTemplateTrigger): string {\n const head =\n trigger.type === 'event'\n ? `${trigger.key}: on ${trigger.event}` +\n (Object.keys(trigger.filter).length > 0\n ? ` where ${Object.entries(trigger.filter)\n .map(\n ([field, value]) =>\n `${field}=${Array.isArray(value) ? value.join(',') : String(value)}`,\n )\n .join(' ')}`\n : '')\n : trigger.type === 'schedule'\n ? `${trigger.key}: every \"${trigger.cron}\" (${trigger.timezone})`\n : `${trigger.key}: webhook (each team gets its own URL and secret)`;\n return trigger.enabled ? head : `${head} — off`;\n}\n\nexport function describeLink(link: AgentTemplateLink): string {\n return link.kind === 'talk'\n ? `may ask ${link.to}`\n : `hands work to ${link.to} (${link.mode ?? 'await'})`;\n}\n\nfunction editBody(\n args: TemplateEditArgs,\n template: AgentTemplateDetail,\n action: string | undefined,\n params: string[],\n): Edit {\n const body = structuredClone(template.body);\n switch (args.subcommand) {\n case 'policy':\n return editPolicy(args, body, action, params);\n case 'triggers':\n return editTriggers(args, body, action, params);\n case 'links':\n return editLinks(args, body, action, params);\n case 'overrides':\n return editOverrides(args, body, action, params);\n }\n}\n\nfunction approval(value: string | undefined, what: string) {\n if (value === 'auto' || value === 'approve') return value;\n throw usageError(\n `${what} must be \"auto\" or \"approve\" (got \"${value ?? ''}\").`,\n HELP.policy,\n );\n}\n\nfunction editPolicy(\n args: TemplateEditArgs,\n body: AgentTemplateBody,\n action: string | undefined,\n params: string[],\n): Edit {\n const changes: string[] = [];\n if (args.reads !== undefined) {\n body.policy.reads = approval(args.reads, '--reads');\n changes.push(`reads ${body.policy.reads}`);\n }\n if (args.writes !== undefined) {\n body.policy.writes = approval(args.writes, '--writes');\n changes.push(`writes ${body.policy.writes}`);\n }\n if (action === 'set') {\n const [tool, mode, ...extra] = params;\n if (!tool || extra.length > 0) {\n throw usageError('policy set needs a tool and a mode.', HELP.policy);\n }\n body.policy.overrides[tool] = approval(mode, tool);\n changes.push(`${tool} ${body.policy.overrides[tool]}`);\n } else if (action === 'unset') {\n const [tool, ...extra] = params;\n if (!tool || extra.length > 0) {\n throw usageError('policy unset needs a tool.', HELP.policy);\n }\n if (!(tool in body.policy.overrides)) {\n throw invalidStateError(\n `${tool} has no setting of its own on ${args.key}.`,\n `\"ekanos agents policy ${args.key}\" lists them.`,\n );\n }\n delete body.policy.overrides[tool];\n changes.push(`${tool} back to the default`);\n } else if (action !== undefined && action !== 'show' && action !== 'list') {\n throw usageError(`Unknown policy action \"${action}\".`, HELP.policy);\n }\n if (changes.length === 0) {\n throw usageError('Nothing to change.', HELP.policy);\n }\n return { body, change: `Approvals: ${changes.join(', ')}` };\n}\n\nfunction editTriggers(\n args: TemplateEditArgs,\n body: AgentTemplateBody,\n action: string | undefined,\n params: string[],\n): Edit {\n const triggers = [...(body.triggers ?? [])];\n if (action === 'remove') {\n const [triggerKey, ...extra] = params;\n if (!triggerKey || extra.length > 0) {\n throw usageError('triggers remove needs a trigger key.', HELP.triggers);\n }\n const kept = triggers.filter((trigger) => trigger.key !== triggerKey);\n if (kept.length === triggers.length) {\n throw invalidStateError(\n `${args.key} has no trigger \"${triggerKey}\".`,\n `\"ekanos agents triggers ${args.key}\" lists them.`,\n );\n }\n return {\n body: { ...body, triggers: kept },\n change: `Removed trigger ${triggerKey}`,\n };\n }\n if (action !== 'add') {\n throw usageError(`Unknown triggers action \"${action}\".`, HELP.triggers);\n }\n\n const [type, triggerKey, ...extra] = params;\n if (!type || !triggerKey || extra.length > 0) {\n throw usageError(\n 'triggers add needs a type (event, schedule or webhook) and a key.',\n HELP.triggers,\n );\n }\n if (triggers.some((trigger) => trigger.key === triggerKey)) {\n throw invalidStateError(\n `${args.key} already has a trigger \"${triggerKey}\".`,\n `Remove it first (\"ekanos agents triggers ${args.key} remove ${triggerKey}\") or pick another key.`,\n );\n }\n const common = {\n key: triggerKey,\n prompt: args.prompt ?? '',\n enabled: !args.disabled,\n };\n let trigger: AgentTemplateTrigger;\n if (type === 'event') {\n if (!args.event) {\n throw usageError(\n 'An event trigger needs --event <slug.event>.',\n HELP.triggers,\n );\n }\n trigger = {\n ...common,\n type: 'event',\n event: args.event,\n filter: parseFilters(args.filter ?? []),\n };\n } else if (type === 'schedule') {\n if (!args.cron || !args.prompt) {\n throw usageError(\n 'A schedule trigger needs --cron \"<m h dom mon dow>\" and --prompt.',\n HELP.triggers,\n );\n }\n trigger = {\n ...common,\n type: 'schedule',\n cron: args.cron,\n timezone: args.timezone ?? 'UTC',\n };\n } else if (type === 'webhook') {\n if (!args.prompt) {\n throw usageError(\n 'A webhook trigger needs --prompt (what to do with each request).',\n HELP.triggers,\n );\n }\n trigger = { ...common, type: 'webhook' };\n } else {\n throw usageError(\n `Unknown trigger type \"${type}\": use event, schedule or webhook.`,\n HELP.triggers,\n );\n }\n return {\n body: { ...body, triggers: [...triggers, trigger] },\n change: `Added trigger ${triggerKey}`,\n };\n}\n\n/**\n * `--filter field=value`, repeatable. A value with a comma is a list\n * (`tags=vip,urgent`), `true`/`false` a switch, anything else text.\n */\nexport function parseFilters(\n raw: readonly string[],\n): Record<string, string | boolean | string[]> {\n const filter: Record<string, string | boolean | string[]> = {};\n for (const entry of raw) {\n const at = entry.indexOf('=');\n if (at <= 0) {\n throw usageError(\n `--filter \"${entry}\" must be field=value.`,\n 'e.g. --filter tags=vip,urgent --filter reply_as=internal_note',\n );\n }\n const field = entry.slice(0, at).trim();\n const value = entry.slice(at + 1).trim();\n filter[field] = value.includes(',')\n ? value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean)\n : value === 'true'\n ? true\n : value === 'false'\n ? false\n : value;\n }\n return filter;\n}\n\nfunction editLinks(\n args: TemplateEditArgs,\n body: AgentTemplateBody,\n action: string | undefined,\n params: string[],\n): Edit {\n const links = [...(body.links ?? [])];\n const [to, ...extra] = params;\n if ((action === 'add' || action === 'remove') && (!to || extra.length > 0)) {\n throw usageError(\n `links ${action} needs the other agent's key.`,\n HELP.links,\n );\n }\n const kind =\n args.kind === undefined\n ? undefined\n : args.kind === 'talk' || args.kind === 'delegate'\n ? args.kind\n : (() => {\n throw usageError(\n `--kind must be \"talk\" or \"delegate\" (got \"${args.kind}\").`,\n HELP.links,\n );\n })();\n\n if (action === 'add') {\n const target = AgentTemplateKeySchema.safeParse(to);\n if (!target.success || to === args.key) {\n throw usageError(\n `\"${to}\" is not another agent's key.`,\n '\"ekanos agents list\" shows them.',\n );\n }\n if (!kind) {\n throw usageError('links add needs --kind talk|delegate.', HELP.links);\n }\n if (args.mode !== undefined && kind === 'talk') {\n throw usageError('Only a delegate link takes --mode.', HELP.links);\n }\n const mode =\n args.mode === undefined\n ? undefined\n : args.mode === 'await' || args.mode === 'handoff'\n ? args.mode\n : (() => {\n throw usageError(\n `--mode must be \"await\" or \"handoff\" (got \"${args.mode}\").`,\n HELP.links,\n );\n })();\n const link: AgentTemplateLink = {\n to: target.data,\n kind,\n ...(mode ? { mode } : {}),\n };\n const others = links.filter(\n (existing) => !(existing.to === to && existing.kind === kind),\n );\n return {\n body: { ...body, links: [...others, link] },\n change: `Linked ${args.key} → ${to} (${describeLink(link)})`,\n };\n }\n if (action === 'remove') {\n const kept = links.filter(\n (link) => !(link.to === to && (kind === undefined || link.kind === kind)),\n );\n if (kept.length === links.length) {\n throw invalidStateError(\n `${args.key} has no link to \"${to}\"${kind ? ` of kind ${kind}` : ''}.`,\n `\"ekanos agents links ${args.key}\" lists them.`,\n );\n }\n return {\n body: { ...body, links: kept },\n change: `Removed link ${args.key} → ${to}`,\n };\n }\n throw usageError(`Unknown links action \"${action}\".`, HELP.links);\n}\n\nfunction editOverrides(\n args: TemplateEditArgs,\n body: AgentTemplateBody,\n action: string | undefined,\n params: string[],\n): Edit {\n if (action !== 'enable' && action !== 'disable') {\n throw usageError(`Unknown overrides action \"${action}\".`, HELP.overrides);\n }\n const [area, ...extra] = params;\n if (!AREAS.some((name) => name === area) || extra.length > 0) {\n throw usageError(\n `overrides ${action} needs one area: policy, triggers or links.`,\n HELP.overrides,\n );\n }\n const name = area as (typeof AREAS)[number];\n return {\n body: {\n ...body,\n teamOverrides: { ...body.teamOverrides, [name]: action === 'enable' },\n },\n change:\n action === 'enable'\n ? `Teams may now keep their own ${name}`\n : `Teams now follow the template's ${name} exactly (their own are kept, inactive)`,\n };\n}\n\n/** A pulled `agents/<key>/agent.json` that is now behind the stored version. */\nfunction staleLocalFile(\n dir: string,\n key: string,\n version: number,\n): string | null {\n const file = path.join(dir, 'agents', key, 'agent.json');\n if (classifyPath(file) !== 'file') return null;\n try {\n const raw = JSON.parse(fs.readFileSync(file, 'utf8')) as {\n baseVersion?: unknown;\n };\n return typeof raw.baseVersion === 'number' && raw.baseVersion < version\n ? path.relative(dir, file)\n : null;\n } catch {\n return null;\n }\n}\n\nconst HELP: Record<TemplateEditSubcommand, string> = {\n policy:\n 'e.g. \"ekanos agents policy <key> set zendesk_add_comment approve\", ' +\n '\"ekanos agents policy <key> unset <tool>\", ' +\n '\"ekanos agents policy <key> --reads auto --writes approve\".',\n triggers:\n 'e.g. \"ekanos agents triggers <key> add event new-tickets --event zendesk.ticket_created ' +\n '--filter tags=vip,urgent --filter reply_as=internal_note\", ' +\n '\"… add schedule daily --cron \\\\\"0 9 * * 1-5\\\\\" --timezone America/Los_Angeles --prompt \\\\\"…\\\\\"\", ' +\n '\"… add webhook inbound --prompt \\\\\"…\\\\\"\", \"… remove <trigger-key>\".',\n links:\n 'e.g. \"ekanos agents links <key> add billing-agent --kind delegate --mode handoff\", ' +\n '\"ekanos agents links <key> remove billing-agent [--kind talk]\".',\n overrides:\n 'e.g. \"ekanos agents overrides <key> enable triggers\", ' +\n '\"ekanos agents overrides <key> disable policy\".',\n};\n\nexport function isTemplateEditSubcommand(\n value: string,\n): value is TemplateEditSubcommand {\n return (\n value === 'policy' ||\n value === 'triggers' ||\n value === 'links' ||\n value === 'overrides'\n );\n}\n"]}
1
+ {"version":3,"file":"agents-edit.js","sourceRoot":"","sources":["../../src/commands/agents-edit.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type AgentTemplateBody,\n AgentTemplateBodySchema,\n type AgentTemplateDetail,\n AgentTemplateKeySchema,\n type AgentTemplateLink,\n type AgentTemplateResult,\n type AgentTemplateTrigger,\n resolveAgentTemplateTeamOverrides,\n} from '@ekanos/integration-schema';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { CliContext } from '../context';\nimport { invalidStateError, usageError, validationError } from '../errors';\nimport type { ExitCode } from '../exit-codes';\nimport { classifyPath } from '../safe-fs';\nimport type { ResultRow } from '../ui';\n\n/**\n * Direct edits to one template (plan 239.10): `agents policy | triggers |\n * links | overrides <key> …`. Each reads the latest version, changes the\n * body, and stores it as the next version — a draft, exactly as `apply`\n * would — then `--publish` rolls it out. Nothing local is written: a pulled\n * `agent.json` is left alone, and the result says when it fell behind.\n */\n\nexport type TemplateEditSubcommand =\n | 'policy'\n | 'triggers'\n | 'links'\n | 'overrides';\n\nexport interface TemplateEditArgs {\n subcommand: TemplateEditSubcommand;\n key: string;\n /** Positionals after the key: an action and its arguments. */\n rest: string[];\n event?: string;\n filter?: string[];\n prompt?: string;\n disabled: boolean;\n cron?: string;\n timezone?: string;\n kind?: string;\n mode?: string;\n reads?: string;\n writes?: string;\n publish: boolean;\n dir: string;\n}\n\nexport interface TemplateEditDeps {\n host: string;\n source: string;\n show: () => Promise<AgentTemplateDetail>;\n apply: (\n body: AgentTemplateBody,\n baseVersion: number,\n ) => Promise<AgentTemplateResult>;\n /** Confirms (or refuses without --yes) and publishes `version`. */\n publish: (version: number) => Promise<AgentTemplateResult>;\n summarize: (result: AgentTemplateResult) => string;\n}\n\ntype Edit = { body: AgentTemplateBody; change: string };\n\nconst AREAS = ['policy', 'triggers', 'links'] as const;\n\nexport async function runTemplateEdit(\n ctx: CliContext,\n args: TemplateEditArgs,\n deps: TemplateEditDeps,\n): Promise<ExitCode> {\n const template = await deps.show();\n const [action, ...params] = args.rest;\n const showing =\n action === undefined || action === 'list' || action === 'show';\n\n if (\n showing &&\n !(args.subcommand === 'policy' && (args.reads || args.writes))\n ) {\n if (params.length > 0) {\n throw usageError(\n `\"agents ${args.subcommand} ${args.key} ${action}\" takes no more arguments.`,\n HELP[args.subcommand],\n );\n }\n return showArea(ctx, args.subcommand, template, deps.host);\n }\n\n const edit = editBody(args, template, action, params);\n const parsed = AgentTemplateBodySchema.safeParse(edit.body);\n if (!parsed.success) {\n throw validationError(\n [\n `That change would make ${args.key} invalid:`,\n ...parsed.error.issues.map(\n (issue) => ` ${issue.path.join('.') || '(root)'}: ${issue.message}`,\n ),\n ].join('\\n'),\n HELP[args.subcommand],\n );\n }\n\n const applied = await deps.apply(parsed.data, template.latestVersion);\n const published =\n args.publish && applied.outcome !== 'unchanged'\n ? await deps.publish(applied.version)\n : null;\n const stale = staleLocalFile(args.dir, args.key, applied.version);\n\n const notes = [\n published\n ? null\n : applied.outcome === 'unchanged'\n ? 'Nothing changed.'\n : `Teams still run the published version. Run \"ekanos agents publish ${args.key}\" to roll it out to teams.`,\n stale\n ? `${stale} is now behind the host (v${applied.version}). \"ekanos agents pull ${args.key}\" refreshes it.`\n : null,\n ].filter((note): note is string => note !== null);\n\n const human = [\n ctx.ui.result({\n title: `${edit.change} (${args.key} v${applied.version})`,\n tone: applied.outcome === 'unchanged' ? 'warn' : 'ok',\n rows: areaRows(args.subcommand, parsed.data),\n notes,\n }),\n published ? deps.summarize(published) : null,\n ]\n .filter(Boolean)\n .join('\\n\\n');\n\n return ctx.succeed(\n {\n host: deps.host,\n change: edit.change,\n ...applied,\n published: published ?? null,\n },\n human,\n );\n}\n\nfunction showArea(\n ctx: CliContext,\n subcommand: TemplateEditSubcommand,\n template: AgentTemplateDetail,\n host: string,\n): ExitCode {\n const { body } = template;\n const switches = resolveAgentTemplateTeamOverrides(body);\n const data = {\n host,\n key: template.key,\n version: template.latestVersion,\n publishedVersion: template.publishedVersion,\n teamOverrides: switches,\n ...(subcommand === 'policy' ? { policy: body.policy } : {}),\n ...(subcommand === 'triggers' ? { triggers: body.triggers ?? [] } : {}),\n ...(subcommand === 'links' ? { links: body.links ?? [] } : {}),\n };\n return ctx.succeed(\n data,\n ctx.ui.result({\n title: `${TITLE[subcommand]} of ${template.key} (v${template.latestVersion} latest)`,\n rows: areaRows(subcommand, body),\n notes:\n template.publishedVersion === template.latestVersion\n ? []\n : [\n `Teams run v${template.publishedVersion ?? 'none'}; this is the latest draft.`,\n ],\n }),\n );\n}\n\nconst TITLE: Record<TemplateEditSubcommand, string> = {\n policy: 'Approvals',\n triggers: 'Triggers',\n links: 'Links',\n overrides: 'Team overrides',\n};\n\nexport function areaRows(\n subcommand: TemplateEditSubcommand,\n body: AgentTemplateBody,\n): ResultRow[] {\n const switches = resolveAgentTemplateTeamOverrides(body);\n const teams = (area: (typeof AREAS)[number]) =>\n switches[area]\n ? 'may keep their own differences'\n : 'follow the template exactly';\n switch (subcommand) {\n case 'policy':\n return [\n ['Reads', body.policy.reads],\n ['Writes', body.policy.writes],\n [\n 'Per tool',\n Object.keys(body.policy.overrides).length > 0\n ? Object.entries(body.policy.overrides).map(\n ([tool, mode]) => `${tool}: ${mode}`,\n )\n : 'none',\n ],\n ['Teams', teams('policy')],\n ];\n case 'triggers':\n return [\n [\n 'Triggers',\n body.triggers === undefined\n ? 'none declared (each team sets its own)'\n : body.triggers.length > 0\n ? body.triggers.map(describeTrigger)\n : 'none',\n ],\n ['Teams', teams('triggers')],\n ];\n case 'links':\n return [\n [\n 'Links',\n body.links === undefined\n ? 'none declared (each team sets its own)'\n : body.links.length > 0\n ? body.links.map(describeLink)\n : 'none',\n ],\n ['Teams', teams('links')],\n ];\n case 'overrides':\n return AREAS.map((area): ResultRow => [\n area,\n `${switches[area] ? 'on' : 'off'} — teams ${teams(area)}` +\n (body.teamOverrides?.[area] === undefined ? ' (default)' : ''),\n ]);\n }\n}\n\nexport function describeTrigger(trigger: AgentTemplateTrigger): string {\n const head =\n trigger.type === 'event'\n ? `${trigger.key}: on ${trigger.event}` +\n (Object.keys(trigger.filter).length > 0\n ? ` where ${Object.entries(trigger.filter)\n .map(\n ([field, value]) =>\n `${field}=${Array.isArray(value) ? value.join(',') : String(value)}`,\n )\n .join(' ')}`\n : '')\n : trigger.type === 'schedule'\n ? `${trigger.key}: every \"${trigger.cron}\" (${trigger.timezone})`\n : `${trigger.key}: webhook (each team gets its own URL and secret)`;\n return trigger.enabled ? head : `${head} — off`;\n}\n\nexport function describeLink(link: AgentTemplateLink): string {\n return link.kind === 'talk'\n ? `may ask ${link.to}`\n : `hands work to ${link.to} (${link.mode ?? 'await'})`;\n}\n\nfunction editBody(\n args: TemplateEditArgs,\n template: AgentTemplateDetail,\n action: string | undefined,\n params: string[],\n): Edit {\n const body = structuredClone(template.body);\n switch (args.subcommand) {\n case 'policy':\n return editPolicy(args, body, action, params);\n case 'triggers':\n return editTriggers(args, body, action, params);\n case 'links':\n return editLinks(args, body, action, params);\n case 'overrides':\n return editOverrides(args, body, action, params);\n }\n}\n\nfunction approval(value: string | undefined, what: string) {\n if (value === 'auto' || value === 'approve') return value;\n throw usageError(\n `${what} must be \"auto\" or \"approve\" (got \"${value ?? ''}\").`,\n HELP.policy,\n );\n}\n\nfunction editPolicy(\n args: TemplateEditArgs,\n body: AgentTemplateBody,\n action: string | undefined,\n params: string[],\n): Edit {\n const changes: string[] = [];\n if (args.reads !== undefined) {\n body.policy.reads = approval(args.reads, '--reads');\n changes.push(`reads ${body.policy.reads}`);\n }\n if (args.writes !== undefined) {\n body.policy.writes = approval(args.writes, '--writes');\n changes.push(`writes ${body.policy.writes}`);\n }\n if (action === 'set') {\n const [tool, mode, ...extra] = params;\n if (!tool || extra.length > 0) {\n throw usageError('policy set needs a tool and a mode.', HELP.policy);\n }\n body.policy.overrides[tool] = approval(mode, tool);\n changes.push(`${tool} ${body.policy.overrides[tool]}`);\n } else if (action === 'unset') {\n const [tool, ...extra] = params;\n if (!tool || extra.length > 0) {\n throw usageError('policy unset needs a tool.', HELP.policy);\n }\n if (!(tool in body.policy.overrides)) {\n throw invalidStateError(\n `${tool} has no setting of its own on ${args.key}.`,\n `\"ekanos agents policy ${args.key}\" lists them.`,\n );\n }\n delete body.policy.overrides[tool];\n changes.push(`${tool} back to the default`);\n } else if (action !== undefined && action !== 'show' && action !== 'list') {\n throw usageError(`Unknown policy action \"${action}\".`, HELP.policy);\n }\n if (changes.length === 0) {\n throw usageError('Nothing to change.', HELP.policy);\n }\n return { body, change: `Approvals: ${changes.join(', ')}` };\n}\n\nfunction editTriggers(\n args: TemplateEditArgs,\n body: AgentTemplateBody,\n action: string | undefined,\n params: string[],\n): Edit {\n const triggers = [...(body.triggers ?? [])];\n if (action === 'remove') {\n const [triggerKey, ...extra] = params;\n if (!triggerKey || extra.length > 0) {\n throw usageError('triggers remove needs a trigger key.', HELP.triggers);\n }\n const kept = triggers.filter((trigger) => trigger.key !== triggerKey);\n if (kept.length === triggers.length) {\n throw invalidStateError(\n `${args.key} has no trigger \"${triggerKey}\".`,\n `\"ekanos agents triggers ${args.key}\" lists them.`,\n );\n }\n return {\n body: { ...body, triggers: kept },\n change: `Removed trigger ${triggerKey}`,\n };\n }\n if (action !== 'add') {\n throw usageError(`Unknown triggers action \"${action}\".`, HELP.triggers);\n }\n\n const [type, triggerKey, ...extra] = params;\n if (!type || !triggerKey || extra.length > 0) {\n throw usageError(\n 'triggers add needs a type (event, schedule or webhook) and a key.',\n HELP.triggers,\n );\n }\n if (triggers.some((trigger) => trigger.key === triggerKey)) {\n throw invalidStateError(\n `${args.key} already has a trigger \"${triggerKey}\".`,\n `Remove it first (\"ekanos agents triggers ${args.key} remove ${triggerKey}\") or pick another key.`,\n );\n }\n const common = {\n key: triggerKey,\n prompt: args.prompt ?? '',\n enabled: !args.disabled,\n };\n let trigger: AgentTemplateTrigger;\n if (type === 'event') {\n if (!args.event) {\n throw usageError(\n 'An event trigger needs --event <slug.event>.',\n HELP.triggers,\n );\n }\n trigger = {\n ...common,\n type: 'event',\n event: args.event,\n filter: parseFilters(args.filter ?? []),\n };\n } else if (type === 'schedule') {\n if (!args.cron || !args.prompt) {\n throw usageError(\n 'A schedule trigger needs --cron \"<m h dom mon dow>\" and --prompt.',\n HELP.triggers,\n );\n }\n trigger = {\n ...common,\n type: 'schedule',\n cron: args.cron,\n timezone: args.timezone ?? 'UTC',\n };\n } else if (type === 'webhook') {\n if (!args.prompt) {\n throw usageError(\n 'A webhook trigger needs --prompt (what to do with each request).',\n HELP.triggers,\n );\n }\n trigger = { ...common, type: 'webhook' };\n } else {\n throw usageError(\n `Unknown trigger type \"${type}\": use event, schedule or webhook.`,\n HELP.triggers,\n );\n }\n return {\n body: { ...body, triggers: [...triggers, trigger] },\n change: `Added trigger ${triggerKey}`,\n };\n}\n\n/**\n * `--filter field=value`, repeatable. A value with a comma is a list\n * (`tags=vip,urgent`), `true`/`false` a switch, anything else text.\n */\nexport function parseFilters(\n raw: readonly string[],\n): Record<string, string | boolean | string[]> {\n const filter: Record<string, string | boolean | string[]> = {};\n for (const entry of raw) {\n const at = entry.indexOf('=');\n if (at <= 0) {\n throw usageError(\n `--filter \"${entry}\" must be field=value.`,\n 'e.g. --filter tags=vip,urgent --filter labels=feedback',\n );\n }\n const field = entry.slice(0, at).trim();\n const value = entry.slice(at + 1).trim();\n filter[field] = value.includes(',')\n ? value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean)\n : value === 'true'\n ? true\n : value === 'false'\n ? false\n : value;\n }\n return filter;\n}\n\nfunction editLinks(\n args: TemplateEditArgs,\n body: AgentTemplateBody,\n action: string | undefined,\n params: string[],\n): Edit {\n const links = [...(body.links ?? [])];\n const [to, ...extra] = params;\n if ((action === 'add' || action === 'remove') && (!to || extra.length > 0)) {\n throw usageError(\n `links ${action} needs the other agent's key.`,\n HELP.links,\n );\n }\n const kind =\n args.kind === undefined\n ? undefined\n : args.kind === 'talk' || args.kind === 'delegate'\n ? args.kind\n : (() => {\n throw usageError(\n `--kind must be \"talk\" or \"delegate\" (got \"${args.kind}\").`,\n HELP.links,\n );\n })();\n\n if (action === 'add') {\n const target = AgentTemplateKeySchema.safeParse(to);\n if (!target.success || to === args.key) {\n throw usageError(\n `\"${to}\" is not another agent's key.`,\n '\"ekanos agents list\" shows them.',\n );\n }\n if (!kind) {\n throw usageError('links add needs --kind talk|delegate.', HELP.links);\n }\n if (args.mode !== undefined && kind === 'talk') {\n throw usageError('Only a delegate link takes --mode.', HELP.links);\n }\n const mode =\n args.mode === undefined\n ? undefined\n : args.mode === 'await' || args.mode === 'handoff'\n ? args.mode\n : (() => {\n throw usageError(\n `--mode must be \"await\" or \"handoff\" (got \"${args.mode}\").`,\n HELP.links,\n );\n })();\n const link: AgentTemplateLink = {\n to: target.data,\n kind,\n ...(mode ? { mode } : {}),\n };\n const others = links.filter(\n (existing) => !(existing.to === to && existing.kind === kind),\n );\n return {\n body: { ...body, links: [...others, link] },\n change: `Linked ${args.key} → ${to} (${describeLink(link)})`,\n };\n }\n if (action === 'remove') {\n const kept = links.filter(\n (link) => !(link.to === to && (kind === undefined || link.kind === kind)),\n );\n if (kept.length === links.length) {\n throw invalidStateError(\n `${args.key} has no link to \"${to}\"${kind ? ` of kind ${kind}` : ''}.`,\n `\"ekanos agents links ${args.key}\" lists them.`,\n );\n }\n return {\n body: { ...body, links: kept },\n change: `Removed link ${args.key} → ${to}`,\n };\n }\n throw usageError(`Unknown links action \"${action}\".`, HELP.links);\n}\n\nfunction editOverrides(\n args: TemplateEditArgs,\n body: AgentTemplateBody,\n action: string | undefined,\n params: string[],\n): Edit {\n if (action !== 'enable' && action !== 'disable') {\n throw usageError(`Unknown overrides action \"${action}\".`, HELP.overrides);\n }\n const [area, ...extra] = params;\n if (!AREAS.some((name) => name === area) || extra.length > 0) {\n throw usageError(\n `overrides ${action} needs one area: policy, triggers or links.`,\n HELP.overrides,\n );\n }\n const name = area as (typeof AREAS)[number];\n return {\n body: {\n ...body,\n teamOverrides: { ...body.teamOverrides, [name]: action === 'enable' },\n },\n change:\n action === 'enable'\n ? `Teams may now keep their own ${name}`\n : `Teams now follow the template's ${name} exactly (their own are kept, inactive)`,\n };\n}\n\n/** A pulled `agents/<key>/agent.json` that is now behind the stored version. */\nfunction staleLocalFile(\n dir: string,\n key: string,\n version: number,\n): string | null {\n const file = path.join(dir, 'agents', key, 'agent.json');\n if (classifyPath(file) !== 'file') return null;\n try {\n const raw = JSON.parse(fs.readFileSync(file, 'utf8')) as {\n baseVersion?: unknown;\n };\n return typeof raw.baseVersion === 'number' && raw.baseVersion < version\n ? path.relative(dir, file)\n : null;\n } catch {\n return null;\n }\n}\n\nconst HELP: Record<TemplateEditSubcommand, string> = {\n policy:\n 'e.g. \"ekanos agents policy <key> set zendesk_add_comment approve\", ' +\n '\"ekanos agents policy <key> unset <tool>\", ' +\n '\"ekanos agents policy <key> --reads auto --writes approve\".',\n triggers:\n 'e.g. \"ekanos agents triggers <key> add event new-tickets --event zendesk.ticket_created ' +\n '--filter tags=vip,urgent --filter reply_as=internal_note\", ' +\n '\"… add schedule daily --cron \\\\\"0 9 * * 1-5\\\\\" --timezone America/Los_Angeles --prompt \\\\\"…\\\\\"\", ' +\n '\"… add webhook inbound --prompt \\\\\"…\\\\\"\", \"… remove <trigger-key>\".',\n links:\n 'e.g. \"ekanos agents links <key> add billing-agent --kind delegate --mode handoff\", ' +\n '\"ekanos agents links <key> remove billing-agent [--kind talk]\".',\n overrides:\n 'e.g. \"ekanos agents overrides <key> enable triggers\", ' +\n '\"ekanos agents overrides <key> disable policy\".',\n};\n\nexport function isTemplateEditSubcommand(\n value: string,\n): value is TemplateEditSubcommand {\n return (\n value === 'policy' ||\n value === 'triggers' ||\n value === 'links' ||\n value === 'overrides'\n );\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import type { ProviderAppStatus } from '@ekanos/integration-schema';
2
2
  import type { CliContext } from '../context.js';
3
3
  import type { ExitCode } from '../exit-codes.js';
4
- export declare const APPS_SUBCOMMANDS: readonly ['show', 'set'];
4
+ export declare const APPS_SUBCOMMANDS: readonly ['show', 'set', 'list', 'connect', 'disconnect'];
5
5
  export interface AppsArgs {
6
6
  host?: string;
7
7
  source?: string;
@@ -10,18 +10,22 @@ export interface AppsArgs {
10
10
  dir: string;
11
11
  env: Record<string, string | undefined>;
12
12
  stdinIsTTY?: boolean;
13
- /** Test seams for the questions `set` asks. */
13
+ /** Test seams for the questions `set` and `connect` ask. */
14
14
  ask?: (question: string) => Promise<string>;
15
15
  askSecret?: (question: string) => Promise<string>;
16
16
  confirm?: (question: string) => Promise<boolean>;
17
+ /** Test seam: `connect`'s wait between status polls. */
18
+ pollDelayMs?: number;
19
+ /** `connect --no-wait`: print the URL and return without polling. */
20
+ noWait?: boolean;
17
21
  }
18
22
  /**
19
23
  * `apps` — a Source's provider apps: the OAuth client an integration signs
20
24
  * every team in through (Linear's, say). `show` says whether the Source has
21
25
  * one and which callback URL to register; `set` takes the client id and
22
- * secret from the Source admin at the terminal — never from a flag, a file
23
- * or a non-interactive run, so an agent driving the CLI never handles the
24
- * secret.
26
+ * secret from the Source admin at the terminal — either on its own, Enter
27
+ * keeping the saved one — never from a flag, a file or a non-interactive
28
+ * run, so an agent driving the CLI never handles the secret.
25
29
  */
26
30
  export declare function runApps(ctx: CliContext, args: AppsArgs): Promise<ExitCode>;
27
31
  /**
@@ -30,5 +34,14 @@ export declare function runApps(ctx: CliContext, args: AppsArgs): Promise<ExitCo
30
34
  */
31
35
  export declare function walkthrough(status: ProviderAppStatus): string[];
32
36
  export declare function promptLine(question: string): Promise<string>;
33
- /** Read a line without echoing it: the secret never appears on screen or in scrollback. */
37
+ /**
38
+ * Read a line without echoing it: the secret never appears on screen or in
39
+ * scrollback. The question is always printed; only the typed characters are
40
+ * hidden (each shows as `*`, so a paste visibly landed).
41
+ *
42
+ * Raw mode by hand rather than readline: a terminal readline redraws its
43
+ * line on `question()` — cursor to column 0, clear to the end of the screen —
44
+ * which erased the question written before it, so the terminal sat on an
45
+ * empty line and a hidden field looked skipped.
46
+ */
34
47
  export declare function promptHidden(question: string): Promise<string>;