@ekanos/cli 0.12.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -8
- package/dist/agents-api.d.ts +11 -2
- package/dist/agents-api.js +39 -3
- package/dist/agents-api.js.map +1 -1
- package/dist/apps-api.d.ts +3 -2
- package/dist/apps-api.js +3 -7
- package/dist/apps-api.js.map +1 -1
- package/dist/auth/ekanos-api.d.ts +16 -2
- package/dist/auth/ekanos-api.js +101 -15
- package/dist/auth/ekanos-api.js.map +1 -1
- package/dist/auth/host-trust.d.ts +46 -0
- package/dist/auth/host-trust.js +79 -0
- package/dist/auth/host-trust.js.map +1 -0
- package/dist/auth/session.d.ts +10 -1
- package/dist/auth/session.js +28 -28
- package/dist/auth/session.js.map +1 -1
- package/dist/commands/agents-edit.d.ts +6 -2
- package/dist/commands/agents-edit.js +57 -26
- package/dist/commands/agents-edit.js.map +1 -1
- package/dist/commands/agents.d.ts +13 -2
- package/dist/commands/agents.js +148 -36
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/apps.d.ts +15 -4
- package/dist/commands/apps.js +133 -51
- package/dist/commands/apps.js.map +1 -1
- package/dist/commands/catalog.js +7 -6
- package/dist/commands/catalog.js.map +1 -1
- package/dist/commands/knowledge.d.ts +56 -0
- package/dist/commands/knowledge.js +456 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/login.d.ts +4 -0
- package/dist/commands/login.js +30 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +9 -1
- package/dist/commands/logout.js +56 -7
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/publish.js +3 -3
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/reviewers.d.ts +2 -0
- package/dist/commands/reviewers.js +7 -3
- package/dist/commands/reviewers.js.map +1 -1
- package/dist/commands/routes.d.ts +2 -0
- package/dist/commands/routes.js +42 -9
- package/dist/commands/routes.js.map +1 -1
- package/dist/commands/runs.d.ts +13 -2
- package/dist/commands/runs.js +96 -15
- package/dist/commands/runs.js.map +1 -1
- package/dist/commands/scope-notice.d.ts +21 -0
- package/dist/commands/scope-notice.js +35 -0
- package/dist/commands/scope-notice.js.map +1 -0
- package/dist/commands/skills.d.ts +7 -1
- package/dist/commands/skills.js +80 -24
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/sources.d.ts +4 -0
- package/dist/commands/sources.js +233 -5
- package/dist/commands/sources.js.map +1 -1
- package/dist/commands/status.js +5 -4
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/team-agent-readiness.d.ts +59 -0
- package/dist/commands/team-agent-readiness.js +341 -0
- package/dist/commands/team-agent-readiness.js.map +1 -0
- package/dist/commands/team-agents-agents.d.ts +24 -3
- package/dist/commands/team-agents-agents.js +336 -35
- package/dist/commands/team-agents-agents.js.map +1 -1
- package/dist/commands/team-agents-mcp.js +32 -3
- package/dist/commands/team-agents-mcp.js.map +1 -1
- package/dist/commands/team-agents-triggers.js +230 -54
- package/dist/commands/team-agents-triggers.js.map +1 -1
- package/dist/commands/team-agents.d.ts +3 -1
- package/dist/commands/team-agents.js +27 -7
- package/dist/commands/team-agents.js.map +1 -1
- package/dist/commands/teams-channel-install.d.ts +24 -0
- package/dist/commands/teams-channel-install.js +94 -0
- package/dist/commands/teams-channel-install.js.map +1 -0
- package/dist/commands/teams-connect.d.ts +66 -0
- package/dist/commands/teams-connect.js +397 -0
- package/dist/commands/teams-connect.js.map +1 -0
- package/dist/commands/teams-events.d.ts +12 -0
- package/dist/commands/teams-events.js +138 -0
- package/dist/commands/teams-events.js.map +1 -0
- package/dist/commands/teams-onboard.d.ts +16 -5
- package/dist/commands/teams-onboard.js +61 -36
- package/dist/commands/teams-onboard.js.map +1 -1
- package/dist/commands/teams-overview.d.ts +11 -0
- package/dist/commands/teams-overview.js +160 -0
- package/dist/commands/teams-overview.js.map +1 -0
- package/dist/commands/teams-scope.d.ts +10 -0
- package/dist/commands/teams-scope.js +109 -0
- package/dist/commands/teams-scope.js.map +1 -0
- package/dist/commands/teams.d.ts +64 -7
- package/dist/commands/teams.js +254 -60
- package/dist/commands/teams.js.map +1 -1
- package/dist/commands/upgrade.js +12 -2
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/commands/use.js +2 -2
- package/dist/commands/use.js.map +1 -1
- package/dist/commands/whoami.js +1 -1
- package/dist/commands/whoami.js.map +1 -1
- package/dist/connections-api.js +1 -1
- package/dist/connections-api.js.map +1 -1
- package/dist/delegate.js +11 -4
- package/dist/delegate.js.map +1 -1
- package/dist/harness-scaffold.js +12 -0
- package/dist/harness-scaffold.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +724 -152
- package/dist/index.js.map +1 -1
- package/dist/knowledge-api.d.ts +175 -0
- package/dist/knowledge-api.js +169 -0
- package/dist/knowledge-api.js.map +1 -0
- package/dist/open-url.d.ts +16 -0
- package/dist/open-url.js +73 -0
- package/dist/open-url.js.map +1 -0
- package/dist/parse-argv.d.ts +2 -0
- package/dist/parse-argv.js.map +1 -1
- package/dist/publish-api.d.ts +2 -1
- package/dist/publish-api.js +4 -3
- package/dist/publish-api.js.map +1 -1
- package/dist/pull-write.d.ts +27 -0
- package/dist/pull-write.js +60 -0
- package/dist/pull-write.js.map +1 -0
- package/dist/routes-api.d.ts +3 -0
- package/dist/routes-api.js +9 -4
- package/dist/routes-api.js.map +1 -1
- package/dist/runs-api.d.ts +7 -1
- package/dist/runs-api.js +21 -6
- package/dist/runs-api.js.map +1 -1
- package/dist/safe-fs.d.ts +2 -0
- package/dist/safe-fs.js +12 -6
- package/dist/safe-fs.js.map +1 -1
- package/dist/secret-file.d.ts +17 -0
- package/dist/secret-file.js +69 -0
- package/dist/secret-file.js.map +1 -0
- package/dist/skills-api.d.ts +10 -2
- package/dist/skills-api.js +37 -2
- package/dist/skills-api.js.map +1 -1
- package/dist/source-products-api.d.ts +63 -0
- package/dist/source-products-api.js +123 -0
- package/dist/source-products-api.js.map +1 -0
- package/dist/source-target.js +2 -1
- package/dist/source-target.js.map +1 -1
- package/dist/sources-api.d.ts +2 -1
- package/dist/sources-api.js +3 -2
- package/dist/sources-api.js.map +1 -1
- package/dist/team-connect-api.d.ts +286 -0
- package/dist/team-connect-api.js +107 -0
- package/dist/team-connect-api.js.map +1 -0
- package/dist/teams-api.d.ts +42 -1
- package/dist/teams-api.js +98 -20
- package/dist/teams-api.js.map +1 -1
- package/dist/toolchain-api.d.ts +9 -0
- package/dist/toolchain-api.js +17 -2
- package/dist/toolchain-api.js.map +1 -1
- package/dist/toolchain-resolve.d.ts +3 -0
- package/dist/toolchain-resolve.js +15 -1
- package/dist/toolchain-resolve.js.map +1 -1
- package/dist/toolchain.d.ts +6 -0
- package/dist/toolchain.js +19 -0
- package/dist/toolchain.js.map +1 -1
- package/dist/update-notice.js +2 -1
- package/dist/update-notice.js.map +1 -1
- package/package.json +2 -2
- package/templates/AGENTS.md.tmpl +6 -1
- package/templates/claude-skill.md.tmpl +5 -0
- package/templates/package.json.tmpl +4 -4
- package/templates/skills/build-agent/SKILL.md +115 -16
- package/templates/skills/build-agent/references/agent-json.md +26 -8
- package/templates/skills/build-agent/references/app-setup.md +2 -1
- package/templates/skills/build-agent/references/rollout.md +27 -4
- package/templates/skills/build-agent/references/set-up-an-integration.md +74 -15
- package/templates/skills/build-agent/references/skills.md +20 -1
- package/templates/skills/build-agent/references/triggers.md +84 -20
- package/templates/skills/build-integration/references/widget-design.md +3 -3
- package/templates/skills/ekanos-platform/SKILL.md +70 -17
- package/templates/skills/polish-widgets/references/patterns.md +2 -2
|
@@ -11,7 +11,7 @@ export async function runTemplateEdit(ctx, args, deps) {
|
|
|
11
11
|
if (showing &&
|
|
12
12
|
!(args.subcommand === 'policy' && (args.reads || args.writes))) {
|
|
13
13
|
if (params.length > 0) {
|
|
14
|
-
throw usageError(`"agents ${args.subcommand} ${args.key} ${action}" takes no more arguments.`,
|
|
14
|
+
throw usageError(`"agents ${args.subcommand} ${args.key} ${action}" takes no more arguments.`, TEMPLATE_EDIT_HELP[args.subcommand]);
|
|
15
15
|
}
|
|
16
16
|
return showArea(ctx, args.subcommand, template, deps.host);
|
|
17
17
|
}
|
|
@@ -21,7 +21,7 @@ export async function runTemplateEdit(ctx, args, deps) {
|
|
|
21
21
|
throw validationError([
|
|
22
22
|
`That change would make ${args.key} invalid:`,
|
|
23
23
|
...parsed.error.issues.map((issue) => ` ${issue.path.join('.') || '(root)'}: ${issue.message}`),
|
|
24
|
-
].join('\n'),
|
|
24
|
+
].join('\n'), TEMPLATE_EDIT_HELP[args.subcommand]);
|
|
25
25
|
}
|
|
26
26
|
const applied = await deps.apply(parsed.data, template.latestVersion);
|
|
27
27
|
const published = args.publish && applied.outcome !== 'unchanged'
|
|
@@ -157,7 +157,7 @@ function editBody(args, template, action, params) {
|
|
|
157
157
|
function approval(value, what) {
|
|
158
158
|
if (value === 'auto' || value === 'approve')
|
|
159
159
|
return value;
|
|
160
|
-
throw usageError(`${what} must be "auto" or "approve" (got "${value !== null && value !== void 0 ? value : ''}").`,
|
|
160
|
+
throw usageError(`${what} must be "auto" or "approve" (got "${value !== null && value !== void 0 ? value : ''}").`, TEMPLATE_EDIT_HELP.policy);
|
|
161
161
|
}
|
|
162
162
|
function editPolicy(args, body, action, params) {
|
|
163
163
|
const changes = [];
|
|
@@ -172,7 +172,7 @@ function editPolicy(args, body, action, params) {
|
|
|
172
172
|
if (action === 'set') {
|
|
173
173
|
const [tool, mode, ...extra] = params;
|
|
174
174
|
if (!tool || extra.length > 0) {
|
|
175
|
-
throw usageError('policy set needs a tool and a mode.',
|
|
175
|
+
throw usageError('policy set needs a tool and a mode.', TEMPLATE_EDIT_HELP.policy);
|
|
176
176
|
}
|
|
177
177
|
body.policy.overrides[tool] = approval(mode, tool);
|
|
178
178
|
changes.push(`${tool} ${body.policy.overrides[tool]}`);
|
|
@@ -180,7 +180,7 @@ function editPolicy(args, body, action, params) {
|
|
|
180
180
|
else if (action === 'unset') {
|
|
181
181
|
const [tool, ...extra] = params;
|
|
182
182
|
if (!tool || extra.length > 0) {
|
|
183
|
-
throw usageError('policy unset needs a tool.',
|
|
183
|
+
throw usageError('policy unset needs a tool.', TEMPLATE_EDIT_HELP.policy);
|
|
184
184
|
}
|
|
185
185
|
if (!(tool in body.policy.overrides)) {
|
|
186
186
|
throw invalidStateError(`${tool} has no setting of its own on ${args.key}.`, `"ekanos agents policy ${args.key}" lists them.`);
|
|
@@ -189,10 +189,10 @@ function editPolicy(args, body, action, params) {
|
|
|
189
189
|
changes.push(`${tool} back to the default`);
|
|
190
190
|
}
|
|
191
191
|
else if (action !== undefined && action !== 'show' && action !== 'list') {
|
|
192
|
-
throw usageError(`Unknown policy action "${action}".`,
|
|
192
|
+
throw usageError(`Unknown policy action "${action}".`, TEMPLATE_EDIT_HELP.policy);
|
|
193
193
|
}
|
|
194
194
|
if (changes.length === 0) {
|
|
195
|
-
throw usageError('Nothing to change.',
|
|
195
|
+
throw usageError('Nothing to change.', TEMPLATE_EDIT_HELP.policy);
|
|
196
196
|
}
|
|
197
197
|
return { body, change: `Approvals: ${changes.join(', ')}` };
|
|
198
198
|
}
|
|
@@ -202,7 +202,7 @@ function editTriggers(args, body, action, params) {
|
|
|
202
202
|
if (action === 'remove') {
|
|
203
203
|
const [triggerKey, ...extra] = params;
|
|
204
204
|
if (!triggerKey || extra.length > 0) {
|
|
205
|
-
throw usageError('triggers remove needs a trigger key.',
|
|
205
|
+
throw usageError('triggers remove needs a trigger key.', TEMPLATE_EDIT_HELP.triggers);
|
|
206
206
|
}
|
|
207
207
|
const kept = triggers.filter((trigger) => trigger.key !== triggerKey);
|
|
208
208
|
if (kept.length === triggers.length) {
|
|
@@ -214,11 +214,11 @@ function editTriggers(args, body, action, params) {
|
|
|
214
214
|
};
|
|
215
215
|
}
|
|
216
216
|
if (action !== 'add') {
|
|
217
|
-
throw usageError(`Unknown triggers action "${action}".`,
|
|
217
|
+
throw usageError(`Unknown triggers action "${action}".`, TEMPLATE_EDIT_HELP.triggers);
|
|
218
218
|
}
|
|
219
219
|
const [type, triggerKey, ...extra] = params;
|
|
220
220
|
if (!type || !triggerKey || extra.length > 0) {
|
|
221
|
-
throw usageError('triggers add needs a type (event, schedule or webhook) and a key.',
|
|
221
|
+
throw usageError('triggers add needs a type (event, schedule or webhook) and a key.', TEMPLATE_EDIT_HELP.triggers);
|
|
222
222
|
}
|
|
223
223
|
if (triggers.some((trigger) => trigger.key === triggerKey)) {
|
|
224
224
|
throw invalidStateError(`${args.key} already has a trigger "${triggerKey}".`, `Remove it first ("ekanos agents triggers ${args.key} remove ${triggerKey}") or pick another key.`);
|
|
@@ -231,24 +231,24 @@ function editTriggers(args, body, action, params) {
|
|
|
231
231
|
let trigger;
|
|
232
232
|
if (type === 'event') {
|
|
233
233
|
if (!args.event) {
|
|
234
|
-
throw usageError('An event trigger needs --event <slug.event>.',
|
|
234
|
+
throw usageError('An event trigger needs --event <slug.event>.', TEMPLATE_EDIT_HELP.triggers);
|
|
235
235
|
}
|
|
236
236
|
trigger = Object.assign(Object.assign({}, common), { type: 'event', event: args.event, filter: parseFilters((_c = args.filter) !== null && _c !== void 0 ? _c : []) });
|
|
237
237
|
}
|
|
238
238
|
else if (type === 'schedule') {
|
|
239
239
|
if (!args.cron || !args.prompt) {
|
|
240
|
-
throw usageError('A schedule trigger needs --cron "<m h dom mon dow>" and --prompt.',
|
|
240
|
+
throw usageError('A schedule trigger needs --cron "<m h dom mon dow>" and --prompt.', TEMPLATE_EDIT_HELP.triggers);
|
|
241
241
|
}
|
|
242
242
|
trigger = Object.assign(Object.assign({}, common), { type: 'schedule', cron: args.cron, timezone: (_d = args.timezone) !== null && _d !== void 0 ? _d : 'UTC' });
|
|
243
243
|
}
|
|
244
244
|
else if (type === 'webhook') {
|
|
245
245
|
if (!args.prompt) {
|
|
246
|
-
throw usageError('A webhook trigger needs --prompt (what to do with each request).',
|
|
246
|
+
throw usageError('A webhook trigger needs --prompt (what to do with each request).', TEMPLATE_EDIT_HELP.triggers);
|
|
247
247
|
}
|
|
248
248
|
trigger = Object.assign(Object.assign({}, common), { type: 'webhook' });
|
|
249
249
|
}
|
|
250
250
|
else {
|
|
251
|
-
throw usageError(`Unknown trigger type "${type}": use event, schedule or webhook.`,
|
|
251
|
+
throw usageError(`Unknown trigger type "${type}": use event, schedule or webhook.`, TEMPLATE_EDIT_HELP.triggers);
|
|
252
252
|
}
|
|
253
253
|
return {
|
|
254
254
|
body: Object.assign(Object.assign({}, body), { triggers: [...triggers, trigger] }),
|
|
@@ -256,15 +256,22 @@ function editTriggers(args, body, action, params) {
|
|
|
256
256
|
};
|
|
257
257
|
}
|
|
258
258
|
/**
|
|
259
|
-
* `--filter
|
|
260
|
-
* (`tags=vip,urgent`),
|
|
259
|
+
* `--filter`, the same at the template and the team level. Repeatable
|
|
260
|
+
* `field=value`: a value with a comma is a list (`tags=vip,urgent`),
|
|
261
|
+
* `true`/`false` a switch, anything else text. Or one JSON object, the team
|
|
262
|
+
* level's older form. Both are accepted at both levels, and may be mixed
|
|
263
|
+
* (a later field wins).
|
|
261
264
|
*/
|
|
262
265
|
export function parseFilters(raw) {
|
|
263
266
|
const filter = {};
|
|
264
267
|
for (const entry of raw) {
|
|
268
|
+
if (entry.trim().startsWith('{')) {
|
|
269
|
+
Object.assign(filter, parseFilterJson(entry));
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
265
272
|
const at = entry.indexOf('=');
|
|
266
273
|
if (at <= 0) {
|
|
267
|
-
throw usageError(`--filter "${entry}" must be field=value
|
|
274
|
+
throw usageError(`--filter "${entry}" must be field=value, or a JSON object.`, FILTER_EXAMPLE);
|
|
268
275
|
}
|
|
269
276
|
const field = entry.slice(0, at).trim();
|
|
270
277
|
const value = entry.slice(at + 1).trim();
|
|
@@ -281,19 +288,43 @@ export function parseFilters(raw) {
|
|
|
281
288
|
}
|
|
282
289
|
return filter;
|
|
283
290
|
}
|
|
291
|
+
const FILTER_EXAMPLE = `e.g. --filter labels=feedback --filter priority=urgent,high, or --filter '{"priority":["urgent","high"]}'`;
|
|
292
|
+
function parseFilterJson(raw) {
|
|
293
|
+
let parsed;
|
|
294
|
+
try {
|
|
295
|
+
parsed = JSON.parse(raw);
|
|
296
|
+
}
|
|
297
|
+
catch (_a) {
|
|
298
|
+
throw usageError('--filter is not valid JSON.', FILTER_EXAMPLE);
|
|
299
|
+
}
|
|
300
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
301
|
+
throw usageError('--filter must be a JSON object.', FILTER_EXAMPLE);
|
|
302
|
+
}
|
|
303
|
+
const filter = {};
|
|
304
|
+
for (const [name, value] of Object.entries(parsed)) {
|
|
305
|
+
if (typeof value === 'string' ||
|
|
306
|
+
typeof value === 'boolean' ||
|
|
307
|
+
(Array.isArray(value) && value.every((item) => typeof item === 'string'))) {
|
|
308
|
+
filter[name] = value;
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
throw usageError(`--filter field "${name}" must be a string, a boolean or a list of strings.`, FILTER_EXAMPLE);
|
|
312
|
+
}
|
|
313
|
+
return filter;
|
|
314
|
+
}
|
|
284
315
|
function editLinks(args, body, action, params) {
|
|
285
316
|
var _a;
|
|
286
317
|
const links = [...((_a = body.links) !== null && _a !== void 0 ? _a : [])];
|
|
287
318
|
const [to, ...extra] = params;
|
|
288
319
|
if ((action === 'add' || action === 'remove') && (!to || extra.length > 0)) {
|
|
289
|
-
throw usageError(`links ${action} needs the other agent's key.`,
|
|
320
|
+
throw usageError(`links ${action} needs the other agent's key.`, TEMPLATE_EDIT_HELP.links);
|
|
290
321
|
}
|
|
291
322
|
const kind = args.kind === undefined
|
|
292
323
|
? undefined
|
|
293
324
|
: args.kind === 'talk' || args.kind === 'delegate'
|
|
294
325
|
? args.kind
|
|
295
326
|
: (() => {
|
|
296
|
-
throw usageError(`--kind must be "talk" or "delegate" (got "${args.kind}").`,
|
|
327
|
+
throw usageError(`--kind must be "talk" or "delegate" (got "${args.kind}").`, TEMPLATE_EDIT_HELP.links);
|
|
297
328
|
})();
|
|
298
329
|
if (action === 'add') {
|
|
299
330
|
const target = AgentTemplateKeySchema.safeParse(to);
|
|
@@ -301,17 +332,17 @@ function editLinks(args, body, action, params) {
|
|
|
301
332
|
throw usageError(`"${to}" is not another agent's key.`, '"ekanos agents list" shows them.');
|
|
302
333
|
}
|
|
303
334
|
if (!kind) {
|
|
304
|
-
throw usageError('links add needs --kind talk|delegate.',
|
|
335
|
+
throw usageError('links add needs --kind talk|delegate.', TEMPLATE_EDIT_HELP.links);
|
|
305
336
|
}
|
|
306
337
|
if (args.mode !== undefined && kind === 'talk') {
|
|
307
|
-
throw usageError('Only a delegate link takes --mode.',
|
|
338
|
+
throw usageError('Only a delegate link takes --mode.', TEMPLATE_EDIT_HELP.links);
|
|
308
339
|
}
|
|
309
340
|
const mode = args.mode === undefined
|
|
310
341
|
? undefined
|
|
311
342
|
: args.mode === 'await' || args.mode === 'handoff'
|
|
312
343
|
? args.mode
|
|
313
344
|
: (() => {
|
|
314
|
-
throw usageError(`--mode must be "await" or "handoff" (got "${args.mode}").`,
|
|
345
|
+
throw usageError(`--mode must be "await" or "handoff" (got "${args.mode}").`, TEMPLATE_EDIT_HELP.links);
|
|
315
346
|
})();
|
|
316
347
|
const link = Object.assign({ to: target.data, kind }, (mode ? { mode } : {}));
|
|
317
348
|
const others = links.filter((existing) => !(existing.to === to && existing.kind === kind));
|
|
@@ -330,15 +361,15 @@ function editLinks(args, body, action, params) {
|
|
|
330
361
|
change: `Removed link ${args.key} → ${to}`,
|
|
331
362
|
};
|
|
332
363
|
}
|
|
333
|
-
throw usageError(`Unknown links action "${action}".`,
|
|
364
|
+
throw usageError(`Unknown links action "${action}".`, TEMPLATE_EDIT_HELP.links);
|
|
334
365
|
}
|
|
335
366
|
function editOverrides(args, body, action, params) {
|
|
336
367
|
if (action !== 'enable' && action !== 'disable') {
|
|
337
|
-
throw usageError(`Unknown overrides action "${action}".`,
|
|
368
|
+
throw usageError(`Unknown overrides action "${action}".`, TEMPLATE_EDIT_HELP.overrides);
|
|
338
369
|
}
|
|
339
370
|
const [area, ...extra] = params;
|
|
340
371
|
if (!AREAS.some((name) => name === area) || extra.length > 0) {
|
|
341
|
-
throw usageError(`overrides ${action} needs one area: policy, triggers or links.`,
|
|
372
|
+
throw usageError(`overrides ${action} needs one area: policy, triggers or links.`, TEMPLATE_EDIT_HELP.overrides);
|
|
342
373
|
}
|
|
343
374
|
const name = area;
|
|
344
375
|
return {
|
|
@@ -363,7 +394,7 @@ function staleLocalFile(dir, key, version) {
|
|
|
363
394
|
return null;
|
|
364
395
|
}
|
|
365
396
|
}
|
|
366
|
-
const
|
|
397
|
+
export const TEMPLATE_EDIT_HELP = {
|
|
367
398
|
policy: 'e.g. "ekanos agents policy <key> set zendesk_add_comment approve", ' +
|
|
368
399
|
'"ekanos agents policy <key> unset <tool>", ' +
|
|
369
400
|
'"ekanos agents policy <key> --reads auto --writes approve".',
|
|
@@ -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 TEMPLATE_EDIT_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 TEMPLATE_EDIT_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 TEMPLATE_EDIT_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(\n 'policy set needs a tool and a mode.',\n TEMPLATE_EDIT_HELP.policy,\n );\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.', TEMPLATE_EDIT_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(\n `Unknown policy action \"${action}\".`,\n TEMPLATE_EDIT_HELP.policy,\n );\n }\n if (changes.length === 0) {\n throw usageError('Nothing to change.', TEMPLATE_EDIT_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(\n 'triggers remove needs a trigger key.',\n TEMPLATE_EDIT_HELP.triggers,\n );\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(\n `Unknown triggers action \"${action}\".`,\n TEMPLATE_EDIT_HELP.triggers,\n );\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 TEMPLATE_EDIT_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 TEMPLATE_EDIT_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 TEMPLATE_EDIT_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 TEMPLATE_EDIT_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 TEMPLATE_EDIT_HELP.triggers,\n );\n }\n return {\n body: { ...body, triggers: [...triggers, trigger] },\n change: `Added trigger ${triggerKey}`,\n };\n}\n\n/**\n * `--filter`, the same at the template and the team level. Repeatable\n * `field=value`: a value with a comma is a list (`tags=vip,urgent`),\n * `true`/`false` a switch, anything else text. Or one JSON object, the team\n * level's older form. Both are accepted at both levels, and may be mixed\n * (a later field wins).\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 if (entry.trim().startsWith('{')) {\n Object.assign(filter, parseFilterJson(entry));\n continue;\n }\n const at = entry.indexOf('=');\n if (at <= 0) {\n throw usageError(\n `--filter \"${entry}\" must be field=value, or a JSON object.`,\n FILTER_EXAMPLE,\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\nconst FILTER_EXAMPLE = `e.g. --filter labels=feedback --filter priority=urgent,high, or --filter '{\"priority\":[\"urgent\",\"high\"]}'`;\n\nfunction parseFilterJson(\n raw: string,\n): Record<string, string | boolean | string[]> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw usageError('--filter is not valid JSON.', FILTER_EXAMPLE);\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw usageError('--filter must be a JSON object.', FILTER_EXAMPLE);\n }\n const filter: Record<string, string | boolean | string[]> = {};\n for (const [name, value] of Object.entries(parsed)) {\n if (\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n (Array.isArray(value) && value.every((item) => typeof item === 'string'))\n ) {\n filter[name] = value as string | boolean | string[];\n continue;\n }\n throw usageError(\n `--filter field \"${name}\" must be a string, a boolean or a list of strings.`,\n FILTER_EXAMPLE,\n );\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 TEMPLATE_EDIT_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 TEMPLATE_EDIT_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(\n 'links add needs --kind talk|delegate.',\n TEMPLATE_EDIT_HELP.links,\n );\n }\n if (args.mode !== undefined && kind === 'talk') {\n throw usageError(\n 'Only a delegate link takes --mode.',\n TEMPLATE_EDIT_HELP.links,\n );\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 TEMPLATE_EDIT_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(\n `Unknown links action \"${action}\".`,\n TEMPLATE_EDIT_HELP.links,\n );\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(\n `Unknown overrides action \"${action}\".`,\n TEMPLATE_EDIT_HELP.overrides,\n );\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 TEMPLATE_EDIT_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\nexport const TEMPLATE_EDIT_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 AgentTemplateBody } 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 AGENTS_SUBCOMMANDS: readonly ['init', 'list', 'show', 'pull', 'apply', 'publish', 'rollback', 'test', 'policy', 'triggers', 'links', 'overrides'];
|
|
4
|
+
export declare const AGENTS_SUBCOMMANDS: readonly ['init', 'list', 'show', 'pull', 'apply', 'publish', 'rollback', 'archive', 'unarchive', 'test', 'policy', 'triggers', 'links', 'overrides'];
|
|
5
5
|
/** The file `pull` writes and `apply` reads, inside an agent's directory. */
|
|
6
6
|
export declare const AGENT_FILE = "agent.json";
|
|
7
7
|
/** Instructions as Markdown, beside it. Used when `agent.json` has none. */
|
|
@@ -18,7 +18,12 @@ export interface AgentsArgs {
|
|
|
18
18
|
overwrite: boolean;
|
|
19
19
|
out?: string;
|
|
20
20
|
yes: boolean;
|
|
21
|
-
/** `
|
|
21
|
+
/** `list`: archived agents too. */
|
|
22
|
+
all?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* `init`: replace the skills and CLAUDE.md even when they exist. `pull`:
|
|
25
|
+
* overwrite local files that differ from the host's.
|
|
26
|
+
*/
|
|
22
27
|
force?: boolean;
|
|
23
28
|
/**
|
|
24
29
|
* `apply`: push the skill folders beside the agent (`<dir>/skills/<slug>/`)
|
|
@@ -40,6 +45,12 @@ export interface AgentsArgs {
|
|
|
40
45
|
writes?: string;
|
|
41
46
|
/** `policy | triggers | links | overrides`: publish the stored version right away. */
|
|
42
47
|
publish?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* `publish` / `rollback` (and an edit's `--publish`): also confirm, as
|
|
50
|
+
* yourself, that the agent may use your connections on every team where
|
|
51
|
+
* it runs as you.
|
|
52
|
+
*/
|
|
53
|
+
confirmAccess?: boolean;
|
|
43
54
|
dir: string;
|
|
44
55
|
env: Record<string, string | undefined>;
|
|
45
56
|
stdinIsTTY?: boolean;
|