@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
package/dist/commands/agents.js
CHANGED
|
@@ -12,9 +12,11 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
12
12
|
import { AgentTemplateBodySchema, AgentTemplateKeySchema, } from '@ekanos/integration-schema';
|
|
13
13
|
import * as fs from 'node:fs';
|
|
14
14
|
import * as path from 'node:path';
|
|
15
|
-
import { applyAgentTemplate, listAgentTemplates, publishAgentTemplate, showAgentTemplate, } from '../agents-api.js';
|
|
15
|
+
import { applyAgentTemplate, archiveAgentTemplate, listAgentTemplates, publishAgentTemplate, showAgentTemplate, } from '../agents-api.js';
|
|
16
|
+
import { loginHint } from '../auth/host-trust.js';
|
|
16
17
|
import { refreshStoredSession, requireSession, resolveAuthEnvironment, } from '../auth/session.js';
|
|
17
|
-
import { authRequiredError, notFoundError, usageError, validationError, } from '../errors.js';
|
|
18
|
+
import { authRequiredError, invalidStateError, notFoundError, usageError, validationError, } from '../errors.js';
|
|
19
|
+
import { writePulledFiles } from '../pull-write.js';
|
|
18
20
|
import { classifyPath } from '../safe-fs.js';
|
|
19
21
|
import { resolveSourceTarget } from '../source-target.js';
|
|
20
22
|
import { pluralize } from '../ui.js';
|
|
@@ -23,6 +25,7 @@ import { runAgentsInit, withDocsHint } from './agents-init.js';
|
|
|
23
25
|
import { promptYesNo } from './publish.js';
|
|
24
26
|
import { runAgentTest } from './runs.js';
|
|
25
27
|
import { AGENT_SKILLS_DIR, SkillsClient, findAgentSkillFolders, pushSkillFolder, pushSummary, readSkillFolder, } from './skills.js';
|
|
28
|
+
import { describeHold } from './team-agent-readiness.js';
|
|
26
29
|
export const AGENTS_SUBCOMMANDS = [
|
|
27
30
|
'init',
|
|
28
31
|
'list',
|
|
@@ -31,6 +34,8 @@ export const AGENTS_SUBCOMMANDS = [
|
|
|
31
34
|
'apply',
|
|
32
35
|
'publish',
|
|
33
36
|
'rollback',
|
|
37
|
+
'archive',
|
|
38
|
+
'unarchive',
|
|
34
39
|
'test',
|
|
35
40
|
'policy',
|
|
36
41
|
'triggers',
|
|
@@ -92,7 +97,7 @@ export async function runAgents(ctx, args) {
|
|
|
92
97
|
const env = resolveAuthEnvironment(ctx, args.host, args.env, {
|
|
93
98
|
projectDir: args.dir,
|
|
94
99
|
});
|
|
95
|
-
const resolved = await resolveSourceTarget(env, requireSession(env
|
|
100
|
+
const resolved = await resolveSourceTarget(env, requireSession(env), args);
|
|
96
101
|
const client = new AgentsClient(env, resolved.session);
|
|
97
102
|
const source = resolved.source;
|
|
98
103
|
if (isTemplateEditSubcommand(subcommand)) {
|
|
@@ -134,15 +139,30 @@ export async function runAgents(ctx, args) {
|
|
|
134
139
|
source,
|
|
135
140
|
key,
|
|
136
141
|
version,
|
|
142
|
+
confirmAccess: args.confirmAccess === true,
|
|
137
143
|
}));
|
|
138
144
|
},
|
|
139
|
-
summarize: (result) => resultSummary(ctx.ui, result),
|
|
145
|
+
summarize: (result) => resultSummary(ctx.ui, result, source),
|
|
140
146
|
});
|
|
141
147
|
}
|
|
142
148
|
switch (subcommand) {
|
|
143
149
|
case 'list': {
|
|
144
150
|
const list = await client.call((token) => listAgentTemplates(env.host, token, source));
|
|
145
|
-
|
|
151
|
+
// Archived agents are retired: listed only on request.
|
|
152
|
+
const shown = args.all === true
|
|
153
|
+
? list
|
|
154
|
+
: Object.assign(Object.assign({}, list), { templates: list.templates.filter((template) => template.status !== 'archived') });
|
|
155
|
+
const hidden = list.templates.length - shown.templates.length;
|
|
156
|
+
return ctx.succeed(Object.assign({ host: env.host }, shown), withDocsHint(ctx.ui, args.dir, listSummary(ctx.ui, shown, hidden)));
|
|
157
|
+
}
|
|
158
|
+
case 'archive':
|
|
159
|
+
case 'unarchive': {
|
|
160
|
+
const key = requireKey(args.target, subcommand);
|
|
161
|
+
if (subcommand === 'archive') {
|
|
162
|
+
await confirmArchive(ctx, args, { key, source });
|
|
163
|
+
}
|
|
164
|
+
const result = await client.call((token) => archiveAgentTemplate(env.host, token, subcommand, { source, key }));
|
|
165
|
+
return ctx.succeed(Object.assign({ host: env.host }, result), archiveSummary(ctx.ui, result, subcommand));
|
|
146
166
|
}
|
|
147
167
|
case 'show': {
|
|
148
168
|
const key = requireKey(args.target, 'show');
|
|
@@ -153,7 +173,13 @@ export async function runAgents(ctx, args) {
|
|
|
153
173
|
const key = requireKey(args.target, 'pull');
|
|
154
174
|
const shown = await client.call((token) => showAgentTemplate(env.host, token, source, key));
|
|
155
175
|
const outDir = path.resolve(args.dir, (_f = args.out) !== null && _f !== void 0 ? _f : path.join('agents', key));
|
|
156
|
-
const written =
|
|
176
|
+
const written = writePulledFiles({
|
|
177
|
+
projectDir: args.dir,
|
|
178
|
+
outDir,
|
|
179
|
+
files: agentFiles(shown.template),
|
|
180
|
+
force: args.force === true,
|
|
181
|
+
rerun: `ekanos agents pull ${key}`,
|
|
182
|
+
});
|
|
157
183
|
return ctx.succeed({
|
|
158
184
|
host: env.host,
|
|
159
185
|
key,
|
|
@@ -189,7 +215,7 @@ export async function runAgents(ctx, args) {
|
|
|
189
215
|
}
|
|
190
216
|
return ctx.succeed(Object.assign(Object.assign({ host: env.host }, result), { skills: pushedSkills }), [
|
|
191
217
|
...pushedSkills.map((pushed) => pushSummary(ctx.ui, pushed)),
|
|
192
|
-
resultSummary(ctx.ui, result),
|
|
218
|
+
resultSummary(ctx.ui, result, source),
|
|
193
219
|
].join('\n\n'));
|
|
194
220
|
}
|
|
195
221
|
case 'publish':
|
|
@@ -221,8 +247,9 @@ export async function runAgents(ctx, args) {
|
|
|
221
247
|
source,
|
|
222
248
|
key,
|
|
223
249
|
version,
|
|
250
|
+
confirmAccess: args.confirmAccess === true,
|
|
224
251
|
}));
|
|
225
|
-
return ctx.succeed(Object.assign({ host: env.host }, result), resultSummary(ctx.ui, result));
|
|
252
|
+
return ctx.succeed(Object.assign({ host: env.host }, result), resultSummary(ctx.ui, result, source));
|
|
226
253
|
}
|
|
227
254
|
}
|
|
228
255
|
}
|
|
@@ -240,7 +267,7 @@ class AgentsClient {
|
|
|
240
267
|
}
|
|
241
268
|
if (result.status === 'ok')
|
|
242
269
|
return result.data;
|
|
243
|
-
throw authRequiredError(`The session for ${this.env.host} could not authorize the agents call.`,
|
|
270
|
+
throw authRequiredError(`The session for ${this.env.host} could not authorize the agents call.`, loginHint(this.env));
|
|
244
271
|
}
|
|
245
272
|
}
|
|
246
273
|
function parseSubcommand(value) {
|
|
@@ -340,25 +367,22 @@ export function readAgentInput(target, cwd) {
|
|
|
340
367
|
return { key: key.data, body: body.data, baseVersion, file };
|
|
341
368
|
}
|
|
342
369
|
/**
|
|
343
|
-
*
|
|
344
|
-
*
|
|
345
|
-
*
|
|
370
|
+
* `agent.json` + `AGENT.md`. The instructions live in the Markdown so they
|
|
371
|
+
* read and diff as prose; the JSON holds everything else plus the version
|
|
372
|
+
* they came from.
|
|
346
373
|
*/
|
|
347
|
-
function
|
|
348
|
-
fs.mkdirSync(outDir, { recursive: true });
|
|
374
|
+
function agentFiles(template) {
|
|
349
375
|
const _a = template.body, { instructions } = _a, rest = __rest(_a, ["instructions"]);
|
|
350
376
|
const json = Object.assign({ key: template.key, baseVersion: template.latestVersion }, rest);
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
fs.writeFileSync(mdPath, instructions.endsWith('\n') ? instructions : `${instructions}\n`);
|
|
361
|
-
return [jsonPath, mdPath];
|
|
377
|
+
return [
|
|
378
|
+
{ path: AGENT_FILE, contents: `${JSON.stringify(json, null, 2)}\n` },
|
|
379
|
+
{
|
|
380
|
+
path: AGENT_INSTRUCTIONS_FILE,
|
|
381
|
+
contents: instructions.endsWith('\n')
|
|
382
|
+
? instructions
|
|
383
|
+
: `${instructions}\n`,
|
|
384
|
+
},
|
|
385
|
+
];
|
|
362
386
|
}
|
|
363
387
|
/** After a stored version, point the file at it, so the next apply is based on it. */
|
|
364
388
|
function recordBaseVersion(file, version) {
|
|
@@ -391,6 +415,42 @@ async function confirmPublish(ctx, args, target) {
|
|
|
391
415
|
throw validationError(`${target.what} was not confirmed.`, 'Nothing was changed.');
|
|
392
416
|
}
|
|
393
417
|
}
|
|
418
|
+
/**
|
|
419
|
+
* Archiving takes the agent away from every team that has not turned it on,
|
|
420
|
+
* and the host refuses it while any team has. A human run asks first; a
|
|
421
|
+
* scripted or JSON run needs `--yes`.
|
|
422
|
+
*/
|
|
423
|
+
async function confirmArchive(ctx, args, target) {
|
|
424
|
+
var _a;
|
|
425
|
+
if (args.yes)
|
|
426
|
+
return;
|
|
427
|
+
if (!canPrompt(ctx, args)) {
|
|
428
|
+
throw invalidStateError(`Archiving ${target.key} on ${target.source} means no team can turn it on, and it cannot be applied or published, until it is unarchived.`, `Re-run with --yes: ekanos agents archive ${target.key} --source ${target.source} --yes`);
|
|
429
|
+
}
|
|
430
|
+
const confirmed = await ((_a = args.confirm) !== null && _a !== void 0 ? _a : promptYesNo)(`Archive ${target.key} on ${target.source}? No team can turn it on until "ekanos agents unarchive ${target.key}". [y/N]`);
|
|
431
|
+
if (!confirmed) {
|
|
432
|
+
throw validationError(`Archiving ${target.key} was not confirmed.`, 'Nothing was changed.');
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
function archiveSummary(ui, result, action) {
|
|
436
|
+
const { template } = result;
|
|
437
|
+
if (result.outcome === 'unchanged') {
|
|
438
|
+
return ui.result({
|
|
439
|
+
title: `Unchanged: ${template.key} is already ${action === 'archive' ? 'archived' : 'active'}`,
|
|
440
|
+
tone: 'warn',
|
|
441
|
+
rows: [['Versions', versionLabel(template)]],
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
return ui.result({
|
|
445
|
+
title: `${result.outcome === 'archived' ? 'Archived' : 'Unarchived'}: ${template.key}`,
|
|
446
|
+
rows: [['Versions', versionLabel(template)]],
|
|
447
|
+
notes: [
|
|
448
|
+
result.outcome === 'archived'
|
|
449
|
+
? `Teams can no longer turn it on. "ekanos agents unarchive ${template.key}" brings it back.`
|
|
450
|
+
: `Teams can turn it on again${template.publishedVersion === null ? ' once it is published' : ''}.`,
|
|
451
|
+
],
|
|
452
|
+
});
|
|
453
|
+
}
|
|
394
454
|
function versionLabel(template) {
|
|
395
455
|
if (template.publishedVersion === null)
|
|
396
456
|
return `v${template.latestVersion} draft, never published`;
|
|
@@ -398,13 +458,21 @@ function versionLabel(template) {
|
|
|
398
458
|
return `v${template.latestVersion} published`;
|
|
399
459
|
return `v${template.publishedVersion} published, v${template.latestVersion} latest`;
|
|
400
460
|
}
|
|
401
|
-
function listSummary(ui, list) {
|
|
461
|
+
function listSummary(ui, list, hidden) {
|
|
462
|
+
const archivedHint = hidden > 0
|
|
463
|
+
? ui.hint(`${pluralize(hidden, 'archived agent')} not shown; --all lists ${hidden === 1 ? 'it' : 'them'}.`)
|
|
464
|
+
: null;
|
|
402
465
|
if (list.templates.length === 0) {
|
|
403
|
-
return
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
466
|
+
return [
|
|
467
|
+
ui.result({
|
|
468
|
+
title: hidden > 0
|
|
469
|
+
? `No active agents on ${list.source.slug}`
|
|
470
|
+
: `No agents on ${list.source.slug} yet`,
|
|
471
|
+
tone: 'warn',
|
|
472
|
+
notes: ['"ekanos agents apply <dir>" stores the first one.'],
|
|
473
|
+
}),
|
|
474
|
+
...(archivedHint ? [archivedHint] : []),
|
|
475
|
+
].join('\n\n');
|
|
408
476
|
}
|
|
409
477
|
return [
|
|
410
478
|
ui.result({
|
|
@@ -424,10 +492,11 @@ function listSummary(ui, list) {
|
|
|
424
492
|
]),
|
|
425
493
|
}),
|
|
426
494
|
ui.hint('"ekanos agents show <key>" shows one, with its versions.'),
|
|
495
|
+
...(archivedHint ? [archivedHint] : []),
|
|
427
496
|
].join('\n\n');
|
|
428
497
|
}
|
|
429
498
|
function templateDetail(ui, template) {
|
|
430
|
-
var _a;
|
|
499
|
+
var _a, _b;
|
|
431
500
|
const { body } = template;
|
|
432
501
|
const rows = [
|
|
433
502
|
['Versions', versionLabel(template)],
|
|
@@ -450,12 +519,21 @@ function templateDetail(ui, template) {
|
|
|
450
519
|
areaRows('overrides', body).map(([area, value]) => `${area}: ${value}`),
|
|
451
520
|
],
|
|
452
521
|
];
|
|
522
|
+
if (template.status === 'archived') {
|
|
523
|
+
rows.unshift([
|
|
524
|
+
'Status',
|
|
525
|
+
`archived: no team can turn it on; "ekanos agents unarchive ${template.key}" brings it back`,
|
|
526
|
+
]);
|
|
527
|
+
}
|
|
453
528
|
if (template.teams) {
|
|
454
529
|
rows.push([
|
|
455
530
|
'Teams',
|
|
456
531
|
`${template.teams.enabled} running` +
|
|
457
532
|
(template.teams.pinned > 0
|
|
458
533
|
? `, ${template.teams.pinned} pinned to an older version`
|
|
534
|
+
: '') +
|
|
535
|
+
(((_b = template.teams.held) !== null && _b !== void 0 ? _b : 0) > 0
|
|
536
|
+
? `, ${template.teams.held} held on an earlier version until confirmed`
|
|
459
537
|
: ''),
|
|
460
538
|
]);
|
|
461
539
|
}
|
|
@@ -494,9 +572,9 @@ const CUSTOMIZATION_LABEL = {
|
|
|
494
572
|
function describeTools(body) {
|
|
495
573
|
var _a, _b;
|
|
496
574
|
if (body.tools.mode === 'read_only')
|
|
497
|
-
return 'every read the team
|
|
575
|
+
return 'every read on the products it can reach (team- or Source-connected)';
|
|
498
576
|
if (body.tools.mode === 'all')
|
|
499
|
-
return 'every tool the team
|
|
577
|
+
return 'every tool on the products it can reach (team- or Source-connected)';
|
|
500
578
|
return ([...((_a = body.tools.products) !== null && _a !== void 0 ? _a : []), ...((_b = body.tools.tools) !== null && _b !== void 0 ? _b : [])].join(', ') ||
|
|
501
579
|
'none');
|
|
502
580
|
}
|
|
@@ -507,21 +585,55 @@ const OUTCOME_TITLE = {
|
|
|
507
585
|
published: 'Published',
|
|
508
586
|
'rolled-back': 'Rolled back',
|
|
509
587
|
};
|
|
510
|
-
function resultSummary(ui, result) {
|
|
588
|
+
function resultSummary(ui, result, source) {
|
|
589
|
+
var _a, _b;
|
|
511
590
|
const { template } = result;
|
|
512
591
|
const rows = [['Versions', versionLabel(template)]];
|
|
513
592
|
if (result.outcome === 'published' || result.outcome === 'rolled-back') {
|
|
514
593
|
rows.push(['Teams updated', String(result.teamsUpdated)]);
|
|
515
594
|
}
|
|
595
|
+
const access = result.access;
|
|
596
|
+
if (access && access.confirmed.length > 0) {
|
|
597
|
+
rows.push([
|
|
598
|
+
'You confirmed',
|
|
599
|
+
access.confirmed.map((team) => `${team.team} (runs as you)`),
|
|
600
|
+
]);
|
|
601
|
+
}
|
|
602
|
+
const held = (_a = access === null || access === void 0 ? void 0 : access.held) !== null && _a !== void 0 ? _a : [];
|
|
603
|
+
if (held.length > 0) {
|
|
604
|
+
rows.push([
|
|
605
|
+
'Held',
|
|
606
|
+
held.map((team) => { var _a; return `${team.team} held on v${team.version} — v${team.hold.waiting} ${describeHold(team.hold)}; ${team.you ? 'you confirm' : `${(_a = team.runsAs) !== null && _a !== void 0 ? _a : 'the person it runs as'} confirms`}: npx @ekanos/cli teams agents confirm ${team.team} ${template.key} --source ${source}`; }),
|
|
607
|
+
]);
|
|
608
|
+
}
|
|
609
|
+
if (access && access.needed.length > 0) {
|
|
610
|
+
rows.push([
|
|
611
|
+
'Needs confirming',
|
|
612
|
+
access.needed.map((team) => { var _a; return `${team.team}: ${team.you ? 'you' : ((_a = team.runsAs) !== null && _a !== void 0 ? _a : 'the person it runs as')} run${team.you ? '' : 's'} "ekanos teams agents confirm ${team.team} ${template.key} --source ${source}"`; }),
|
|
613
|
+
]);
|
|
614
|
+
}
|
|
516
615
|
const notes = (result.outcome === 'created' || result.outcome === 'updated') &&
|
|
517
616
|
template.publishedVersion !== template.latestVersion
|
|
518
617
|
? [
|
|
519
618
|
`Teams still run the published version. "ekanos agents publish ${template.key}" moves them.`,
|
|
520
619
|
]
|
|
521
620
|
: [];
|
|
621
|
+
if (held.length > 0) {
|
|
622
|
+
notes.push(`This version reaches further than ${held.length === 1 ? 'that team confirmed, so it keeps' : 'those teams confirmed, so each keeps'} running its earlier version, as confirmed, until the person it runs as confirms the update; nobody can confirm for them.${held.some((team) => team.you) ? ' Publishing with --confirm-access confirms, and moves, every team where the agent runs as you.' : ''}`);
|
|
623
|
+
}
|
|
624
|
+
if (access === null || access === void 0 ? void 0 : access.needed.some((team) => team.you)) {
|
|
625
|
+
notes.push('This version reaches further than what was confirmed. Until confirmed, those agents keep only what needs no confirmation. Publishing with --confirm-access confirms on every team where the agent runs as you.');
|
|
626
|
+
}
|
|
627
|
+
else if (access && access.needed.length > 0) {
|
|
628
|
+
notes.push('This version reaches further than what was confirmed. Until each person above confirms, their agent keeps only what needs no confirmation; nobody can confirm for them.');
|
|
629
|
+
}
|
|
522
630
|
return ui.result({
|
|
523
631
|
title: `${OUTCOME_TITLE[result.outcome]}: ${template.key}`,
|
|
524
|
-
tone: result.outcome === 'unchanged'
|
|
632
|
+
tone: result.outcome === 'unchanged' ||
|
|
633
|
+
((_b = access === null || access === void 0 ? void 0 : access.needed.length) !== null && _b !== void 0 ? _b : 0) > 0 ||
|
|
634
|
+
held.length > 0
|
|
635
|
+
? 'warn'
|
|
636
|
+
: 'ok',
|
|
525
637
|
rows,
|
|
526
638
|
notes,
|
|
527
639
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type AgentTemplateBody,\n AgentTemplateBodySchema,\n type AgentTemplateDetail,\n AgentTemplateKeySchema,\n type AgentTemplateList,\n type AgentTemplateResult,\n} from '@ekanos/integration-schema';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport {\n type AgentsApiResult,\n applyAgentTemplate,\n listAgentTemplates,\n publishAgentTemplate,\n showAgentTemplate,\n} from '../agents-api';\nimport type { StoredSession } from '../auth/credential-store';\nimport {\n type AuthEnvironment,\n refreshStoredSession,\n requireSession,\n resolveAuthEnvironment,\n} from '../auth/session';\nimport type { CliContext } from '../context';\nimport {\n authRequiredError,\n notFoundError,\n usageError,\n validationError,\n} from '../errors';\nimport type { ExitCode } from '../exit-codes';\nimport { classifyPath } from '../safe-fs';\nimport { resolveSourceTarget } from '../source-target';\nimport { type ResultRow, type Ui, pluralize } from '../ui';\nimport {\n areaRows,\n isTemplateEditSubcommand,\n runTemplateEdit,\n} from './agents-edit';\nimport { runAgentsInit, withDocsHint } from './agents-init';\nimport { promptYesNo } from './publish';\nimport { runAgentTest } from './runs';\nimport {\n AGENT_SKILLS_DIR,\n type SkillFolder,\n SkillsClient,\n findAgentSkillFolders,\n pushSkillFolder,\n pushSummary,\n readSkillFolder,\n} from './skills';\n\nexport const AGENTS_SUBCOMMANDS = [\n 'init',\n 'list',\n 'show',\n 'pull',\n 'apply',\n 'publish',\n 'rollback',\n 'test',\n 'policy',\n 'triggers',\n 'links',\n 'overrides',\n] as const;\n\ntype AgentsSubcommand = (typeof AGENTS_SUBCOMMANDS)[number];\n\n/** The file `pull` writes and `apply` reads, inside an agent's directory. */\nexport const AGENT_FILE = 'agent.json';\n/** Instructions as Markdown, beside it. Used when `agent.json` has none. */\nexport const AGENT_INSTRUCTIONS_FILE = 'AGENT.md';\n\nexport interface AgentsArgs {\n host?: string;\n source?: string;\n subcommand?: string;\n /** A template key, or for `apply` a file or directory. */\n target?: string;\n /** `publish` / `rollback`: the version to make the one teams run. */\n to?: string;\n baseVersion?: string;\n overwrite: boolean;\n out?: string;\n yes: boolean;\n /** `init`: replace the skills and CLAUDE.md even when they exist. */\n force?: boolean;\n /**\n * `apply`: push the skill folders beside the agent (`<dir>/skills/<slug>/`)\n * first, and name them in its skills. On unless `--no-skills`.\n */\n skills?: boolean;\n /** `init`: `--claude` adds the docs to Claude Code without asking; `--no-claude` skips it. */\n claude?: boolean;\n /** `policy | triggers | links | overrides`: positionals after the key. */\n rest?: string[];\n event?: string;\n filter?: string[];\n disabled?: boolean;\n cron?: string;\n timezone?: string;\n kind?: string;\n mode?: string;\n reads?: string;\n writes?: string;\n /** `policy | triggers | links | overrides`: publish the stored version right away. */\n publish?: boolean;\n dir: string;\n env: Record<string, string | undefined>;\n stdinIsTTY?: boolean;\n confirm?: (question: string) => Promise<boolean>;\n /** `test`: the team to run the draft on, and what to give it. Also a trigger's prompt. */\n team?: string;\n prompt?: string;\n input?: string;\n follow?: boolean;\n}\n\n/**\n * `agents` — the Source's agent templates (plan 239.0 / 239.2). Ekanos holds\n * them; nothing here is deployed. `apply` stores a new version (a draft\n * until published), `publish` makes a version the one every team runs,\n * `rollback` publishes an older one. `pull` writes a template out as\n * `agent.json` + `AGENT.md` for review or Git, and `apply` reads the same\n * layout back.\n */\nexport async function runAgents(\n ctx: CliContext,\n args: AgentsArgs,\n): Promise<ExitCode> {\n const subcommand = parseSubcommand(args.subcommand);\n if (!isTemplateEditSubcommand(subcommand) && (args.rest?.length ?? 0) > 0) {\n throw usageError(\n `\"agents ${subcommand}\" takes at most one argument after the subcommand.`,\n 'See \"ekanos agents --help\".',\n );\n }\n\n // Local only: no host, no session.\n if (subcommand === 'init') {\n return runAgentsInit(ctx, {\n dir: path.resolve(args.dir, args.target ?? '.'),\n force: args.force === true,\n claude: args.claude,\n canPrompt: canPrompt(ctx, args),\n confirm: args.confirm ?? promptYesNo,\n env: args.env,\n });\n }\n\n if (subcommand === 'test') {\n return runAgentTest(ctx, {\n host: args.host,\n source: args.source,\n positionals: [],\n key: args.target,\n team: args.team,\n prompt: args.prompt,\n input: args.input,\n follow: args.follow === true,\n dir: args.dir,\n env: args.env,\n });\n }\n\n // Read the local input before any network call, so a bad file fails fast.\n const local =\n subcommand === 'apply' ? readAgentInput(args.target, args.dir) : null;\n const localSkills =\n local?.file && args.skills !== false\n ? findAgentSkillFolders(path.dirname(local.file)).map((dir) =>\n readSkillFolder(dir, args.dir),\n )\n : [];\n if (local && localSkills.length > 0) {\n local.body = withLocalSkills(local.body, localSkills);\n }\n\n const env = resolveAuthEnvironment(ctx, args.host, args.env, {\n projectDir: args.dir,\n });\n const resolved = await resolveSourceTarget(\n env,\n requireSession(env.store, env.host),\n args,\n );\n const client = new AgentsClient(env, resolved.session);\n const source = resolved.source;\n\n if (isTemplateEditSubcommand(subcommand)) {\n const key = requireKey(args.target, subcommand);\n return runTemplateEdit(\n ctx,\n {\n subcommand,\n key,\n rest: args.rest ?? [],\n event: args.event,\n filter: args.filter,\n prompt: args.prompt,\n disabled: args.disabled === true,\n cron: args.cron,\n timezone: args.timezone,\n kind: args.kind,\n mode: args.mode,\n reads: args.reads,\n writes: args.writes,\n publish: args.publish === true,\n dir: args.dir,\n },\n {\n host: env.host,\n source,\n show: async () =>\n (\n await client.call((token) =>\n showAgentTemplate(env.host, token, source, key),\n )\n ).template,\n apply: (body, baseVersion) =>\n client.call((token) =>\n applyAgentTemplate(env.host, token, {\n source,\n key,\n body,\n baseVersion,\n overwrite: false,\n }),\n ),\n publish: async (version) => {\n await confirmPublish(ctx, args, {\n key,\n source,\n what: `Publish ${key} version ${version}`,\n });\n return client.call((token) =>\n publishAgentTemplate(env.host, token, 'publish', {\n source,\n key,\n version,\n }),\n );\n },\n summarize: (result) => resultSummary(ctx.ui, result),\n },\n );\n }\n\n switch (subcommand) {\n case 'list': {\n const list = await client.call((token) =>\n listAgentTemplates(env.host, token, source),\n );\n return ctx.succeed(\n { host: env.host, ...list },\n withDocsHint(ctx.ui, args.dir, listSummary(ctx.ui, list)),\n );\n }\n case 'show': {\n const key = requireKey(args.target, 'show');\n const shown = await client.call((token) =>\n showAgentTemplate(env.host, token, source, key),\n );\n return ctx.succeed(\n { host: env.host, ...shown },\n templateDetail(ctx.ui, shown.template),\n );\n }\n case 'pull': {\n const key = requireKey(args.target, 'pull');\n const shown = await client.call((token) =>\n showAgentTemplate(env.host, token, source, key),\n );\n const outDir = path.resolve(\n args.dir,\n args.out ?? path.join('agents', key),\n );\n const written = writeAgentFiles(outDir, shown.template);\n return ctx.succeed(\n {\n host: env.host,\n key,\n version: shown.template.latestVersion,\n files: written,\n },\n ctx.ui.result({\n title: `Pulled ${key} v${shown.template.latestVersion}`,\n rows: written.map((file): ResultRow => ['Wrote', file]),\n notes: [\n `Edit, then \"ekanos agents apply ${path.relative(args.dir, outDir) || '.'}\".`,\n ],\n }),\n );\n }\n case 'apply': {\n const input = local!;\n const baseVersion =\n parseVersionFlag(args.baseVersion, '--base-version') ??\n input.baseVersion;\n // The skills first, so the agent can name them. Source level: a\n // template may only name the Source's skills and the platform's.\n const skillsClient = new SkillsClient(env, resolved.session);\n const pushedSkills: Awaited<ReturnType<typeof pushSkillFolder>>[] = [];\n for (const folder of localSkills) {\n pushedSkills.push(\n await pushSkillFolder(skillsClient, env.host, { source, folder }),\n );\n }\n const result = await client.call((token) =>\n applyAgentTemplate(env.host, token, {\n source,\n key: input.key,\n body: input.body,\n baseVersion,\n overwrite: args.overwrite,\n }),\n );\n if (input.file && result.outcome !== 'unchanged') {\n recordBaseVersion(input.file, result.version);\n }\n return ctx.succeed(\n { host: env.host, ...result, skills: pushedSkills },\n [\n ...pushedSkills.map((pushed) => pushSummary(ctx.ui, pushed)),\n resultSummary(ctx.ui, result),\n ].join('\\n\\n'),\n );\n }\n case 'publish':\n case 'rollback': {\n const key = requireKey(args.target, subcommand);\n let version = parseVersionFlag(args.to, '--to') ?? undefined;\n if (subcommand === 'rollback' && version === undefined) {\n throw usageError(\n 'rollback needs the version to go back to.',\n `Pass \"--to <n>\". \"ekanos agents show ${key}\" lists them.`,\n );\n }\n // Refuse a script with no --yes before reading anything.\n if (!args.yes && !canPrompt(ctx, args)) {\n throw validationError(\n `${subcommand === 'rollback' ? 'Rolling back' : 'Publishing'} ${key} on ${source} needs confirmation.`,\n 'It reaches every team running this agent at once. Pass --yes to confirm.',\n );\n }\n // Publish names the version it confirmed, never \"whatever is latest\n // when the request lands\" — a draft applied in between is not shipped\n // unseen to every team.\n if (version === undefined) {\n const shown = await client.call((token) =>\n showAgentTemplate(env.host, token, source, key),\n );\n version = shown.template.latestVersion;\n }\n await confirmPublish(ctx, args, {\n key,\n source,\n what:\n subcommand === 'rollback'\n ? `Roll ${key} back to version ${version}`\n : `Publish ${key} version ${version}`,\n });\n const result = await client.call((token) =>\n publishAgentTemplate(env.host, token, subcommand, {\n source,\n key,\n version,\n }),\n );\n return ctx.succeed(\n { host: env.host, ...result },\n resultSummary(ctx.ui, result),\n );\n }\n }\n}\n\n/** Every call refreshes the session once on a 401, then gives up. */\nclass AgentsClient {\n constructor(\n private readonly env: AuthEnvironment,\n private session: StoredSession,\n ) {}\n\n async call<T>(\n send: (accessToken: string) => Promise<AgentsApiResult<T>>,\n ): Promise<T> {\n let result = await send(this.session.accessToken);\n if (result.status === 'unauthorized') {\n this.session = await refreshStoredSession(this.env, this.session);\n result = await send(this.session.accessToken);\n }\n if (result.status === 'ok') return result.data;\n throw authRequiredError(\n `The session for ${this.env.host} could not authorize the agents call.`,\n `Run \"ekanos login --host ${this.env.host}\" and retry.`,\n );\n }\n}\n\nfunction parseSubcommand(value: string | undefined): AgentsSubcommand {\n const match = AGENTS_SUBCOMMANDS.find((name) => name === value);\n if (match) return match;\n throw usageError(\n value\n ? `Unknown agents subcommand \"${value}\".`\n : 'agents needs a subcommand.',\n `Run one of: ${AGENTS_SUBCOMMANDS.map((name) => `ekanos agents ${name}`).join(', ')}.`,\n );\n}\n\nfunction requireKey(value: string | undefined, verb: string): string {\n const parsed = AgentTemplateKeySchema.safeParse(value ?? '');\n if (parsed.success) return parsed.data;\n throw usageError(\n value\n ? `\"${value}\" is not an agent key.`\n : `agents ${verb} needs an agent key.`,\n `Pass the key, e.g. \"ekanos agents ${verb} support-triage\". ` +\n `\"ekanos agents list\" shows them.`,\n );\n}\n\nfunction parseVersionFlag(\n value: string | undefined,\n flag: string,\n): number | null {\n if (value === undefined) return null;\n const version = Number(value);\n if (Number.isInteger(version) && version >= 1) return version;\n throw usageError(\n `${flag} must be a version number (got \"${value}\").`,\n `\"ekanos agents show <key>\" lists the versions.`,\n );\n}\n\n/**\n * The agent's skills plus the folders beside it, which it uses by being\n * there — a repo migrated as `agents/<key>/skills/<slug>/` need not repeat\n * them in agent.json.\n */\nfunction withLocalSkills(\n body: AgentTemplateBody,\n folders: SkillFolder[],\n): AgentTemplateBody {\n const skills = [...body.skills];\n for (const folder of folders) {\n if (!skills.includes(folder.slug)) skills.push(folder.slug);\n }\n if (skills.length > 50) {\n throw validationError(\n `The agent would name ${skills.length} skills (with its ${AGENT_SKILLS_DIR}/ folders); the limit is 50.`,\n 'Drop some, or pass --no-skills and list them in agent.json.',\n );\n }\n return { ...body, skills };\n}\n\ninterface AgentInput {\n key: string;\n body: AgentTemplateBody;\n baseVersion: number | null;\n /** The agent.json read, when there was one, so the new version is recorded in it. */\n file: string | null;\n}\n\n/**\n * Read `apply`'s input: a directory holding `agent.json` (and optionally\n * `AGENT.md`), or a `.json` file. The key is the file's `key`, else the\n * directory's name. `baseVersion` in the file is the version it was pulled\n * or last applied at — what the host checks for a concurrent change.\n */\nexport function readAgentInput(\n target: string | undefined,\n cwd: string,\n): AgentInput {\n if (!target) {\n throw usageError(\n 'agents apply needs a file or directory.',\n `Pass an agent directory (\"ekanos agents apply agents/support\") or a ` +\n `JSON file. \"ekanos agents pull <key>\" writes the layout.`,\n );\n }\n const resolved = path.resolve(cwd, target);\n const kind = classifyPath(resolved);\n const dir = kind === 'directory' ? resolved : path.dirname(resolved);\n const file =\n kind === 'directory' ? path.join(resolved, AGENT_FILE) : resolved;\n\n if (classifyPath(file) !== 'file') {\n throw notFoundError(\n `No ${kind === 'directory' ? AGENT_FILE : 'file'} at ${file}.`,\n `\"ekanos agents pull <key>\" writes ${AGENT_FILE} and ${AGENT_INSTRUCTIONS_FILE}.`,\n );\n }\n\n let raw: unknown;\n try {\n raw = JSON.parse(fs.readFileSync(file, 'utf8'));\n } catch (error) {\n throw validationError(\n `${file} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`,\n 'Fix the JSON and apply again.',\n );\n }\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n throw validationError(\n `${file} must hold a JSON object.`,\n 'See \"ekanos agents --help\".',\n );\n }\n\n const {\n key: rawKey,\n baseVersion: rawBase,\n $schema: _schema,\n ...rest\n } = raw as Record<string, unknown>;\n const fields: Record<string, unknown> = { ...rest };\n\n const instructionsFile = path.join(dir, AGENT_INSTRUCTIONS_FILE);\n if (\n fields.instructions === undefined &&\n classifyPath(instructionsFile) === 'file'\n ) {\n fields.instructions = fs.readFileSync(instructionsFile, 'utf8');\n }\n\n const key = AgentTemplateKeySchema.safeParse(\n typeof rawKey === 'string' ? rawKey : path.basename(dir),\n );\n if (!key.success) {\n throw validationError(\n `No usable agent key: set \"key\" in ${file}, or name the directory after it.`,\n key.error.issues[0]?.message ??\n 'Use lowercase letters, digits and hyphens.',\n );\n }\n\n const body = AgentTemplateBodySchema.safeParse(fields);\n if (!body.success) {\n throw validationError(\n [\n `${file} is not a valid agent:`,\n ...body.error.issues.map(\n (issue) => ` ${issue.path.join('.') || '(root)'}: ${issue.message}`,\n ),\n ].join('\\n'),\n `Fields: name, description, instructions (or ${AGENT_INSTRUCTIONS_FILE}), ` +\n `model, maxTurns, tools, policy, skills, connections, mcpServers, ` +\n `teamCustomization, triggers, links, teamOverrides.`,\n );\n }\n\n const baseVersion =\n typeof rawBase === 'number' && Number.isInteger(rawBase) && rawBase >= 1\n ? rawBase\n : null;\n\n return { key: key.data, body: body.data, baseVersion, file };\n}\n\n/**\n * Write `agent.json` + `AGENT.md`. The instructions live in the Markdown so\n * they read and diff as prose; the JSON holds everything else plus the\n * version they came from.\n */\nfunction writeAgentFiles(\n outDir: string,\n template: AgentTemplateDetail,\n): string[] {\n fs.mkdirSync(outDir, { recursive: true });\n const { instructions, ...rest } = template.body;\n const json = {\n key: template.key,\n baseVersion: template.latestVersion,\n ...rest,\n };\n const jsonPath = path.join(outDir, AGENT_FILE);\n const mdPath = path.join(outDir, AGENT_INSTRUCTIONS_FILE);\n for (const target of [jsonPath, mdPath]) {\n const kind = classifyPath(target);\n if (kind !== 'missing' && kind !== 'file') {\n throw validationError(\n `Refusing to write through ${target} (${kind}).`,\n 'Remove it, or pass --out <dir>.',\n );\n }\n }\n fs.writeFileSync(jsonPath, `${JSON.stringify(json, null, 2)}\\n`);\n fs.writeFileSync(\n mdPath,\n instructions.endsWith('\\n') ? instructions : `${instructions}\\n`,\n );\n return [jsonPath, mdPath];\n}\n\n/** After a stored version, point the file at it, so the next apply is based on it. */\nfunction recordBaseVersion(file: string, version: number) {\n const raw = JSON.parse(fs.readFileSync(file, 'utf8')) as Record<\n string,\n unknown\n >;\n if (raw.baseVersion === version) return;\n const { key, baseVersion: _old, ...rest } = raw;\n const next =\n key === undefined\n ? { baseVersion: version, ...rest }\n : { key, baseVersion: version, ...rest };\n fs.writeFileSync(file, `${JSON.stringify(next, null, 2)}\\n`);\n}\n\nfunction canPrompt(ctx: CliContext, args: AgentsArgs): boolean {\n return !ctx.jsonMode && (args.stdinIsTTY ?? process.stdin.isTTY === true);\n}\n\n/**\n * Publishing changes what every team running the agent does, at once. A\n * human run asks first; a scripted or JSON run needs `--yes`.\n */\nasync function confirmPublish(\n ctx: CliContext,\n args: AgentsArgs,\n target: { key: string; source: string; what: string },\n) {\n if (args.yes) return;\n if (!canPrompt(ctx, args)) {\n throw validationError(\n `${target.what} on ${target.source} needs confirmation.`,\n 'It reaches every team running this agent at once. Pass --yes to confirm.',\n );\n }\n ctx.log(\n `${target.what} on ${target.source}. Every team running it follows at once.`,\n );\n const confirmed = await (args.confirm ?? promptYesNo)('Proceed? [y/N]');\n if (!confirmed) {\n throw validationError(\n `${target.what} was not confirmed.`,\n 'Nothing was changed.',\n );\n }\n}\n\nfunction versionLabel(template: {\n latestVersion: number;\n publishedVersion: number | null;\n}): string {\n if (template.publishedVersion === null)\n return `v${template.latestVersion} draft, never published`;\n if (template.publishedVersion === template.latestVersion)\n return `v${template.latestVersion} published`;\n return `v${template.publishedVersion} published, v${template.latestVersion} latest`;\n}\n\nfunction listSummary(ui: Ui, list: AgentTemplateList): string {\n if (list.templates.length === 0) {\n return ui.result({\n title: `No agents on ${list.source.slug} yet`,\n tone: 'warn',\n notes: ['\"ekanos agents apply <dir>\" stores the first one.'],\n });\n }\n return [\n ui.result({\n title: `${pluralize(list.templates.length, 'agent')} on ${list.source.slug}`,\n rows: list.templates.map((template): ResultRow => [\n template.key,\n [\n template.name,\n versionLabel(template),\n template.status === 'archived' ? 'archived' : null,\n template.teams\n ? `${pluralize(template.teams.enabled, 'team')}`\n : null,\n ]\n .filter(Boolean)\n .join(' · '),\n ]),\n }),\n ui.hint('\"ekanos agents show <key>\" shows one, with its versions.'),\n ].join('\\n\\n');\n}\n\nfunction templateDetail(ui: Ui, template: AgentTemplateDetail): string {\n const { body } = template;\n const rows: ResultRow[] = [\n ['Versions', versionLabel(template)],\n ['Model', body.model ?? 'house default'],\n ['Tools', describeTools(body)],\n [\n 'Approval',\n `reads ${body.policy.reads}, writes ${body.policy.writes}` +\n (Object.keys(body.policy.overrides).length > 0\n ? `, ${pluralize(Object.keys(body.policy.overrides).length, 'override')}`\n : ''),\n ],\n ['Skills', body.skills.length > 0 ? body.skills.join(', ') : 'none'],\n ['Connections', describeConnections(body)],\n ['Teams may add', describeCustomization(body)],\n ...areaRows('triggers', body).slice(0, 1),\n ...areaRows('links', body).slice(0, 1),\n [\n 'Team overrides',\n areaRows('overrides', body).map(([area, value]) => `${area}: ${value}`),\n ],\n ];\n if (template.teams) {\n rows.push([\n 'Teams',\n `${template.teams.enabled} running` +\n (template.teams.pinned > 0\n ? `, ${template.teams.pinned} pinned to an older version`\n : ''),\n ]);\n }\n rows.push([\n 'History',\n template.versions.map(\n (version) =>\n `v${version.version} ${version.createdAt.slice(0, 10)}` +\n (version.createdBy ? ` by ${version.createdBy}` : '') +\n (version.publishedAt\n ? ` · published ${version.publishedAt.slice(0, 10)}`\n : ''),\n ),\n ]);\n return ui.result({ title: `${body.name} (${template.key})`, rows });\n}\n\nfunction describeConnections(body: AgentTemplateBody): string[] {\n const owner = (connection: AgentTemplateBody['connections'][string]) =>\n connection.owner === 'source'\n ? 'one connection for the source'\n : `each team's own (${connection.team})`;\n const lines = [\n ...Object.entries(body.connections).map(\n ([slug, connection]) => `${slug}: ${owner(connection)}`,\n ),\n ...body.mcpServers.map(\n (server) => `${server.key} (MCP, ${server.url}): ${owner(server)}`,\n ),\n ];\n return lines.length > 0 ? lines : [\"each team's own (optional)\"];\n}\n\nfunction describeCustomization(body: AgentTemplateBody): string {\n const allowed = Object.entries(body.teamCustomization)\n .filter(([, on]) => on)\n .map(([knob]) => CUSTOMIZATION_LABEL[knob] ?? knob);\n return allowed.length > 0 ? allowed.join(', ') : 'nothing (template only)';\n}\n\nconst CUSTOMIZATION_LABEL: Record<string, string> = {\n mcpServers: 'own MCP servers',\n skills: 'own skills',\n integrations: 'more integrations',\n narrow: 'narrower tools',\n};\n\nfunction describeTools(body: AgentTemplateBody): string {\n if (body.tools.mode === 'read_only')\n return 'every read the team has connected';\n if (body.tools.mode === 'all') return 'every tool the team has connected';\n return (\n [...(body.tools.products ?? []), ...(body.tools.tools ?? [])].join(', ') ||\n 'none'\n );\n}\n\nconst OUTCOME_TITLE = {\n created: 'Created',\n updated: 'Stored a new version',\n unchanged: 'Unchanged',\n published: 'Published',\n 'rolled-back': 'Rolled back',\n} as const;\n\nfunction resultSummary(ui: Ui, result: AgentTemplateResult): string {\n const { template } = result;\n const rows: ResultRow[] = [['Versions', versionLabel(template)]];\n if (result.outcome === 'published' || result.outcome === 'rolled-back') {\n rows.push(['Teams updated', String(result.teamsUpdated)]);\n }\n const notes =\n (result.outcome === 'created' || result.outcome === 'updated') &&\n template.publishedVersion !== template.latestVersion\n ? [\n `Teams still run the published version. \"ekanos agents publish ${template.key}\" moves them.`,\n ]\n : [];\n return ui.result({\n title: `${OUTCOME_TITLE[result.outcome]}: ${template.key}`,\n tone: result.outcome === 'unchanged' ? 'warn' : 'ok',\n rows,\n notes,\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAGL,uBAAuB,EAEvB,sBAAsB,GAGvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAEL,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAEL,oBAAoB,EACpB,cAAc,EACd,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,eAAe,GAChB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAmB,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAA2B,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EACL,QAAQ,EACR,wBAAwB,EACxB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACL,gBAAgB,EAEhB,YAAY,EACZ,qBAAqB,EACrB,eAAe,EACf,WAAW,EACX,eAAe,GAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,SAAS;IACT,UAAU;IACV,SAAS;IACT,WAAW;IACX,MAAM;IACN,QAAQ;IACR,UAAU;IACV,OAAO;IACP,WAAW;CACH,CAAC;AAIX,6EAA6E;AAC7E,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;AACvC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAC;AA0DlD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAe,EACf,IAAgB;;;IAEhB,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC,wBAAwB,CAAC,UAAU,CAAC,IAAI,OAAC,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,mCAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1E,MAAM,UAAU,CACd,WAAW,UAAU,oDAAoD,EACzE,6BAA6B,CAC9B,CAAC;IACJ,CAAC;IAED,mCAAmC;IACnC,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,aAAa,CAAC,GAAG,EAAE;YACxB,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,QAAE,IAAI,CAAC,MAAM,mCAAI,GAAG,CAAC;YAC/C,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI;YAC1B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC;YAC/B,OAAO,QAAE,IAAI,CAAC,OAAO,mCAAI,WAAW;YACpC,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAC;IACL,CAAC;IAED,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,YAAY,CAAC,GAAG,EAAE;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,EAAE;YACf,GAAG,EAAE,IAAI,CAAC,MAAM;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI;YAC5B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAC;IACL,CAAC;IAED,0EAA0E;IAC1E,MAAM,KAAK,GACT,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,MAAM,WAAW,GACf,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,KAAI,IAAI,CAAC,MAAM,KAAK,KAAK;QAClC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC1D,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAC/B;QACH,CAAC,CAAC,EAAE,CAAC;IACT,IAAI,KAAK,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,GAAG,GAAG,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;QAC3D,UAAU,EAAE,IAAI,CAAC,GAAG;KACrB,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAE/B,IAAI,wBAAwB,CAAC,UAAU,CAAC,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAChD,OAAO,eAAe,CACpB,GAAG,EACH;YACE,UAAU;YACV,GAAG;YACH,IAAI,QAAE,IAAI,CAAC,IAAI,mCAAI,EAAE;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ,KAAK,IAAI;YAChC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI;YAC9B,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,EACD;YACE,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,MAAM;YACN,IAAI,EAAE,KAAK,IAAI,EAAE,CACf,CACE,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC1B,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAChD,CACF,CAAC,QAAQ;YACZ,KAAK,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACpB,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;gBAClC,MAAM;gBACN,GAAG;gBACH,IAAI;gBACJ,WAAW;gBACX,SAAS,EAAE,KAAK;aACjB,CAAC,CACH;YACH,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBACzB,MAAM,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE;oBAC9B,GAAG;oBACH,MAAM;oBACN,IAAI,EAAE,WAAW,GAAG,YAAY,OAAO,EAAE;iBAC1C,CAAC,CAAC;gBACH,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC3B,oBAAoB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;oBAC/C,MAAM;oBACN,GAAG;oBACH,OAAO;oBACP,aAAa,EAAE,IAAI,CAAC,aAAa,KAAK,IAAI;iBAC3C,CAAC,CACH,CAAC;YACJ,CAAC;YACD,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC;SAC7D,CACF,CAAC;IACJ,CAAC;IAED,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACvC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAC5C,CAAC;YACF,uDAAuD;YACvD,MAAM,KAAK,GACT,IAAI,CAAC,GAAG,KAAK,IAAI;gBACf,CAAC,CAAC,IAAI;gBACN,CAAC,iCACM,IAAI,KACP,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAC9B,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,UAAU,CAC7C,GACF,CAAC;YACR,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;YAC9D,OAAO,GAAG,CAAC,OAAO,iBACd,IAAI,EAAE,GAAG,CAAC,IAAI,IAAK,KAAK,GAC1B,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CACnE,CAAC;QACJ,CAAC;QACD,KAAK,SAAS,CAAC;QACf,KAAK,WAAW,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAChD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACzC,oBAAoB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CACnE,CAAC;YACF,OAAO,GAAG,CAAC,OAAO,iBACd,IAAI,EAAE,GAAG,CAAC,IAAI,IAAK,MAAM,GAC3B,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,CAC3C,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACxC,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAChD,CAAC;YACF,OAAO,GAAG,CAAC,OAAO,iBACd,IAAI,EAAE,GAAG,CAAC,IAAI,IAAK,KAAK,GAC1B,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,CACvC,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACxC,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAChD,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CACzB,IAAI,CAAC,GAAG,QACR,IAAI,CAAC,GAAG,mCAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CACrC,CAAC;YACF,MAAM,OAAO,GAAG,gBAAgB,CAAC;gBAC/B,UAAU,EAAE,IAAI,CAAC,GAAG;gBACpB,MAAM;gBACN,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACjC,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI;gBAC1B,KAAK,EAAE,sBAAsB,GAAG,EAAE;aACnC,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,OAAO,CAChB;gBACE,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,GAAG;gBACH,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,aAAa;gBACrC,KAAK,EAAE,OAAO;aACf,EACD,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC;gBACZ,KAAK,EAAE,UAAU,GAAG,KAAK,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE;gBACvD,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAa,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACvD,KAAK,EAAE;oBACL,mCAAmC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI;iBAC9E;aACF,CAAC,CACH,CAAC;QACJ,CAAC;QACD,KAAK,OAAO,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,KAAM,CAAC;YACrB,MAAM,WAAW,SACf,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,mCACpD,KAAK,CAAC,WAAW,CAAC;YACpB,gEAAgE;YAChE,iEAAiE;YACjE,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC7D,MAAM,YAAY,GAAkD,EAAE,CAAC;YACvE,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;gBACjC,YAAY,CAAC,IAAI,CACf,MAAM,eAAe,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAClE,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACzC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;gBAClC,MAAM;gBACN,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW;gBACX,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC,CACH,CAAC;YACF,IAAI,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;gBACjD,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAChD,CAAC;YACD,OAAO,GAAG,CAAC,OAAO,+BACd,IAAI,EAAE,GAAG,CAAC,IAAI,IAAK,MAAM,KAAE,MAAM,EAAE,YAAY,KACjD;gBACE,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC5D,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC;aACtC,CAAC,IAAI,CAAC,MAAM,CAAC,CACf,CAAC;QACJ,CAAC;QACD,KAAK,SAAS,CAAC;QACf,KAAK,UAAU,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAChD,IAAI,OAAO,SAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,mCAAI,SAAS,CAAC;YAC7D,IAAI,UAAU,KAAK,UAAU,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBACvD,MAAM,UAAU,CACd,2CAA2C,EAC3C,wCAAwC,GAAG,eAAe,CAC3D,CAAC;YACJ,CAAC;YACD,yDAAyD;YACzD,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;gBACvC,MAAM,eAAe,CACnB,GAAG,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,IAAI,GAAG,OAAO,MAAM,sBAAsB,EACtG,0EAA0E,CAC3E,CAAC;YACJ,CAAC;YACD,oEAAoE;YACpE,sEAAsE;YACtE,wBAAwB;YACxB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACxC,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAChD,CAAC;gBACF,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;YACzC,CAAC;YACD,MAAM,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE;gBAC9B,GAAG;gBACH,MAAM;gBACN,IAAI,EACF,UAAU,KAAK,UAAU;oBACvB,CAAC,CAAC,QAAQ,GAAG,oBAAoB,OAAO,EAAE;oBAC1C,CAAC,CAAC,WAAW,GAAG,YAAY,OAAO,EAAE;aAC1C,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACzC,oBAAoB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;gBAChD,MAAM;gBACN,GAAG;gBACH,OAAO;gBACP,aAAa,EAAE,IAAI,CAAC,aAAa,KAAK,IAAI;aAC3C,CAAC,CACH,CAAC;YACF,OAAO,GAAG,CAAC,OAAO,iBACd,IAAI,EAAE,GAAG,CAAC,IAAI,IAAK,MAAM,GAC3B,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CACtC,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,YAAY;IAChB,YACmB,GAAoB,EAC7B,OAAsB;mBADb,GAAG;uBACZ,OAAO;IACd,CAAC;IAEJ,KAAK,CAAC,IAAI,CACR,IAA0D;QAE1D,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAClE,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC;QAC/C,MAAM,iBAAiB,CACrB,mBAAmB,IAAI,CAAC,GAAG,CAAC,IAAI,uCAAuC,EACvE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CACpB,CAAC;IACJ,CAAC;CACF;AAED,SAAS,eAAe,CAAC,KAAyB;IAChD,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IAChE,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,UAAU,CACd,KAAK;QACH,CAAC,CAAC,8BAA8B,KAAK,IAAI;QACzC,CAAC,CAAC,4BAA4B,EAChC,eAAe,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACvF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAyB,EAAE,IAAY;IACzD,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,EAAE,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IACvC,MAAM,UAAU,CACd,KAAK;QACH,CAAC,CAAC,IAAI,KAAK,wBAAwB;QACnC,CAAC,CAAC,UAAU,IAAI,sBAAsB,EACxC,qCAAqC,IAAI,oBAAoB;QAC3D,kCAAkC,CACrC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAyB,EACzB,IAAY;IAEZ,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAC9D,MAAM,UAAU,CACd,GAAG,IAAI,mCAAmC,KAAK,KAAK,EACpD,gDAAgD,CACjD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CACtB,IAAuB,EACvB,OAAsB;IAEtB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACvB,MAAM,eAAe,CACnB,wBAAwB,MAAM,CAAC,MAAM,qBAAqB,gBAAgB,8BAA8B,EACxG,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IACD,uCAAY,IAAI,KAAE,MAAM,IAAG;AAC7B,CAAC;AAUD;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,MAA0B,EAC1B,GAAW;;;IAEX,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,UAAU,CACd,yCAAyC,EACzC,sEAAsE;YACpE,0DAA0D,CAC7D,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrE,MAAM,IAAI,GACR,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEpE,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;QAClC,MAAM,aAAa,CACjB,MAAM,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,OAAO,IAAI,GAAG,EAC9D,qCAAqC,UAAU,QAAQ,uBAAuB,GAAG,CAClF,CAAC;IACJ,CAAC;IAED,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,eAAe,CACnB,GAAG,IAAI,uBAAuB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACtF,+BAA+B,CAChC,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClE,MAAM,eAAe,CACnB,GAAG,IAAI,2BAA2B,EAClC,6BAA6B,CAC9B,CAAC;IACJ,CAAC;IAED,MAAM,KAKF,GAA8B,EAL5B,EACJ,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,OAAO,EACpB,OAAO,EAAE,OAAO,OAEgB,EAD7B,IAAI,cAJH,iCAKL,CAAiC,CAAC;IACnC,MAAM,MAAM,qBAAiC,IAAI,CAAE,CAAC;IAEpD,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;IACjE,IACE,MAAM,CAAC,YAAY,KAAK,SAAS;QACjC,YAAY,CAAC,gBAAgB,CAAC,KAAK,MAAM,EACzC,CAAC;QACD,MAAM,CAAC,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,GAAG,GAAG,sBAAsB,CAAC,SAAS,CAC1C,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CACzD,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,eAAe,CACnB,qCAAqC,IAAI,mCAAmC,QAC5E,MAAA,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,0CAAE,OAAO,mCAC1B,4CAA4C,CAC/C,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,uBAAuB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACvD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,eAAe,CACnB;YACE,GAAG,IAAI,wBAAwB;YAC/B,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CACtB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,KAAK,CAAC,OAAO,EAAE,CACrE;SACF,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,+CAA+C,uBAAuB,KAAK;YACzE,mEAAmE;YACnE,oDAAoD,CACvD,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GACf,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC;QACtE,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,IAAI,CAAC;IAEX,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC/D,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,QAA6B;IAC/C,MAAM,KAA4B,QAAQ,CAAC,IAAI,EAAzC,EAAE,YAAY,OAA2B,EAAtB,IAAI,cAAvB,gBAAyB,CAAgB,CAAC;IAChD,MAAM,IAAI,mBACR,GAAG,EAAE,QAAQ,CAAC,GAAG,EACjB,WAAW,EAAE,QAAQ,CAAC,aAAa,IAChC,IAAI,CACR,CAAC;IACF,OAAO;QACL,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACpE;YACE,IAAI,EAAE,uBAAuB;YAC7B,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACnC,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,GAAG,YAAY,IAAI;SACxB;KACF,CAAC;AACJ,CAAC;AAED,sFAAsF;AACtF,SAAS,iBAAiB,CAAC,IAAY,EAAE,OAAe;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAGnD,CAAC;IACF,IAAI,GAAG,CAAC,WAAW,KAAK,OAAO;QAAE,OAAO;IACxC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,KAAc,GAAG,EAAZ,IAAI,UAAK,GAAG,EAAzC,sBAAmC,CAAM,CAAC;IAChD,MAAM,IAAI,GACR,GAAG,KAAK,SAAS;QACf,CAAC,iBAAG,WAAW,EAAE,OAAO,IAAK,IAAI,EACjC,CAAC,iBAAG,GAAG,EAAE,WAAW,EAAE,OAAO,IAAK,IAAI,CAAE,CAAC;IAC7C,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,SAAS,CAAC,GAAe,EAAE,IAAgB;;IAClD,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAC,IAAI,CAAC,UAAU,mCAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;AAC5E,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,cAAc,CAC3B,GAAe,EACf,IAAgB,EAChB,MAAqD;;IAErD,IAAI,IAAI,CAAC,GAAG;QAAE,OAAO;IACrB,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,eAAe,CACnB,GAAG,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,MAAM,sBAAsB,EACxD,0EAA0E,CAC3E,CAAC;IACJ,CAAC;IACD,GAAG,CAAC,GAAG,CACL,GAAG,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,MAAM,0CAA0C,CAC7E,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,OAAC,IAAI,CAAC,OAAO,mCAAI,WAAW,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACxE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,eAAe,CACnB,GAAG,MAAM,CAAC,IAAI,qBAAqB,EACnC,sBAAsB,CACvB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,cAAc,CAC3B,GAAe,EACf,IAAgB,EAChB,MAAuC;;IAEvC,IAAI,IAAI,CAAC,GAAG;QAAE,OAAO;IACrB,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,iBAAiB,CACrB,aAAa,MAAM,CAAC,GAAG,OAAO,MAAM,CAAC,MAAM,+FAA+F,EAC1I,4CAA4C,MAAM,CAAC,GAAG,aAAa,MAAM,CAAC,MAAM,QAAQ,CACzF,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,OAAC,IAAI,CAAC,OAAO,mCAAI,WAAW,CAAC,CACnD,WAAW,MAAM,CAAC,GAAG,OAAO,MAAM,CAAC,MAAM,2DAA2D,MAAM,CAAC,GAAG,UAAU,CACzH,CAAC;IACF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,eAAe,CACnB,aAAa,MAAM,CAAC,GAAG,qBAAqB,EAC5C,sBAAsB,CACvB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,EAAM,EACN,MAAkC,EAClC,MAA+B;IAE/B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAC5B,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC,MAAM,CAAC;YACf,KAAK,EAAE,cAAc,QAAQ,CAAC,GAAG,eAAe,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE;YAC9F,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,GAAG,MAAM,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,KAAK,QAAQ,CAAC,GAAG,EAAE;QACtF,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5C,KAAK,EAAE;YACL,MAAM,CAAC,OAAO,KAAK,UAAU;gBAC3B,CAAC,CAAC,4DAA4D,QAAQ,CAAC,GAAG,mBAAmB;gBAC7F,CAAC,CAAC,6BAA6B,QAAQ,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,GAAG;SACtG;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,QAGrB;IACC,IAAI,QAAQ,CAAC,gBAAgB,KAAK,IAAI;QACpC,OAAO,IAAI,QAAQ,CAAC,aAAa,yBAAyB,CAAC;IAC7D,IAAI,QAAQ,CAAC,gBAAgB,KAAK,QAAQ,CAAC,aAAa;QACtD,OAAO,IAAI,QAAQ,CAAC,aAAa,YAAY,CAAC;IAChD,OAAO,IAAI,QAAQ,CAAC,gBAAgB,gBAAgB,QAAQ,CAAC,aAAa,SAAS,CAAC;AACtF,CAAC;AAED,SAAS,WAAW,CAAC,EAAM,EAAE,IAAuB,EAAE,MAAc;IAClE,MAAM,YAAY,GAChB,MAAM,GAAG,CAAC;QACR,CAAC,CAAC,EAAE,CAAC,IAAI,CACL,GAAG,SAAS,CAAC,MAAM,EAAE,gBAAgB,CAAC,2BAA2B,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CACjG;QACH,CAAC,CAAC,IAAI,CAAC;IACX,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,EAAE,CAAC,MAAM,CAAC;gBACR,KAAK,EACH,MAAM,GAAG,CAAC;oBACR,CAAC,CAAC,uBAAuB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;oBAC3C,CAAC,CAAC,gBAAgB,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM;gBAC5C,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,CAAC,mDAAmD,CAAC;aAC7D,CAAC;YACF,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjB,CAAC;IACD,OAAO;QACL,EAAE,CAAC,MAAM,CAAC;YACR,KAAK,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAC5E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAa,EAAE,CAAC;gBAChD,QAAQ,CAAC,GAAG;gBACZ;oBACE,QAAQ,CAAC,IAAI;oBACb,YAAY,CAAC,QAAQ,CAAC;oBACtB,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;oBAClD,QAAQ,CAAC,KAAK;wBACZ,CAAC,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;wBAChD,CAAC,CAAC,IAAI;iBACT;qBACE,MAAM,CAAC,OAAO,CAAC;qBACf,IAAI,CAAC,KAAK,CAAC;aACf,CAAC;SACH,CAAC;QACF,EAAE,CAAC,IAAI,CAAC,0DAA0D,CAAC;QACnE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,cAAc,CAAC,EAAM,EAAE,QAA6B;;IAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;IAC1B,MAAM,IAAI,GAAgB;QACxB,CAAC,UAAU,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC,OAAO,QAAE,IAAI,CAAC,KAAK,mCAAI,eAAe,CAAC;QACxC,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9B;YACE,UAAU;YACV,SAAS,IAAI,CAAC,MAAM,CAAC,KAAK,YAAY,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBACxD,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC;oBAC5C,CAAC,CAAC,KAAK,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE;oBACzE,CAAC,CAAC,EAAE,CAAC;SACV;QACD,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACpE,CAAC,aAAa,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,eAAe,EAAE,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC9C,GAAG,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACzC,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACtC;YACE,gBAAgB;YAChB,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC;SACxE;KACF,CAAC;IACF,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC;YACX,QAAQ;YACR,8DAA8D,QAAQ,CAAC,GAAG,kBAAkB;SAC7F,CAAC,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC;YACR,OAAO;YACP,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,UAAU;gBACjC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;oBACxB,CAAC,CAAC,KAAK,QAAQ,CAAC,KAAK,CAAC,MAAM,6BAA6B;oBACzD,CAAC,CAAC,EAAE,CAAC;gBACP,CAAC,OAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,mCAAI,CAAC,CAAC,GAAG,CAAC;oBAC7B,CAAC,CAAC,KAAK,QAAQ,CAAC,KAAK,CAAC,IAAI,6CAA6C;oBACvE,CAAC,CAAC,EAAE,CAAC;SACV,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,IAAI,CAAC;QACR,SAAS;QACT,QAAQ,CAAC,QAAQ,CAAC,GAAG,CACnB,CAAC,OAAO,EAAE,EAAE,CACV,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;YACvD,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,CAAC,OAAO,CAAC,WAAW;gBAClB,CAAC,CAAC,gBAAgB,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;gBACpD,CAAC,CAAC,EAAE,CAAC,CACV;KACF,CAAC,CAAC;IACH,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAuB;IAClD,MAAM,KAAK,GAAG,CAAC,UAAoD,EAAE,EAAE,CACrE,UAAU,CAAC,KAAK,KAAK,QAAQ;QAC3B,CAAC,CAAC,+BAA+B;QACjC,CAAC,CAAC,oBAAoB,UAAU,CAAC,IAAI,GAAG,CAAC;IAC7C,MAAM,KAAK,GAAG;QACZ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CACrC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,UAAU,CAAC,EAAE,CACxD;QACD,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CACpB,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,UAAU,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,CACnE;KACF,CAAC;IACF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAuB;IACpD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC;SACnD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;SACtB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,wBAAC,mBAAmB,CAAC,IAAI,CAAC,mCAAI,IAAI,GAAA,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC;AAC7E,CAAC;AAED,MAAM,mBAAmB,GAA2B;IAClD,UAAU,EAAE,iBAAiB;IAC7B,MAAM,EAAE,YAAY;IACpB,YAAY,EAAE,mBAAmB;IACjC,MAAM,EAAE,gBAAgB;CACzB,CAAC;AAEF,SAAS,aAAa,CAAC,IAAuB;;IAC5C,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW;QACjC,OAAO,qEAAqE,CAAC;IAC/E,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK;QAC3B,OAAO,qEAAqE,CAAC;IAC/E,OAAO,CACL,CAAC,GAAG,OAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,mCAAI,EAAE,CAAC,EAAE,GAAG,OAAC,IAAI,CAAC,KAAK,CAAC,KAAK,mCAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACxE,MAAM,CACP,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAAG;IACpB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,sBAAsB;IAC/B,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;IACtB,aAAa,EAAE,aAAa;CACpB,CAAC;AAEX,SAAS,aAAa,CACpB,EAAM,EACN,MAA2B,EAC3B,MAAc;;IAEd,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAC5B,MAAM,IAAI,GAAgB,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACjE,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC;YACR,eAAe;YACf,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,gBAAgB,CAAC;SAC7D,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,SAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,mCAAI,EAAE,CAAC;IAChC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC;YACR,MAAM;YACN,IAAI,CAAC,GAAG,CACN,CAAC,IAAI,EAAE,EAAE,kBACP,GAAG,IAAI,CAAC,IAAI,aAAa,IAAI,CAAC,OAAO,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,MAAA,IAAI,CAAC,MAAM,mCAAI,uBAAuB,WAAW,0CAA0C,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,aAAa,MAAM,EAAE,GAAA,CACvQ;SACF,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC;YACR,kBAAkB;YAClB,MAAM,CAAC,MAAM,CAAC,GAAG,CACf,CAAC,IAAI,EAAE,EAAE,kBACP,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAC,IAAI,CAAC,MAAM,mCAAI,uBAAuB,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,iCAAiC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,aAAa,MAAM,GAAG,GAAA,CACzL;SACF,CAAC,CAAC;IACL,CAAC;IACD,MAAM,KAAK,GACT,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC;QAC9D,QAAQ,CAAC,gBAAgB,KAAK,QAAQ,CAAC,aAAa;QAClD,CAAC,CAAC;YACE,iEAAiE,QAAQ,CAAC,GAAG,eAAe;SAC7F;QACH,CAAC,CAAC,EAAE,CAAC;IACT,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CACR,qCAAqC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,sCAAsC,4HAA4H,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,gGAAgG,CAAC,CAAC,CAAC,EAAE,EAAE,CACxY,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CACR,gNAAgN,CACjN,CAAC;IACJ,CAAC;SAAM,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,KAAK,CAAC,IAAI,CACR,yKAAyK,CAC1K,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,GAAG,EAAE;QAC1D,IAAI,EACF,MAAM,CAAC,OAAO,KAAK,WAAW;YAC9B,OAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAC,MAAM,mCAAI,CAAC,CAAC,GAAG,CAAC;YAChC,IAAI,CAAC,MAAM,GAAG,CAAC;YACb,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,IAAI;QACV,IAAI;QACJ,KAAK;KACN,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n type AgentTemplateArchiveResult,\n type AgentTemplateBody,\n AgentTemplateBodySchema,\n type AgentTemplateDetail,\n AgentTemplateKeySchema,\n type AgentTemplateList,\n type AgentTemplateResult,\n} from '@ekanos/integration-schema';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport {\n type AgentsApiResult,\n applyAgentTemplate,\n archiveAgentTemplate,\n listAgentTemplates,\n publishAgentTemplate,\n showAgentTemplate,\n} from '../agents-api';\nimport type { StoredSession } from '../auth/credential-store';\nimport { loginHint } from '../auth/host-trust';\nimport {\n type AuthEnvironment,\n refreshStoredSession,\n requireSession,\n resolveAuthEnvironment,\n} from '../auth/session';\nimport type { CliContext } from '../context';\nimport {\n authRequiredError,\n invalidStateError,\n notFoundError,\n usageError,\n validationError,\n} from '../errors';\nimport type { ExitCode } from '../exit-codes';\nimport { type PulledFile, writePulledFiles } from '../pull-write';\nimport { classifyPath } from '../safe-fs';\nimport { resolveSourceTarget } from '../source-target';\nimport { type ResultRow, type Ui, pluralize } from '../ui';\nimport {\n areaRows,\n isTemplateEditSubcommand,\n runTemplateEdit,\n} from './agents-edit';\nimport { runAgentsInit, withDocsHint } from './agents-init';\nimport { promptYesNo } from './publish';\nimport { runAgentTest } from './runs';\nimport {\n AGENT_SKILLS_DIR,\n type SkillFolder,\n SkillsClient,\n findAgentSkillFolders,\n pushSkillFolder,\n pushSummary,\n readSkillFolder,\n} from './skills';\nimport { describeHold } from './team-agent-readiness';\n\nexport const AGENTS_SUBCOMMANDS = [\n 'init',\n 'list',\n 'show',\n 'pull',\n 'apply',\n 'publish',\n 'rollback',\n 'archive',\n 'unarchive',\n 'test',\n 'policy',\n 'triggers',\n 'links',\n 'overrides',\n] as const;\n\ntype AgentsSubcommand = (typeof AGENTS_SUBCOMMANDS)[number];\n\n/** The file `pull` writes and `apply` reads, inside an agent's directory. */\nexport const AGENT_FILE = 'agent.json';\n/** Instructions as Markdown, beside it. Used when `agent.json` has none. */\nexport const AGENT_INSTRUCTIONS_FILE = 'AGENT.md';\n\nexport interface AgentsArgs {\n host?: string;\n source?: string;\n subcommand?: string;\n /** A template key, or for `apply` a file or directory. */\n target?: string;\n /** `publish` / `rollback`: the version to make the one teams run. */\n to?: string;\n baseVersion?: string;\n overwrite: boolean;\n out?: string;\n yes: boolean;\n /** `list`: archived agents too. */\n all?: boolean;\n /**\n * `init`: replace the skills and CLAUDE.md even when they exist. `pull`:\n * overwrite local files that differ from the host's.\n */\n force?: boolean;\n /**\n * `apply`: push the skill folders beside the agent (`<dir>/skills/<slug>/`)\n * first, and name them in its skills. On unless `--no-skills`.\n */\n skills?: boolean;\n /** `init`: `--claude` adds the docs to Claude Code without asking; `--no-claude` skips it. */\n claude?: boolean;\n /** `policy | triggers | links | overrides`: positionals after the key. */\n rest?: string[];\n event?: string;\n filter?: string[];\n disabled?: boolean;\n cron?: string;\n timezone?: string;\n kind?: string;\n mode?: string;\n reads?: string;\n writes?: string;\n /** `policy | triggers | links | overrides`: publish the stored version right away. */\n publish?: boolean;\n /**\n * `publish` / `rollback` (and an edit's `--publish`): also confirm, as\n * yourself, that the agent may use your connections on every team where\n * it runs as you.\n */\n confirmAccess?: boolean;\n dir: string;\n env: Record<string, string | undefined>;\n stdinIsTTY?: boolean;\n confirm?: (question: string) => Promise<boolean>;\n /** `test`: the team to run the draft on, and what to give it. Also a trigger's prompt. */\n team?: string;\n prompt?: string;\n input?: string;\n follow?: boolean;\n}\n\n/**\n * `agents` — the Source's agent templates (plan 239.0 / 239.2). Ekanos holds\n * them; nothing here is deployed. `apply` stores a new version (a draft\n * until published), `publish` makes a version the one every team runs,\n * `rollback` publishes an older one. `pull` writes a template out as\n * `agent.json` + `AGENT.md` for review or Git, and `apply` reads the same\n * layout back.\n */\nexport async function runAgents(\n ctx: CliContext,\n args: AgentsArgs,\n): Promise<ExitCode> {\n const subcommand = parseSubcommand(args.subcommand);\n if (!isTemplateEditSubcommand(subcommand) && (args.rest?.length ?? 0) > 0) {\n throw usageError(\n `\"agents ${subcommand}\" takes at most one argument after the subcommand.`,\n 'See \"ekanos agents --help\".',\n );\n }\n\n // Local only: no host, no session.\n if (subcommand === 'init') {\n return runAgentsInit(ctx, {\n dir: path.resolve(args.dir, args.target ?? '.'),\n force: args.force === true,\n claude: args.claude,\n canPrompt: canPrompt(ctx, args),\n confirm: args.confirm ?? promptYesNo,\n env: args.env,\n });\n }\n\n if (subcommand === 'test') {\n return runAgentTest(ctx, {\n host: args.host,\n source: args.source,\n positionals: [],\n key: args.target,\n team: args.team,\n prompt: args.prompt,\n input: args.input,\n follow: args.follow === true,\n dir: args.dir,\n env: args.env,\n });\n }\n\n // Read the local input before any network call, so a bad file fails fast.\n const local =\n subcommand === 'apply' ? readAgentInput(args.target, args.dir) : null;\n const localSkills =\n local?.file && args.skills !== false\n ? findAgentSkillFolders(path.dirname(local.file)).map((dir) =>\n readSkillFolder(dir, args.dir),\n )\n : [];\n if (local && localSkills.length > 0) {\n local.body = withLocalSkills(local.body, localSkills);\n }\n\n const env = resolveAuthEnvironment(ctx, args.host, args.env, {\n projectDir: args.dir,\n });\n const resolved = await resolveSourceTarget(env, requireSession(env), args);\n const client = new AgentsClient(env, resolved.session);\n const source = resolved.source;\n\n if (isTemplateEditSubcommand(subcommand)) {\n const key = requireKey(args.target, subcommand);\n return runTemplateEdit(\n ctx,\n {\n subcommand,\n key,\n rest: args.rest ?? [],\n event: args.event,\n filter: args.filter,\n prompt: args.prompt,\n disabled: args.disabled === true,\n cron: args.cron,\n timezone: args.timezone,\n kind: args.kind,\n mode: args.mode,\n reads: args.reads,\n writes: args.writes,\n publish: args.publish === true,\n dir: args.dir,\n },\n {\n host: env.host,\n source,\n show: async () =>\n (\n await client.call((token) =>\n showAgentTemplate(env.host, token, source, key),\n )\n ).template,\n apply: (body, baseVersion) =>\n client.call((token) =>\n applyAgentTemplate(env.host, token, {\n source,\n key,\n body,\n baseVersion,\n overwrite: false,\n }),\n ),\n publish: async (version) => {\n await confirmPublish(ctx, args, {\n key,\n source,\n what: `Publish ${key} version ${version}`,\n });\n return client.call((token) =>\n publishAgentTemplate(env.host, token, 'publish', {\n source,\n key,\n version,\n confirmAccess: args.confirmAccess === true,\n }),\n );\n },\n summarize: (result) => resultSummary(ctx.ui, result, source),\n },\n );\n }\n\n switch (subcommand) {\n case 'list': {\n const list = await client.call((token) =>\n listAgentTemplates(env.host, token, source),\n );\n // Archived agents are retired: listed only on request.\n const shown =\n args.all === true\n ? list\n : {\n ...list,\n templates: list.templates.filter(\n (template) => template.status !== 'archived',\n ),\n };\n const hidden = list.templates.length - shown.templates.length;\n return ctx.succeed(\n { host: env.host, ...shown },\n withDocsHint(ctx.ui, args.dir, listSummary(ctx.ui, shown, hidden)),\n );\n }\n case 'archive':\n case 'unarchive': {\n const key = requireKey(args.target, subcommand);\n if (subcommand === 'archive') {\n await confirmArchive(ctx, args, { key, source });\n }\n const result = await client.call((token) =>\n archiveAgentTemplate(env.host, token, subcommand, { source, key }),\n );\n return ctx.succeed(\n { host: env.host, ...result },\n archiveSummary(ctx.ui, result, subcommand),\n );\n }\n case 'show': {\n const key = requireKey(args.target, 'show');\n const shown = await client.call((token) =>\n showAgentTemplate(env.host, token, source, key),\n );\n return ctx.succeed(\n { host: env.host, ...shown },\n templateDetail(ctx.ui, shown.template),\n );\n }\n case 'pull': {\n const key = requireKey(args.target, 'pull');\n const shown = await client.call((token) =>\n showAgentTemplate(env.host, token, source, key),\n );\n const outDir = path.resolve(\n args.dir,\n args.out ?? path.join('agents', key),\n );\n const written = writePulledFiles({\n projectDir: args.dir,\n outDir,\n files: agentFiles(shown.template),\n force: args.force === true,\n rerun: `ekanos agents pull ${key}`,\n });\n return ctx.succeed(\n {\n host: env.host,\n key,\n version: shown.template.latestVersion,\n files: written,\n },\n ctx.ui.result({\n title: `Pulled ${key} v${shown.template.latestVersion}`,\n rows: written.map((file): ResultRow => ['Wrote', file]),\n notes: [\n `Edit, then \"ekanos agents apply ${path.relative(args.dir, outDir) || '.'}\".`,\n ],\n }),\n );\n }\n case 'apply': {\n const input = local!;\n const baseVersion =\n parseVersionFlag(args.baseVersion, '--base-version') ??\n input.baseVersion;\n // The skills first, so the agent can name them. Source level: a\n // template may only name the Source's skills and the platform's.\n const skillsClient = new SkillsClient(env, resolved.session);\n const pushedSkills: Awaited<ReturnType<typeof pushSkillFolder>>[] = [];\n for (const folder of localSkills) {\n pushedSkills.push(\n await pushSkillFolder(skillsClient, env.host, { source, folder }),\n );\n }\n const result = await client.call((token) =>\n applyAgentTemplate(env.host, token, {\n source,\n key: input.key,\n body: input.body,\n baseVersion,\n overwrite: args.overwrite,\n }),\n );\n if (input.file && result.outcome !== 'unchanged') {\n recordBaseVersion(input.file, result.version);\n }\n return ctx.succeed(\n { host: env.host, ...result, skills: pushedSkills },\n [\n ...pushedSkills.map((pushed) => pushSummary(ctx.ui, pushed)),\n resultSummary(ctx.ui, result, source),\n ].join('\\n\\n'),\n );\n }\n case 'publish':\n case 'rollback': {\n const key = requireKey(args.target, subcommand);\n let version = parseVersionFlag(args.to, '--to') ?? undefined;\n if (subcommand === 'rollback' && version === undefined) {\n throw usageError(\n 'rollback needs the version to go back to.',\n `Pass \"--to <n>\". \"ekanos agents show ${key}\" lists them.`,\n );\n }\n // Refuse a script with no --yes before reading anything.\n if (!args.yes && !canPrompt(ctx, args)) {\n throw validationError(\n `${subcommand === 'rollback' ? 'Rolling back' : 'Publishing'} ${key} on ${source} needs confirmation.`,\n 'It reaches every team running this agent at once. Pass --yes to confirm.',\n );\n }\n // Publish names the version it confirmed, never \"whatever is latest\n // when the request lands\" — a draft applied in between is not shipped\n // unseen to every team.\n if (version === undefined) {\n const shown = await client.call((token) =>\n showAgentTemplate(env.host, token, source, key),\n );\n version = shown.template.latestVersion;\n }\n await confirmPublish(ctx, args, {\n key,\n source,\n what:\n subcommand === 'rollback'\n ? `Roll ${key} back to version ${version}`\n : `Publish ${key} version ${version}`,\n });\n const result = await client.call((token) =>\n publishAgentTemplate(env.host, token, subcommand, {\n source,\n key,\n version,\n confirmAccess: args.confirmAccess === true,\n }),\n );\n return ctx.succeed(\n { host: env.host, ...result },\n resultSummary(ctx.ui, result, source),\n );\n }\n }\n}\n\n/** Every call refreshes the session once on a 401, then gives up. */\nclass AgentsClient {\n constructor(\n private readonly env: AuthEnvironment,\n private session: StoredSession,\n ) {}\n\n async call<T>(\n send: (accessToken: string) => Promise<AgentsApiResult<T>>,\n ): Promise<T> {\n let result = await send(this.session.accessToken);\n if (result.status === 'unauthorized') {\n this.session = await refreshStoredSession(this.env, this.session);\n result = await send(this.session.accessToken);\n }\n if (result.status === 'ok') return result.data;\n throw authRequiredError(\n `The session for ${this.env.host} could not authorize the agents call.`,\n loginHint(this.env),\n );\n }\n}\n\nfunction parseSubcommand(value: string | undefined): AgentsSubcommand {\n const match = AGENTS_SUBCOMMANDS.find((name) => name === value);\n if (match) return match;\n throw usageError(\n value\n ? `Unknown agents subcommand \"${value}\".`\n : 'agents needs a subcommand.',\n `Run one of: ${AGENTS_SUBCOMMANDS.map((name) => `ekanos agents ${name}`).join(', ')}.`,\n );\n}\n\nfunction requireKey(value: string | undefined, verb: string): string {\n const parsed = AgentTemplateKeySchema.safeParse(value ?? '');\n if (parsed.success) return parsed.data;\n throw usageError(\n value\n ? `\"${value}\" is not an agent key.`\n : `agents ${verb} needs an agent key.`,\n `Pass the key, e.g. \"ekanos agents ${verb} support-triage\". ` +\n `\"ekanos agents list\" shows them.`,\n );\n}\n\nfunction parseVersionFlag(\n value: string | undefined,\n flag: string,\n): number | null {\n if (value === undefined) return null;\n const version = Number(value);\n if (Number.isInteger(version) && version >= 1) return version;\n throw usageError(\n `${flag} must be a version number (got \"${value}\").`,\n `\"ekanos agents show <key>\" lists the versions.`,\n );\n}\n\n/**\n * The agent's skills plus the folders beside it, which it uses by being\n * there — a repo migrated as `agents/<key>/skills/<slug>/` need not repeat\n * them in agent.json.\n */\nfunction withLocalSkills(\n body: AgentTemplateBody,\n folders: SkillFolder[],\n): AgentTemplateBody {\n const skills = [...body.skills];\n for (const folder of folders) {\n if (!skills.includes(folder.slug)) skills.push(folder.slug);\n }\n if (skills.length > 50) {\n throw validationError(\n `The agent would name ${skills.length} skills (with its ${AGENT_SKILLS_DIR}/ folders); the limit is 50.`,\n 'Drop some, or pass --no-skills and list them in agent.json.',\n );\n }\n return { ...body, skills };\n}\n\ninterface AgentInput {\n key: string;\n body: AgentTemplateBody;\n baseVersion: number | null;\n /** The agent.json read, when there was one, so the new version is recorded in it. */\n file: string | null;\n}\n\n/**\n * Read `apply`'s input: a directory holding `agent.json` (and optionally\n * `AGENT.md`), or a `.json` file. The key is the file's `key`, else the\n * directory's name. `baseVersion` in the file is the version it was pulled\n * or last applied at — what the host checks for a concurrent change.\n */\nexport function readAgentInput(\n target: string | undefined,\n cwd: string,\n): AgentInput {\n if (!target) {\n throw usageError(\n 'agents apply needs a file or directory.',\n `Pass an agent directory (\"ekanos agents apply agents/support\") or a ` +\n `JSON file. \"ekanos agents pull <key>\" writes the layout.`,\n );\n }\n const resolved = path.resolve(cwd, target);\n const kind = classifyPath(resolved);\n const dir = kind === 'directory' ? resolved : path.dirname(resolved);\n const file =\n kind === 'directory' ? path.join(resolved, AGENT_FILE) : resolved;\n\n if (classifyPath(file) !== 'file') {\n throw notFoundError(\n `No ${kind === 'directory' ? AGENT_FILE : 'file'} at ${file}.`,\n `\"ekanos agents pull <key>\" writes ${AGENT_FILE} and ${AGENT_INSTRUCTIONS_FILE}.`,\n );\n }\n\n let raw: unknown;\n try {\n raw = JSON.parse(fs.readFileSync(file, 'utf8'));\n } catch (error) {\n throw validationError(\n `${file} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`,\n 'Fix the JSON and apply again.',\n );\n }\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n throw validationError(\n `${file} must hold a JSON object.`,\n 'See \"ekanos agents --help\".',\n );\n }\n\n const {\n key: rawKey,\n baseVersion: rawBase,\n $schema: _schema,\n ...rest\n } = raw as Record<string, unknown>;\n const fields: Record<string, unknown> = { ...rest };\n\n const instructionsFile = path.join(dir, AGENT_INSTRUCTIONS_FILE);\n if (\n fields.instructions === undefined &&\n classifyPath(instructionsFile) === 'file'\n ) {\n fields.instructions = fs.readFileSync(instructionsFile, 'utf8');\n }\n\n const key = AgentTemplateKeySchema.safeParse(\n typeof rawKey === 'string' ? rawKey : path.basename(dir),\n );\n if (!key.success) {\n throw validationError(\n `No usable agent key: set \"key\" in ${file}, or name the directory after it.`,\n key.error.issues[0]?.message ??\n 'Use lowercase letters, digits and hyphens.',\n );\n }\n\n const body = AgentTemplateBodySchema.safeParse(fields);\n if (!body.success) {\n throw validationError(\n [\n `${file} is not a valid agent:`,\n ...body.error.issues.map(\n (issue) => ` ${issue.path.join('.') || '(root)'}: ${issue.message}`,\n ),\n ].join('\\n'),\n `Fields: name, description, instructions (or ${AGENT_INSTRUCTIONS_FILE}), ` +\n `model, maxTurns, tools, policy, skills, connections, mcpServers, ` +\n `teamCustomization, triggers, links, teamOverrides.`,\n );\n }\n\n const baseVersion =\n typeof rawBase === 'number' && Number.isInteger(rawBase) && rawBase >= 1\n ? rawBase\n : null;\n\n return { key: key.data, body: body.data, baseVersion, file };\n}\n\n/**\n * `agent.json` + `AGENT.md`. The instructions live in the Markdown so they\n * read and diff as prose; the JSON holds everything else plus the version\n * they came from.\n */\nfunction agentFiles(template: AgentTemplateDetail): PulledFile[] {\n const { instructions, ...rest } = template.body;\n const json = {\n key: template.key,\n baseVersion: template.latestVersion,\n ...rest,\n };\n return [\n { path: AGENT_FILE, contents: `${JSON.stringify(json, null, 2)}\\n` },\n {\n path: AGENT_INSTRUCTIONS_FILE,\n contents: instructions.endsWith('\\n')\n ? instructions\n : `${instructions}\\n`,\n },\n ];\n}\n\n/** After a stored version, point the file at it, so the next apply is based on it. */\nfunction recordBaseVersion(file: string, version: number) {\n const raw = JSON.parse(fs.readFileSync(file, 'utf8')) as Record<\n string,\n unknown\n >;\n if (raw.baseVersion === version) return;\n const { key, baseVersion: _old, ...rest } = raw;\n const next =\n key === undefined\n ? { baseVersion: version, ...rest }\n : { key, baseVersion: version, ...rest };\n fs.writeFileSync(file, `${JSON.stringify(next, null, 2)}\\n`);\n}\n\nfunction canPrompt(ctx: CliContext, args: AgentsArgs): boolean {\n return !ctx.jsonMode && (args.stdinIsTTY ?? process.stdin.isTTY === true);\n}\n\n/**\n * Publishing changes what every team running the agent does, at once. A\n * human run asks first; a scripted or JSON run needs `--yes`.\n */\nasync function confirmPublish(\n ctx: CliContext,\n args: AgentsArgs,\n target: { key: string; source: string; what: string },\n) {\n if (args.yes) return;\n if (!canPrompt(ctx, args)) {\n throw validationError(\n `${target.what} on ${target.source} needs confirmation.`,\n 'It reaches every team running this agent at once. Pass --yes to confirm.',\n );\n }\n ctx.log(\n `${target.what} on ${target.source}. Every team running it follows at once.`,\n );\n const confirmed = await (args.confirm ?? promptYesNo)('Proceed? [y/N]');\n if (!confirmed) {\n throw validationError(\n `${target.what} was not confirmed.`,\n 'Nothing was changed.',\n );\n }\n}\n\n/**\n * Archiving takes the agent away from every team that has not turned it on,\n * and the host refuses it while any team has. A human run asks first; a\n * scripted or JSON run needs `--yes`.\n */\nasync function confirmArchive(\n ctx: CliContext,\n args: AgentsArgs,\n target: { key: string; source: string },\n) {\n if (args.yes) return;\n if (!canPrompt(ctx, args)) {\n throw invalidStateError(\n `Archiving ${target.key} on ${target.source} means no team can turn it on, and it cannot be applied or published, until it is unarchived.`,\n `Re-run with --yes: ekanos agents archive ${target.key} --source ${target.source} --yes`,\n );\n }\n const confirmed = await (args.confirm ?? promptYesNo)(\n `Archive ${target.key} on ${target.source}? No team can turn it on until \"ekanos agents unarchive ${target.key}\". [y/N]`,\n );\n if (!confirmed) {\n throw validationError(\n `Archiving ${target.key} was not confirmed.`,\n 'Nothing was changed.',\n );\n }\n}\n\nfunction archiveSummary(\n ui: Ui,\n result: AgentTemplateArchiveResult,\n action: 'archive' | 'unarchive',\n): string {\n const { template } = result;\n if (result.outcome === 'unchanged') {\n return ui.result({\n title: `Unchanged: ${template.key} is already ${action === 'archive' ? 'archived' : 'active'}`,\n tone: 'warn',\n rows: [['Versions', versionLabel(template)]],\n });\n }\n return ui.result({\n title: `${result.outcome === 'archived' ? 'Archived' : 'Unarchived'}: ${template.key}`,\n rows: [['Versions', versionLabel(template)]],\n notes: [\n result.outcome === 'archived'\n ? `Teams can no longer turn it on. \"ekanos agents unarchive ${template.key}\" brings it back.`\n : `Teams can turn it on again${template.publishedVersion === null ? ' once it is published' : ''}.`,\n ],\n });\n}\n\nfunction versionLabel(template: {\n latestVersion: number;\n publishedVersion: number | null;\n}): string {\n if (template.publishedVersion === null)\n return `v${template.latestVersion} draft, never published`;\n if (template.publishedVersion === template.latestVersion)\n return `v${template.latestVersion} published`;\n return `v${template.publishedVersion} published, v${template.latestVersion} latest`;\n}\n\nfunction listSummary(ui: Ui, list: AgentTemplateList, hidden: number): string {\n const archivedHint =\n hidden > 0\n ? ui.hint(\n `${pluralize(hidden, 'archived agent')} not shown; --all lists ${hidden === 1 ? 'it' : 'them'}.`,\n )\n : null;\n if (list.templates.length === 0) {\n return [\n ui.result({\n title:\n hidden > 0\n ? `No active agents on ${list.source.slug}`\n : `No agents on ${list.source.slug} yet`,\n tone: 'warn',\n notes: ['\"ekanos agents apply <dir>\" stores the first one.'],\n }),\n ...(archivedHint ? [archivedHint] : []),\n ].join('\\n\\n');\n }\n return [\n ui.result({\n title: `${pluralize(list.templates.length, 'agent')} on ${list.source.slug}`,\n rows: list.templates.map((template): ResultRow => [\n template.key,\n [\n template.name,\n versionLabel(template),\n template.status === 'archived' ? 'archived' : null,\n template.teams\n ? `${pluralize(template.teams.enabled, 'team')}`\n : null,\n ]\n .filter(Boolean)\n .join(' · '),\n ]),\n }),\n ui.hint('\"ekanos agents show <key>\" shows one, with its versions.'),\n ...(archivedHint ? [archivedHint] : []),\n ].join('\\n\\n');\n}\n\nfunction templateDetail(ui: Ui, template: AgentTemplateDetail): string {\n const { body } = template;\n const rows: ResultRow[] = [\n ['Versions', versionLabel(template)],\n ['Model', body.model ?? 'house default'],\n ['Tools', describeTools(body)],\n [\n 'Approval',\n `reads ${body.policy.reads}, writes ${body.policy.writes}` +\n (Object.keys(body.policy.overrides).length > 0\n ? `, ${pluralize(Object.keys(body.policy.overrides).length, 'override')}`\n : ''),\n ],\n ['Skills', body.skills.length > 0 ? body.skills.join(', ') : 'none'],\n ['Connections', describeConnections(body)],\n ['Teams may add', describeCustomization(body)],\n ...areaRows('triggers', body).slice(0, 1),\n ...areaRows('links', body).slice(0, 1),\n [\n 'Team overrides',\n areaRows('overrides', body).map(([area, value]) => `${area}: ${value}`),\n ],\n ];\n if (template.status === 'archived') {\n rows.unshift([\n 'Status',\n `archived: no team can turn it on; \"ekanos agents unarchive ${template.key}\" brings it back`,\n ]);\n }\n if (template.teams) {\n rows.push([\n 'Teams',\n `${template.teams.enabled} running` +\n (template.teams.pinned > 0\n ? `, ${template.teams.pinned} pinned to an older version`\n : '') +\n ((template.teams.held ?? 0) > 0\n ? `, ${template.teams.held} held on an earlier version until confirmed`\n : ''),\n ]);\n }\n rows.push([\n 'History',\n template.versions.map(\n (version) =>\n `v${version.version} ${version.createdAt.slice(0, 10)}` +\n (version.createdBy ? ` by ${version.createdBy}` : '') +\n (version.publishedAt\n ? ` · published ${version.publishedAt.slice(0, 10)}`\n : ''),\n ),\n ]);\n return ui.result({ title: `${body.name} (${template.key})`, rows });\n}\n\nfunction describeConnections(body: AgentTemplateBody): string[] {\n const owner = (connection: AgentTemplateBody['connections'][string]) =>\n connection.owner === 'source'\n ? 'one connection for the source'\n : `each team's own (${connection.team})`;\n const lines = [\n ...Object.entries(body.connections).map(\n ([slug, connection]) => `${slug}: ${owner(connection)}`,\n ),\n ...body.mcpServers.map(\n (server) => `${server.key} (MCP, ${server.url}): ${owner(server)}`,\n ),\n ];\n return lines.length > 0 ? lines : [\"each team's own (optional)\"];\n}\n\nfunction describeCustomization(body: AgentTemplateBody): string {\n const allowed = Object.entries(body.teamCustomization)\n .filter(([, on]) => on)\n .map(([knob]) => CUSTOMIZATION_LABEL[knob] ?? knob);\n return allowed.length > 0 ? allowed.join(', ') : 'nothing (template only)';\n}\n\nconst CUSTOMIZATION_LABEL: Record<string, string> = {\n mcpServers: 'own MCP servers',\n skills: 'own skills',\n integrations: 'more integrations',\n narrow: 'narrower tools',\n};\n\nfunction describeTools(body: AgentTemplateBody): string {\n if (body.tools.mode === 'read_only')\n return 'every read on the products it can reach (team- or Source-connected)';\n if (body.tools.mode === 'all')\n return 'every tool on the products it can reach (team- or Source-connected)';\n return (\n [...(body.tools.products ?? []), ...(body.tools.tools ?? [])].join(', ') ||\n 'none'\n );\n}\n\nconst OUTCOME_TITLE = {\n created: 'Created',\n updated: 'Stored a new version',\n unchanged: 'Unchanged',\n published: 'Published',\n 'rolled-back': 'Rolled back',\n} as const;\n\nfunction resultSummary(\n ui: Ui,\n result: AgentTemplateResult,\n source: string,\n): string {\n const { template } = result;\n const rows: ResultRow[] = [['Versions', versionLabel(template)]];\n if (result.outcome === 'published' || result.outcome === 'rolled-back') {\n rows.push(['Teams updated', String(result.teamsUpdated)]);\n }\n const access = result.access;\n if (access && access.confirmed.length > 0) {\n rows.push([\n 'You confirmed',\n access.confirmed.map((team) => `${team.team} (runs as you)`),\n ]);\n }\n const held = access?.held ?? [];\n if (held.length > 0) {\n rows.push([\n 'Held',\n held.map(\n (team) =>\n `${team.team} held on v${team.version} — v${team.hold.waiting} ${describeHold(team.hold)}; ${team.you ? 'you confirm' : `${team.runsAs ?? 'the person it runs as'} confirms`}: npx @ekanos/cli teams agents confirm ${team.team} ${template.key} --source ${source}`,\n ),\n ]);\n }\n if (access && access.needed.length > 0) {\n rows.push([\n 'Needs confirming',\n access.needed.map(\n (team) =>\n `${team.team}: ${team.you ? 'you' : (team.runsAs ?? 'the person it runs as')} run${team.you ? '' : 's'} \"ekanos teams agents confirm ${team.team} ${template.key} --source ${source}\"`,\n ),\n ]);\n }\n const notes =\n (result.outcome === 'created' || result.outcome === 'updated') &&\n template.publishedVersion !== template.latestVersion\n ? [\n `Teams still run the published version. \"ekanos agents publish ${template.key}\" moves them.`,\n ]\n : [];\n if (held.length > 0) {\n notes.push(\n `This version reaches further than ${held.length === 1 ? 'that team confirmed, so it keeps' : 'those teams confirmed, so each keeps'} running its earlier version, as confirmed, until the person it runs as confirms the update; nobody can confirm for them.${held.some((team) => team.you) ? ' Publishing with --confirm-access confirms, and moves, every team where the agent runs as you.' : ''}`,\n );\n }\n if (access?.needed.some((team) => team.you)) {\n notes.push(\n 'This version reaches further than what was confirmed. Until confirmed, those agents keep only what needs no confirmation. Publishing with --confirm-access confirms on every team where the agent runs as you.',\n );\n } else if (access && access.needed.length > 0) {\n notes.push(\n 'This version reaches further than what was confirmed. Until each person above confirms, their agent keeps only what needs no confirmation; nobody can confirm for them.',\n );\n }\n return ui.result({\n title: `${OUTCOME_TITLE[result.outcome]}: ${template.key}`,\n tone:\n result.outcome === 'unchanged' ||\n (access?.needed.length ?? 0) > 0 ||\n held.length > 0\n ? 'warn'\n : 'ok',\n rows,\n notes,\n });\n}\n"]}
|
package/dist/commands/apps.d.ts
CHANGED
|
@@ -18,14 +18,16 @@ export interface AppsArgs {
|
|
|
18
18
|
pollDelayMs?: number;
|
|
19
19
|
/** `connect --no-wait`: print the URL and return without polling. */
|
|
20
20
|
noWait?: boolean;
|
|
21
|
+
/** `disconnect --yes`: confirm without the question (a script, an agent run). */
|
|
22
|
+
yes?: boolean;
|
|
21
23
|
}
|
|
22
24
|
/**
|
|
23
25
|
* `apps` — a Source's provider apps: the OAuth client an integration signs
|
|
24
26
|
* every team in through (Linear's, say). `show` says whether the Source has
|
|
25
27
|
* one and which callback URL to register; `set` takes the client id and
|
|
26
|
-
* secret from the Source admin at the terminal —
|
|
27
|
-
*
|
|
28
|
-
* secret.
|
|
28
|
+
* secret from the Source admin at the terminal — either on its own, Enter
|
|
29
|
+
* keeping the saved one — never from a flag, a file or a non-interactive
|
|
30
|
+
* run, so an agent driving the CLI never handles the secret.
|
|
29
31
|
*/
|
|
30
32
|
export declare function runApps(ctx: CliContext, args: AppsArgs): Promise<ExitCode>;
|
|
31
33
|
/**
|
|
@@ -34,5 +36,14 @@ export declare function runApps(ctx: CliContext, args: AppsArgs): Promise<ExitCo
|
|
|
34
36
|
*/
|
|
35
37
|
export declare function walkthrough(status: ProviderAppStatus): string[];
|
|
36
38
|
export declare function promptLine(question: string): Promise<string>;
|
|
37
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* Read a line without echoing it: the secret never appears on screen or in
|
|
41
|
+
* scrollback. The question is always printed; only the typed characters are
|
|
42
|
+
* hidden (each shows as `*`, so a paste visibly landed).
|
|
43
|
+
*
|
|
44
|
+
* Raw mode by hand rather than readline: a terminal readline redraws its
|
|
45
|
+
* line on `question()` — cursor to column 0, clear to the end of the screen —
|
|
46
|
+
* which erased the question written before it, so the terminal sat on an
|
|
47
|
+
* empty line and a hidden field looked skipped.
|
|
48
|
+
*/
|
|
38
49
|
export declare function promptHidden(question: string): Promise<string>;
|