@nocobase/app-plugin-agents 1.0.0-beta.19 → 1.0.0-beta.20
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/CHANGELOG.md +21 -0
- package/README.md +13 -1
- package/dist/client/api/client.d.ts +29 -1
- package/dist/client/api/client.d.ts.map +1 -1
- package/dist/client/api/client.js +40 -0
- package/dist/client/api/client.js.map +1 -1
- package/dist/client/api/keys.d.ts +8 -0
- package/dist/client/api/keys.d.ts.map +1 -1
- package/dist/client/api/keys.js +19 -0
- package/dist/client/api/keys.js.map +1 -1
- package/dist/client/locales/de-DE.d.ts.map +1 -1
- package/dist/client/locales/de-DE.js +85 -3
- package/dist/client/locales/de-DE.js.map +1 -1
- package/dist/client/locales/en-US.d.ts +80 -2
- package/dist/client/locales/en-US.d.ts.map +1 -1
- package/dist/client/locales/en-US.js +81 -3
- package/dist/client/locales/en-US.js.map +1 -1
- package/dist/client/locales/es-ES.d.ts.map +1 -1
- package/dist/client/locales/es-ES.js +94 -3
- package/dist/client/locales/es-ES.js.map +1 -1
- package/dist/client/locales/fr-FR.d.ts.map +1 -1
- package/dist/client/locales/fr-FR.js +94 -3
- package/dist/client/locales/fr-FR.js.map +1 -1
- package/dist/client/locales/id-ID.d.ts.map +1 -1
- package/dist/client/locales/id-ID.js +85 -3
- package/dist/client/locales/id-ID.js.map +1 -1
- package/dist/client/locales/ja-JP.d.ts.map +1 -1
- package/dist/client/locales/ja-JP.js +85 -3
- package/dist/client/locales/ja-JP.js.map +1 -1
- package/dist/client/locales/pt-BR.d.ts.map +1 -1
- package/dist/client/locales/pt-BR.js +94 -3
- package/dist/client/locales/pt-BR.js.map +1 -1
- package/dist/client/locales/runtimes.en-US.d.ts +4 -0
- package/dist/client/locales/runtimes.en-US.d.ts.map +1 -1
- package/dist/client/locales/runtimes.en-US.js +7 -3
- package/dist/client/locales/runtimes.en-US.js.map +1 -1
- package/dist/client/locales/runtimes.zh-CN.d.ts.map +1 -1
- package/dist/client/locales/runtimes.zh-CN.js +6 -2
- package/dist/client/locales/runtimes.zh-CN.js.map +1 -1
- package/dist/client/locales/vi-VN.d.ts.map +1 -1
- package/dist/client/locales/vi-VN.js +85 -3
- package/dist/client/locales/vi-VN.js.map +1 -1
- package/dist/client/locales/zh-CN.d.ts.map +1 -1
- package/dist/client/locales/zh-CN.js +81 -3
- package/dist/client/locales/zh-CN.js.map +1 -1
- package/dist/client/locales/zh-TW.d.ts.map +1 -1
- package/dist/client/locales/zh-TW.js +85 -3
- package/dist/client/locales/zh-TW.js.map +1 -1
- package/dist/client/pages/agents/agent-dialog.js +1 -1
- package/dist/client/pages/agents/agent-dialog.js.map +1 -1
- package/dist/client/pages/agents/available-models-drawer.d.ts +7 -0
- package/dist/client/pages/agents/available-models-drawer.d.ts.map +1 -0
- package/dist/client/pages/agents/available-models-drawer.js +330 -0
- package/dist/client/pages/agents/available-models-drawer.js.map +1 -0
- package/dist/client/pages/agents/cleanup-drawer.d.ts +7 -0
- package/dist/client/pages/agents/cleanup-drawer.d.ts.map +1 -0
- package/dist/client/pages/agents/cleanup-drawer.js +214 -0
- package/dist/client/pages/agents/cleanup-drawer.js.map +1 -0
- package/dist/client/pages/agents/runner-agents.d.ts.map +1 -1
- package/dist/client/pages/agents/runner-agents.js +21 -111
- package/dist/client/pages/agents/runner-agents.js.map +1 -1
- package/dist/client/pages/runtimes/connect.d.ts.map +1 -1
- package/dist/client/pages/runtimes/connect.js +4 -5
- package/dist/client/pages/runtimes/connect.js.map +1 -1
- package/dist/client/pages/runtimes/index.js +1 -1
- package/dist/client/pages/runtimes/index.js.map +1 -1
- package/dist/client/pages/runtimes/quota.d.ts +1 -1
- package/dist/client/pages/runtimes/quota.d.ts.map +1 -1
- package/dist/client/pages/runtimes/quota.js +4 -1
- package/dist/client/pages/runtimes/quota.js.map +1 -1
- package/dist/client/pages/runtimes/runner-cells.d.ts.map +1 -1
- package/dist/client/pages/runtimes/runner-cells.js +3 -1
- package/dist/client/pages/runtimes/runner-cells.js.map +1 -1
- package/dist/client/pages/runtimes/runner-overview.d.ts.map +1 -1
- package/dist/client/pages/runtimes/runner-overview.js +6 -8
- package/dist/client/pages/runtimes/runner-overview.js.map +1 -1
- package/dist/client/pages/runtimes/runner-sheet.js +3 -1
- package/dist/client/pages/runtimes/runner-sheet.js.map +1 -1
- package/dist/client/pages/runtimes/runner-tools.d.ts.map +1 -1
- package/dist/client/pages/runtimes/runner-tools.js +4 -6
- package/dist/client/pages/runtimes/runner-tools.js.map +1 -1
- package/dist/database/migrations/.manifest.json +4 -0
- package/dist/database/migrations/202610280001_ag_explicit_runner_tools.d.ts +5 -0
- package/dist/database/migrations/202610280001_ag_explicit_runner_tools.d.ts.map +1 -0
- package/dist/database/migrations/202610280001_ag_explicit_runner_tools.js +23 -0
- package/dist/database/migrations/202610280001_ag_explicit_runner_tools.js.map +1 -0
- package/dist/package.json +4 -2
- package/dist/server/core/agents/agent.history.d.ts +2 -0
- package/dist/server/core/agents/agent.history.d.ts.map +1 -1
- package/dist/server/core/agents/agent.history.js +4 -0
- package/dist/server/core/agents/agent.history.js.map +1 -1
- package/dist/server/core/agents/agent.service.d.ts +43 -1
- package/dist/server/core/agents/agent.service.d.ts.map +1 -1
- package/dist/server/core/agents/agent.service.js +207 -26
- package/dist/server/core/agents/agent.service.js.map +1 -1
- package/dist/server/core/agents/agent.store.d.ts +2 -0
- package/dist/server/core/agents/agent.store.d.ts.map +1 -1
- package/dist/server/core/agents/agent.store.js +4 -0
- package/dist/server/core/agents/agent.store.js.map +1 -1
- package/dist/server/core/agents/available-models.d.ts +41 -0
- package/dist/server/core/agents/available-models.d.ts.map +1 -0
- package/dist/server/core/agents/available-models.js +225 -0
- package/dist/server/core/agents/available-models.js.map +1 -0
- package/dist/server/core/agents/index.d.ts +1 -0
- package/dist/server/core/agents/index.d.ts.map +1 -1
- package/dist/server/core/agents/index.js +1 -0
- package/dist/server/core/agents/index.js.map +1 -1
- package/dist/server/routes/admin.d.ts.map +1 -1
- package/dist/server/routes/admin.js +133 -2
- package/dist/server/routes/admin.js.map +1 -1
- package/dist/server/routes/runners/admin.d.ts.map +1 -1
- package/dist/server/routes/runners/admin.js +27 -18
- package/dist/server/routes/runners/admin.js.map +1 -1
- package/dist/server/routes/runners/runner.d.ts.map +1 -1
- package/dist/server/routes/runners/runner.js +3 -0
- package/dist/server/routes/runners/runner.js.map +1 -1
- package/dist/server/routes/runners/runs.d.ts.map +1 -1
- package/dist/server/routes/runners/runs.js +9 -3
- package/dist/server/routes/runners/runs.js.map +1 -1
- package/dist/server/routes/schemas.d.ts +35 -2
- package/dist/server/routes/schemas.d.ts.map +1 -1
- package/dist/server/routes/schemas.js +138 -1
- package/dist/server/routes/schemas.js.map +1 -1
- package/dist/server/runners/runner.service.d.ts.map +1 -1
- package/dist/server/runners/runner.service.js +22 -7
- package/dist/server/runners/runner.service.js.map +1 -1
- package/dist/server/runners/runner.store.d.ts +1 -1
- package/dist/server/runners/runner.store.d.ts.map +1 -1
- package/dist/server/runners/runner.store.js +4 -4
- package/dist/server/runners/runner.store.js.map +1 -1
- package/dist/server/runners/tool-detection.d.ts +3 -0
- package/dist/server/runners/tool-detection.d.ts.map +1 -0
- package/dist/server/runners/tool-detection.js +9 -0
- package/dist/server/runners/tool-detection.js.map +1 -0
- package/dist/shared/agents.d.ts +114 -0
- package/dist/shared/agents.d.ts.map +1 -1
- package/dist/shared/agents.js +16 -1
- package/dist/shared/agents.js.map +1 -1
- package/dist/shared/model-catalog.d.ts +14 -2
- package/dist/shared/model-catalog.d.ts.map +1 -1
- package/dist/shared/model-catalog.js +46 -2
- package/dist/shared/model-catalog.js.map +1 -1
- package/dist/shared/runners.d.ts +7 -8
- package/dist/shared/runners.d.ts.map +1 -1
- package/dist/shared/runners.js +17 -11
- package/dist/shared/runners.js.map +1 -1
- package/package.json +14 -12
- package/skills/nocobase-app-plugin-agents/SKILL.md +3 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The available models list (`GET /api/agents/availableModels`): every tool and model any runner has reported,
|
|
3
|
+
* whichever an agent exists for or not, for the enable dialog to group by tool and create from. Replaces the old
|
|
4
|
+
* "New discoveries" section, which read pending agents a runner's report created one of per model — the thing that
|
|
5
|
+
* once produced hundreds of pending agents for a single ACP tool. This file only reads; nothing here writes.
|
|
6
|
+
*
|
|
7
|
+
* Grouped in two steps so the dialog never fetches every tool's models at once: `availableModelGroups` lists each
|
|
8
|
+
* tool once, with its model count and aggregated availability; `availableModelRows` lists one tool's models, for the
|
|
9
|
+
* route to page. Availability is computed per model, from the online runners currently reporting exactly that model
|
|
10
|
+
* — never an offline runner's old report, and never another model of the same tool standing in for one with no
|
|
11
|
+
* runner of its own.
|
|
12
|
+
*/
|
|
13
|
+
import type { AgentTool } from '@nocobase/agent-protocol';
|
|
14
|
+
import type { Agent, AvailableModel, AvailableModelGroup, ModelAvailabilityStatus } from '../../../shared/agents.js';
|
|
15
|
+
import { type AgentService } from './agent.service.js';
|
|
16
|
+
import { type Runner } from '../../../shared/runners.js';
|
|
17
|
+
export interface AvailableModelOptions {
|
|
18
|
+
readonly recommendedModels: readonly {
|
|
19
|
+
readonly tool: AgentTool;
|
|
20
|
+
readonly model: string;
|
|
21
|
+
}[];
|
|
22
|
+
readonly suggestion: AgentService['suggestion'];
|
|
23
|
+
}
|
|
24
|
+
export interface AvailableModelFilter {
|
|
25
|
+
readonly q?: string;
|
|
26
|
+
readonly status?: ModelAvailabilityStatus;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* One row per coding tool any runner has selected, for the enable drawer's group headers: how many models matched
|
|
30
|
+
* `filter`, how many online runners have the tool selected, and its aggregated availability. Bounded by the number
|
|
31
|
+
* of catalog tools, never by how many models one of them lists — the thing the flat list used to ship all at once.
|
|
32
|
+
*/
|
|
33
|
+
export declare function availableModelGroups(runners: readonly Runner[], agents: readonly Agent[], options: AvailableModelOptions, filter?: AvailableModelFilter): AvailableModelGroup[];
|
|
34
|
+
/**
|
|
35
|
+
* One tool's models, for the enable drawer once its group is open or matched a search: unavailable models are listed
|
|
36
|
+
* too (so an administrator can see what a down tool used to offer) but marked unselectable, each with its own
|
|
37
|
+
* availability — a model no online runner currently reports is never shown as available just because a sibling
|
|
38
|
+
* model of the same tool is.
|
|
39
|
+
*/
|
|
40
|
+
export declare function availableModelRows(runners: readonly Runner[], agents: readonly Agent[], options: AvailableModelOptions, tool: AgentTool, filter?: AvailableModelFilter): AvailableModel[];
|
|
41
|
+
//# sourceMappingURL=available-models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"available-models.d.ts","sourceRoot":"","sources":["../../../../server/core/agents/available-models.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EACV,SAAS,EAGV,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EACV,KAAK,EACL,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACxB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAGL,KAAK,MAAM,EACZ,MAAM,4BAA4B,CAAC;AAsJpC,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,iBAAiB,EAAE,SAAS;QACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;QACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,EAAE,CAAC;IACJ,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,uBAAuB,CAAC;CAC3C;AAwCD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,OAAO,EAAE,qBAAqB,EAC9B,MAAM,GAAE,oBAAyB,GAChC,mBAAmB,EAAE,CAuDvB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,OAAO,EAAE,qBAAqB,EAC9B,IAAI,EAAE,SAAS,EACf,MAAM,GAAE,oBAAyB,GAChC,cAAc,EAAE,CAmClB"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { TOOL_LABELS } from '../../../shared/model-catalog.js';
|
|
2
|
+
import { reportedCombos, runnerAgentId, } from './agent.service.js';
|
|
3
|
+
import { reportedModels, toolEnabled, } from '../../../shared/runners.js';
|
|
4
|
+
/** Most actionable first, when more than one online runner disagrees on why a tool is not usable. */
|
|
5
|
+
const REASON_PRIORITY = [
|
|
6
|
+
'notLoggedIn',
|
|
7
|
+
'signInUnconfirmed',
|
|
8
|
+
'notConfigured',
|
|
9
|
+
'versionTooOld',
|
|
10
|
+
'otherProgram',
|
|
11
|
+
'timeout',
|
|
12
|
+
'startFailed',
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* `needsSetup` covers both "not signed in" and "signed in but missing a model or provider": the drawer's fix is the
|
|
16
|
+
* same either way (run the tool's own sign-in/setup command on the runtime). `versionTooOld` stays its own bucket so
|
|
17
|
+
* the filter can single it out; everything else neither a person can act on from here nor confirm is `failed`.
|
|
18
|
+
*/
|
|
19
|
+
function bucketOf(reason) {
|
|
20
|
+
switch (reason) {
|
|
21
|
+
case 'notLoggedIn':
|
|
22
|
+
case 'notConfigured':
|
|
23
|
+
return 'needsSetup';
|
|
24
|
+
case 'versionTooOld':
|
|
25
|
+
return 'versionTooOld';
|
|
26
|
+
default:
|
|
27
|
+
return 'failed';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The same bucket a runner predating `statusReason` (protocol 13) still earns from `status` alone: its plain
|
|
32
|
+
* `needsLogin` must keep reading as `needsSetup`, not disappear into `failed` for lacking a reason field.
|
|
33
|
+
*/
|
|
34
|
+
function bucketOfInfo(info) {
|
|
35
|
+
if (info.statusReason)
|
|
36
|
+
return {
|
|
37
|
+
status: bucketOf(info.statusReason),
|
|
38
|
+
reason: info.statusReason,
|
|
39
|
+
...(info.statusDetail ? { detail: info.statusDetail } : {}),
|
|
40
|
+
};
|
|
41
|
+
if (info.status === 'needsLogin')
|
|
42
|
+
return { status: 'needsSetup' };
|
|
43
|
+
return {
|
|
44
|
+
status: 'failed',
|
|
45
|
+
...(info.statusDetail ? { detail: info.statusDetail } : {}),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* `tool`'s availability across every *online* runner that has it selected (`toolEnabled`): `available` when at least
|
|
50
|
+
* one is signed in and ready; otherwise the most actionable reason none is (`REASON_PRIORITY`, falling back to the
|
|
51
|
+
* plain `status` for a runner with no reason field), with that runner's own words when it gave any. An offline
|
|
52
|
+
* runner's old report never counts, in either direction: it does not grant readiness and it does not block it.
|
|
53
|
+
*/
|
|
54
|
+
function toolAvailability(runners, tool) {
|
|
55
|
+
const infos = runners
|
|
56
|
+
.filter((runner) => runner.status === 'online' && toolEnabled(runner, tool))
|
|
57
|
+
.flatMap((runner) => runner.tools.filter((item) => item.kind === tool));
|
|
58
|
+
const ready = infos.filter((info) => info.authenticated && (!info.status || info.status === 'ready'));
|
|
59
|
+
if (ready.length > 0)
|
|
60
|
+
return { status: 'available', runnerCount: infos.length };
|
|
61
|
+
if (infos.length === 0)
|
|
62
|
+
return { status: 'failed', runnerCount: 0 };
|
|
63
|
+
const classified = infos
|
|
64
|
+
.map((info) => ({ info, ...bucketOfInfo(info) }))
|
|
65
|
+
.sort((a, b) => {
|
|
66
|
+
const ai = a.reason
|
|
67
|
+
? REASON_PRIORITY.indexOf(a.reason)
|
|
68
|
+
: REASON_PRIORITY.length;
|
|
69
|
+
const bi = b.reason
|
|
70
|
+
? REASON_PRIORITY.indexOf(b.reason)
|
|
71
|
+
: REASON_PRIORITY.length;
|
|
72
|
+
return ai - bi;
|
|
73
|
+
});
|
|
74
|
+
const picked = classified[0];
|
|
75
|
+
return {
|
|
76
|
+
status: picked.status,
|
|
77
|
+
...(picked.reason ? { statusReason: picked.reason } : {}),
|
|
78
|
+
...(picked.detail ? { statusDetail: picked.detail } : {}),
|
|
79
|
+
runnerCount: infos.length,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** Every tool and model `runners` report, plus any agent's that no runner currently reports (it may be offline). */
|
|
83
|
+
function allCombos(runners, agents) {
|
|
84
|
+
const combos = new Map();
|
|
85
|
+
for (const runner of runners)
|
|
86
|
+
for (const combo of reportedCombos(runner)) {
|
|
87
|
+
const id = runnerAgentId(combo.tool, combo.model);
|
|
88
|
+
if (combos.has(id))
|
|
89
|
+
continue;
|
|
90
|
+
const displayModel = runner.tools
|
|
91
|
+
.find((tool) => tool.kind === combo.tool)
|
|
92
|
+
?.models?.find((model) => model.id === combo.model)?.name;
|
|
93
|
+
combos.set(id, { ...combo, ...(displayModel ? { displayModel } : {}) });
|
|
94
|
+
}
|
|
95
|
+
// An agent offline runners stopped reporting stays listed: it is not forgotten just because nothing reports it now.
|
|
96
|
+
for (const agent of agents)
|
|
97
|
+
if (agent.source === 'runner' && agent.tool && !combos.has(agent.id))
|
|
98
|
+
combos.set(agent.id, { tool: agent.tool, model: agent.model ?? '' });
|
|
99
|
+
return combos;
|
|
100
|
+
}
|
|
101
|
+
/** Matches the tool's display name, the tool's own id, the model's own id, or its display name. */
|
|
102
|
+
function matchesQuery(tool, combo, q) {
|
|
103
|
+
const needle = q.trim().toLowerCase();
|
|
104
|
+
if (!needle)
|
|
105
|
+
return true;
|
|
106
|
+
return (tool.toLowerCase().includes(needle) ||
|
|
107
|
+
TOOL_LABELS[tool].toLowerCase().includes(needle) ||
|
|
108
|
+
combo.model.toLowerCase().includes(needle) ||
|
|
109
|
+
(combo.displayModel?.toLowerCase().includes(needle) ?? false));
|
|
110
|
+
}
|
|
111
|
+
function toolMatchesQuery(tool, q) {
|
|
112
|
+
const needle = q.trim().toLowerCase();
|
|
113
|
+
return (!needle ||
|
|
114
|
+
tool.toLowerCase().includes(needle) ||
|
|
115
|
+
TOOL_LABELS[tool].toLowerCase().includes(needle));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* `combo`'s own availability: `available` only when an online runner currently reports exactly this model. When none
|
|
119
|
+
* does, it inherits the tool's own aggregate bucket exactly when that explains why — the tool has no ready runner at
|
|
120
|
+
* all, so no model of it could be ready either — but never borrows a sibling model's `available` the way the tool
|
|
121
|
+
* aggregate alone would suggest: a model with no runner behind it is `failed` (not currently backed), not `available`
|
|
122
|
+
* because something else of the same tool is.
|
|
123
|
+
*/
|
|
124
|
+
function comboAvailability(runners, tool, model, toolAvail) {
|
|
125
|
+
const withTool = runners.filter((runner) => runner.status === 'online' && toolEnabled(runner, tool));
|
|
126
|
+
const withModel = withTool.filter((runner) => reportedModels(runner, tool).includes(model));
|
|
127
|
+
const status = withModel.length > 0
|
|
128
|
+
? 'available'
|
|
129
|
+
: toolAvail.status === 'available'
|
|
130
|
+
? 'failed'
|
|
131
|
+
: toolAvail.status;
|
|
132
|
+
return {
|
|
133
|
+
status,
|
|
134
|
+
runners: {
|
|
135
|
+
ready: withModel.length,
|
|
136
|
+
total: withTool.length,
|
|
137
|
+
names: withModel.slice(0, 5).map((runner) => runner.name),
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* One row per coding tool any runner has selected, for the enable drawer's group headers: how many models matched
|
|
143
|
+
* `filter`, how many online runners have the tool selected, and its aggregated availability. Bounded by the number
|
|
144
|
+
* of catalog tools, never by how many models one of them lists — the thing the flat list used to ship all at once.
|
|
145
|
+
*/
|
|
146
|
+
export function availableModelGroups(runners, agents, options, filter = {}) {
|
|
147
|
+
const combos = [...allCombos(runners, agents).values()];
|
|
148
|
+
const recommended = new Set(options.recommendedModels.map((item) => `${item.tool}\u0000${item.model}`));
|
|
149
|
+
const byTool = new Map();
|
|
150
|
+
for (const combo of combos) {
|
|
151
|
+
const list = byTool.get(combo.tool);
|
|
152
|
+
if (list)
|
|
153
|
+
list.push(combo);
|
|
154
|
+
else
|
|
155
|
+
byTool.set(combo.tool, [combo]);
|
|
156
|
+
}
|
|
157
|
+
const tools = new Set([
|
|
158
|
+
...byTool.keys(),
|
|
159
|
+
...runners.flatMap((runner) => runner.tools.map((item) => item.kind)),
|
|
160
|
+
]);
|
|
161
|
+
const groups = [];
|
|
162
|
+
for (const tool of tools) {
|
|
163
|
+
const toolAvail = toolAvailability(runners, tool);
|
|
164
|
+
if (toolAvail.runnerCount === 0)
|
|
165
|
+
continue;
|
|
166
|
+
const toolCombos = (byTool.get(tool) ?? []).filter((combo) => matchesQuery(tool, combo, filter.q ?? '') &&
|
|
167
|
+
(!filter.status ||
|
|
168
|
+
comboAvailability(runners, combo.tool, combo.model, toolAvail)
|
|
169
|
+
.status === filter.status));
|
|
170
|
+
if (filter.status &&
|
|
171
|
+
toolAvail.status !== filter.status &&
|
|
172
|
+
toolCombos.length === 0)
|
|
173
|
+
continue;
|
|
174
|
+
if (filter.q &&
|
|
175
|
+
toolCombos.length === 0 &&
|
|
176
|
+
!toolMatchesQuery(tool, filter.q))
|
|
177
|
+
continue;
|
|
178
|
+
groups.push({
|
|
179
|
+
tool,
|
|
180
|
+
modelCount: toolCombos.length,
|
|
181
|
+
runnerCount: toolAvail.runnerCount,
|
|
182
|
+
status: toolAvail.status,
|
|
183
|
+
...(toolAvail.statusReason
|
|
184
|
+
? { statusReason: toolAvail.statusReason }
|
|
185
|
+
: {}),
|
|
186
|
+
...(toolAvail.statusDetail
|
|
187
|
+
? { statusDetail: toolAvail.statusDetail }
|
|
188
|
+
: {}),
|
|
189
|
+
recommendedCount: toolCombos.filter((combo) => recommended.has(`${combo.tool}\u0000${combo.model}`)).length,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
return groups.sort((a, b) => a.tool.localeCompare(b.tool));
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* One tool's models, for the enable drawer once its group is open or matched a search: unavailable models are listed
|
|
196
|
+
* too (so an administrator can see what a down tool used to offer) but marked unselectable, each with its own
|
|
197
|
+
* availability — a model no online runner currently reports is never shown as available just because a sibling
|
|
198
|
+
* model of the same tool is.
|
|
199
|
+
*/
|
|
200
|
+
export function availableModelRows(runners, agents, options, tool, filter = {}) {
|
|
201
|
+
const byId = new Map(agents.map((agent) => [agent.id, agent]));
|
|
202
|
+
const recommended = new Set(options.recommendedModels.map((item) => `${item.tool}\u0000${item.model}`));
|
|
203
|
+
const toolAvail = toolAvailability(runners, tool);
|
|
204
|
+
const combos = [...allCombos(runners, agents).values()].filter((combo) => combo.tool === tool && matchesQuery(tool, combo, filter.q ?? ''));
|
|
205
|
+
return combos
|
|
206
|
+
.map((combo) => {
|
|
207
|
+
const id = runnerAgentId(combo.tool, combo.model);
|
|
208
|
+
const agent = byId.get(id);
|
|
209
|
+
const availability = comboAvailability(runners, combo.tool, combo.model, toolAvail);
|
|
210
|
+
return {
|
|
211
|
+
tool: combo.tool,
|
|
212
|
+
model: combo.model,
|
|
213
|
+
...(combo.displayModel ? { displayModel: combo.displayModel } : {}),
|
|
214
|
+
agentId: agent?.id ?? null,
|
|
215
|
+
status: agent?.status ?? null,
|
|
216
|
+
recommended: recommended.has(`${combo.tool}\u0000${combo.model}`),
|
|
217
|
+
suggestion: options.suggestion(combo.tool, combo.model),
|
|
218
|
+
availability: availability.status,
|
|
219
|
+
runners: availability.runners,
|
|
220
|
+
};
|
|
221
|
+
})
|
|
222
|
+
.filter((row) => !filter.status || row.availability === filter.status)
|
|
223
|
+
.sort((a, b) => (a.displayModel ?? a.model).localeCompare(b.displayModel ?? b.model));
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=available-models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"available-models.js","sourceRoot":"","sources":["../../../../server/core/agents/available-models.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,4 +2,5 @@ export { AgentPatchSchema, createAgentService, isWorkable, reportedCombos, runne
|
|
|
2
2
|
export { findAgent, findAgents, listAgents, lockAgentForClaim, } from './agent.store.js';
|
|
3
3
|
export { createAgentActionCatalog, type AgentActionCatalog, } from './actions.js';
|
|
4
4
|
export { agentViews, availableAgents, isReported, unusableReason, } from './agent.views.js';
|
|
5
|
+
export { availableModelGroups, availableModelRows, } from './available-models.js';
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/core/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,SAAS,EACT,UAAU,EACV,UAAU,EACV,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,wBAAwB,EACxB,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,UAAU,EACV,eAAe,EACf,UAAU,EACV,cAAc,GACf,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/core/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,SAAS,EACT,UAAU,EACV,UAAU,EACV,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,wBAAwB,EACxB,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,UAAU,EACV,eAAe,EACf,UAAU,EACV,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC"}
|
|
@@ -2,4 +2,5 @@ export { AgentPatchSchema, createAgentService, isWorkable, reportedCombos, runne
|
|
|
2
2
|
export { findAgent, findAgents, listAgents, lockAgentForClaim, } from './agent.store.js';
|
|
3
3
|
export { createAgentActionCatalog, } from './actions.js';
|
|
4
4
|
export { agentViews, availableAgents, isReported, unusableReason, } from './agent.views.js';
|
|
5
|
+
export { availableModelGroups, availableModelRows, } from './available-models.js';
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/core/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,aAAa,GAId,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,SAAS,EACT,UAAU,EACV,UAAU,EACV,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,wBAAwB,GAEzB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,UAAU,EACV,eAAe,EACf,UAAU,EACV,cAAc,GACf,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/core/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,aAAa,GAId,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,SAAS,EACT,UAAU,EACV,UAAU,EACV,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,wBAAwB,GAEzB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,UAAU,EACV,eAAe,EACf,UAAU,EACV,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../server/routes/admin.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAW,IAAI,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAI7D,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,IAAI,EACT,KAAK,KAAK,EACV,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../server/routes/admin.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAW,IAAI,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAI7D,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,IAAI,EACT,KAAK,KAAK,EACV,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AA0BhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAyD7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AA8CnE,mGAAmG;AACnG,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClE,oEAAoE;IACpE,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACxC,sFAAsF;IACtF,QAAQ,CAAC,GAAG,CAAC,EAAE;QACb,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;KAC5B,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,CAAC;CACpC;AAqCD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAClC,MAAM,GAAE,iBAAiB,CAAC,QAAQ,CAAS,GAC1C,IAAI,CAAC,QAAQ,CAAC,CAi+DhB"}
|
|
@@ -33,7 +33,7 @@ import { z } from 'zod';
|
|
|
33
33
|
import { reaches, } from '../../shared/access.js';
|
|
34
34
|
import { SKILL_UPLOAD_MAX_BYTES } from '../../shared/skills.js';
|
|
35
35
|
import { CONVERSATION_SUBJECT } from '../../shared/conversations.js';
|
|
36
|
-
import { AgentPatchSchema, agentViews } from '../core/agents/index.js';
|
|
36
|
+
import { AgentPatchSchema, agentViews, availableModelGroups, availableModelRows, } from '../core/agents/index.js';
|
|
37
37
|
import { ModelPricesSchema } from '../core/reports/index.js';
|
|
38
38
|
import { runMachineViewerFor, runForViewer, } from '../core/runs/index.js';
|
|
39
39
|
import { SkillIdsSchema, SkillImportSchema, SkillInputSchema, SkillSaveSchema, } from '../core/skills/index.js';
|
|
@@ -41,7 +41,7 @@ import { forbidden, invalid, notFound } from '../kernel/errors.js';
|
|
|
41
41
|
import { decodePageToken, domainRouter, encodePageToken, } from '../kernel/http.js';
|
|
42
42
|
import { WORKDIR_TITLE } from '../kernel/scopes.js';
|
|
43
43
|
import { tags } from './openapi.js';
|
|
44
|
-
import { AgentActionOptionSchema, AgentChangeSchema, AgentHistoryQuery, AgentParams, AgentNameSchema, AgentSchema, AgentViewSchema, BriefPreviewSchema, ModelUsageReportSchema, PageTokenMetaSchema, PricesSchema, RunBriefSchema, RunDetailSchema, RunEventItemSchema, RunSchema, SeqPageMetaSchema, SkillArchiveQuery, SkillAttachmentsSchema, SkillDetailSchema, SkillFileQuery, SkillUploadSchema, SkillSchema, SkillVersionDetailSchema, SkillVersionSchema, SkillViewSchema, UsageReportSchema, UserRefSchema, VariableAuditSchema, VariableSchema, VariableValueSchema, VocabularySchema, AuditListQuery, ModelUsageQuery, PreviewBriefQuery, RunEventsQuery, RunListQuery, RunParams, ScopeParams, SkillParams, SkillRestoreInput, SkillVersionParams, UsageQuerySchema, VariableParams, VariableValueInput, WorkspaceParams, } from './schemas.js';
|
|
44
|
+
import { AgentActionOptionSchema, AgentChangeSchema, AgentHistoryQuery, AgentParams, AgentNameSchema, AgentSchema, AgentViewSchema, AvailableModelSchema, AvailableModelGroupSchema, AvailableModelsQuerySchema, BriefPreviewSchema, CleanupCandidateSchema, CleanupCandidatesQuerySchema, CleanupGroupSchema, RunnerAgentCreateInputSchema, ModelUsageReportSchema, PageMetaSchema, PageTokenMetaSchema, PricesSchema, RunBriefSchema, RunDetailSchema, RunEventItemSchema, RunSchema, SeqPageMetaSchema, SkillArchiveQuery, SkillAttachmentsSchema, SkillDetailSchema, SkillFileQuery, SkillUploadSchema, SkillSchema, SkillVersionDetailSchema, SkillVersionSchema, SkillViewSchema, UsageReportSchema, UserRefSchema, VariableAuditSchema, VariableSchema, VariableValueSchema, VocabularySchema, AuditListQuery, ModelUsageQuery, PreviewBriefQuery, RunEventsQuery, RunListQuery, RunParams, ScopeParams, SkillParams, SkillRestoreInput, SkillVersionParams, UsageQuerySchema, VariableParams, VariableValueInput, WorkspaceParams, } from './schemas.js';
|
|
45
45
|
/** A multipart body of one file, as `file`. */
|
|
46
46
|
const skillUploadBody = {
|
|
47
47
|
required: true,
|
|
@@ -288,6 +288,137 @@ export function createAdminRoutes(services, guard, scoped = guard) {
|
|
|
288
288
|
const data = await services.agents.setIgnored(groups, ignored);
|
|
289
289
|
return context.json({ data, meta: { total: data.length } });
|
|
290
290
|
});
|
|
291
|
+
router.get('/availableModels', guard, can('agents.agents', 'read'), describeRoute({
|
|
292
|
+
tags,
|
|
293
|
+
summary: 'List tools, or one tool’s models, to create an agent from',
|
|
294
|
+
operationId: 'agentsListAvailableModels',
|
|
295
|
+
...cliRoute({
|
|
296
|
+
command: 'agent model list',
|
|
297
|
+
examples: ['agent model list', 'agent model list --tool codex'],
|
|
298
|
+
}),
|
|
299
|
+
description: 'Without `tool`: one row per coding tool a runner has selected, with its model count and aggregated availability, for the enable drawer’s group headers. With `tool`: that tool’s models, a page at a time, whether or not an agent exists for each yet. The application’s recommended combinations create and enable themselves as soon as a runner reports them; create the rest with `POST /runnerAgents`. Needs `agents.agents` read.',
|
|
300
|
+
responses: {
|
|
301
|
+
200: listResponse(z.union([AvailableModelGroupSchema, AvailableModelSchema]), PageMetaSchema),
|
|
302
|
+
...apiErrorResponses,
|
|
303
|
+
},
|
|
304
|
+
}), apiValidator('query', AvailableModelsQuerySchema), async (context) => {
|
|
305
|
+
const query = context.req.valid('query');
|
|
306
|
+
const conn = services.tx.read();
|
|
307
|
+
const [runners, agents] = await Promise.all([
|
|
308
|
+
services.runners.all(conn),
|
|
309
|
+
services.agents.list(),
|
|
310
|
+
]);
|
|
311
|
+
const options = {
|
|
312
|
+
recommendedModels: services.agents.recommended(),
|
|
313
|
+
suggestion: services.agents.suggestion,
|
|
314
|
+
};
|
|
315
|
+
if (query.tool === undefined) {
|
|
316
|
+
const data = availableModelGroups(runners, agents, options, {
|
|
317
|
+
q: query.q,
|
|
318
|
+
status: query.status,
|
|
319
|
+
});
|
|
320
|
+
return context.json({
|
|
321
|
+
data,
|
|
322
|
+
meta: { total: data.length, page: 1, pageSize: data.length },
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
const rows = availableModelRows(runners, agents, options, query.tool, {
|
|
326
|
+
q: query.q,
|
|
327
|
+
status: query.status,
|
|
328
|
+
});
|
|
329
|
+
const start = (query.page - 1) * query.pageSize;
|
|
330
|
+
return context.json({
|
|
331
|
+
data: rows.slice(start, start + query.pageSize),
|
|
332
|
+
meta: {
|
|
333
|
+
total: rows.length,
|
|
334
|
+
page: query.page,
|
|
335
|
+
pageSize: query.pageSize,
|
|
336
|
+
},
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
router.post('/runnerAgents', scoped, can('agents.agents', 'manage'), describeRoute({
|
|
340
|
+
tags,
|
|
341
|
+
summary: 'Create an agent from an available model',
|
|
342
|
+
operationId: 'agentsCreateRunnerAgent',
|
|
343
|
+
...cliRoute({
|
|
344
|
+
command: 'agent create',
|
|
345
|
+
bodyFile: 'input',
|
|
346
|
+
flags: { description: { name: 'good-at', contentFile: true } },
|
|
347
|
+
examples: [
|
|
348
|
+
'agent create --tool gemini --model gemini-2.5-pro --good-at "..."',
|
|
349
|
+
],
|
|
350
|
+
}),
|
|
351
|
+
description: 'Creates and enables an agent for a tool and model from the available models list. Needs `agents.agents` manage.',
|
|
352
|
+
responses: {
|
|
353
|
+
201: dataResponse(AgentSchema),
|
|
354
|
+
400: apiErrorResponse(400, 'An agent for this tool and model already exists (`AGENT_EXISTS`), no description was given (`GOOD_AT_REQUIRED`), or the effort is not one its tool takes (`EFFORT_UNSUPPORTED`).'),
|
|
355
|
+
...apiErrorResponses,
|
|
356
|
+
},
|
|
357
|
+
}), apiValidator('json', RunnerAgentCreateInputSchema), async (context) => {
|
|
358
|
+
const data = await services.agents.createFromAvailable(context.req.valid('json'), caller(context).userId);
|
|
359
|
+
context.status(201);
|
|
360
|
+
return context.json({ data });
|
|
361
|
+
});
|
|
362
|
+
router.get('/cleanupCandidates', guard, can('agents.agents', 'manage'), describeRoute({
|
|
363
|
+
tags,
|
|
364
|
+
summary: 'List tools, or one tool’s runner-discovered agents, safe to remove outright',
|
|
365
|
+
operationId: 'agentsListCleanupCandidates',
|
|
366
|
+
...cliRoute({
|
|
367
|
+
command: 'agent cleanup list',
|
|
368
|
+
examples: ['agent cleanup list', 'agent cleanup list --tool codex'],
|
|
369
|
+
}),
|
|
370
|
+
description: 'Without `tool`: one row per coding tool with candidates, for the cleanup drawer’s group headers. With `tool`: that tool’s candidates, a page at a time. A candidate is an agent a runner’s report created that nobody enabled and that never ran: safe to remove outright, such as a batch left from before the application stopped creating one agent per reported model. Needs `agents.agents` manage.',
|
|
371
|
+
responses: {
|
|
372
|
+
200: listResponse(z.union([CleanupGroupSchema, CleanupCandidateSchema]), PageMetaSchema),
|
|
373
|
+
...apiErrorResponses,
|
|
374
|
+
},
|
|
375
|
+
}), apiValidator('query', CleanupCandidatesQuerySchema), async (context) => {
|
|
376
|
+
const query = context.req.valid('query');
|
|
377
|
+
if (query.tool === undefined) {
|
|
378
|
+
const data = await services.agents.cleanupGroups(query.q);
|
|
379
|
+
return context.json({
|
|
380
|
+
data,
|
|
381
|
+
meta: { total: data.length, page: 1, pageSize: data.length },
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
const rows = await services.agents.cleanupCandidates({
|
|
385
|
+
tool: query.tool,
|
|
386
|
+
q: query.q,
|
|
387
|
+
});
|
|
388
|
+
const start = (query.page - 1) * query.pageSize;
|
|
389
|
+
return context.json({
|
|
390
|
+
data: rows.slice(start, start + query.pageSize),
|
|
391
|
+
meta: {
|
|
392
|
+
total: rows.length,
|
|
393
|
+
page: query.page,
|
|
394
|
+
pageSize: query.pageSize,
|
|
395
|
+
},
|
|
396
|
+
});
|
|
397
|
+
});
|
|
398
|
+
router.post('/cleanup', scoped, can('agents.agents', 'manage'), describeRoute({
|
|
399
|
+
tags,
|
|
400
|
+
summary: 'Remove chosen cleanup candidates outright',
|
|
401
|
+
operationId: 'agentsCleanup',
|
|
402
|
+
...cliRoute({ command: 'agent cleanup run', bodyFile: 'input' }),
|
|
403
|
+
description: 'Removes the named agents, each re-checked against the cleanup rule first (still pending, never run): anything changed since it was listed is left alone and reported back skipped, never removed. Needs `agents.agents` manage.',
|
|
404
|
+
responses: {
|
|
405
|
+
200: dataResponse(z.object({
|
|
406
|
+
removed: z.array(z.string()),
|
|
407
|
+
skipped: z.array(z.string()),
|
|
408
|
+
})),
|
|
409
|
+
...apiErrorResponses,
|
|
410
|
+
},
|
|
411
|
+
}), apiValidator('json', z.strictObject({
|
|
412
|
+
agentIds: z
|
|
413
|
+
.array(z.string().min(1).max(256))
|
|
414
|
+
.min(1)
|
|
415
|
+
.max(256)
|
|
416
|
+
.meta({ description: 'The ids from `GET /cleanupCandidates`.' }),
|
|
417
|
+
})), async (context) => {
|
|
418
|
+
const { agentIds } = context.req.valid('json');
|
|
419
|
+
const data = await services.agents.cleanup(agentIds, caller(context).userId);
|
|
420
|
+
return context.json({ data });
|
|
421
|
+
});
|
|
291
422
|
// Every agent's name, removed ones and the application's own included, for the runs that name them.
|
|
292
423
|
router.get('/agentNames', guard, describeRoute({
|
|
293
424
|
tags,
|