@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.
Files changed (175) hide show
  1. package/README.md +25 -8
  2. package/dist/agents-api.d.ts +11 -2
  3. package/dist/agents-api.js +39 -3
  4. package/dist/agents-api.js.map +1 -1
  5. package/dist/apps-api.d.ts +3 -2
  6. package/dist/apps-api.js +3 -7
  7. package/dist/apps-api.js.map +1 -1
  8. package/dist/auth/ekanos-api.d.ts +16 -2
  9. package/dist/auth/ekanos-api.js +101 -15
  10. package/dist/auth/ekanos-api.js.map +1 -1
  11. package/dist/auth/host-trust.d.ts +46 -0
  12. package/dist/auth/host-trust.js +79 -0
  13. package/dist/auth/host-trust.js.map +1 -0
  14. package/dist/auth/session.d.ts +10 -1
  15. package/dist/auth/session.js +28 -28
  16. package/dist/auth/session.js.map +1 -1
  17. package/dist/commands/agents-edit.d.ts +6 -2
  18. package/dist/commands/agents-edit.js +57 -26
  19. package/dist/commands/agents-edit.js.map +1 -1
  20. package/dist/commands/agents.d.ts +13 -2
  21. package/dist/commands/agents.js +148 -36
  22. package/dist/commands/agents.js.map +1 -1
  23. package/dist/commands/apps.d.ts +15 -4
  24. package/dist/commands/apps.js +133 -51
  25. package/dist/commands/apps.js.map +1 -1
  26. package/dist/commands/catalog.js +7 -6
  27. package/dist/commands/catalog.js.map +1 -1
  28. package/dist/commands/knowledge.d.ts +56 -0
  29. package/dist/commands/knowledge.js +456 -0
  30. package/dist/commands/knowledge.js.map +1 -0
  31. package/dist/commands/login.d.ts +4 -0
  32. package/dist/commands/login.js +30 -2
  33. package/dist/commands/login.js.map +1 -1
  34. package/dist/commands/logout.d.ts +9 -1
  35. package/dist/commands/logout.js +56 -7
  36. package/dist/commands/logout.js.map +1 -1
  37. package/dist/commands/publish.js +3 -3
  38. package/dist/commands/publish.js.map +1 -1
  39. package/dist/commands/reviewers.d.ts +2 -0
  40. package/dist/commands/reviewers.js +7 -3
  41. package/dist/commands/reviewers.js.map +1 -1
  42. package/dist/commands/routes.d.ts +2 -0
  43. package/dist/commands/routes.js +42 -9
  44. package/dist/commands/routes.js.map +1 -1
  45. package/dist/commands/runs.d.ts +13 -2
  46. package/dist/commands/runs.js +96 -15
  47. package/dist/commands/runs.js.map +1 -1
  48. package/dist/commands/scope-notice.d.ts +21 -0
  49. package/dist/commands/scope-notice.js +35 -0
  50. package/dist/commands/scope-notice.js.map +1 -0
  51. package/dist/commands/skills.d.ts +7 -1
  52. package/dist/commands/skills.js +80 -24
  53. package/dist/commands/skills.js.map +1 -1
  54. package/dist/commands/sources.d.ts +4 -0
  55. package/dist/commands/sources.js +233 -5
  56. package/dist/commands/sources.js.map +1 -1
  57. package/dist/commands/status.js +5 -4
  58. package/dist/commands/status.js.map +1 -1
  59. package/dist/commands/team-agent-readiness.d.ts +59 -0
  60. package/dist/commands/team-agent-readiness.js +341 -0
  61. package/dist/commands/team-agent-readiness.js.map +1 -0
  62. package/dist/commands/team-agents-agents.d.ts +24 -3
  63. package/dist/commands/team-agents-agents.js +336 -35
  64. package/dist/commands/team-agents-agents.js.map +1 -1
  65. package/dist/commands/team-agents-mcp.js +32 -3
  66. package/dist/commands/team-agents-mcp.js.map +1 -1
  67. package/dist/commands/team-agents-triggers.js +230 -54
  68. package/dist/commands/team-agents-triggers.js.map +1 -1
  69. package/dist/commands/team-agents.d.ts +3 -1
  70. package/dist/commands/team-agents.js +27 -7
  71. package/dist/commands/team-agents.js.map +1 -1
  72. package/dist/commands/teams-channel-install.d.ts +24 -0
  73. package/dist/commands/teams-channel-install.js +94 -0
  74. package/dist/commands/teams-channel-install.js.map +1 -0
  75. package/dist/commands/teams-connect.d.ts +66 -0
  76. package/dist/commands/teams-connect.js +397 -0
  77. package/dist/commands/teams-connect.js.map +1 -0
  78. package/dist/commands/teams-events.d.ts +12 -0
  79. package/dist/commands/teams-events.js +138 -0
  80. package/dist/commands/teams-events.js.map +1 -0
  81. package/dist/commands/teams-onboard.d.ts +16 -5
  82. package/dist/commands/teams-onboard.js +61 -36
  83. package/dist/commands/teams-onboard.js.map +1 -1
  84. package/dist/commands/teams-overview.d.ts +11 -0
  85. package/dist/commands/teams-overview.js +160 -0
  86. package/dist/commands/teams-overview.js.map +1 -0
  87. package/dist/commands/teams-scope.d.ts +10 -0
  88. package/dist/commands/teams-scope.js +109 -0
  89. package/dist/commands/teams-scope.js.map +1 -0
  90. package/dist/commands/teams.d.ts +64 -7
  91. package/dist/commands/teams.js +254 -60
  92. package/dist/commands/teams.js.map +1 -1
  93. package/dist/commands/upgrade.js +12 -2
  94. package/dist/commands/upgrade.js.map +1 -1
  95. package/dist/commands/use.js +2 -2
  96. package/dist/commands/use.js.map +1 -1
  97. package/dist/commands/whoami.js +1 -1
  98. package/dist/commands/whoami.js.map +1 -1
  99. package/dist/connections-api.js +1 -1
  100. package/dist/connections-api.js.map +1 -1
  101. package/dist/delegate.js +11 -4
  102. package/dist/delegate.js.map +1 -1
  103. package/dist/harness-scaffold.js +12 -0
  104. package/dist/harness-scaffold.js.map +1 -1
  105. package/dist/index.d.ts +6 -0
  106. package/dist/index.js +724 -152
  107. package/dist/index.js.map +1 -1
  108. package/dist/knowledge-api.d.ts +175 -0
  109. package/dist/knowledge-api.js +169 -0
  110. package/dist/knowledge-api.js.map +1 -0
  111. package/dist/open-url.d.ts +16 -0
  112. package/dist/open-url.js +73 -0
  113. package/dist/open-url.js.map +1 -0
  114. package/dist/parse-argv.d.ts +2 -0
  115. package/dist/parse-argv.js.map +1 -1
  116. package/dist/publish-api.d.ts +2 -1
  117. package/dist/publish-api.js +4 -3
  118. package/dist/publish-api.js.map +1 -1
  119. package/dist/pull-write.d.ts +27 -0
  120. package/dist/pull-write.js +60 -0
  121. package/dist/pull-write.js.map +1 -0
  122. package/dist/routes-api.d.ts +3 -0
  123. package/dist/routes-api.js +9 -4
  124. package/dist/routes-api.js.map +1 -1
  125. package/dist/runs-api.d.ts +7 -1
  126. package/dist/runs-api.js +21 -6
  127. package/dist/runs-api.js.map +1 -1
  128. package/dist/safe-fs.d.ts +2 -0
  129. package/dist/safe-fs.js +12 -6
  130. package/dist/safe-fs.js.map +1 -1
  131. package/dist/secret-file.d.ts +17 -0
  132. package/dist/secret-file.js +69 -0
  133. package/dist/secret-file.js.map +1 -0
  134. package/dist/skills-api.d.ts +10 -2
  135. package/dist/skills-api.js +37 -2
  136. package/dist/skills-api.js.map +1 -1
  137. package/dist/source-products-api.d.ts +63 -0
  138. package/dist/source-products-api.js +123 -0
  139. package/dist/source-products-api.js.map +1 -0
  140. package/dist/source-target.js +2 -1
  141. package/dist/source-target.js.map +1 -1
  142. package/dist/sources-api.d.ts +2 -1
  143. package/dist/sources-api.js +3 -2
  144. package/dist/sources-api.js.map +1 -1
  145. package/dist/team-connect-api.d.ts +286 -0
  146. package/dist/team-connect-api.js +107 -0
  147. package/dist/team-connect-api.js.map +1 -0
  148. package/dist/teams-api.d.ts +42 -1
  149. package/dist/teams-api.js +98 -20
  150. package/dist/teams-api.js.map +1 -1
  151. package/dist/toolchain-api.d.ts +9 -0
  152. package/dist/toolchain-api.js +17 -2
  153. package/dist/toolchain-api.js.map +1 -1
  154. package/dist/toolchain-resolve.d.ts +3 -0
  155. package/dist/toolchain-resolve.js +15 -1
  156. package/dist/toolchain-resolve.js.map +1 -1
  157. package/dist/toolchain.d.ts +6 -0
  158. package/dist/toolchain.js +19 -0
  159. package/dist/toolchain.js.map +1 -1
  160. package/dist/update-notice.js +2 -1
  161. package/dist/update-notice.js.map +1 -1
  162. package/package.json +2 -2
  163. package/templates/AGENTS.md.tmpl +6 -1
  164. package/templates/claude-skill.md.tmpl +5 -0
  165. package/templates/package.json.tmpl +4 -4
  166. package/templates/skills/build-agent/SKILL.md +115 -16
  167. package/templates/skills/build-agent/references/agent-json.md +26 -8
  168. package/templates/skills/build-agent/references/app-setup.md +2 -1
  169. package/templates/skills/build-agent/references/rollout.md +27 -4
  170. package/templates/skills/build-agent/references/set-up-an-integration.md +74 -15
  171. package/templates/skills/build-agent/references/skills.md +20 -1
  172. package/templates/skills/build-agent/references/triggers.md +84 -20
  173. package/templates/skills/build-integration/references/widget-design.md +3 -3
  174. package/templates/skills/ekanos-platform/SKILL.md +70 -17
  175. 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.`, HELP[args.subcommand]);
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'), HELP[args.subcommand]);
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 : ''}").`, HELP.policy);
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.', HELP.policy);
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.', HELP.policy);
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}".`, HELP.policy);
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.', HELP.policy);
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.', HELP.triggers);
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}".`, HELP.triggers);
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.', HELP.triggers);
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>.', HELP.triggers);
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.', HELP.triggers);
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).', HELP.triggers);
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.`, HELP.triggers);
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 field=value`, repeatable. A value with a comma is a list
260
- * (`tags=vip,urgent`), `true`/`false` a switch, anything else text.
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.`, 'e.g. --filter tags=vip,urgent --filter reply_as=internal_note');
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.`, HELP.links);
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}").`, HELP.links);
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.', HELP.links);
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.', HELP.links);
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}").`, HELP.links);
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}".`, HELP.links);
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}".`, HELP.overrides);
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.`, HELP.overrides);
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 HELP = {
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
- /** `init`: replace the skills and CLAUDE.md even when they exist. */
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;