@truefoundry/trueforge-ui 0.3.0-rc.0 → 0.3.0-rc.2
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 +68 -0
- package/README.md +21 -6
- package/dist/AgentCodeSnippets-637HQUXD.js +74 -0
- package/dist/AgentCodeSnippets-637HQUXD.js.map +1 -0
- package/dist/AgentMetricChart-4FYECRIN.js +15 -0
- package/dist/AgentOverview-3FJ5EE6N.js +167 -0
- package/dist/AgentOverview-3FJ5EE6N.js.map +1 -0
- package/dist/AgentSessionEventTimeline-VELWUYPR.js +88 -0
- package/dist/AgentSessionEventTimeline-VELWUYPR.js.map +1 -0
- package/dist/AgentSessionEventTimelineChart-CUKETHWM.js +591 -0
- package/dist/AgentSessionEventTimelineChart-CUKETHWM.js.map +1 -0
- package/dist/AgentSessions-T7MOGOTZ.js +275 -0
- package/dist/AgentSessions-T7MOGOTZ.js.map +1 -0
- package/dist/{ConnectorSettings-FXQ5B7TN.js → ConnectorSettings-ESZ2RSRG.js} +19 -21
- package/dist/ConnectorSettings-ESZ2RSRG.js.map +1 -0
- package/dist/{DockLayout-LBNQJZNF.js → DockLayout-NLFNU6F2.js} +11 -10
- package/dist/{DockLayout-LBNQJZNF.js.map → DockLayout-NLFNU6F2.js.map} +1 -1
- package/dist/DrawerLayout-PR3SMKA6.js +184 -0
- package/dist/DrawerLayout-PR3SMKA6.js.map +1 -0
- package/dist/{ModelSettings-4L4LOQJA.js → ModelSettings-LYW64IRR.js} +20 -24
- package/dist/ModelSettings-LYW64IRR.js.map +1 -0
- package/dist/OpenUiFenceBlock-JEPNPJ7U.js +9 -0
- package/dist/OpenUiFenceBlock-JEPNPJ7U.js.map +1 -0
- package/dist/{SandboxSettings-Z4ZG6ZX4.js → SandboxSettings-DF64LHYI.js} +16 -18
- package/dist/SandboxSettings-DF64LHYI.js.map +1 -0
- package/dist/SchedulesPage-WQU4H25F.js +15 -0
- package/dist/SchedulesPage-WQU4H25F.js.map +1 -0
- package/dist/{SettingsBuilder-WF7ZWKQW.js → SettingsBuilder-LSXK2VN4.js} +26 -22
- package/dist/SettingsBuilder-LSXK2VN4.js.map +1 -0
- package/dist/ShellRouteSync-B22IAV2W.js +255 -0
- package/dist/ShellRouteSync-B22IAV2W.js.map +1 -0
- package/dist/SidebarLayout-XW6LXB7R.js +309 -0
- package/dist/SidebarLayout-XW6LXB7R.js.map +1 -0
- package/dist/{SkillSettings-3EPPC3IT.js → SkillSettings-64VXUO6J.js} +14 -15
- package/dist/SkillSettings-64VXUO6J.js.map +1 -0
- package/dist/{TrueForgeUIWithRouter-NZ4FGPE4.js → TrueForgeUIWithRouter-3TSLV22Q.js} +14 -10
- package/dist/{TrueForgeUIWithRouter-NZ4FGPE4.js.map → TrueForgeUIWithRouter-3TSLV22Q.js.map} +1 -1
- package/dist/{WidgetLayout-3QZ357FL.js → WidgetLayout-Q5P7PYSJ.js} +17 -13
- package/dist/WidgetLayout-Q5P7PYSJ.js.map +1 -0
- package/dist/chunk-5I2COQNL.js +119 -0
- package/dist/chunk-5I2COQNL.js.map +1 -0
- package/dist/chunk-BWHOZFIV.js +587 -0
- package/dist/chunk-BWHOZFIV.js.map +1 -0
- package/dist/chunk-DJUFS2BW.js +27 -0
- package/dist/chunk-DJUFS2BW.js.map +1 -0
- package/dist/chunk-FQK2XVVE.js +880 -0
- package/dist/chunk-FQK2XVVE.js.map +1 -0
- package/dist/chunk-G2TUAD65.js +555 -0
- package/dist/chunk-G2TUAD65.js.map +1 -0
- package/dist/chunk-GXYAOAK5.js +1357 -0
- package/dist/chunk-GXYAOAK5.js.map +1 -0
- package/dist/{chunk-FJ5RSSMA.js → chunk-H6WTY5PM.js} +196 -32
- package/dist/chunk-H6WTY5PM.js.map +1 -0
- package/dist/chunk-I3AL54MA.js +180 -0
- package/dist/chunk-I3AL54MA.js.map +1 -0
- package/dist/{chunk-WREC7D54.js → chunk-LGRHHFHN.js} +120 -32
- package/dist/chunk-LGRHHFHN.js.map +1 -0
- package/dist/chunk-NHHSZB5N.js +74 -0
- package/dist/chunk-NHHSZB5N.js.map +1 -0
- package/dist/{chunk-CFLVPV5M.js → chunk-QC42MLAK.js} +7 -2
- package/dist/chunk-QC42MLAK.js.map +1 -0
- package/dist/chunk-RDXBMTP5.js +32 -0
- package/dist/chunk-RDXBMTP5.js.map +1 -0
- package/dist/chunk-SFZNIO6U.js +18 -0
- package/dist/chunk-SFZNIO6U.js.map +1 -0
- package/dist/chunk-SQGT43Z3.js +200 -0
- package/dist/chunk-SQGT43Z3.js.map +1 -0
- package/dist/{chunk-B52K63AW.js → chunk-VJ7BZGAF.js} +2 -2
- package/dist/chunk-VUMGMGKZ.js +252 -0
- package/dist/chunk-VUMGMGKZ.js.map +1 -0
- package/dist/chunk-Y6S4OVVQ.js +16 -0
- package/dist/chunk-Y6S4OVVQ.js.map +1 -0
- package/dist/chunk-YQO2NMJ3.js +13341 -0
- package/dist/chunk-YQO2NMJ3.js.map +1 -0
- package/dist/{createTrueFoundryServer-B72bU-J7.d.ts → createTrueFoundryServer-CmZnBh_l.d.ts} +15 -4
- package/dist/index.d.ts +1024 -24
- package/dist/index.js +691 -67
- package/dist/index.js.map +1 -1
- package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +552 -8
- package/dist/plugins/trueforge-agent-server-adapter/index.js +504 -188
- package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +9 -8
- package/dist/ConnectorSettings-FXQ5B7TN.js.map +0 -1
- package/dist/DrawerLayout-Q6UK4VMI.js +0 -159
- package/dist/DrawerLayout-Q6UK4VMI.js.map +0 -1
- package/dist/ModelSettings-4L4LOQJA.js.map +0 -1
- package/dist/OpenUiFenceBlock-6UIIAVBX.js +0 -9
- package/dist/SandboxSettings-Z4ZG6ZX4.js.map +0 -1
- package/dist/SettingsBuilder-WF7ZWKQW.js.map +0 -1
- package/dist/ShellRouteSync-T4WLY57Q.js +0 -172
- package/dist/ShellRouteSync-T4WLY57Q.js.map +0 -1
- package/dist/SidebarLayout-3WZ3CVON.js +0 -256
- package/dist/SidebarLayout-3WZ3CVON.js.map +0 -1
- package/dist/SkillSettings-3EPPC3IT.js.map +0 -1
- package/dist/WidgetLayout-3QZ357FL.js.map +0 -1
- package/dist/chunk-36KOSC2J.js +0 -567
- package/dist/chunk-36KOSC2J.js.map +0 -1
- package/dist/chunk-3S6KHO7H.js +0 -2121
- package/dist/chunk-3S6KHO7H.js.map +0 -1
- package/dist/chunk-7L63OK3O.js +0 -91
- package/dist/chunk-7L63OK3O.js.map +0 -1
- package/dist/chunk-CFLVPV5M.js.map +0 -1
- package/dist/chunk-FJ5RSSMA.js.map +0 -1
- package/dist/chunk-OSV3HI5M.js +0 -6891
- package/dist/chunk-OSV3HI5M.js.map +0 -1
- package/dist/chunk-WQULF5AT.js +0 -460
- package/dist/chunk-WQULF5AT.js.map +0 -1
- package/dist/chunk-WREC7D54.js.map +0 -1
- package/dist/chunk-YIWUG6MC.js +0 -101
- package/dist/chunk-YIWUG6MC.js.map +0 -1
- package/dist/chunk-ZXOADNF3.js +0 -75
- package/dist/chunk-ZXOADNF3.js.map +0 -1
- /package/dist/{OpenUiFenceBlock-6UIIAVBX.js.map → AgentMetricChart-4FYECRIN.js.map} +0 -0
- /package/dist/{chunk-B52K63AW.js.map → chunk-VJ7BZGAF.js.map} +0 -0
|
@@ -1,195 +1,114 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createTrueFoundryServer
|
|
3
|
-
} from "../../chunk-
|
|
3
|
+
} from "../../chunk-QC42MLAK.js";
|
|
4
|
+
import {
|
|
5
|
+
drainListPages
|
|
6
|
+
} from "../../chunk-SFZNIO6U.js";
|
|
7
|
+
import {
|
|
8
|
+
readSessionIsCreateAgent
|
|
9
|
+
} from "../../chunk-RDXBMTP5.js";
|
|
4
10
|
|
|
5
|
-
// src/plugins/trueforge-agent-server-adapter/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
if (
|
|
12
|
-
return
|
|
13
|
-
}
|
|
14
|
-
const headerName = Object.keys(auth.headers)[0];
|
|
15
|
-
return {
|
|
16
|
-
type: "header",
|
|
17
|
-
...headerName === void 0 ? {} : { headerName }
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
function toHarnessAuth(auth) {
|
|
21
|
-
if (auth.type === "none") {
|
|
22
|
-
return void 0;
|
|
23
|
-
}
|
|
24
|
-
if (auth.type === "dcr") {
|
|
25
|
-
return { type: "dcr" };
|
|
26
|
-
}
|
|
27
|
-
const apiKey = auth.apiKey?.trim();
|
|
28
|
-
if (apiKey === void 0 || apiKey === "") {
|
|
29
|
-
throw new Error("API key is required for header-authenticated MCP servers");
|
|
11
|
+
// src/plugins/trueforge-agent-server-adapter/client.ts
|
|
12
|
+
import { TrueForge } from "@truefoundry/trueforge-sdk";
|
|
13
|
+
var DEFAULT_BASE_URL = "/";
|
|
14
|
+
function resolveTrueForgeBaseUrl(baseUrl) {
|
|
15
|
+
if (/^https?:\/\//i.test(baseUrl)) return baseUrl;
|
|
16
|
+
const origin = globalThis.location?.origin;
|
|
17
|
+
if (typeof origin === "string" && origin.length > 0 && origin !== "null") {
|
|
18
|
+
return new URL(baseUrl, origin).href;
|
|
30
19
|
}
|
|
31
|
-
|
|
32
|
-
const headerName = trimmedHeader !== void 0 && trimmedHeader !== "" ? trimmedHeader : DEFAULT_API_KEY_HEADER;
|
|
33
|
-
return { type: "header", headers: { [headerName]: apiKey } };
|
|
34
|
-
}
|
|
35
|
-
function toUiCatalogEntry(server) {
|
|
36
|
-
return {
|
|
37
|
-
id: server.name,
|
|
38
|
-
name: server.name,
|
|
39
|
-
url: server.url,
|
|
40
|
-
description: server.description,
|
|
41
|
-
...server.logo === void 0 ? {} : { logo: server.logo },
|
|
42
|
-
auth: toUiAuthPublic(server.auth)
|
|
43
|
-
};
|
|
20
|
+
return baseUrl;
|
|
44
21
|
}
|
|
45
|
-
function
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const auth = toUiAuthPublic(server.manifest.auth);
|
|
52
|
-
return {
|
|
53
|
-
id: server.name,
|
|
54
|
-
name: server.name,
|
|
55
|
-
description: server.manifest.description,
|
|
56
|
-
url: server.manifest.url,
|
|
57
|
-
auth,
|
|
58
|
-
requiresAuth: server.authStatus.status === "auth_required",
|
|
59
|
-
authenticated: server.authStatus.status !== "auth_required"
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
function toUiConnectorFromReadEntry(server) {
|
|
63
|
-
const auth = server.auth?.type ? { type: server.auth.type } : { type: "none" };
|
|
64
|
-
return {
|
|
65
|
-
id: server.name,
|
|
66
|
-
name: server.name,
|
|
67
|
-
description: server.url,
|
|
68
|
-
url: server.url,
|
|
69
|
-
auth,
|
|
70
|
-
requiresAuth: server.authStatus.status === "auth_required",
|
|
71
|
-
authenticated: server.authStatus.status !== "auth_required"
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
function toHarnessManifest(req) {
|
|
75
|
-
const auth = toHarnessAuth(req.auth);
|
|
76
|
-
const trimmed = req.description?.trim();
|
|
77
|
-
return {
|
|
78
|
-
type: "remote",
|
|
79
|
-
name: req.name,
|
|
80
|
-
url: req.url,
|
|
81
|
-
description: trimmed !== void 0 && trimmed !== "" ? trimmed : `${req.name} MCP server`,
|
|
82
|
-
...auth === void 0 ? {} : { auth }
|
|
83
|
-
};
|
|
22
|
+
function createTrueForgeClient(options = {}) {
|
|
23
|
+
return new TrueForge({
|
|
24
|
+
baseUrl: resolveTrueForgeBaseUrl(options.baseUrl ?? DEFAULT_BASE_URL),
|
|
25
|
+
...options.token === void 0 ? {} : { token: options.token },
|
|
26
|
+
...options.fetch === void 0 ? {} : { fetch: options.fetch }
|
|
27
|
+
});
|
|
84
28
|
}
|
|
85
|
-
function
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
if (existing === void 0) {
|
|
90
|
-
throw new Error(`MCP server "${name}" not found`);
|
|
91
|
-
}
|
|
92
|
-
return existing;
|
|
29
|
+
function parseIsoDate(value) {
|
|
30
|
+
const date = new Date(value);
|
|
31
|
+
if (Number.isNaN(date.getTime())) {
|
|
32
|
+
throw new Error(`Invalid ISO timestamp: ${value}`);
|
|
93
33
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
102
|
-
if (req.id === void 0) {
|
|
103
|
-
throw new Error("API key is required for header-authenticated MCP servers");
|
|
104
|
-
}
|
|
105
|
-
const existing = await getConfigured(req.id);
|
|
106
|
-
if (existing.manifest.auth?.type !== "header") {
|
|
107
|
-
throw new Error(`MCP server "${req.id}" has no stored header credentials to reuse`);
|
|
108
|
-
}
|
|
109
|
-
const preferredHeader = req.auth.headerName?.trim();
|
|
110
|
-
const storedHeaderName = Object.keys(existing.manifest.auth.headers)[0];
|
|
111
|
-
const headerName = preferredHeader !== void 0 && preferredHeader !== "" ? preferredHeader : storedHeaderName ?? DEFAULT_API_KEY_HEADER;
|
|
112
|
-
const stored = existing.manifest.auth.headers[headerName] ?? Object.values(existing.manifest.auth.headers)[0];
|
|
113
|
-
if (stored === void 0) {
|
|
114
|
-
throw new Error(`MCP server "${req.id}" has no stored header credentials to reuse`);
|
|
115
|
-
}
|
|
116
|
-
return { type: "header", apiKey: stored, headerName };
|
|
34
|
+
return date;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// src/plugins/trueforge-agent-server-adapter/agentMetricsServer.ts
|
|
38
|
+
function toHarnessChartName(name) {
|
|
39
|
+
if (name === "sessions_over_time" || name === "sessions_cost_over_time" || name === "turns_over_time") {
|
|
40
|
+
return name;
|
|
117
41
|
}
|
|
42
|
+
throw new Error(`Unsupported Harness metrics chart: ${name}`);
|
|
43
|
+
}
|
|
44
|
+
function createHarnessAgentMetricsServer(options = {}) {
|
|
45
|
+
const client = options.client ?? createTrueForgeClient(options);
|
|
118
46
|
return {
|
|
119
|
-
|
|
120
|
-
const
|
|
121
|
-
return
|
|
47
|
+
async getCharts() {
|
|
48
|
+
const { data } = await client.internal.metrics.listCharts();
|
|
49
|
+
return data.charts;
|
|
122
50
|
},
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
const body = await client.settings.mcpServers.list();
|
|
129
|
-
const connectors = body.data.map(toUiConnector);
|
|
130
|
-
const query = req?.query?.trim().toLowerCase();
|
|
131
|
-
if (query === void 0 || query === "") {
|
|
132
|
-
return connectors;
|
|
133
|
-
}
|
|
134
|
-
return connectors.filter(
|
|
135
|
-
(connector) => connector.name.toLowerCase().includes(query) || connector.description.toLowerCase().includes(query) || connector.url.toLowerCase().includes(query)
|
|
136
|
-
);
|
|
137
|
-
},
|
|
138
|
-
getToolsByConnectorId: async ({ id }) => {
|
|
139
|
-
const body = await client.mcpServers.listTools(id);
|
|
140
|
-
return body.data.map(toUiTool);
|
|
141
|
-
},
|
|
142
|
-
createConnector: async (req) => {
|
|
143
|
-
const auth = await resolveWriteAuth({ auth: req.auth });
|
|
144
|
-
const body = await client.settings.mcpServers.create({
|
|
145
|
-
manifest: toHarnessManifest({
|
|
146
|
-
name: req.name,
|
|
147
|
-
url: req.url,
|
|
148
|
-
auth,
|
|
149
|
-
description: req.description
|
|
150
|
-
})
|
|
51
|
+
async getMeters({ agentId, startTimestamp, endTimestamp }) {
|
|
52
|
+
const { data } = await client.internal.metrics.getMeters({
|
|
53
|
+
agentId,
|
|
54
|
+
startTimestamp: parseIsoDate(startTimestamp),
|
|
55
|
+
endTimestamp: parseIsoDate(endTimestamp)
|
|
151
56
|
});
|
|
152
|
-
return
|
|
57
|
+
return data.meters;
|
|
153
58
|
},
|
|
154
|
-
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
auth,
|
|
161
|
-
description: req.description
|
|
162
|
-
})
|
|
59
|
+
async getChartData({ agentId, startTimestamp, endTimestamp, chartName }) {
|
|
60
|
+
const { data } = await client.internal.metrics.getChartData({
|
|
61
|
+
agentId,
|
|
62
|
+
startTimestamp: parseIsoDate(startTimestamp),
|
|
63
|
+
endTimestamp: parseIsoDate(endTimestamp),
|
|
64
|
+
chartName: toHarnessChartName(chartName)
|
|
163
65
|
});
|
|
164
|
-
return
|
|
165
|
-
},
|
|
166
|
-
authenticateConnector: async (req) => {
|
|
167
|
-
const result = await client.mcpServers.authorize(
|
|
168
|
-
req.id,
|
|
169
|
-
req.returnTo === void 0 ? {} : { returnTo: req.returnTo }
|
|
170
|
-
);
|
|
171
|
-
return { status: result.status, authorization_endpoint: result.authorizationUrl };
|
|
172
|
-
},
|
|
173
|
-
disconnectConnector: async (req) => {
|
|
174
|
-
const existing = await getConfigured(req.id);
|
|
175
|
-
if (existing.manifest.auth?.type !== "dcr") {
|
|
176
|
-
throw new Error(`Disconnect is only supported for OAuth MCP servers`);
|
|
177
|
-
}
|
|
178
|
-
const body = await client.mcpServers.deleteAuthorization(req.id);
|
|
179
|
-
return toUiConnector(body.data);
|
|
66
|
+
return data;
|
|
180
67
|
}
|
|
181
68
|
};
|
|
182
69
|
}
|
|
183
70
|
|
|
184
|
-
// src/plugins/trueforge-agent-server-adapter/
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
71
|
+
// src/plugins/trueforge-agent-server-adapter/toUiTurnState.ts
|
|
72
|
+
function toUiTurnDoneMetrics(metrics) {
|
|
73
|
+
return {
|
|
74
|
+
totalInputTokens: metrics.totalInputTokens ?? 0,
|
|
75
|
+
totalOutputTokens: metrics.totalOutputTokens ?? 0,
|
|
76
|
+
totalTokens: metrics.totalTokens ?? 0,
|
|
77
|
+
totalCacheReadTokens: metrics.totalCacheReadTokens ?? 0,
|
|
78
|
+
totalCacheWriteTokens: metrics.totalCacheWriteTokens ?? 0,
|
|
79
|
+
totalReasoningTokens: metrics.totalReasoningTokens ?? 0,
|
|
80
|
+
...metrics.totalCostInUsd == null ? {} : { totalCostInUsd: metrics.totalCostInUsd }
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function toUiTurnState(state) {
|
|
84
|
+
return state.status === "running" ? { status: "running" } : toUiTerminalTurnState(state);
|
|
85
|
+
}
|
|
86
|
+
function toUiTerminalTurnState(state) {
|
|
87
|
+
switch (state.status) {
|
|
88
|
+
case "cancelled":
|
|
89
|
+
return { status: "cancelled", reason: state.reason, completedAt: state.completedAt };
|
|
90
|
+
case "error":
|
|
91
|
+
return { status: "error", message: state.message, completedAt: state.completedAt };
|
|
92
|
+
case "done":
|
|
93
|
+
return {
|
|
94
|
+
status: "done",
|
|
95
|
+
completedAt: state.completedAt,
|
|
96
|
+
requiredActions: state.requiredActions,
|
|
97
|
+
...state.output == null ? {} : { output: state.output },
|
|
98
|
+
...state.metrics == null ? {} : { metrics: toUiTurnDoneMetrics(state.metrics) }
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function toUiSessionEvent(event) {
|
|
103
|
+
if (event.type !== "turn.done") return { ...event };
|
|
104
|
+
return { ...event, state: toUiTerminalTurnState(event.state) };
|
|
105
|
+
}
|
|
106
|
+
function toUiStreamingEvent(event) {
|
|
107
|
+
if (event.type !== "turn.done") return { ...event };
|
|
108
|
+
return { ...event, state: toUiTerminalTurnState(event.state) };
|
|
109
|
+
}
|
|
110
|
+
function toUiEventItem(item) {
|
|
111
|
+
return { turnId: item.turnId, event: toUiSessionEvent(item.event) };
|
|
193
112
|
}
|
|
194
113
|
|
|
195
114
|
// src/plugins/trueforge-agent-server-adapter/chatServer.ts
|
|
@@ -228,6 +147,7 @@ function toUiSession(session) {
|
|
|
228
147
|
return {
|
|
229
148
|
id: session.id,
|
|
230
149
|
isMutable: session.agent.type === "inline",
|
|
150
|
+
isCreateAgent: readSessionIsCreateAgent(session.metadata),
|
|
231
151
|
createdAt: session.createdAt,
|
|
232
152
|
updatedAt: session.updatedAt,
|
|
233
153
|
...session.title === null ? {} : { title: session.title },
|
|
@@ -237,6 +157,10 @@ function toUiSession(session) {
|
|
|
237
157
|
...session.agent.type === "inline" ? { agentSpec: toUiAgentSpec(session.agent.spec) } : {}
|
|
238
158
|
};
|
|
239
159
|
}
|
|
160
|
+
function createSessionMetadata(request) {
|
|
161
|
+
if (request.metadata === void 0) return void 0;
|
|
162
|
+
return request.metadata;
|
|
163
|
+
}
|
|
240
164
|
function toUiContent(content) {
|
|
241
165
|
return typeof content === "string" ? content : content.map((part) => ({ ...part }));
|
|
242
166
|
}
|
|
@@ -244,16 +168,14 @@ function toUiInput(input) {
|
|
|
244
168
|
return input.map((item) => item.type === "user.message" ? { ...item, content: toUiContent(item.content) } : item);
|
|
245
169
|
}
|
|
246
170
|
function toUiTurn(turn) {
|
|
247
|
-
const { previousTurnId, input, ...rest } = turn;
|
|
171
|
+
const { previousTurnId, input, state, ...rest } = turn;
|
|
248
172
|
return {
|
|
249
173
|
...rest,
|
|
174
|
+
state: toUiTurnState(state),
|
|
250
175
|
...previousTurnId === null ? {} : { previousTurnId },
|
|
251
176
|
...input === void 0 ? {} : { input: toUiInput(input) }
|
|
252
177
|
};
|
|
253
178
|
}
|
|
254
|
-
function toUiEventItem(item) {
|
|
255
|
-
return { turnId: item.turnId, event: { ...item.event } };
|
|
256
|
-
}
|
|
257
179
|
function toListResult(page, map) {
|
|
258
180
|
const data = page.data.map(map);
|
|
259
181
|
const token = page.response.pagination.nextPageToken;
|
|
@@ -293,15 +215,18 @@ function createHarnessChatServer(options = {}) {
|
|
|
293
215
|
return response.blob();
|
|
294
216
|
},
|
|
295
217
|
async createSession(request) {
|
|
218
|
+
const metadata = createSessionMetadata(request);
|
|
296
219
|
if (request.agentName !== void 0 && request.agentName.length > 0) {
|
|
297
220
|
const created = await client.sessions.create({
|
|
298
|
-
agent: { name: request.agentName }
|
|
221
|
+
agent: { name: request.agentName },
|
|
222
|
+
...metadata === void 0 ? {} : { metadata }
|
|
299
223
|
});
|
|
300
224
|
return toUiSession(created.data);
|
|
301
225
|
}
|
|
302
226
|
if (request.agentSpec !== void 0) {
|
|
303
227
|
const created = await client.sessions.create({
|
|
304
|
-
agent: { spec: toHarnessAgentSpec(request.agentSpec) }
|
|
228
|
+
agent: { spec: toHarnessAgentSpec(request.agentSpec) },
|
|
229
|
+
...metadata === void 0 ? {} : { metadata }
|
|
305
230
|
});
|
|
306
231
|
return toUiSession(created.data);
|
|
307
232
|
}
|
|
@@ -342,7 +267,7 @@ function createHarnessChatServer(options = {}) {
|
|
|
342
267
|
for await (const item of stream.withMetadata()) {
|
|
343
268
|
yield {
|
|
344
269
|
sequenceNumber: sequenceNumber(item.id, fallbackSequence),
|
|
345
|
-
event:
|
|
270
|
+
event: toUiStreamingEvent(item.data)
|
|
346
271
|
};
|
|
347
272
|
fallbackSequence += 1;
|
|
348
273
|
}
|
|
@@ -360,7 +285,7 @@ function createHarnessChatServer(options = {}) {
|
|
|
360
285
|
for await (const item of stream.withMetadata()) {
|
|
361
286
|
yield {
|
|
362
287
|
sequenceNumber: sequenceNumber(item.id, fallbackSequence),
|
|
363
|
-
event:
|
|
288
|
+
event: toUiStreamingEvent(item.data)
|
|
364
289
|
};
|
|
365
290
|
fallbackSequence += 1;
|
|
366
291
|
}
|
|
@@ -390,14 +315,257 @@ function createHarnessChatServer(options = {}) {
|
|
|
390
315
|
};
|
|
391
316
|
}
|
|
392
317
|
|
|
318
|
+
// src/plugins/trueforge-agent-server-adapter/agentSessionsServer.ts
|
|
319
|
+
function toSessionListEntry(session) {
|
|
320
|
+
return {
|
|
321
|
+
id: session.id,
|
|
322
|
+
createdAt: session.createdAt,
|
|
323
|
+
updatedAt: session.updatedAt,
|
|
324
|
+
lastActivityAt: session.updatedAt,
|
|
325
|
+
isCreateAgent: readSessionIsCreateAgent(session.metadata),
|
|
326
|
+
isMutable: session.agent.type === "inline",
|
|
327
|
+
metrics: {
|
|
328
|
+
totalTurns: session.metrics.totalTurns,
|
|
329
|
+
totalCostInUsd: session.metrics.totalCostInUsd ?? 0,
|
|
330
|
+
// TODO: fix this.
|
|
331
|
+
totalDurationMs: session.metrics.totalDurationMs
|
|
332
|
+
},
|
|
333
|
+
...session.title === null ? {} : { title: session.title },
|
|
334
|
+
...session.agent.type === "reference" && session.agent.name !== null ? { agentName: session.agent.name } : {},
|
|
335
|
+
...session.agent.type === "inline" ? { agentSpec: toUiAgentSpec(session.agent.spec) } : {}
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
function createHarnessAgentSessionsServer(options = {}) {
|
|
339
|
+
const client = options.client ?? createTrueForgeClient(options);
|
|
340
|
+
return {
|
|
341
|
+
async getAgent({ agentId }) {
|
|
342
|
+
const { data } = await client.agents.get(agentId);
|
|
343
|
+
return {
|
|
344
|
+
agentId: data.id,
|
|
345
|
+
name: data.name,
|
|
346
|
+
agentSpec: toUiAgentSpec(data.manifest)
|
|
347
|
+
};
|
|
348
|
+
},
|
|
349
|
+
async getCodeSnippets({ agentId }) {
|
|
350
|
+
const { data } = await client.internal.agents.getCodeSnippets(agentId);
|
|
351
|
+
return data.snippets;
|
|
352
|
+
},
|
|
353
|
+
async listSessions(requestParams = {}) {
|
|
354
|
+
const page = await client.sessions.list({
|
|
355
|
+
...requestParams.limit === void 0 ? {} : { limit: requestParams.limit },
|
|
356
|
+
...requestParams.order === void 0 ? {} : { order: requestParams.order },
|
|
357
|
+
...requestParams.pageToken === void 0 ? {} : { pageToken: requestParams.pageToken },
|
|
358
|
+
...requestParams.startTimestamp === void 0 ? {} : { startTimestamp: parseIsoDate(requestParams.startTimestamp) },
|
|
359
|
+
...requestParams.endTimestamp === void 0 ? {} : { endTimestamp: parseIsoDate(requestParams.endTimestamp) },
|
|
360
|
+
...requestParams.agentId === void 0 || requestParams.agentId.length === 0 ? {} : { agentId: requestParams.agentId }
|
|
361
|
+
});
|
|
362
|
+
return toListResult(page, toSessionListEntry);
|
|
363
|
+
},
|
|
364
|
+
async listSessionEvents({ sessionId, pageToken, limit }) {
|
|
365
|
+
const page = await client.sessions.listEvents(sessionId, {
|
|
366
|
+
...pageToken === void 0 ? {} : { pageToken },
|
|
367
|
+
...limit === void 0 ? {} : { limit }
|
|
368
|
+
});
|
|
369
|
+
return toListResult(page, toUiEventItem);
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// src/plugins/trueforge-agent-server-adapter/catalogs/connectorCatalog.ts
|
|
375
|
+
var DEFAULT_API_KEY_HEADER = "Authorization";
|
|
376
|
+
function toUiAuthPublic(auth) {
|
|
377
|
+
if (auth === void 0) {
|
|
378
|
+
return { type: "none" };
|
|
379
|
+
}
|
|
380
|
+
if (auth.type === "dcr") {
|
|
381
|
+
return { type: "dcr" };
|
|
382
|
+
}
|
|
383
|
+
const headerName = Object.keys(auth.headers)[0];
|
|
384
|
+
return {
|
|
385
|
+
type: "header",
|
|
386
|
+
...headerName === void 0 ? {} : { headerName }
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
function toHarnessAuth(auth) {
|
|
390
|
+
if (auth.type === "none") {
|
|
391
|
+
return void 0;
|
|
392
|
+
}
|
|
393
|
+
if (auth.type === "dcr") {
|
|
394
|
+
return { type: "dcr" };
|
|
395
|
+
}
|
|
396
|
+
const apiKey = auth.apiKey?.trim();
|
|
397
|
+
if (apiKey === void 0 || apiKey === "") {
|
|
398
|
+
throw new Error("API key is required for header-authenticated MCP servers");
|
|
399
|
+
}
|
|
400
|
+
const trimmedHeader = auth.headerName?.trim();
|
|
401
|
+
const headerName = trimmedHeader !== void 0 && trimmedHeader !== "" ? trimmedHeader : DEFAULT_API_KEY_HEADER;
|
|
402
|
+
return { type: "header", headers: { [headerName]: apiKey } };
|
|
403
|
+
}
|
|
404
|
+
function toUiCatalogEntry(server) {
|
|
405
|
+
return {
|
|
406
|
+
id: server.name,
|
|
407
|
+
name: server.name,
|
|
408
|
+
url: server.url,
|
|
409
|
+
description: server.description,
|
|
410
|
+
...server.logo === void 0 ? {} : { logo: server.logo },
|
|
411
|
+
auth: toUiAuthPublic(server.auth)
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
function toUiTool(tool) {
|
|
415
|
+
const name = typeof tool.name === "string" && tool.name !== "" ? tool.name : "tool";
|
|
416
|
+
const description = typeof tool.description === "string" ? tool.description : "";
|
|
417
|
+
return { id: name, name, description };
|
|
418
|
+
}
|
|
419
|
+
function toUiConnector(server) {
|
|
420
|
+
const auth = toUiAuthPublic(server.manifest.auth);
|
|
421
|
+
return {
|
|
422
|
+
id: server.name,
|
|
423
|
+
name: server.name,
|
|
424
|
+
description: server.manifest.description,
|
|
425
|
+
url: server.manifest.url,
|
|
426
|
+
auth,
|
|
427
|
+
requiresAuth: server.authStatus.status === "auth_required",
|
|
428
|
+
authenticated: server.authStatus.status !== "auth_required"
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
function toUiConnectorFromReadEntry(server) {
|
|
432
|
+
const auth = server.auth?.type ? { type: server.auth.type } : { type: "none" };
|
|
433
|
+
return {
|
|
434
|
+
id: server.name,
|
|
435
|
+
name: server.name,
|
|
436
|
+
description: server.url,
|
|
437
|
+
url: server.url,
|
|
438
|
+
auth,
|
|
439
|
+
requiresAuth: server.authStatus.status === "auth_required",
|
|
440
|
+
authenticated: server.authStatus.status !== "auth_required"
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
function toHarnessManifest(req) {
|
|
444
|
+
const auth = toHarnessAuth(req.auth);
|
|
445
|
+
const trimmed = req.description?.trim();
|
|
446
|
+
return {
|
|
447
|
+
type: "remote",
|
|
448
|
+
name: req.name,
|
|
449
|
+
url: req.url,
|
|
450
|
+
description: trimmed !== void 0 && trimmed !== "" ? trimmed : `${req.name} MCP server`,
|
|
451
|
+
...auth === void 0 ? {} : { auth }
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
function createConnectorCatalog(client) {
|
|
455
|
+
async function getConfigured(name) {
|
|
456
|
+
const listed = await client.settings.mcpServers.list();
|
|
457
|
+
const existing = listed.data.find((server) => server.name === name);
|
|
458
|
+
if (existing === void 0) {
|
|
459
|
+
throw new Error(`MCP server "${name}" not found`);
|
|
460
|
+
}
|
|
461
|
+
return existing;
|
|
462
|
+
}
|
|
463
|
+
async function resolveWriteAuth(req) {
|
|
464
|
+
if (req.auth.type !== "header") {
|
|
465
|
+
return req.auth;
|
|
466
|
+
}
|
|
467
|
+
const apiKey = req.auth.apiKey?.trim();
|
|
468
|
+
if (apiKey !== void 0 && apiKey !== "") {
|
|
469
|
+
return req.auth;
|
|
470
|
+
}
|
|
471
|
+
if (req.id === void 0) {
|
|
472
|
+
throw new Error("API key is required for header-authenticated MCP servers");
|
|
473
|
+
}
|
|
474
|
+
const existing = await getConfigured(req.id);
|
|
475
|
+
if (existing.manifest.auth?.type !== "header") {
|
|
476
|
+
throw new Error(`MCP server "${req.id}" has no stored header credentials to reuse`);
|
|
477
|
+
}
|
|
478
|
+
const preferredHeader = req.auth.headerName?.trim();
|
|
479
|
+
const storedHeaderName = Object.keys(existing.manifest.auth.headers)[0];
|
|
480
|
+
const headerName = preferredHeader !== void 0 && preferredHeader !== "" ? preferredHeader : storedHeaderName ?? DEFAULT_API_KEY_HEADER;
|
|
481
|
+
const stored = existing.manifest.auth.headers[headerName] ?? Object.values(existing.manifest.auth.headers)[0];
|
|
482
|
+
if (stored === void 0) {
|
|
483
|
+
throw new Error(`MCP server "${req.id}" has no stored header credentials to reuse`);
|
|
484
|
+
}
|
|
485
|
+
return { type: "header", apiKey: stored, headerName };
|
|
486
|
+
}
|
|
487
|
+
return {
|
|
488
|
+
getConnectorCatalog: async () => {
|
|
489
|
+
const body = await client.catalogs.mcpServers.list();
|
|
490
|
+
return body.data.map(toUiCatalogEntry);
|
|
491
|
+
},
|
|
492
|
+
getConnector: async (req) => {
|
|
493
|
+
const body = await client.settings.mcpServers.get(req.id);
|
|
494
|
+
return toUiConnector(body.data);
|
|
495
|
+
},
|
|
496
|
+
listConnectors: async (req) => {
|
|
497
|
+
const body = await client.settings.mcpServers.list();
|
|
498
|
+
const connectors = body.data.map(toUiConnector);
|
|
499
|
+
const query = req?.query?.trim().toLowerCase();
|
|
500
|
+
if (query === void 0 || query === "") {
|
|
501
|
+
return connectors;
|
|
502
|
+
}
|
|
503
|
+
return connectors.filter(
|
|
504
|
+
(connector) => connector.name.toLowerCase().includes(query) || connector.description.toLowerCase().includes(query) || connector.url.toLowerCase().includes(query)
|
|
505
|
+
);
|
|
506
|
+
},
|
|
507
|
+
getToolsByConnectorId: async ({ id }) => {
|
|
508
|
+
const body = await client.mcpServers.listTools(id);
|
|
509
|
+
return body.data.map(toUiTool);
|
|
510
|
+
},
|
|
511
|
+
createConnector: async (req) => {
|
|
512
|
+
const auth = await resolveWriteAuth({ auth: req.auth });
|
|
513
|
+
const body = await client.settings.mcpServers.create({
|
|
514
|
+
manifest: toHarnessManifest({
|
|
515
|
+
name: req.name,
|
|
516
|
+
url: req.url,
|
|
517
|
+
auth,
|
|
518
|
+
description: req.description
|
|
519
|
+
})
|
|
520
|
+
});
|
|
521
|
+
return toUiConnector(body.data);
|
|
522
|
+
},
|
|
523
|
+
updateConnector: async (req) => {
|
|
524
|
+
const auth = await resolveWriteAuth({ id: req.id, auth: req.auth });
|
|
525
|
+
const body = await client.settings.mcpServers.createOrUpdate({
|
|
526
|
+
manifest: toHarnessManifest({
|
|
527
|
+
name: req.id,
|
|
528
|
+
url: req.url,
|
|
529
|
+
auth,
|
|
530
|
+
description: req.description
|
|
531
|
+
})
|
|
532
|
+
});
|
|
533
|
+
return toUiConnector(body.data);
|
|
534
|
+
},
|
|
535
|
+
authenticateConnector: async (req) => {
|
|
536
|
+
const result = await client.mcpServers.authorize(
|
|
537
|
+
req.id,
|
|
538
|
+
req.returnTo === void 0 ? {} : { returnTo: req.returnTo }
|
|
539
|
+
);
|
|
540
|
+
return { status: result.status, authorization_endpoint: result.authorizationUrl };
|
|
541
|
+
},
|
|
542
|
+
disconnectConnector: async (req) => {
|
|
543
|
+
const existing = await getConfigured(req.id);
|
|
544
|
+
if (existing.manifest.auth?.type !== "dcr") {
|
|
545
|
+
throw new Error(`Disconnect is only supported for OAuth MCP servers`);
|
|
546
|
+
}
|
|
547
|
+
const body = await client.mcpServers.deleteAuthorization(req.id);
|
|
548
|
+
return toUiConnector(body.data);
|
|
549
|
+
}
|
|
550
|
+
};
|
|
551
|
+
}
|
|
552
|
+
|
|
393
553
|
// src/plugins/trueforge-agent-server-adapter/lists.ts
|
|
394
554
|
async function listModels(client) {
|
|
395
555
|
const body = await client.models.list();
|
|
396
556
|
return body.data;
|
|
397
557
|
}
|
|
558
|
+
async function listConfiguredMcpServersPage(client, req = {}) {
|
|
559
|
+
const page = await client.mcpServers.list({
|
|
560
|
+
...req.limit === void 0 ? {} : { limit: req.limit },
|
|
561
|
+
...req.pageToken === void 0 ? {} : { pageToken: req.pageToken }
|
|
562
|
+
});
|
|
563
|
+
return toListResult(page, (server) => server);
|
|
564
|
+
}
|
|
398
565
|
async function listConfiguredMcpServers(client) {
|
|
399
|
-
|
|
400
|
-
|
|
566
|
+
return drainListPages({
|
|
567
|
+
fetchPage: (pageToken) => listConfiguredMcpServersPage(client, { pageToken })
|
|
568
|
+
});
|
|
401
569
|
}
|
|
402
570
|
async function listSkills(client) {
|
|
403
571
|
const body = await client.skills.list();
|
|
@@ -423,7 +591,7 @@ function toModelSelection({
|
|
|
423
591
|
model,
|
|
424
592
|
logo
|
|
425
593
|
}) {
|
|
426
|
-
const
|
|
594
|
+
const { contextLength, maxOutputTokens, reasoningEfforts } = model.properties;
|
|
427
595
|
return {
|
|
428
596
|
id: model.modelId,
|
|
429
597
|
name: model.name,
|
|
@@ -432,7 +600,9 @@ function toModelSelection({
|
|
|
432
600
|
...logo === void 0 ? {} : { logo }
|
|
433
601
|
},
|
|
434
602
|
properties: {
|
|
435
|
-
...
|
|
603
|
+
...contextLength === void 0 ? {} : { contextLength },
|
|
604
|
+
...maxOutputTokens === void 0 ? {} : { maxOutputTokens },
|
|
605
|
+
...reasoningEfforts === void 0 ? {} : { reasoningEfforts: [...reasoningEfforts] }
|
|
436
606
|
}
|
|
437
607
|
};
|
|
438
608
|
}
|
|
@@ -467,6 +637,19 @@ function createHarnessBuilderServer(options = {}) {
|
|
|
467
637
|
return skills.map((skill) => ({ id: skill.name, name: skill.name, description: skill.description }));
|
|
468
638
|
},
|
|
469
639
|
getMcp: async () => (await listConfiguredMcpServers(client)).map(toUiConnectorFromReadEntry),
|
|
640
|
+
listMcp: async (req) => {
|
|
641
|
+
const page = await listConfiguredMcpServersPage(client, req ?? {});
|
|
642
|
+
return {
|
|
643
|
+
data: page.data.map(toUiConnectorFromReadEntry),
|
|
644
|
+
...page.nextPageToken === void 0 ? {} : { nextPageToken: page.nextPageToken }
|
|
645
|
+
};
|
|
646
|
+
},
|
|
647
|
+
getMcpTools: async ({ connectorId }) => {
|
|
648
|
+
const body = await client.mcpServers.listTools(connectorId);
|
|
649
|
+
return body.data.flatMap(
|
|
650
|
+
(tool) => typeof tool.name === "string" && tool.name.trim() !== "" ? [toUiTool(tool)] : []
|
|
651
|
+
);
|
|
652
|
+
},
|
|
470
653
|
async searchAgents(req) {
|
|
471
654
|
const { data } = await client.agents.list();
|
|
472
655
|
const query = req?.query?.trim().toLowerCase();
|
|
@@ -488,6 +671,12 @@ function createHarnessBuilderServer(options = {}) {
|
|
|
488
671
|
}
|
|
489
672
|
const created = await client.agents.create({ name: agentName, manifest });
|
|
490
673
|
return { agentId: created.data.id };
|
|
674
|
+
},
|
|
675
|
+
async deleteAgent({ agentName }) {
|
|
676
|
+
const { data } = await client.agents.list();
|
|
677
|
+
const existing = data.find((agent) => agent.name === agentName);
|
|
678
|
+
if (!existing) return;
|
|
679
|
+
await client.agents.delete(existing.id);
|
|
491
680
|
}
|
|
492
681
|
};
|
|
493
682
|
}
|
|
@@ -817,6 +1006,126 @@ function createSkillCatalog(client) {
|
|
|
817
1006
|
};
|
|
818
1007
|
}
|
|
819
1008
|
|
|
1009
|
+
// src/plugins/trueforge-agent-server-adapter/schedules/scheduleServer.ts
|
|
1010
|
+
var SCHEDULES_PAGE_LIMIT = 25;
|
|
1011
|
+
async function loadAgentIndex(client) {
|
|
1012
|
+
const { data } = await client.agents.list();
|
|
1013
|
+
const idToName = /* @__PURE__ */ new Map();
|
|
1014
|
+
const nameToId = /* @__PURE__ */ new Map();
|
|
1015
|
+
for (const agent of data) {
|
|
1016
|
+
idToName.set(agent.id, agent.name);
|
|
1017
|
+
nameToId.set(agent.name, agent.id);
|
|
1018
|
+
}
|
|
1019
|
+
return { idToName, nameToId };
|
|
1020
|
+
}
|
|
1021
|
+
function resolveAgentName(agentId, index) {
|
|
1022
|
+
const byId = index.idToName.get(agentId);
|
|
1023
|
+
if (byId != null) return byId;
|
|
1024
|
+
if (index.nameToId.has(agentId)) return agentId;
|
|
1025
|
+
throw new Error(`Unknown agent: ${agentId}`);
|
|
1026
|
+
}
|
|
1027
|
+
function collectAgentIds(req) {
|
|
1028
|
+
const ids = [];
|
|
1029
|
+
if (req?.agentIds != null) {
|
|
1030
|
+
for (const id of req.agentIds) {
|
|
1031
|
+
if (id !== "") ids.push(id);
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
if (req?.agentId != null && req.agentId !== "") ids.push(req.agentId);
|
|
1035
|
+
return [...new Set(ids)];
|
|
1036
|
+
}
|
|
1037
|
+
function wireStatus(manifest) {
|
|
1038
|
+
return manifest.status ?? "active";
|
|
1039
|
+
}
|
|
1040
|
+
function toUiSchedule(wire, index) {
|
|
1041
|
+
const agentId = index.nameToId.get(wire.agentName) ?? wire.agentName;
|
|
1042
|
+
return {
|
|
1043
|
+
id: wire.id,
|
|
1044
|
+
name: wire.name,
|
|
1045
|
+
agentId,
|
|
1046
|
+
agentName: wire.agentName,
|
|
1047
|
+
task: wire.manifest.task,
|
|
1048
|
+
cron: wire.manifest.cron,
|
|
1049
|
+
timezone: wire.manifest.timezone ?? "UTC",
|
|
1050
|
+
status: wireStatus(wire.manifest),
|
|
1051
|
+
lastRunAt: null
|
|
1052
|
+
};
|
|
1053
|
+
}
|
|
1054
|
+
function toWireManifest(input) {
|
|
1055
|
+
return {
|
|
1056
|
+
task: input.task,
|
|
1057
|
+
cron: input.cron,
|
|
1058
|
+
timezone: input.timezone ?? "UTC",
|
|
1059
|
+
status: input.status ?? "active"
|
|
1060
|
+
};
|
|
1061
|
+
}
|
|
1062
|
+
function toIsoInstant(value) {
|
|
1063
|
+
if (value instanceof Date) return value.toISOString();
|
|
1064
|
+
return value;
|
|
1065
|
+
}
|
|
1066
|
+
function toUiScheduleRun(wire) {
|
|
1067
|
+
return {
|
|
1068
|
+
id: wire.id,
|
|
1069
|
+
scheduleId: wire.scheduleId,
|
|
1070
|
+
name: wire.name,
|
|
1071
|
+
scheduledFor: toIsoInstant(wire.scheduledFor),
|
|
1072
|
+
status: wire.status,
|
|
1073
|
+
triggeredAt: wire.triggeredAt == null ? null : toIsoInstant(wire.triggeredAt),
|
|
1074
|
+
triggeredBy: wire.createdBySubject.subjectDisplayName || wire.createdBySubject.subjectId
|
|
1075
|
+
};
|
|
1076
|
+
}
|
|
1077
|
+
function createScheduleServer(options) {
|
|
1078
|
+
const { client } = options;
|
|
1079
|
+
return {
|
|
1080
|
+
async listSchedules(req) {
|
|
1081
|
+
const index = await loadAgentIndex(client);
|
|
1082
|
+
const agentIds = collectAgentIds(req);
|
|
1083
|
+
const agentNames = agentIds.length === 0 ? void 0 : agentIds.map((id) => resolveAgentName(id, index)).join(",");
|
|
1084
|
+
const limit = Math.min(Math.max(req?.limit ?? SCHEDULES_PAGE_LIMIT, 1), SCHEDULES_PAGE_LIMIT);
|
|
1085
|
+
const page = await client.schedules.list({
|
|
1086
|
+
limit,
|
|
1087
|
+
...req?.pageToken === void 0 || req.pageToken === "" ? {} : { pageToken: req.pageToken },
|
|
1088
|
+
...agentNames === void 0 ? {} : { agentNames }
|
|
1089
|
+
});
|
|
1090
|
+
return toListResult(page, (row) => toUiSchedule(row, index));
|
|
1091
|
+
},
|
|
1092
|
+
async getSchedule({ id }) {
|
|
1093
|
+
const index = await loadAgentIndex(client);
|
|
1094
|
+
const { data } = await client.schedules.get(id);
|
|
1095
|
+
return toUiSchedule(data, index);
|
|
1096
|
+
},
|
|
1097
|
+
async createSchedule(req) {
|
|
1098
|
+
const index = await loadAgentIndex(client);
|
|
1099
|
+
const agentName = resolveAgentName(req.agentId, index);
|
|
1100
|
+
const { data } = await client.schedules.create({
|
|
1101
|
+
agentName,
|
|
1102
|
+
name: req.name,
|
|
1103
|
+
manifest: toWireManifest(req)
|
|
1104
|
+
});
|
|
1105
|
+
return toUiSchedule(data, index);
|
|
1106
|
+
},
|
|
1107
|
+
async updateSchedule(req) {
|
|
1108
|
+
const index = await loadAgentIndex(client);
|
|
1109
|
+
const { data } = await client.schedules.update(req.id, {
|
|
1110
|
+
name: req.name,
|
|
1111
|
+
manifest: toWireManifest(req)
|
|
1112
|
+
});
|
|
1113
|
+
return toUiSchedule(data, index);
|
|
1114
|
+
},
|
|
1115
|
+
async deleteSchedule({ id }) {
|
|
1116
|
+
await client.schedules.delete(id);
|
|
1117
|
+
},
|
|
1118
|
+
async listScheduleRuns({ scheduleId }) {
|
|
1119
|
+
const { data } = await client.schedules.listRuns(scheduleId);
|
|
1120
|
+
return data.map(toUiScheduleRun);
|
|
1121
|
+
},
|
|
1122
|
+
async createScheduleRun(req) {
|
|
1123
|
+
const { data } = await client.schedules.createRun({ scheduleId: req.scheduleId });
|
|
1124
|
+
return toUiScheduleRun(data);
|
|
1125
|
+
}
|
|
1126
|
+
};
|
|
1127
|
+
}
|
|
1128
|
+
|
|
820
1129
|
// src/plugins/trueforge-agent-server-adapter/index.ts
|
|
821
1130
|
function createTrueForgeAgentUIServer(options = {}) {
|
|
822
1131
|
const { catalog: catalogOverride, ...clientOptions } = options;
|
|
@@ -830,22 +1139,29 @@ function createTrueForgeAgentUIServer(options = {}) {
|
|
|
830
1139
|
return createTrueFoundryServer({
|
|
831
1140
|
chatServer: createHarnessChatServer({ client }),
|
|
832
1141
|
...createHarnessBuilderServer({ client }),
|
|
833
|
-
catalog
|
|
1142
|
+
catalog,
|
|
1143
|
+
sessions: createHarnessAgentSessionsServer({ ...clientOptions, client }),
|
|
1144
|
+
metrics: createHarnessAgentMetricsServer({ ...clientOptions, client }),
|
|
1145
|
+
schedules: createScheduleServer({ client })
|
|
834
1146
|
});
|
|
835
1147
|
}
|
|
836
1148
|
export {
|
|
837
1149
|
configFromHarness,
|
|
838
1150
|
createConnectorCatalog,
|
|
1151
|
+
createHarnessAgentMetricsServer,
|
|
1152
|
+
createHarnessAgentSessionsServer,
|
|
839
1153
|
createHarnessBuilderServer,
|
|
840
1154
|
createHarnessChatServer,
|
|
841
1155
|
createModelProviderCatalog,
|
|
842
1156
|
createSandboxProviderCatalog,
|
|
1157
|
+
createScheduleServer,
|
|
843
1158
|
createSkillCatalog,
|
|
844
1159
|
createTrueForgeAgentUIServer,
|
|
845
1160
|
createTrueForgeClient,
|
|
846
1161
|
filterUiSandboxProviders,
|
|
847
1162
|
getCapabilities,
|
|
848
1163
|
listConfiguredMcpServers,
|
|
1164
|
+
listConfiguredMcpServersPage,
|
|
849
1165
|
listModels,
|
|
850
1166
|
listSkills,
|
|
851
1167
|
modelProviderLogosByName,
|