@ekanos/cli 0.12.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.
- package/dist/apps-api.d.ts +3 -2
- package/dist/apps-api.js +1 -5
- package/dist/apps-api.js.map +1 -1
- package/dist/commands/agents-edit.js +1 -1
- package/dist/commands/agents-edit.js.map +1 -1
- package/dist/commands/apps.d.ts +13 -4
- package/dist/commands/apps.js +117 -39
- package/dist/commands/apps.js.map +1 -1
- package/dist/commands/knowledge.d.ts +37 -0
- package/dist/commands/knowledge.js +364 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/sources.d.ts +4 -0
- package/dist/commands/sources.js +115 -1
- package/dist/commands/sources.js.map +1 -1
- package/dist/commands/team-agents-triggers.js +2 -1
- package/dist/commands/team-agents-triggers.js.map +1 -1
- package/dist/commands/teams-connect.d.ts +25 -0
- package/dist/commands/teams-connect.js +242 -0
- package/dist/commands/teams-connect.js.map +1 -0
- package/dist/commands/teams-onboard.d.ts +5 -2
- package/dist/commands/teams-onboard.js +12 -40
- package/dist/commands/teams-onboard.js.map +1 -1
- package/dist/commands/teams.d.ts +60 -5
- package/dist/commands/teams.js +141 -46
- package/dist/commands/teams.js.map +1 -1
- package/dist/index.js +62 -6
- package/dist/index.js.map +1 -1
- package/dist/knowledge-api.d.ts +129 -0
- package/dist/knowledge-api.js +138 -0
- package/dist/knowledge-api.js.map +1 -0
- package/dist/source-products-api.d.ts +59 -0
- package/dist/source-products-api.js +113 -0
- package/dist/source-products-api.js.map +1 -0
- package/dist/team-connect-api.d.ts +244 -0
- package/dist/team-connect-api.js +95 -0
- package/dist/team-connect-api.js.map +1 -0
- package/dist/teams-api.d.ts +1 -0
- package/dist/teams-api.js +1 -1
- package/dist/teams-api.js.map +1 -1
- package/package.json +2 -2
- package/templates/package.json.tmpl +4 -4
- package/templates/skills/build-agent/SKILL.md +14 -1
- package/templates/skills/build-agent/references/agent-json.md +22 -6
- package/templates/skills/build-agent/references/app-setup.md +2 -1
- package/templates/skills/build-agent/references/set-up-an-integration.md +19 -8
- package/templates/skills/build-agent/references/triggers.md +44 -15
- package/templates/skills/ekanos-platform/SKILL.md +32 -6
package/dist/apps-api.d.ts
CHANGED
|
@@ -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
|
-
|
|
26
|
-
|
|
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) {
|
package/dist/apps-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apps-api.js","sourceRoot":"","sources":["../src/apps-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,0BAA0B,EAE1B,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,UAAU,GACX,MAAM,UAAU,CAAC;AAoBlB,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,WAAmB,EACnB,MAAc,EACd,OAAe;IAEf,OAAO,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,uBAAuB,EAAE,OAAO,EAAE;QAC/D,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;KAC7D,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,WAAmB,EACnB,
|
|
1
|
+
{"version":3,"file":"apps-api.js","sourceRoot":"","sources":["../src/apps-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,0BAA0B,EAE1B,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,UAAU,GACX,MAAM,UAAU,CAAC;AAoBlB,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,WAAmB,EACnB,MAAc,EACd,OAAe;IAEf,OAAO,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,uBAAuB,EAAE,OAAO,EAAE;QAC/D,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;KAC7D,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,WAAmB,EACnB,IAMC;IAED,OAAO,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,0BAA0B,EAAE,IAAI,CAAC,OAAO,EAAE;QACvE,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;QACzB,IAAI,gCACF,MAAM,EAAE,IAAI,CAAC,MAAM,IAChB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAClD,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAClE;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,KAAK,CAAC,OAAe;IAC5B,OAAO,qBAAqB,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,IAAI,CACjB,IAAY,EACZ,WAAmB,EACnB,MAAoB,EACpB,OAAe,EACf,IAA6D;IAE7D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE;QACpD,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,kBACL,MAAM,EAAE,kBAAkB,EAC1B,aAAa,EAAE,UAAU,WAAW,EAAE,IACnC,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS;YACzB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAC5C;QACD,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;KACtE,CAAC,CAAC;IAEH,IACE,QAAQ,CAAC,MAAM,KAAK,GAAG;QACvB,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,EACjD,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,MAAM,OAAO,GACX,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAEnE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;QACvD,MAAM,iBAAiB,CACrB,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,GAAG,IAAI,wCAAwC,EAC1D,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,cAAc,CAClB,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,+BAA+B,EAC1C,IAAI,KAAK,uBAAuB;YAC9B,CAAC,CAAC,mEAAmE;YACrE,CAAC,CAAC,8DAA8D,CACnE,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,aAAa,CACjB,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,IAAI,OAAO,kBAAkB,EACxC,IAAI,KAAK,sBAAsB;YAC7B,CAAC,CAAC,qFAAqF;YACvF,CAAC,CAAC,8DAA8D,CACnE,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC1D,MAAM,iBAAiB,CACrB,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,IAAI,OAAO,wCAAwC,EAC9D,sBAAsB,OAAO,yEAAyE,OAAO,0BAA0B,CACxI,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,UAAU,CACd,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,+BAA+B,EAC1C,2BAA2B,CAC5B,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,YAAY,CAChB,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,QAAQ,CAAC,MAAM,GAAG,EACjE,QAAQ,CAAC,MAAM,IAAI,GAAG;YACpB,CAAC,CAAC,+DAA+D;YACjE,CAAC,CAAC,8DAA8D,CACnE,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,YAAY,CAChB,GAAG,IAAI,+DAA+D,EACtE,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,QAAkB;IAElB,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC9C,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;YAClD,CAAC,CAAE,MAAkC;YACrC,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;eAAO,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC","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
|
|
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"]}
|
package/dist/commands/apps.d.ts
CHANGED
|
@@ -23,9 +23,9 @@ export interface AppsArgs {
|
|
|
23
23
|
* `apps` — a Source's provider apps: the OAuth client an integration signs
|
|
24
24
|
* every team in through (Linear's, say). `show` says whether the Source has
|
|
25
25
|
* one and which callback URL to register; `set` takes the client id and
|
|
26
|
-
* secret from the Source admin at the terminal —
|
|
27
|
-
*
|
|
28
|
-
* 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.
|
|
29
29
|
*/
|
|
30
30
|
export declare function runApps(ctx: CliContext, args: AppsArgs): Promise<ExitCode>;
|
|
31
31
|
/**
|
|
@@ -34,5 +34,14 @@ export declare function runApps(ctx: CliContext, args: AppsArgs): Promise<ExitCo
|
|
|
34
34
|
*/
|
|
35
35
|
export declare function walkthrough(status: ProviderAppStatus): string[];
|
|
36
36
|
export declare function promptLine(question: string): Promise<string>;
|
|
37
|
-
/**
|
|
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
|
+
*/
|
|
38
47
|
export declare function promptHidden(question: string): Promise<string>;
|
package/dist/commands/apps.js
CHANGED
|
@@ -15,9 +15,9 @@ export const APPS_SUBCOMMANDS = [
|
|
|
15
15
|
* `apps` — a Source's provider apps: the OAuth client an integration signs
|
|
16
16
|
* every team in through (Linear's, say). `show` says whether the Source has
|
|
17
17
|
* one and which callback URL to register; `set` takes the client id and
|
|
18
|
-
* secret from the Source admin at the terminal —
|
|
19
|
-
*
|
|
20
|
-
* secret.
|
|
18
|
+
* secret from the Source admin at the terminal — either on its own, Enter
|
|
19
|
+
* keeping the saved one — never from a flag, a file or a non-interactive
|
|
20
|
+
* run, so an agent driving the CLI never handles the secret.
|
|
21
21
|
*/
|
|
22
22
|
export async function runApps(ctx, args) {
|
|
23
23
|
var _a, _b, _c;
|
|
@@ -42,29 +42,32 @@ export async function runApps(ctx, args) {
|
|
|
42
42
|
}
|
|
43
43
|
const status = await client.call((token) => showProviderApp(env.host, token, source, product));
|
|
44
44
|
ctx.log(walkthrough(status).join('\n'));
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
const
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
45
|
+
// Either credential on its own: Enter keeps what is saved. An older host
|
|
46
|
+
// sends no `fields`; then `configured` says whether both are saved.
|
|
47
|
+
const saved = (name) => { var _a; var _b; return (_b = (_a = status.fields) === null || _a === void 0 ? void 0 : _a.find((field) => field.name === name)) !== null && _b !== void 0 ? _b : {
|
|
48
|
+
set: status.configured,
|
|
49
|
+
value: null,
|
|
50
|
+
}; };
|
|
51
|
+
const savedId = saved('clientId');
|
|
52
|
+
const savedSecret = saved('clientSecret');
|
|
53
|
+
const clientId = (await ((_a = args.ask) !== null && _a !== void 0 ? _a : promptLine)(savedId.set
|
|
54
|
+
? `Client ID (current: ${(_b = savedId.value) !== null && _b !== void 0 ? _b : 'saved'} — Enter to keep): `
|
|
55
|
+
: 'Client ID: ')).trim();
|
|
56
|
+
const clientSecret = (await ((_c = args.askSecret) !== null && _c !== void 0 ? _c : promptHidden)(savedSecret.set
|
|
57
|
+
? 'Client secret (saved — Enter to keep, hidden): '
|
|
58
|
+
: 'Client secret (hidden): ')).trim();
|
|
59
|
+
if (!clientId && !clientSecret) {
|
|
60
|
+
throw validationError('Nothing was changed.', `Run "ekanos apps show ${product}" to see the current state.`);
|
|
55
61
|
}
|
|
56
|
-
const result = await client.call((token) => setProviderApp(env.host, token, {
|
|
57
|
-
|
|
58
|
-
product,
|
|
59
|
-
clientId,
|
|
60
|
-
clientSecret,
|
|
61
|
-
}));
|
|
62
|
+
const result = await client.call((token) => setProviderApp(env.host, token, Object.assign(Object.assign({ source,
|
|
63
|
+
product }, (clientId ? { clientId } : {})), (clientSecret ? { clientSecret } : {}))));
|
|
62
64
|
return ctx.succeed(Object.assign({ host: env.host }, result), ctx.ui.result({
|
|
63
65
|
title: result.replaced
|
|
64
|
-
? `
|
|
66
|
+
? `Updated the ${result.product.name} app`
|
|
65
67
|
: `Set up the ${result.product.name} app`,
|
|
66
68
|
rows: [
|
|
67
69
|
['Source', result.source.slug],
|
|
70
|
+
...providerFieldRows(result),
|
|
68
71
|
['Teams can connect', result.configured ? 'yes' : 'not yet'],
|
|
69
72
|
['Callback URLs', callbackUrls(result)],
|
|
70
73
|
],
|
|
@@ -112,6 +115,7 @@ function summary(ctx, status) {
|
|
|
112
115
|
],
|
|
113
116
|
]
|
|
114
117
|
: []),
|
|
118
|
+
...providerFieldRows(status),
|
|
115
119
|
[
|
|
116
120
|
'Set up',
|
|
117
121
|
status.configured
|
|
@@ -409,27 +413,101 @@ export async function promptLine(question) {
|
|
|
409
413
|
rl.close();
|
|
410
414
|
}
|
|
411
415
|
}
|
|
412
|
-
/**
|
|
416
|
+
/**
|
|
417
|
+
* Read a line without echoing it: the secret never appears on screen or in
|
|
418
|
+
* scrollback. The question is always printed; only the typed characters are
|
|
419
|
+
* hidden (each shows as `*`, so a paste visibly landed).
|
|
420
|
+
*
|
|
421
|
+
* Raw mode by hand rather than readline: a terminal readline redraws its
|
|
422
|
+
* line on `question()` — cursor to column 0, clear to the end of the screen —
|
|
423
|
+
* which erased the question written before it, so the terminal sat on an
|
|
424
|
+
* empty line and a hidden field looked skipped.
|
|
425
|
+
*/
|
|
413
426
|
export async function promptHidden(question) {
|
|
414
|
-
const
|
|
415
|
-
process.stderr
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
finally {
|
|
430
|
-
rl.close();
|
|
431
|
-
process.stderr.write('\n');
|
|
427
|
+
const stdin = process.stdin;
|
|
428
|
+
const stderr = process.stderr;
|
|
429
|
+
stderr.write(question);
|
|
430
|
+
if (!stdin.isTTY) {
|
|
431
|
+
// Piped stdin echoes nothing: read one line as is.
|
|
432
|
+
const readline = await import('node:readline/promises');
|
|
433
|
+
const rl = readline.createInterface({ input: stdin, terminal: false });
|
|
434
|
+
try {
|
|
435
|
+
return await rl.question('');
|
|
436
|
+
}
|
|
437
|
+
finally {
|
|
438
|
+
rl.close();
|
|
439
|
+
stderr.write('\n');
|
|
440
|
+
}
|
|
432
441
|
}
|
|
442
|
+
return new Promise((resolve) => {
|
|
443
|
+
let value = '';
|
|
444
|
+
let inEscape = false;
|
|
445
|
+
const wasRaw = stdin.isRaw;
|
|
446
|
+
const finish = () => {
|
|
447
|
+
stdin.off('data', onData);
|
|
448
|
+
stdin.setRawMode(wasRaw);
|
|
449
|
+
stdin.pause();
|
|
450
|
+
stderr.write('\n');
|
|
451
|
+
};
|
|
452
|
+
const onData = (chunk) => {
|
|
453
|
+
for (const char of typeof chunk === 'string'
|
|
454
|
+
? chunk
|
|
455
|
+
: chunk.toString('utf8')) {
|
|
456
|
+
if (inEscape) {
|
|
457
|
+
// An escape sequence (an arrow key) ends at its final letter.
|
|
458
|
+
if (/[A-Za-z~]/.test(char))
|
|
459
|
+
inEscape = false;
|
|
460
|
+
continue;
|
|
461
|
+
}
|
|
462
|
+
if (char === '\u001b') {
|
|
463
|
+
inEscape = true;
|
|
464
|
+
continue;
|
|
465
|
+
}
|
|
466
|
+
if (char === '\r' || char === '\n' || char === '\u0004') {
|
|
467
|
+
finish();
|
|
468
|
+
resolve(value);
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
471
|
+
if (char === '\u0003') {
|
|
472
|
+
// Ctrl-C: raw mode swallowed the signal, so leave as SIGINT would.
|
|
473
|
+
finish();
|
|
474
|
+
process.exit(130);
|
|
475
|
+
}
|
|
476
|
+
if (char === '\u007f' || char === '\b') {
|
|
477
|
+
if (value.length > 0) {
|
|
478
|
+
value = value.slice(0, -1);
|
|
479
|
+
stderr.write('\b \b');
|
|
480
|
+
}
|
|
481
|
+
continue;
|
|
482
|
+
}
|
|
483
|
+
if (char === '\u0015') {
|
|
484
|
+
// Ctrl-U: clear what was typed.
|
|
485
|
+
stderr.write('\b \b'.repeat(value.length));
|
|
486
|
+
value = '';
|
|
487
|
+
continue;
|
|
488
|
+
}
|
|
489
|
+
if (char < ' ')
|
|
490
|
+
continue;
|
|
491
|
+
value += char;
|
|
492
|
+
stderr.write('*');
|
|
493
|
+
}
|
|
494
|
+
};
|
|
495
|
+
stdin.setRawMode(true);
|
|
496
|
+
stdin.resume();
|
|
497
|
+
stdin.on('data', onData);
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
/** Each credential's state: the client id's value, the secret as saved or not. */
|
|
501
|
+
function providerFieldRows(status) {
|
|
502
|
+
var _a;
|
|
503
|
+
return ((_a = status.fields) !== null && _a !== void 0 ? _a : []).map((field) => { var _a; return [
|
|
504
|
+
field.label,
|
|
505
|
+
!field.set
|
|
506
|
+
? 'not set'
|
|
507
|
+
: field.sensitive
|
|
508
|
+
? 'saved'
|
|
509
|
+
: ((_a = field.value) !== null && _a !== void 0 ? _a : 'saved'),
|
|
510
|
+
]; });
|
|
433
511
|
}
|
|
434
512
|
/** Every redirect URI to register; an older host sends only the one. */
|
|
435
513
|
function callbackUrls(status) {
|