agent-discover 1.2.4 → 1.2.5
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 +12 -0
- package/agent-desk-plugin.json +1 -1
- package/dist/context.d.ts +1 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +39 -28
- package/dist/context.js.map +1 -1
- package/dist/domain/health.d.ts.map +1 -1
- package/dist/domain/health.js +6 -1
- package/dist/domain/health.js.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.2.5] - 2026-04-12
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **Multi-process hydrate no longer corrupts `servers.active`.** The per-process `McpProxy.activeServers` map used to be rebuilt on every context creation, so every fresh stdio child (one per connected MCP client) raced to spawn a duplicate child for the same server, and whichever lost the race flipped `active = 0` via `setActive(name, false)` in the `catch` branch of the hydrate IIFE. Real symptom: a server that `registry.activate` had just successfully activated would appear as "Inactive" in the dashboard seconds later, even though the stdio child that ran the activate still had a live bridge. Fix: extracted the hydrate logic into an exported `hydrateActiveServers(ctx)` function, removed the auto-invocation from `createContext`, and only call it from `src/index.ts` after `startDashboard` binds successfully — so only the primary process (the one that owns port 3424) rebuilds the map. Secondary stdio children leave the DB flag alone. Hydrate failures in the primary process are now informational log lines only — they never flip `active = 0`, because a failed hydrate is often a transient spawn race and we should not punish the DB state that the REST + WS dashboard depends on.
|
|
13
|
+
- **`HEALTH_CHECK_TIMEOUT_MS` raised from 5 s to 60 s** (`src/domain/health.ts`). When a health probe arrives for a server that is not currently in the local process's proxy map, the health service runs a full activate / deactivate cycle — which for an `npx -y mcp-remote …` wrapper involves npm cold-start, package download, HTTP handshake with the remote, and `tools/list`. 5 s was never enough; every cold probe returned `{status:"unhealthy", latency_ms:5141, error:"Health check timed out"}` and the dashboard surfaced the server as Unhealthy even when a plain `proxy_call` round-tripped fine. 60 s matches `ACTIVATE_TIMEOUT_MS` in `src/domain/proxy.ts`.
|
|
14
|
+
- **Hydrate is idempotent.** The new `hydrateActiveServers` skips any server where `proxy.isActive(name)` is already true, so calling it twice in the same process (e.g. future use of `hydrateActiveServers` as an imperative refresh) never throws `"Server already active"`.
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- **`tests/domain/hydrate.test.ts`** — unit coverage for `hydrateActiveServers`: empty-DB no-op, does not flip `active = 0` when `proxy.activate` throws, skips already-active servers, and happy-path restores an entry into the in-memory proxy map.
|
|
19
|
+
|
|
8
20
|
## [1.2.4] - 2026-04-11
|
|
9
21
|
|
|
10
22
|
### Fixed
|
package/agent-desk-plugin.json
CHANGED
package/dist/context.d.ts
CHANGED
package/dist/context.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAOA,OAAO,EAAY,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAOA,OAAO,EAAY,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,CAsC/D;AAkBD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBzE"}
|
package/dist/context.js
CHANGED
|
@@ -30,34 +30,6 @@ export function createContext(dbOptions) {
|
|
|
30
30
|
const server = registry.getByName(name);
|
|
31
31
|
return server ? server.id : null;
|
|
32
32
|
});
|
|
33
|
-
// Hydrate the in-process proxy from servers marked active in the DB.
|
|
34
|
-
// Activation lives in McpProxy.activeServers (in-memory) but the DB-backed
|
|
35
|
-
// active flag is the cross-process source of truth, so each new instance
|
|
36
|
-
// (e.g. a fresh stdio child spawned by an MCP client) re-establishes its
|
|
37
|
-
// own proxy connections to the same set of child servers.
|
|
38
|
-
void (async () => {
|
|
39
|
-
const activeRows = db.queryAll('SELECT name FROM servers WHERE active = 1 AND installed = 1');
|
|
40
|
-
for (const row of activeRows) {
|
|
41
|
-
const server = registry.getByName(row.name);
|
|
42
|
-
if (!server)
|
|
43
|
-
continue;
|
|
44
|
-
try {
|
|
45
|
-
await proxy.activate({
|
|
46
|
-
name: server.name,
|
|
47
|
-
command: server.command ?? undefined,
|
|
48
|
-
args: server.args,
|
|
49
|
-
env: server.env,
|
|
50
|
-
transport: server.transport,
|
|
51
|
-
url: server.homepage ?? undefined,
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
catch (err) {
|
|
55
|
-
process.stderr.write(`[agent-discover] failed to hydrate active server "${server.name}": ${err instanceof Error ? err.message : String(err)}\n`);
|
|
56
|
-
// Clear the stale active flag so we don't retry forever
|
|
57
|
-
registry.setActive(server.name, false);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
})();
|
|
61
33
|
return {
|
|
62
34
|
db,
|
|
63
35
|
events,
|
|
@@ -78,4 +50,43 @@ export function createContext(dbOptions) {
|
|
|
78
50
|
},
|
|
79
51
|
};
|
|
80
52
|
}
|
|
53
|
+
// Hydrate the in-process proxy from servers marked active in the DB. The
|
|
54
|
+
// McpProxy.activeServers map is per-process, but the DB-backed `active` flag
|
|
55
|
+
// is the cross-process source of truth, so a fresh process can rebuild its
|
|
56
|
+
// live children by replaying it.
|
|
57
|
+
//
|
|
58
|
+
// Only the primary process (the one that successfully binds the dashboard
|
|
59
|
+
// port) should call this. Running hydrate in every stdio child — which is
|
|
60
|
+
// what happened before v1.2.5 — races on duplicate child spawning, and the
|
|
61
|
+
// losers used to flip the DB flag to 0 on failure, which surfaced as a
|
|
62
|
+
// dashboard server that flickered between Active and Inactive depending on
|
|
63
|
+
// which stdio child ran last.
|
|
64
|
+
//
|
|
65
|
+
// Hydrate failures here are logged but never flip the DB flag. The health
|
|
66
|
+
// probe is the one responsible for surfacing a dead child, and a failed
|
|
67
|
+
// hydrate in a secondary process is informational only — another process
|
|
68
|
+
// may already hold a live bridge.
|
|
69
|
+
export async function hydrateActiveServers(ctx) {
|
|
70
|
+
const activeRows = ctx.db.queryAll('SELECT name FROM servers WHERE active = 1 AND installed = 1');
|
|
71
|
+
for (const row of activeRows) {
|
|
72
|
+
const server = ctx.registry.getByName(row.name);
|
|
73
|
+
if (!server)
|
|
74
|
+
continue;
|
|
75
|
+
if (ctx.proxy.isActive(server.name))
|
|
76
|
+
continue;
|
|
77
|
+
try {
|
|
78
|
+
await ctx.proxy.activate({
|
|
79
|
+
name: server.name,
|
|
80
|
+
command: server.command ?? undefined,
|
|
81
|
+
args: server.args,
|
|
82
|
+
env: server.env,
|
|
83
|
+
transport: server.transport,
|
|
84
|
+
url: server.homepage ?? undefined,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
process.stderr.write(`[agent-discover] failed to hydrate active server "${server.name}": ${err instanceof Error ? err.message : String(err)}\n`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
81
92
|
//# sourceMappingURL=context.js.map
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,uCAAuC;AACvC,EAAE;AACF,sEAAsE;AACtE,sEAAsE;AACtE,gFAAgF;AAEhF,OAAO,EAAE,QAAQ,EAA2B,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAerD,MAAM,UAAU,aAAa,CAAC,SAAqB;IACjD,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC9B,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAE5C,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,mBAAmB,CAAC,CAAC,IAAY,EAAE,EAAE;QACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/domain/health.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/domain/health.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAShD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAaD,qBAAa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,QAAQ;IAG5B,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmFzD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAW/B,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU;CAWxC"}
|
package/dist/domain/health.js
CHANGED
|
@@ -4,7 +4,12 @@
|
|
|
4
4
|
// Monitors the health of registered MCP servers by attempting to connect
|
|
5
5
|
// and list tools. Updates health_status and last_health_check in the DB.
|
|
6
6
|
// =============================================================================
|
|
7
|
-
|
|
7
|
+
// Matches ACTIVATE_TIMEOUT_MS in proxy.ts — a health probe that isn't already
|
|
8
|
+
// active spawns a real child (e.g. `npx -y mcp-remote …`) and does the full
|
|
9
|
+
// MCP handshake, which easily exceeds a few seconds on cold start. 5 s was
|
|
10
|
+
// always unhealthy for remote-wrapped servers, causing spurious "unhealthy"
|
|
11
|
+
// flags and a false Inactive status in the dashboard.
|
|
12
|
+
const HEALTH_CHECK_TIMEOUT_MS = 60_000;
|
|
8
13
|
export class HealthService {
|
|
9
14
|
db;
|
|
10
15
|
proxy;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/domain/health.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,wCAAwC;AACxC,EAAE;AACF,yEAAyE;AACzE,yEAAyE;AACzE,gFAAgF;AAMhF,MAAM,uBAAuB,GAAG,
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/domain/health.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
// servers (activate/deactivate/uninstall).
|
|
10
10
|
// =============================================================================
|
|
11
11
|
import { startMcpServer } from 'agent-common';
|
|
12
|
-
import { createContext } from './context.js';
|
|
12
|
+
import { createContext, hydrateActiveServers } from './context.js';
|
|
13
13
|
import { readPackageMeta } from './package-meta.js';
|
|
14
14
|
import { createToolHandler, getToolList } from './transport/mcp.js';
|
|
15
15
|
import { startDashboard } from './server.js';
|
|
@@ -26,6 +26,11 @@ function tryStartDashboard() {
|
|
|
26
26
|
startDashboard(appContext, DASHBOARD_PORT)
|
|
27
27
|
.then((dashboardServer) => {
|
|
28
28
|
dashboard = dashboardServer;
|
|
29
|
+
// Only the primary process (the one that bound the dashboard port)
|
|
30
|
+
// re-establishes the proxy map from DB-backed active servers. Secondary
|
|
31
|
+
// stdio children of subsequent MCP clients skip hydrate so they don't
|
|
32
|
+
// race on duplicate child spawning.
|
|
33
|
+
void hydrateActiveServers(appContext);
|
|
29
34
|
})
|
|
30
35
|
.catch(() => {
|
|
31
36
|
process.stderr.write(`[agent-discover] Dashboard port ${DASHBOARD_PORT} in use — another instance is serving.\n`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,gFAAgF;AAChF,4DAA4D;AAC5D,EAAE;AACF,iFAAiF;AACjF,2EAA2E;AAC3E,gEAAgE;AAChE,wEAAwE;AACxE,2CAA2C;AAC3C,gFAAgF;AAEhF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,gFAAgF;AAChF,4DAA4D;AAC5D,EAAE;AACF,iFAAiF;AACjF,2EAA2E;AAC3E,gEAAgE;AAChE,wEAAwE;AACxE,2CAA2C;AAC3C,gFAAgF;AAEhF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAwB,MAAM,aAAa,CAAC;AAEnE,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;AACtC,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AAE/E,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;AACnC,MAAM,UAAU,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;AAEjD,IAAI,SAAS,GAA2B,IAAI,CAAC;AAC7C,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAE/B,SAAS,iBAAiB;IACxB,IAAI,SAAS,IAAI,kBAAkB;QAAE,OAAO;IAC5C,kBAAkB,GAAG,IAAI,CAAC;IAC1B,cAAc,CAAC,UAAU,EAAE,cAAc,CAAC;SACvC,IAAI,CAAC,CAAC,eAAe,EAAE,EAAE;QACxB,SAAS,GAAG,eAAe,CAAC;QAC5B,mEAAmE;QACnE,wEAAwE;QACxE,sEAAsE;QACtE,oCAAoC;QACpC,KAAK,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE;QACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mCAAmC,cAAc,0CAA0C,CAC5F,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC;AAED,cAAc,CAAC;IACb,UAAU,EAAE,WAAW;IACvB,KAAK,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC;IACpC,UAAU;IACV,YAAY,EAAE,iBAAiB;IAC/B,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;IAC9C,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QACnC,IACE,IAAI,KAAK,UAAU;YACnB,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,EAC3F,CAAC;YACD,MAAM,CAAC,kCAAkC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,QAAQ,EAAE,gBAAgB;CAC3B,CAAC,CAAC;AAEH,SAAS,OAAO;IACd,IAAI,SAAS,EAAE,CAAC;QACd,SAAS,CAAC,KAAK,EAAE,CAAC;QAClB,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,UAAU,CAAC,KAAK,EAAE,CAAC;AACrB,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,EAAE,CAAC;IACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,OAAO,EAAE,CAAC;IACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC"}
|
package/package.json
CHANGED