@mcoda/agent-setup 0.1.76 → 0.1.79
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 +8 -0
- package/README.md +41 -0
- package/dist/headless/catalog.d.ts +1 -0
- package/dist/headless/catalog.d.ts.map +1 -1
- package/dist/headless/catalog.js +28 -1
- package/dist/headless/normalization.d.ts.map +1 -1
- package/dist/headless/normalization.js +38 -16
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/jobClient.d.ts +76 -0
- package/dist/jobClient.d.ts.map +1 -0
- package/dist/jobClient.js +92 -0
- package/dist/react/index.d.ts +20 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +244 -18
- package/dist/server/cliRuntime.d.ts.map +1 -1
- package/dist/server/cliRuntime.js +6 -0
- package/dist/server/inMemoryRuntime.d.ts.map +1 -1
- package/dist/server/inMemoryRuntime.js +47 -3
- package/dist/server/programmaticRuntime.d.ts.map +1 -1
- package/dist/server/programmaticRuntime.js +5 -1
- package/dist/server/service.d.ts.map +1 -1
- package/dist/server/service.js +5 -1
- package/dist/types.d.ts +10 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/styles/react.css +168 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.78
|
|
4
|
+
|
|
5
|
+
- Add the trusted backend `createMcodaGpuJobClient()` helper for owner-local
|
|
6
|
+
mswarm generic GPU/package jobs.
|
|
7
|
+
- Add the React `GpuJobOpsPanel` export and `McodaAgentSetupPage` GPU job ops
|
|
8
|
+
callbacks for queue, usage, quota, logs/events/artifacts, cancellation, and
|
|
9
|
+
retry drilldowns.
|
|
10
|
+
|
|
3
11
|
## 0.1.74
|
|
4
12
|
|
|
5
13
|
- Expose non-secret local-runner metadata in catalog entries.
|
package/README.md
CHANGED
|
@@ -9,11 +9,32 @@ The package provides:
|
|
|
9
9
|
- framework-agnostic server service helpers
|
|
10
10
|
- a default programmatic mcoda runtime adapter
|
|
11
11
|
- an optional React setup page
|
|
12
|
+
- a trusted backend GPU/generic job client for owner-local mswarm nodes
|
|
12
13
|
|
|
13
14
|
The default server runtime uses mcoda package APIs directly and does not require
|
|
14
15
|
a preinstalled or configured `mcoda` CLI/client tool. When an admin submits a
|
|
15
16
|
real mswarm API key through `configureMswarmApiKey()`, subsequent cloud and
|
|
16
17
|
self-hosted catalog reads use the real mswarm API via `MswarmApi`.
|
|
18
|
+
Self-hosted catalog reads include mswarm load-balanced aliases by default in
|
|
19
|
+
the setup SDK, and those aliases are exposed as `Auto load-balanced` server
|
|
20
|
+
options with `managedKind: "self_hosted_load_balanced"`. The synced local agent
|
|
21
|
+
config keeps only gateway/group metadata and never needs self-hosted node tokens
|
|
22
|
+
or invocation signing secrets in browser-visible state.
|
|
23
|
+
|
|
24
|
+
## Self-Hosted Routing Modes
|
|
25
|
+
|
|
26
|
+
The setup SDK presents two self-hosted routing modes side by side:
|
|
27
|
+
|
|
28
|
+
- Direct self-hosted entries keep a fixed server/node target and use
|
|
29
|
+
`managedKind: "self_hosted"` with `routingMode: "direct"`.
|
|
30
|
+
- Auto load-balanced entries are synthetic mswarm aliases and use
|
|
31
|
+
`managedKind: "self_hosted_load_balanced"` with `routingMode: "auto"`.
|
|
32
|
+
|
|
33
|
+
Existing saved assignments are not rewritten when auto aliases appear. For a
|
|
34
|
+
safe migration, let an admin choose the `Auto load-balanced` option only after
|
|
35
|
+
the control plane preview shows an eligible upgraded node group. For rollback,
|
|
36
|
+
save a direct self-hosted slug again or hide auto aliases in the backend catalog
|
|
37
|
+
sync; direct server entries remain usable.
|
|
17
38
|
|
|
18
39
|
For user-scoped mswarm integrations, `configureMswarmApiKey()` can receive
|
|
19
40
|
non-secret connection metadata such as tenant ID, product slug, owner user ID,
|
|
@@ -27,3 +48,23 @@ React consumers can use the packaged default stylesheet:
|
|
|
27
48
|
import { McodaAgentSetupPage } from "@mcoda/agent-setup/react";
|
|
28
49
|
import "@mcoda/agent-setup/react/styles.css";
|
|
29
50
|
```
|
|
51
|
+
|
|
52
|
+
Host applications can pass `gpuJobOps` and GPU job callbacks into
|
|
53
|
+
`McodaAgentSetupPage` to show an owner-local queue/usage/audit panel beside the
|
|
54
|
+
agent setup flow. Keep those callbacks backed by trusted backend routes; do not
|
|
55
|
+
send self-hosted node signing secrets to browser code.
|
|
56
|
+
|
|
57
|
+
Trusted backend code can use the GPU job client directly:
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
import { createMcodaGpuJobClient } from "@mcoda/agent-setup";
|
|
61
|
+
|
|
62
|
+
const gpuJobs = await createMcodaGpuJobClient({
|
|
63
|
+
nodeBaseUrl: process.env.MCODA_MSWARM_NODE_BASE_URL,
|
|
64
|
+
nodeId: process.env.MCODA_MSWARM_NODE_ID,
|
|
65
|
+
signingSecret: process.env.MCODA_MSWARM_NODE_SIGNING_SECRET,
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
const capabilities = await gpuJobs.listGpus();
|
|
69
|
+
const ops = await gpuJobs.ops({ auditLimit: 25 });
|
|
70
|
+
```
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { McodaAgentCatalogEntry, McodaSelfHostedServer } from "../types.js";
|
|
2
2
|
export declare function isCloudAgent(agent: McodaAgentCatalogEntry): boolean;
|
|
3
3
|
export declare function isSelfHostedAgent(agent: McodaAgentCatalogEntry): boolean;
|
|
4
|
+
export declare function isLoadBalancedSelfHostedAgent(agent: McodaAgentCatalogEntry): boolean;
|
|
4
5
|
export declare function isWorkerAgent(agent: McodaAgentCatalogEntry): boolean;
|
|
5
6
|
export declare function syncedCloudSlug(agent: McodaAgentCatalogEntry): string;
|
|
6
7
|
export declare function syncedSelfHostedSlug(agent: McodaAgentCatalogEntry): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/headless/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/headless/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAoBrB,wBAAgB,YAAY,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAMnE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAQxE;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAOT;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAMpE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAIrE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAO1E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAItE;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,sBAAsB,EAC7B,OAAO,CAAC,EAAE,sBAAsB,GAC/B,sBAAsB,CA6BxB;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,sBAAsB,EAAE,EACrC,kBAAkB,EAAE,sBAAsB,EAAE,GAC3C,sBAAsB,EAAE,CAY1B;AAED,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,sBAAsB,EAAE,EACrC,YAAY,EAAE,sBAAsB,EAAE,GACrC,qBAAqB,EAAE,CAoCzB;AAED,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,sBAAsB,EAAE,EACrC,mBAAmB,EAAE,sBAAsB,EAAE,GAC5C,sBAAsB,EAAE,CAY1B;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,sBAAsB,EAAE,EAChC,KAAK,EAAE,MAAM,GACZ,sBAAsB,EAAE,CAmC1B;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,sBAAsB,EAAE,GACpC,MAAM,CAqBR;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EACrC,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE;IACL,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAiBA"}
|
package/dist/headless/catalog.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const CLOUD_PREFIX = "mswarm-cloud-";
|
|
2
2
|
const SELF_HOSTED_PREFIX = "mswarm-self-hosted-";
|
|
3
|
+
const SELF_HOSTED_AUTO_PREFIX = "mswarm-self-hosted-auto-";
|
|
3
4
|
const WORKER_PREFIX = "mswarm-worker-";
|
|
4
5
|
const normalizeSlugPart = (value) => value
|
|
5
6
|
.trim()
|
|
@@ -16,9 +17,16 @@ export function isCloudAgent(agent) {
|
|
|
16
17
|
export function isSelfHostedAgent(agent) {
|
|
17
18
|
return (agent.source === "self_hosted_catalog" ||
|
|
18
19
|
agent.managedKind === "self_hosted" ||
|
|
20
|
+
agent.managedKind === "self_hosted_load_balanced" ||
|
|
19
21
|
agent.slug.startsWith(SELF_HOSTED_PREFIX) ||
|
|
20
22
|
Boolean(agent.nodeId || agent.serverName || agent.serverId));
|
|
21
23
|
}
|
|
24
|
+
export function isLoadBalancedSelfHostedAgent(agent) {
|
|
25
|
+
return (agent.managedKind === "self_hosted_load_balanced" ||
|
|
26
|
+
agent.routingMode === "auto" ||
|
|
27
|
+
Boolean(agent.loadBalancedGroupId) ||
|
|
28
|
+
agent.slug.startsWith(SELF_HOSTED_AUTO_PREFIX));
|
|
29
|
+
}
|
|
22
30
|
export function isWorkerAgent(agent) {
|
|
23
31
|
return (agent.source === "worker_catalog" ||
|
|
24
32
|
agent.managedKind === "worker" ||
|
|
@@ -34,7 +42,10 @@ export function syncedSelfHostedSlug(agent) {
|
|
|
34
42
|
if (agent.slug.startsWith(SELF_HOSTED_PREFIX))
|
|
35
43
|
return agent.slug;
|
|
36
44
|
const remote = agent.remoteSlug ?? agent.slug;
|
|
37
|
-
|
|
45
|
+
const prefix = isLoadBalancedSelfHostedAgent(agent)
|
|
46
|
+
? SELF_HOSTED_AUTO_PREFIX
|
|
47
|
+
: SELF_HOSTED_PREFIX;
|
|
48
|
+
return `${prefix}${normalizeSlugPart(remote) || "agent"}`;
|
|
38
49
|
}
|
|
39
50
|
export function syncedWorkerSlug(agent) {
|
|
40
51
|
if (agent.slug.startsWith(WORKER_PREFIX))
|
|
@@ -153,6 +164,8 @@ export function filterAgentOptions(agents, query) {
|
|
|
153
164
|
agent.bestUsage,
|
|
154
165
|
agent.serverName,
|
|
155
166
|
agent.serverLabel,
|
|
167
|
+
agent.routingMode,
|
|
168
|
+
agent.loadBalancedGroupId,
|
|
156
169
|
agent.nodeId,
|
|
157
170
|
...(agent.capabilities ?? []),
|
|
158
171
|
]
|
|
@@ -203,6 +216,16 @@ export function getVirtualAgentWindow(items, input) {
|
|
|
203
216
|
};
|
|
204
217
|
}
|
|
205
218
|
function resolveSelfHostedServer(agent) {
|
|
219
|
+
if (isLoadBalancedSelfHostedAgent(agent)) {
|
|
220
|
+
return {
|
|
221
|
+
id: "auto-load-balanced",
|
|
222
|
+
label: "Auto load-balanced",
|
|
223
|
+
routingMode: "auto",
|
|
224
|
+
loadBalancedGroupId: null,
|
|
225
|
+
status: agent.healthStatus,
|
|
226
|
+
remoteSlugPrefix: null,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
206
229
|
const nodeId = agent.nodeId?.trim() || undefined;
|
|
207
230
|
const serverName = agent.serverName?.trim() || undefined;
|
|
208
231
|
const serverId = agent.serverId?.trim() || undefined;
|
|
@@ -213,6 +236,8 @@ function resolveSelfHostedServer(agent) {
|
|
|
213
236
|
label: agent.serverLabel ?? serverName ?? nodeId ?? serverId ?? id,
|
|
214
237
|
nodeId,
|
|
215
238
|
serverName,
|
|
239
|
+
routingMode: "direct",
|
|
240
|
+
loadBalancedGroupId: null,
|
|
216
241
|
status: agent.healthStatus,
|
|
217
242
|
remoteSlugPrefix: undefined,
|
|
218
243
|
};
|
|
@@ -225,6 +250,8 @@ function resolveSelfHostedServer(agent) {
|
|
|
225
250
|
return {
|
|
226
251
|
id,
|
|
227
252
|
label: remoteSlugPrefix || id,
|
|
253
|
+
routingMode: "direct",
|
|
254
|
+
loadBalancedGroupId: null,
|
|
228
255
|
status: agent.healthStatus,
|
|
229
256
|
remoteSlugPrefix: remoteSlugPrefix || null,
|
|
230
257
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalization.d.ts","sourceRoot":"","sources":["../../src/headless/normalization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAEjB,MAAM,aAAa,CAAC;AAsErB,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE;IACR,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,qBAAqB,CAAC;CACrC,GACA,sBAAsB,
|
|
1
|
+
{"version":3,"file":"normalization.d.ts","sourceRoot":"","sources":["../../src/headless/normalization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAEjB,MAAM,aAAa,CAAC;AAsErB,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE;IACR,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,qBAAqB,CAAC;CACrC,GACA,sBAAsB,CA6JxB;AAwDD,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE;IACR,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,qBAAqB,CAAC;CACrC,GACA,sBAAsB,EAAE,CAO1B"}
|
|
@@ -58,14 +58,27 @@ export function normalizeAgentCatalogEntry(raw, fallback) {
|
|
|
58
58
|
const sync = recordValue(record.sync) ??
|
|
59
59
|
recordValue(mswarmSelfHosted?.sync) ??
|
|
60
60
|
recordValue(mswarmWorker?.sync);
|
|
61
|
-
const
|
|
62
|
-
(
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
61
|
+
const loadBalanced = booleanValue(record.load_balanced) ??
|
|
62
|
+
booleanValue(record.loadBalanced) ??
|
|
63
|
+
booleanValue(mswarmSelfHosted?.loadBalanced) ??
|
|
64
|
+
booleanValue(sync?.load_balanced) ??
|
|
65
|
+
false;
|
|
66
|
+
const routingMode = stringValue(record.routingMode) ??
|
|
67
|
+
stringValue(record.routing_mode) ??
|
|
68
|
+
stringValue(mswarmSelfHosted?.routingMode) ??
|
|
69
|
+
(loadBalanced ? "auto" : null);
|
|
70
|
+
const managedKind = fallback.managedKind === "self_hosted" && routingMode === "auto"
|
|
71
|
+
? "self_hosted_load_balanced"
|
|
72
|
+
: fallback.managedKind ??
|
|
73
|
+
(mswarmCloud
|
|
74
|
+
? "cloud"
|
|
75
|
+
: mswarmSelfHosted
|
|
76
|
+
? routingMode === "auto"
|
|
77
|
+
? "self_hosted_load_balanced"
|
|
78
|
+
: "self_hosted"
|
|
79
|
+
: mswarmWorker
|
|
80
|
+
? "worker"
|
|
81
|
+
: null);
|
|
69
82
|
const remoteSlug = stringValue(record.remoteSlug) ??
|
|
70
83
|
stringValue(record.remote_slug) ??
|
|
71
84
|
stringValue(mswarmCloud?.remoteSlug) ??
|
|
@@ -97,20 +110,29 @@ export function normalizeAgentCatalogEntry(raw, fallback) {
|
|
|
97
110
|
stringValue(record.health_status) ??
|
|
98
111
|
stringValue(health?.status) ??
|
|
99
112
|
stringValue(record.status);
|
|
100
|
-
const nodeId =
|
|
101
|
-
|
|
102
|
-
stringValue(
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
113
|
+
const nodeId = routingMode === "auto"
|
|
114
|
+
? null
|
|
115
|
+
: stringValue(record.nodeId) ??
|
|
116
|
+
stringValue(record.node_id) ??
|
|
117
|
+
stringValue(mswarmSelfHosted?.nodeId) ??
|
|
118
|
+
stringValue(sync?.node_id);
|
|
119
|
+
const serverName = routingMode === "auto"
|
|
120
|
+
? null
|
|
121
|
+
: stringValue(record.serverName) ??
|
|
122
|
+
stringValue(record.server_name) ??
|
|
123
|
+
stringValue(mswarmSelfHosted?.serverName) ??
|
|
124
|
+
stringValue(sync?.server_name);
|
|
108
125
|
return {
|
|
109
126
|
slug,
|
|
110
127
|
source: fallback.source,
|
|
111
128
|
synced: fallback.synced ?? fallback.source === "local_registry",
|
|
112
129
|
remoteSlug,
|
|
113
130
|
managedKind,
|
|
131
|
+
routingMode: routingMode === "auto" ? "auto" : routingMode === "direct" ? "direct" : null,
|
|
132
|
+
loadBalancedGroupId: stringValue(record.loadBalancedGroupId) ??
|
|
133
|
+
stringValue(record.load_balanced_group_id) ??
|
|
134
|
+
stringValue(mswarmSelfHosted?.loadBalancedGroupId) ??
|
|
135
|
+
stringValue(sync?.group_id),
|
|
114
136
|
nodeId,
|
|
115
137
|
serverName,
|
|
116
138
|
serverId: stringValue(record.serverId) ??
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type MswarmCapabilityRequestOptions, type MswarmGenericJobArtifactUploadInput, type MswarmGenericJobArtifactUploadResult, type MswarmGenericJobArtifactsResult, type MswarmGenericJobEventsResult, type MswarmGenericJobLifecycleSnapshot, type MswarmGenericJobLogsResult, type MswarmGenericJobOpsRequestOptions, type MswarmGenericJobOpsSummary, type MswarmGenericJobReference, type MswarmGenericNodeJobEnvelope } from "@mcoda/core";
|
|
2
|
+
type MswarmGenericJobRequestInput = MswarmGenericNodeJobEnvelope["job"];
|
|
3
|
+
type McodaGpuJobCreateInput = MswarmGenericNodeJobEnvelope | MswarmGenericJobRequestInput;
|
|
4
|
+
type McodaGpuJobEvent = MswarmGenericJobEventsResult["events"][number];
|
|
5
|
+
export interface McodaGpuJobEventStreamOptions extends Partial<MswarmGenericJobReference> {
|
|
6
|
+
intervalMs?: number;
|
|
7
|
+
stopOnTerminal?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface McodaGpuJobsNamespace {
|
|
10
|
+
create(job: McodaGpuJobCreateInput, input?: Partial<MswarmGenericJobReference>): Promise<MswarmGenericJobLifecycleSnapshot>;
|
|
11
|
+
run(job: McodaGpuJobCreateInput, input?: Partial<MswarmGenericJobReference>): Promise<MswarmGenericJobLifecycleSnapshot>;
|
|
12
|
+
status(input: Partial<MswarmGenericJobReference> & {
|
|
13
|
+
jobId: string;
|
|
14
|
+
}): Promise<MswarmGenericJobLifecycleSnapshot>;
|
|
15
|
+
logs(input: Partial<MswarmGenericJobReference> & {
|
|
16
|
+
jobId: string;
|
|
17
|
+
}): Promise<MswarmGenericJobLogsResult>;
|
|
18
|
+
events(jobIdOrInput: string | (Partial<MswarmGenericJobReference> & {
|
|
19
|
+
jobId: string;
|
|
20
|
+
}), input?: McodaGpuJobEventStreamOptions): AsyncIterable<McodaGpuJobEvent>;
|
|
21
|
+
eventsSnapshot(input: Partial<MswarmGenericJobReference> & {
|
|
22
|
+
jobId: string;
|
|
23
|
+
}): Promise<MswarmGenericJobEventsResult>;
|
|
24
|
+
artifacts(input: Partial<MswarmGenericJobReference> & {
|
|
25
|
+
jobId: string;
|
|
26
|
+
}): Promise<MswarmGenericJobArtifactsResult>;
|
|
27
|
+
cancel(input: Partial<MswarmGenericJobReference> & {
|
|
28
|
+
jobId: string;
|
|
29
|
+
}): Promise<MswarmGenericJobLifecycleSnapshot>;
|
|
30
|
+
retry(input: Partial<MswarmGenericJobReference> & {
|
|
31
|
+
jobId: string;
|
|
32
|
+
}): Promise<MswarmGenericJobLifecycleSnapshot>;
|
|
33
|
+
ops(input?: Partial<MswarmGenericJobOpsRequestOptions>): Promise<MswarmGenericJobOpsSummary>;
|
|
34
|
+
}
|
|
35
|
+
export interface CreateMcodaGpuJobClientInput {
|
|
36
|
+
baseUrl?: string;
|
|
37
|
+
apiKey?: string;
|
|
38
|
+
timeoutMs?: number;
|
|
39
|
+
nodeBaseUrl?: string;
|
|
40
|
+
nodeId?: string;
|
|
41
|
+
signingSecret?: string;
|
|
42
|
+
token?: string;
|
|
43
|
+
tokenTtlSeconds?: number;
|
|
44
|
+
}
|
|
45
|
+
export interface McodaGpuJobClient {
|
|
46
|
+
close(): Promise<void>;
|
|
47
|
+
jobs: McodaGpuJobsNamespace;
|
|
48
|
+
listGpus(input?: Partial<MswarmCapabilityRequestOptions>): Promise<Record<string, unknown>>;
|
|
49
|
+
uploadArtifact(input: Omit<MswarmGenericJobArtifactUploadInput, keyof MswarmGenericJobReference> & Partial<MswarmGenericJobReference> & {
|
|
50
|
+
jobId: string;
|
|
51
|
+
}): Promise<MswarmGenericJobArtifactUploadResult>;
|
|
52
|
+
runJob(job: McodaGpuJobCreateInput, input?: Partial<MswarmGenericJobReference>): Promise<MswarmGenericJobLifecycleSnapshot>;
|
|
53
|
+
create(job: McodaGpuJobCreateInput, input?: Partial<MswarmGenericJobReference>): Promise<MswarmGenericJobLifecycleSnapshot>;
|
|
54
|
+
status(input: Partial<MswarmGenericJobReference> & {
|
|
55
|
+
jobId: string;
|
|
56
|
+
}): Promise<MswarmGenericJobLifecycleSnapshot>;
|
|
57
|
+
logs(input: Partial<MswarmGenericJobReference> & {
|
|
58
|
+
jobId: string;
|
|
59
|
+
}): Promise<MswarmGenericJobLogsResult>;
|
|
60
|
+
events(input: Partial<MswarmGenericJobReference> & {
|
|
61
|
+
jobId: string;
|
|
62
|
+
}): Promise<MswarmGenericJobEventsResult>;
|
|
63
|
+
artifacts(input: Partial<MswarmGenericJobReference> & {
|
|
64
|
+
jobId: string;
|
|
65
|
+
}): Promise<MswarmGenericJobArtifactsResult>;
|
|
66
|
+
cancel(input: Partial<MswarmGenericJobReference> & {
|
|
67
|
+
jobId: string;
|
|
68
|
+
}): Promise<MswarmGenericJobLifecycleSnapshot>;
|
|
69
|
+
retry(input: Partial<MswarmGenericJobReference> & {
|
|
70
|
+
jobId: string;
|
|
71
|
+
}): Promise<MswarmGenericJobLifecycleSnapshot>;
|
|
72
|
+
ops(input?: Partial<MswarmGenericJobOpsRequestOptions>): Promise<MswarmGenericJobOpsSummary>;
|
|
73
|
+
}
|
|
74
|
+
export declare function createMcodaGpuJobClient(input?: CreateMcodaGpuJobClientInput): Promise<McodaGpuJobClient>;
|
|
75
|
+
export {};
|
|
76
|
+
//# sourceMappingURL=jobClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobClient.d.ts","sourceRoot":"","sources":["../src/jobClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { MswarmApi } from "@mcoda/core";
|
|
3
|
+
export async function createMcodaGpuJobClient(input = {}) {
|
|
4
|
+
const api = await MswarmApi.create({
|
|
5
|
+
baseUrl: input.baseUrl,
|
|
6
|
+
apiKey: input.apiKey,
|
|
7
|
+
timeoutMs: input.timeoutMs
|
|
8
|
+
});
|
|
9
|
+
const defaults = {
|
|
10
|
+
nodeBaseUrl: input.nodeBaseUrl,
|
|
11
|
+
nodeId: input.nodeId,
|
|
12
|
+
signingSecret: input.signingSecret,
|
|
13
|
+
token: input.token,
|
|
14
|
+
tokenTtlSeconds: input.tokenTtlSeconds
|
|
15
|
+
};
|
|
16
|
+
const withDefaults = (request) => ({
|
|
17
|
+
...defaults,
|
|
18
|
+
...request
|
|
19
|
+
});
|
|
20
|
+
const requireText = (value, label) => {
|
|
21
|
+
if (!value || value.trim() === "") {
|
|
22
|
+
throw new Error(`${label} is required`);
|
|
23
|
+
}
|
|
24
|
+
return value.trim();
|
|
25
|
+
};
|
|
26
|
+
const normalizeJobEnvelope = (job, request = {}) => {
|
|
27
|
+
if ("job" in job && typeof job.job_id === "string" && typeof job.request_id === "string" && typeof job.node_id === "string") {
|
|
28
|
+
return job;
|
|
29
|
+
}
|
|
30
|
+
const merged = withDefaults(request);
|
|
31
|
+
return {
|
|
32
|
+
job_id: request.jobId || `job-${randomUUID()}`,
|
|
33
|
+
request_id: request.requestId || `req-${randomUUID()}`,
|
|
34
|
+
node_id: requireText(merged.nodeId, "nodeId"),
|
|
35
|
+
job: job
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
const create = (job, request = {}) => api.runGenericJob(normalizeJobEnvelope(job, request), withDefaults(request));
|
|
39
|
+
const terminalStates = new Set(["succeeded", "failed", "cancelled", "expired", "blocked"]);
|
|
40
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
41
|
+
async function* streamEvents(jobIdOrInput, request = {}) {
|
|
42
|
+
const { intervalMs = 1000, stopOnTerminal = true, ...requestRest } = request;
|
|
43
|
+
const reference = typeof jobIdOrInput === "string"
|
|
44
|
+
? withDefaults({ ...requestRest, jobId: jobIdOrInput })
|
|
45
|
+
: withDefaults({ ...jobIdOrInput, ...requestRest });
|
|
46
|
+
const seen = new Set();
|
|
47
|
+
while (true) {
|
|
48
|
+
const events = await api.getGenericJobEvents(reference);
|
|
49
|
+
for (const event of events.events) {
|
|
50
|
+
const key = `${event.sequence}:${event.timestamp}:${event.type}`;
|
|
51
|
+
if (!seen.has(key)) {
|
|
52
|
+
seen.add(key);
|
|
53
|
+
yield event;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (stopOnTerminal) {
|
|
57
|
+
const snapshot = await api.getGenericJob(reference);
|
|
58
|
+
if (terminalStates.has(snapshot.job.state)) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
await sleep(intervalMs);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const jobs = {
|
|
66
|
+
create,
|
|
67
|
+
run: create,
|
|
68
|
+
status: (request) => api.getGenericJob(withDefaults(request)),
|
|
69
|
+
logs: (request) => api.getGenericJobLogs(withDefaults(request)),
|
|
70
|
+
events: streamEvents,
|
|
71
|
+
eventsSnapshot: (request) => api.getGenericJobEvents(withDefaults(request)),
|
|
72
|
+
artifacts: (request) => api.getGenericJobArtifacts(withDefaults(request)),
|
|
73
|
+
cancel: (request) => api.cancelGenericJob(withDefaults(request)),
|
|
74
|
+
retry: (request) => api.retryGenericJob(withDefaults(request)),
|
|
75
|
+
ops: (request = {}) => api.getGenericJobOps(withDefaults(request))
|
|
76
|
+
};
|
|
77
|
+
return {
|
|
78
|
+
close: () => api.close(),
|
|
79
|
+
jobs,
|
|
80
|
+
listGpus: (request = {}) => api.listGpuCapabilities(withDefaults(request)),
|
|
81
|
+
uploadArtifact: (request) => api.uploadGenericJobArtifact(withDefaults(request)),
|
|
82
|
+
runJob: create,
|
|
83
|
+
create,
|
|
84
|
+
status: jobs.status,
|
|
85
|
+
logs: jobs.logs,
|
|
86
|
+
events: jobs.eventsSnapshot,
|
|
87
|
+
artifacts: jobs.artifacts,
|
|
88
|
+
cancel: jobs.cancel,
|
|
89
|
+
retry: jobs.retry,
|
|
90
|
+
ops: jobs.ops
|
|
91
|
+
};
|
|
92
|
+
}
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import type { McodaAgentCatalogEntry, McodaAgentSetupClient, McodaAgentSetupSnapshot, McodaSelfHostedServer, McodaStageDefinition } from "../types.js";
|
|
2
|
+
import type { McodaAgentCatalogEntry, McodaAgentSetupClient, McodaAgentSetupSnapshot, McodaGpuJobOpsPanelData, McodaGpuJobOpsPanelJob, McodaSelfHostedServer, McodaStageDefinition } from "../types.js";
|
|
3
3
|
export interface McodaAgentSetupPageProps {
|
|
4
4
|
client: McodaAgentSetupClient;
|
|
5
5
|
stages?: McodaStageDefinition[];
|
|
@@ -7,6 +7,13 @@ export interface McodaAgentSetupPageProps {
|
|
|
7
7
|
className?: string;
|
|
8
8
|
labels?: Partial<McodaAgentSetupLabels>;
|
|
9
9
|
components?: Partial<McodaAgentSetupComponentOverrides>;
|
|
10
|
+
gpuJobOps?: McodaGpuJobOpsPanelData | null;
|
|
11
|
+
onGpuJobOpsRefresh?: () => void | Promise<void>;
|
|
12
|
+
onGpuJobViewDetails?: (job: McodaGpuJobOpsPanelJob) => void | Promise<void>;
|
|
13
|
+
onGpuJobViewLogs?: (job: McodaGpuJobOpsPanelJob) => void | Promise<void>;
|
|
14
|
+
onGpuJobViewArtifacts?: (job: McodaGpuJobOpsPanelJob) => void | Promise<void>;
|
|
15
|
+
onGpuJobRetry?: (job: McodaGpuJobOpsPanelJob) => void | Promise<void>;
|
|
16
|
+
onGpuJobCancel?: (job: McodaGpuJobOpsPanelJob) => void | Promise<void>;
|
|
10
17
|
}
|
|
11
18
|
export interface McodaAgentSetupLabels {
|
|
12
19
|
saveKey: string;
|
|
@@ -20,6 +27,7 @@ export interface McodaAgentSetupLabels {
|
|
|
20
27
|
export interface McodaAgentSetupComponentOverrides {
|
|
21
28
|
AgentCatalogSummary: typeof AgentCatalogSummary;
|
|
22
29
|
MswarmAccessCard: typeof MswarmAccessCard;
|
|
30
|
+
GpuJobOpsPanel: typeof GpuJobOpsPanel;
|
|
23
31
|
StageAgentAssignments: typeof StageAgentAssignments;
|
|
24
32
|
AgentSourceSelect: typeof AgentSourceSelect;
|
|
25
33
|
SelfHostedServerSelect: typeof SelfHostedServerSelect;
|
|
@@ -27,6 +35,17 @@ export interface McodaAgentSetupComponentOverrides {
|
|
|
27
35
|
}
|
|
28
36
|
type AgentAssignmentSource = "local" | "cloud" | "self_hosted" | "worker";
|
|
29
37
|
export declare function McodaAgentSetupPage(props: McodaAgentSetupPageProps): React.ReactElement;
|
|
38
|
+
export interface GpuJobOpsPanelProps {
|
|
39
|
+
ops: McodaGpuJobOpsPanelData;
|
|
40
|
+
busy?: boolean;
|
|
41
|
+
onRefresh?: () => void | Promise<void>;
|
|
42
|
+
onViewDetails?: (job: McodaGpuJobOpsPanelJob) => void | Promise<void>;
|
|
43
|
+
onViewLogs?: (job: McodaGpuJobOpsPanelJob) => void | Promise<void>;
|
|
44
|
+
onViewArtifacts?: (job: McodaGpuJobOpsPanelJob) => void | Promise<void>;
|
|
45
|
+
onRetry?: (job: McodaGpuJobOpsPanelJob) => void | Promise<void>;
|
|
46
|
+
onCancel?: (job: McodaGpuJobOpsPanelJob) => void | Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
export declare function GpuJobOpsPanel(props: GpuJobOpsPanelProps): React.ReactElement;
|
|
30
49
|
export declare function AgentCatalogSummary(props: {
|
|
31
50
|
snapshot: McodaAgentSetupSnapshot;
|
|
32
51
|
}): React.ReactElement;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,MAAM,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACxC,UAAU,CAAC,EAAE,OAAO,CAAC,iCAAiC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,MAAM,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACxC,UAAU,CAAC,EAAE,OAAO,CAAC,iCAAiC,CAAC,CAAC;IACxD,SAAS,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC3C,kBAAkB,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,qBAAqB,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iCAAiC;IAChD,mBAAmB,EAAE,OAAO,mBAAmB,CAAC;IAChD,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;IAC1C,cAAc,EAAE,OAAO,cAAc,CAAC;IACtC,qBAAqB,EAAE,OAAO,qBAAqB,CAAC;IACpD,iBAAiB,EAAE,OAAO,iBAAiB,CAAC;IAC5C,sBAAsB,EAAE,OAAO,sBAAsB,CAAC;IACtD,iBAAiB,EAAE,OAAO,iBAAiB,CAAC;CAC7C;AAYD,KAAK,qBAAqB,GAAG,OAAO,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,CAAC;AAE1E,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,wBAAwB,GAC9B,KAAK,CAAC,YAAY,CAsNpB;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,uBAAuB,CAAC;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,KAAK,CAAC,YAAY,CAsP7E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,QAAQ,EAAE,uBAAuB,CAAC;CACnC,GAAG,KAAK,CAAC,YAAY,CA4ErB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC1C,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,GAAG,KAAK,CAAC,YAAY,CA2DrB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,QAAQ,EAAE,uBAAuB,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACxC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACpE,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC/B,GAAG,KAAK,CAAC,YAAY,CAoNrB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;CAClD,GAAG,KAAK,CAAC,YAAY,CA0CrB;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,GAAG,KAAK,CAAC,YAAY,CA6CrB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,KAAK,CAAC,YAAY,CA4NrB;AAiMD,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,mBAAmB,aAAa,CAAC"}
|