@dbx-tools/appkit-graphiti 0.6.114 → 0.6.116
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -33
- package/lib/src/config.d.ts +6 -20
- package/lib/src/config.js +9 -27
- package/lib/src/plugin.d.ts +21 -9
- package/lib/src/plugin.js +247 -94
- package/package.json +7 -5
- package/src/config.ts +10 -46
- package/src/plugin.ts +285 -95
package/README.md
CHANGED
|
@@ -5,46 +5,51 @@ AppKit process plugin for the Python `dbx-tools-graphiti` MCP runtime.
|
|
|
5
5
|
## Key features
|
|
6
6
|
|
|
7
7
|
- starts Graphiti as a supervised AppKit sidecar;
|
|
8
|
-
-
|
|
9
|
-
|
|
10
|
-
- starts
|
|
11
|
-
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
8
|
+
- enables the Python Postgres write journal when the app supplies Lakebase or
|
|
9
|
+
PostgreSQL connection environment;
|
|
10
|
+
- starts an internal loopback Caddy proxy in front of upstream Graphiti, then
|
|
11
|
+
republishes the allowed tools through AppKit at `/api/graphiti/mcp`;
|
|
12
|
+
- derives a stable private Graphiti group from the AppKit user or Mastra memory
|
|
13
|
+
resource id, overriding every caller-supplied group;
|
|
14
|
+
- exposes only operations that can be constrained to that group and removes
|
|
15
|
+
UUID arguments that could reference another user's graph objects;
|
|
16
|
+
- selects separate free loopback ports for Graphiti, LiteLLM, and Caddy unless
|
|
17
|
+
they are explicitly configured;
|
|
18
|
+
- exposes the user-scoped tools through `plugins.graphiti?.toolkit()` for
|
|
19
|
+
`@dbx-tools/appkit-mastra` agents;
|
|
20
|
+
- runs Graphiti and Caddy under `concurrently`, while the Python launcher runs
|
|
21
|
+
Graphiti and LiteLLM under Honcho;
|
|
22
|
+
- propagates termination signals through both supervisors, which escalate
|
|
23
|
+
unresponsive process groups to `SIGKILL`;
|
|
24
|
+
- exposes the MCP path through plugin exports.
|
|
18
25
|
|
|
19
26
|
## Why use this over native AppKit
|
|
20
27
|
|
|
21
|
-
AppKit has no Graphiti or embedded MCP sidecar. This package owns AppKit
|
|
22
|
-
|
|
23
|
-
|
|
28
|
+
AppKit has no Graphiti or embedded MCP sidecar. This package owns AppKit routes
|
|
29
|
+
and process lifecycle while `dbx-tools-graphiti` owns Graphiti, Neo4j, LiteLLM,
|
|
30
|
+
and Postgres recovery.
|
|
24
31
|
|
|
25
32
|
## Register
|
|
26
33
|
|
|
27
|
-
Install `dbx-tools-graphiti` in the app's Python dependencies
|
|
28
|
-
|
|
34
|
+
Install `dbx-tools-graphiti` in the app's Python dependencies and register the
|
|
35
|
+
plugin:
|
|
29
36
|
|
|
30
37
|
```ts
|
|
31
|
-
import {
|
|
38
|
+
import { server } from "@databricks/appkit";
|
|
32
39
|
import { appkit } from "@dbx-tools/appkit";
|
|
33
|
-
import {
|
|
34
|
-
|
|
35
|
-
const graphiti = graphitiConfig.resolveGraphitiConfig();
|
|
40
|
+
import { plugin as graphitiPlugin } from "@dbx-tools/appkit-graphiti";
|
|
36
41
|
|
|
37
42
|
await appkit.createApp({
|
|
38
|
-
plugins: [
|
|
39
|
-
server({ host: "127.0.0.1", port: graphiti.appPort }),
|
|
40
|
-
lakebase(),
|
|
41
|
-
graphitiPlugin.graphiti(graphiti),
|
|
42
|
-
],
|
|
43
|
+
plugins: [server(), graphitiPlugin.graphiti()],
|
|
43
44
|
});
|
|
44
45
|
```
|
|
45
46
|
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
AppKit continues to listen on `DATABRICKS_APP_PORT`. The plugin adds a
|
|
48
|
+
user-scoped MCP server at `/api/graphiti/mcp`; Graphiti, LiteLLM, and Caddy
|
|
49
|
+
remain loopback-only. The plugin's manifest declares the Lakebase resource
|
|
50
|
+
requirements used by generated deployments, so Graphiti does not require a
|
|
51
|
+
separate `lakebase()` plugin. Local callers must still supply a Lakebase or
|
|
52
|
+
PostgreSQL connection environment to enable the journal.
|
|
48
53
|
|
|
49
54
|
Add the MCP tools to a Mastra agent with:
|
|
50
55
|
|
|
@@ -54,27 +59,36 @@ tools(plugins) {
|
|
|
54
59
|
}
|
|
55
60
|
```
|
|
56
61
|
|
|
62
|
+
The same resource id that scopes Mastra memory scopes every Graphiti operation
|
|
63
|
+
invoked as an agent tool. Direct MCP requests use the forwarded AppKit user id,
|
|
64
|
+
falling back to AppKit's service identity in local development. The plugin
|
|
65
|
+
hashes that identity before using it as a Graphiti group id. Model or MCP input
|
|
66
|
+
cannot choose `group_id` or `group_ids`.
|
|
67
|
+
|
|
68
|
+
The scoped surface includes memory ingestion, node/fact search, episode listing,
|
|
69
|
+
saga summaries, community building, triplet insertion, and status. UUID-only
|
|
70
|
+
read/delete operations and graph clearing are omitted from the agent and public
|
|
71
|
+
MCP surfaces.
|
|
72
|
+
|
|
57
73
|
## Configuration
|
|
58
74
|
|
|
59
75
|
Plugin config overrides environment values:
|
|
60
76
|
|
|
61
|
-
- `publicPort` / `DATABRICKS_APP_PORT`: Caddy's public port, default `8000`;
|
|
62
|
-
- `appPort` / `GRAPHITI_APP_PORT`: AppKit's internal port, default public + 1;
|
|
63
77
|
- `graphitiPort` / `GRAPHITI_PORT`: Graphiti's internal port; a free loopback
|
|
64
78
|
port is selected automatically when omitted;
|
|
65
79
|
- `litellmPort` / `LITELLM_PORT`: the managed LiteLLM port; a separate free
|
|
66
80
|
loopback port is selected automatically so another local proxy cannot be
|
|
67
81
|
mistaken for Graphiti's model backend;
|
|
68
|
-
- `
|
|
69
|
-
|
|
82
|
+
- `proxyPort` / `PROXY_PORT`: Caddy's internal port; a third free loopback port
|
|
83
|
+
is selected automatically when omitted;
|
|
70
84
|
- `python` / `PYTHON`: Python executable, default `python3`;
|
|
71
85
|
- `journalNamespace` / `JOURNAL_NAMESPACE`: Postgres journal namespace, default
|
|
72
|
-
`DATABRICKS_APP_NAME
|
|
86
|
+
`DATABRICKS_APP_NAME`, then the detected project name, then `default`.
|
|
73
87
|
|
|
74
88
|
The app must package both Node and Python dependencies. Databricks Apps supports
|
|
75
|
-
this directly with `package.json` plus `requirements.txt`.
|
|
89
|
+
this directly with `package.json` plus `pyproject.toml` or `requirements.txt`.
|
|
76
90
|
|
|
77
91
|
## Modules
|
|
78
92
|
|
|
79
|
-
- `config` resolves ports,
|
|
93
|
+
- `config` resolves sidecar ports, the Python command, and journal namespace;
|
|
80
94
|
- `plugin` starts and supervises Graphiti and Caddy.
|
package/lib/src/config.d.ts
CHANGED
|
@@ -1,53 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* AppKit Graphiti sidecar ports
|
|
2
|
+
* AppKit Graphiti sidecar ports and Python command.
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
6
|
import { type BasePluginConfig } from "@databricks/appkit";
|
|
7
7
|
export interface GraphitiPluginConfig extends BasePluginConfig {
|
|
8
|
-
publicPort?: number;
|
|
9
|
-
appPort?: number;
|
|
10
8
|
graphitiPort?: number;
|
|
11
9
|
litellmPort?: number;
|
|
12
|
-
|
|
10
|
+
proxyPort?: number;
|
|
13
11
|
python?: string;
|
|
14
12
|
journalNamespace?: string;
|
|
15
13
|
}
|
|
16
14
|
export interface ResolvedGraphitiPluginConfig extends GraphitiPluginConfig {
|
|
17
|
-
publicPort: number;
|
|
18
|
-
appPort: number;
|
|
19
15
|
graphitiPort: number;
|
|
20
16
|
litellmPort: number;
|
|
21
|
-
|
|
17
|
+
proxyPort: number;
|
|
22
18
|
python: string;
|
|
23
19
|
journalNamespace: string;
|
|
24
20
|
}
|
|
25
21
|
export declare const GRAPHITI_CONFIG_SCHEMA: {
|
|
26
22
|
type: "object";
|
|
27
23
|
properties: {
|
|
28
|
-
|
|
29
|
-
type: "integer";
|
|
30
|
-
minimum: number;
|
|
31
|
-
maximum: number;
|
|
32
|
-
};
|
|
33
|
-
appPort: {
|
|
24
|
+
graphitiPort: {
|
|
34
25
|
type: "integer";
|
|
35
26
|
minimum: number;
|
|
36
27
|
maximum: number;
|
|
37
28
|
};
|
|
38
|
-
|
|
29
|
+
litellmPort: {
|
|
39
30
|
type: "integer";
|
|
40
31
|
minimum: number;
|
|
41
32
|
maximum: number;
|
|
42
33
|
};
|
|
43
|
-
|
|
34
|
+
proxyPort: {
|
|
44
35
|
type: "integer";
|
|
45
36
|
minimum: number;
|
|
46
37
|
maximum: number;
|
|
47
38
|
};
|
|
48
|
-
routePrefix: {
|
|
49
|
-
type: "string";
|
|
50
|
-
};
|
|
51
39
|
python: {
|
|
52
40
|
type: "string";
|
|
53
41
|
};
|
|
@@ -59,5 +47,3 @@ export declare const GRAPHITI_CONFIG_SCHEMA: {
|
|
|
59
47
|
};
|
|
60
48
|
/** Resolve plugin config over exact environment values and stable defaults. */
|
|
61
49
|
export declare function resolveGraphitiConfig(config?: GraphitiPluginConfig): ResolvedGraphitiPluginConfig;
|
|
62
|
-
/** Return the internal port an AppKit `server()` plugin should bind. */
|
|
63
|
-
export declare function appPort(config?: GraphitiPluginConfig): number;
|
package/lib/src/config.js
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* AppKit Graphiti sidecar ports
|
|
2
|
+
* AppKit Graphiti sidecar ports and Python command.
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
6
|
import { ConfigurationError } from "@databricks/appkit";
|
|
7
|
-
import { config as coreConfig } from "@dbx-tools/core";
|
|
7
|
+
import { config as coreConfig, project as coreProject } from "@dbx-tools/core";
|
|
8
8
|
export const GRAPHITI_CONFIG_SCHEMA = {
|
|
9
9
|
type: "object",
|
|
10
10
|
properties: {
|
|
11
|
-
publicPort: { type: "integer", minimum: 1, maximum: 65535 },
|
|
12
|
-
appPort: { type: "integer", minimum: 1, maximum: 65535 },
|
|
13
11
|
graphitiPort: { type: "integer", minimum: 1, maximum: 65535 },
|
|
14
12
|
litellmPort: { type: "integer", minimum: 1, maximum: 65535 },
|
|
15
|
-
|
|
13
|
+
proxyPort: { type: "integer", minimum: 1, maximum: 65535 },
|
|
16
14
|
python: { type: "string" },
|
|
17
15
|
journalNamespace: { type: "string" },
|
|
18
16
|
},
|
|
@@ -20,41 +18,25 @@ export const GRAPHITI_CONFIG_SCHEMA = {
|
|
|
20
18
|
};
|
|
21
19
|
/** Resolve plugin config over exact environment values and stable defaults. */
|
|
22
20
|
export function resolveGraphitiConfig(config = {}) {
|
|
23
|
-
const publicPort = coreConfig.port(config.publicPort, "DATABRICKS_APP_PORT", 8000, coreConfig.ENV_ONLY);
|
|
24
|
-
const appPort = coreConfig.port(config.appPort, "GRAPHITI_APP_PORT", publicPort + 1, coreConfig.ENV_ONLY);
|
|
25
21
|
const graphitiPort = coreConfig.port(config.graphitiPort, "GRAPHITI_PORT", 0, coreConfig.ENV_ONLY);
|
|
26
22
|
const litellmPort = coreConfig.port(config.litellmPort, "LITELLM_PORT", 0, coreConfig.ENV_ONLY);
|
|
27
|
-
const
|
|
23
|
+
const proxyPort = coreConfig.port(config.proxyPort, "PROXY_PORT", 0, coreConfig.ENV_ONLY);
|
|
24
|
+
const configuredPorts = [graphitiPort, litellmPort, proxyPort].filter(Boolean);
|
|
28
25
|
if (new Set(configuredPorts).size !== configuredPorts.length) {
|
|
29
|
-
throw new ConfigurationError("Graphiti
|
|
26
|
+
throw new ConfigurationError("Graphiti sidecar ports must be distinct");
|
|
30
27
|
}
|
|
31
|
-
const routePrefix = normalizeRoutePrefix(config.routePrefix ??
|
|
32
|
-
coreConfig.text("GRAPHITI_ROUTE_PREFIX", coreConfig.ENV_ONLY) ??
|
|
33
|
-
"/graphiti");
|
|
34
28
|
const python = config.python ?? coreConfig.text("PYTHON", coreConfig.ENV_ONLY)?.trim() ?? "python3";
|
|
35
29
|
const journalNamespace = config.journalNamespace ??
|
|
36
30
|
coreConfig.text("JOURNAL_NAMESPACE", coreConfig.ENV_ONLY)?.trim() ??
|
|
37
31
|
process.env.DATABRICKS_APP_NAME?.trim() ??
|
|
32
|
+
coreProject.name() ??
|
|
38
33
|
"default";
|
|
39
34
|
return {
|
|
40
|
-
publicPort,
|
|
41
|
-
appPort,
|
|
42
35
|
graphitiPort,
|
|
43
36
|
litellmPort,
|
|
44
|
-
|
|
37
|
+
proxyPort,
|
|
45
38
|
python,
|
|
46
39
|
journalNamespace,
|
|
47
40
|
};
|
|
48
41
|
}
|
|
49
|
-
|
|
50
|
-
export function appPort(config = {}) {
|
|
51
|
-
return resolveGraphitiConfig(config).appPort;
|
|
52
|
-
}
|
|
53
|
-
function normalizeRoutePrefix(value) {
|
|
54
|
-
const normalized = `/${value.trim().replace(/^\/+|\/+$/g, "")}`;
|
|
55
|
-
if (normalized === "/") {
|
|
56
|
-
throw new ConfigurationError("Graphiti routePrefix must contain a path segment");
|
|
57
|
-
}
|
|
58
|
-
return normalized;
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLGtCQUFrQixFQUF5QixNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxNQUFNLElBQUksVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUF1QnZELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHO0lBQ3BDLElBQUksRUFBRSxRQUFRO0lBQ2QsVUFBVSxFQUFFO1FBQ1YsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7UUFDM0QsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7UUFDeEQsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7UUFDN0QsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7UUFDNUQsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtRQUMvQixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO1FBQzFCLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtLQUNyQztJQUNELG9CQUFvQixFQUFFLEtBQUs7Q0FDTixDQUFDO0FBRXhCLCtFQUErRTtBQUMvRSxNQUFNLFVBQVUscUJBQXFCLENBQ25DLFNBQStCLEVBQUU7SUFFakMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FDaEMsTUFBTSxDQUFDLFVBQVUsRUFDakIscUJBQXFCLEVBQ3JCLElBQUksRUFDSixVQUFVLENBQUMsUUFBUSxDQUNwQixDQUFDO0lBQ0YsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FDN0IsTUFBTSxDQUFDLE9BQU8sRUFDZCxtQkFBbUIsRUFDbkIsVUFBVSxHQUFHLENBQUMsRUFDZCxVQUFVLENBQUMsUUFBUSxDQUNwQixDQUFDO0lBQ0YsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FDbEMsTUFBTSxDQUFDLFlBQVksRUFDbkIsZUFBZSxFQUNmLENBQUMsRUFDRCxVQUFVLENBQUMsUUFBUSxDQUNwQixDQUFDO0lBQ0YsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hHLE1BQU0sZUFBZSxHQUFHLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pGLElBQUksSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3RCxNQUFNLElBQUksa0JBQWtCLENBQUMsNkRBQTZELENBQUMsQ0FBQztJQUM5RixDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsb0JBQW9CLENBQ3RDLE1BQU0sQ0FBQyxXQUFXO1FBQ2hCLFVBQVUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUM3RCxXQUFXLENBQ2QsQ0FBQztJQUNGLE1BQU0sTUFBTSxHQUNWLE1BQU0sQ0FBQyxNQUFNLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLFNBQVMsQ0FBQztJQUN2RixNQUFNLGdCQUFnQixHQUNwQixNQUFNLENBQUMsZ0JBQWdCO1FBQ3ZCLFVBQVUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRTtRQUNqRSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRTtRQUN2QyxTQUFTLENBQUM7SUFDWixPQUFPO1FBQ0wsVUFBVTtRQUNWLE9BQU87UUFDUCxZQUFZO1FBQ1osV0FBVztRQUNYLFdBQVc7UUFDWCxNQUFNO1FBQ04sZ0JBQWdCO0tBQ2pCLENBQUM7QUFDSixDQUFDO0FBRUQsd0VBQXdFO0FBQ3hFLE1BQU0sVUFBVSxPQUFPLENBQUMsU0FBK0IsRUFBRTtJQUN2RCxPQUFPLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxLQUFhO0lBQ3pDLE1BQU0sVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNoRSxJQUFJLFVBQVUsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUN2QixNQUFNLElBQUksa0JBQWtCLENBQUMsa0RBQWtELENBQUMsQ0FBQztJQUNuRixDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IEdyYXBoaXRpIHNpZGVjYXIgcG9ydHMsIHJvdXRlIHByZWZpeCwgYW5kIFB5dGhvbiBjb21tYW5kLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yLCB0eXBlIEJhc2VQbHVnaW5Db25maWcgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBjb25maWcgYXMgY29yZUNvbmZpZyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgSlNPTlNjaGVtYTcgfSBmcm9tIFwianNvbi1zY2hlbWFcIjtcblxuZXhwb3J0IGludGVyZmFjZSBHcmFwaGl0aVBsdWdpbkNvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcge1xuICBwdWJsaWNQb3J0PzogbnVtYmVyO1xuICBhcHBQb3J0PzogbnVtYmVyO1xuICBncmFwaGl0aVBvcnQ/OiBudW1iZXI7XG4gIGxpdGVsbG1Qb3J0PzogbnVtYmVyO1xuICByb3V0ZVByZWZpeD86IHN0cmluZztcbiAgcHl0aG9uPzogc3RyaW5nO1xuICBqb3VybmFsTmFtZXNwYWNlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkR3JhcGhpdGlQbHVnaW5Db25maWcgZXh0ZW5kcyBHcmFwaGl0aVBsdWdpbkNvbmZpZyB7XG4gIHB1YmxpY1BvcnQ6IG51bWJlcjtcbiAgYXBwUG9ydDogbnVtYmVyO1xuICBncmFwaGl0aVBvcnQ6IG51bWJlcjtcbiAgbGl0ZWxsbVBvcnQ6IG51bWJlcjtcbiAgcm91dGVQcmVmaXg6IHN0cmluZztcbiAgcHl0aG9uOiBzdHJpbmc7XG4gIGpvdXJuYWxOYW1lc3BhY2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IEdSQVBISVRJX0NPTkZJR19TQ0hFTUEgPSB7XG4gIHR5cGU6IFwib2JqZWN0XCIsXG4gIHByb3BlcnRpZXM6IHtcbiAgICBwdWJsaWNQb3J0OiB7IHR5cGU6IFwiaW50ZWdlclwiLCBtaW5pbXVtOiAxLCBtYXhpbXVtOiA2NTUzNSB9LFxuICAgIGFwcFBvcnQ6IHsgdHlwZTogXCJpbnRlZ2VyXCIsIG1pbmltdW06IDEsIG1heGltdW06IDY1NTM1IH0sXG4gICAgZ3JhcGhpdGlQb3J0OiB7IHR5cGU6IFwiaW50ZWdlclwiLCBtaW5pbXVtOiAxLCBtYXhpbXVtOiA2NTUzNSB9LFxuICAgIGxpdGVsbG1Qb3J0OiB7IHR5cGU6IFwiaW50ZWdlclwiLCBtaW5pbXVtOiAxLCBtYXhpbXVtOiA2NTUzNSB9LFxuICAgIHJvdXRlUHJlZml4OiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICBweXRob246IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgIGpvdXJuYWxOYW1lc3BhY2U6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICB9LFxuICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG59IHNhdGlzZmllcyBKU09OU2NoZW1hNztcblxuLyoqIFJlc29sdmUgcGx1Z2luIGNvbmZpZyBvdmVyIGV4YWN0IGVudmlyb25tZW50IHZhbHVlcyBhbmQgc3RhYmxlIGRlZmF1bHRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVHcmFwaGl0aUNvbmZpZyhcbiAgY29uZmlnOiBHcmFwaGl0aVBsdWdpbkNvbmZpZyA9IHt9LFxuKTogUmVzb2x2ZWRHcmFwaGl0aVBsdWdpbkNvbmZpZyB7XG4gIGNvbnN0IHB1YmxpY1BvcnQgPSBjb3JlQ29uZmlnLnBvcnQoXG4gICAgY29uZmlnLnB1YmxpY1BvcnQsXG4gICAgXCJEQVRBQlJJQ0tTX0FQUF9QT1JUXCIsXG4gICAgODAwMCxcbiAgICBjb3JlQ29uZmlnLkVOVl9PTkxZLFxuICApO1xuICBjb25zdCBhcHBQb3J0ID0gY29yZUNvbmZpZy5wb3J0KFxuICAgIGNvbmZpZy5hcHBQb3J0LFxuICAgIFwiR1JBUEhJVElfQVBQX1BPUlRcIixcbiAgICBwdWJsaWNQb3J0ICsgMSxcbiAgICBjb3JlQ29uZmlnLkVOVl9PTkxZLFxuICApO1xuICBjb25zdCBncmFwaGl0aVBvcnQgPSBjb3JlQ29uZmlnLnBvcnQoXG4gICAgY29uZmlnLmdyYXBoaXRpUG9ydCxcbiAgICBcIkdSQVBISVRJX1BPUlRcIixcbiAgICAwLFxuICAgIGNvcmVDb25maWcuRU5WX09OTFksXG4gICk7XG4gIGNvbnN0IGxpdGVsbG1Qb3J0ID0gY29yZUNvbmZpZy5wb3J0KGNvbmZpZy5saXRlbGxtUG9ydCwgXCJMSVRFTExNX1BPUlRcIiwgMCwgY29yZUNvbmZpZy5FTlZfT05MWSk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRQb3J0cyA9IFtwdWJsaWNQb3J0LCBhcHBQb3J0LCBncmFwaGl0aVBvcnQsIGxpdGVsbG1Qb3J0XS5maWx0ZXIoQm9vbGVhbik7XG4gIGlmIChuZXcgU2V0KGNvbmZpZ3VyZWRQb3J0cykuc2l6ZSAhPT0gY29uZmlndXJlZFBvcnRzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXCJHcmFwaGl0aSBwdWJsaWMsIEFwcEtpdCwgYW5kIHNpZGVjYXIgcG9ydHMgbXVzdCBiZSBkaXN0aW5jdFwiKTtcbiAgfVxuICBjb25zdCByb3V0ZVByZWZpeCA9IG5vcm1hbGl6ZVJvdXRlUHJlZml4KFxuICAgIGNvbmZpZy5yb3V0ZVByZWZpeCA/P1xuICAgICAgY29yZUNvbmZpZy50ZXh0KFwiR1JBUEhJVElfUk9VVEVfUFJFRklYXCIsIGNvcmVDb25maWcuRU5WX09OTFkpID8/XG4gICAgICBcIi9ncmFwaGl0aVwiLFxuICApO1xuICBjb25zdCBweXRob24gPVxuICAgIGNvbmZpZy5weXRob24gPz8gY29yZUNvbmZpZy50ZXh0KFwiUFlUSE9OXCIsIGNvcmVDb25maWcuRU5WX09OTFkpPy50cmltKCkgPz8gXCJweXRob24zXCI7XG4gIGNvbnN0IGpvdXJuYWxOYW1lc3BhY2UgPVxuICAgIGNvbmZpZy5qb3VybmFsTmFtZXNwYWNlID8/XG4gICAgY29yZUNvbmZpZy50ZXh0KFwiSk9VUk5BTF9OQU1FU1BBQ0VcIiwgY29yZUNvbmZpZy5FTlZfT05MWSk/LnRyaW0oKSA/P1xuICAgIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQVBQX05BTUU/LnRyaW0oKSA/P1xuICAgIFwiZGVmYXVsdFwiO1xuICByZXR1cm4ge1xuICAgIHB1YmxpY1BvcnQsXG4gICAgYXBwUG9ydCxcbiAgICBncmFwaGl0aVBvcnQsXG4gICAgbGl0ZWxsbVBvcnQsXG4gICAgcm91dGVQcmVmaXgsXG4gICAgcHl0aG9uLFxuICAgIGpvdXJuYWxOYW1lc3BhY2UsXG4gIH07XG59XG5cbi8qKiBSZXR1cm4gdGhlIGludGVybmFsIHBvcnQgYW4gQXBwS2l0IGBzZXJ2ZXIoKWAgcGx1Z2luIHNob3VsZCBiaW5kLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcFBvcnQoY29uZmlnOiBHcmFwaGl0aVBsdWdpbkNvbmZpZyA9IHt9KTogbnVtYmVyIHtcbiAgcmV0dXJuIHJlc29sdmVHcmFwaGl0aUNvbmZpZyhjb25maWcpLmFwcFBvcnQ7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJvdXRlUHJlZml4KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBub3JtYWxpemVkID0gYC8ke3ZhbHVlLnRyaW0oKS5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKX1gO1xuICBpZiAobm9ybWFsaXplZCA9PT0gXCIvXCIpIHtcbiAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFwiR3JhcGhpdGkgcm91dGVQcmVmaXggbXVzdCBjb250YWluIGEgcGF0aCBzZWdtZW50XCIpO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuIl19
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLGtCQUFrQixFQUF5QixNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxNQUFNLElBQUksVUFBVSxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQW1CL0UsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUc7SUFDcEMsSUFBSSxFQUFFLFFBQVE7SUFDZCxVQUFVLEVBQUU7UUFDVixZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtRQUM3RCxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtRQUM1RCxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtRQUMxRCxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO1FBQzFCLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtLQUNyQztJQUNELG9CQUFvQixFQUFFLEtBQUs7Q0FDTixDQUFDO0FBRXhCLCtFQUErRTtBQUMvRSxNQUFNLFVBQVUscUJBQXFCLENBQ25DLFNBQStCLEVBQUU7SUFFakMsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FDbEMsTUFBTSxDQUFDLFlBQVksRUFDbkIsZUFBZSxFQUNmLENBQUMsRUFDRCxVQUFVLENBQUMsUUFBUSxDQUNwQixDQUFDO0lBQ0YsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hHLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxRixNQUFNLGVBQWUsR0FBRyxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9FLElBQUksSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3RCxNQUFNLElBQUksa0JBQWtCLENBQUMseUNBQXlDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQ1YsTUFBTSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksU0FBUyxDQUFDO0lBQ3ZGLE1BQU0sZ0JBQWdCLEdBQ3BCLE1BQU0sQ0FBQyxnQkFBZ0I7UUFDdkIsVUFBVSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFO1FBQ2pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFO1FBQ3ZDLFdBQVcsQ0FBQyxJQUFJLEVBQUU7UUFDbEIsU0FBUyxDQUFDO0lBQ1osT0FBTztRQUNMLFlBQVk7UUFDWixXQUFXO1FBQ1gsU0FBUztRQUNULE1BQU07UUFDTixnQkFBZ0I7S0FDakIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFwcEtpdCBHcmFwaGl0aSBzaWRlY2FyIHBvcnRzIGFuZCBQeXRob24gY29tbWFuZC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY29uZmlnIGFzIGNvcmVDb25maWcsIHByb2plY3QgYXMgY29yZVByb2plY3QgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEpTT05TY2hlbWE3IH0gZnJvbSBcImpzb24tc2NoZW1hXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JhcGhpdGlQbHVnaW5Db25maWcgZXh0ZW5kcyBCYXNlUGx1Z2luQ29uZmlnIHtcbiAgZ3JhcGhpdGlQb3J0PzogbnVtYmVyO1xuICBsaXRlbGxtUG9ydD86IG51bWJlcjtcbiAgcHJveHlQb3J0PzogbnVtYmVyO1xuICBweXRob24/OiBzdHJpbmc7XG4gIGpvdXJuYWxOYW1lc3BhY2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRHcmFwaGl0aVBsdWdpbkNvbmZpZyBleHRlbmRzIEdyYXBoaXRpUGx1Z2luQ29uZmlnIHtcbiAgZ3JhcGhpdGlQb3J0OiBudW1iZXI7XG4gIGxpdGVsbG1Qb3J0OiBudW1iZXI7XG4gIHByb3h5UG9ydDogbnVtYmVyO1xuICBweXRob246IHN0cmluZztcbiAgam91cm5hbE5hbWVzcGFjZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgR1JBUEhJVElfQ09ORklHX1NDSEVNQSA9IHtcbiAgdHlwZTogXCJvYmplY3RcIixcbiAgcHJvcGVydGllczoge1xuICAgIGdyYXBoaXRpUG9ydDogeyB0eXBlOiBcImludGVnZXJcIiwgbWluaW11bTogMSwgbWF4aW11bTogNjU1MzUgfSxcbiAgICBsaXRlbGxtUG9ydDogeyB0eXBlOiBcImludGVnZXJcIiwgbWluaW11bTogMSwgbWF4aW11bTogNjU1MzUgfSxcbiAgICBwcm94eVBvcnQ6IHsgdHlwZTogXCJpbnRlZ2VyXCIsIG1pbmltdW06IDEsIG1heGltdW06IDY1NTM1IH0sXG4gICAgcHl0aG9uOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICBqb3VybmFsTmFtZXNwYWNlOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgfSxcbiAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxufSBzYXRpc2ZpZXMgSlNPTlNjaGVtYTc7XG5cbi8qKiBSZXNvbHZlIHBsdWdpbiBjb25maWcgb3ZlciBleGFjdCBlbnZpcm9ubWVudCB2YWx1ZXMgYW5kIHN0YWJsZSBkZWZhdWx0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlR3JhcGhpdGlDb25maWcoXG4gIGNvbmZpZzogR3JhcGhpdGlQbHVnaW5Db25maWcgPSB7fSxcbik6IFJlc29sdmVkR3JhcGhpdGlQbHVnaW5Db25maWcge1xuICBjb25zdCBncmFwaGl0aVBvcnQgPSBjb3JlQ29uZmlnLnBvcnQoXG4gICAgY29uZmlnLmdyYXBoaXRpUG9ydCxcbiAgICBcIkdSQVBISVRJX1BPUlRcIixcbiAgICAwLFxuICAgIGNvcmVDb25maWcuRU5WX09OTFksXG4gICk7XG4gIGNvbnN0IGxpdGVsbG1Qb3J0ID0gY29yZUNvbmZpZy5wb3J0KGNvbmZpZy5saXRlbGxtUG9ydCwgXCJMSVRFTExNX1BPUlRcIiwgMCwgY29yZUNvbmZpZy5FTlZfT05MWSk7XG4gIGNvbnN0IHByb3h5UG9ydCA9IGNvcmVDb25maWcucG9ydChjb25maWcucHJveHlQb3J0LCBcIlBST1hZX1BPUlRcIiwgMCwgY29yZUNvbmZpZy5FTlZfT05MWSk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRQb3J0cyA9IFtncmFwaGl0aVBvcnQsIGxpdGVsbG1Qb3J0LCBwcm94eVBvcnRdLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKG5ldyBTZXQoY29uZmlndXJlZFBvcnRzKS5zaXplICE9PSBjb25maWd1cmVkUG9ydHMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcIkdyYXBoaXRpIHNpZGVjYXIgcG9ydHMgbXVzdCBiZSBkaXN0aW5jdFwiKTtcbiAgfVxuICBjb25zdCBweXRob24gPVxuICAgIGNvbmZpZy5weXRob24gPz8gY29yZUNvbmZpZy50ZXh0KFwiUFlUSE9OXCIsIGNvcmVDb25maWcuRU5WX09OTFkpPy50cmltKCkgPz8gXCJweXRob24zXCI7XG4gIGNvbnN0IGpvdXJuYWxOYW1lc3BhY2UgPVxuICAgIGNvbmZpZy5qb3VybmFsTmFtZXNwYWNlID8/XG4gICAgY29yZUNvbmZpZy50ZXh0KFwiSk9VUk5BTF9OQU1FU1BBQ0VcIiwgY29yZUNvbmZpZy5FTlZfT05MWSk/LnRyaW0oKSA/P1xuICAgIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQVBQX05BTUU/LnRyaW0oKSA/P1xuICAgIGNvcmVQcm9qZWN0Lm5hbWUoKSA/P1xuICAgIFwiZGVmYXVsdFwiO1xuICByZXR1cm4ge1xuICAgIGdyYXBoaXRpUG9ydCxcbiAgICBsaXRlbGxtUG9ydCxcbiAgICBwcm94eVBvcnQsXG4gICAgcHl0aG9uLFxuICAgIGpvdXJuYWxOYW1lc3BhY2UsXG4gIH07XG59XG4iXX0=
|
package/lib/src/plugin.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { Plugin, type PluginManifest, type ResourceRequirement } from "@databricks/appkit";
|
|
1
|
+
import { Plugin, type IAppRouter, type PluginManifest, type ResourceRequirement } from "@databricks/appkit";
|
|
2
2
|
import { type GraphitiPluginConfig } from "./config.ts";
|
|
3
3
|
interface ToolkitEntry {
|
|
4
|
+
readonly __toolkitRef: true;
|
|
4
5
|
pluginName: string;
|
|
5
6
|
localName: string;
|
|
6
7
|
def: {
|
|
@@ -8,29 +9,40 @@ interface ToolkitEntry {
|
|
|
8
9
|
description: string;
|
|
9
10
|
parameters: unknown;
|
|
10
11
|
};
|
|
12
|
+
annotations: {
|
|
13
|
+
effect: "read" | "write";
|
|
14
|
+
requiresUserContext: true;
|
|
15
|
+
};
|
|
11
16
|
}
|
|
12
17
|
export declare class GraphitiPlugin extends Plugin<GraphitiPluginConfig> {
|
|
13
18
|
static manifest: PluginManifest<"graphiti">;
|
|
14
19
|
static getResourceRequirements(): ResourceRequirement[];
|
|
15
20
|
private readonly logger;
|
|
16
|
-
private
|
|
21
|
+
private commands;
|
|
17
22
|
private mcp?;
|
|
23
|
+
private mcpServers;
|
|
24
|
+
private mcpServerSweep?;
|
|
18
25
|
private mcpTools;
|
|
19
26
|
private resolved?;
|
|
27
|
+
private setupComplete;
|
|
28
|
+
private supervision?;
|
|
20
29
|
private stopping;
|
|
21
30
|
setup(): Promise<void>;
|
|
31
|
+
injectRoutes(router: IAppRouter): void;
|
|
22
32
|
abortActiveOperations(): void;
|
|
33
|
+
shutdown(): Promise<void>;
|
|
23
34
|
exports(): {
|
|
24
|
-
appPort: number;
|
|
25
|
-
graphitiPort: number;
|
|
26
|
-
litellmPort: number;
|
|
27
35
|
mcpPath: string;
|
|
28
|
-
publicPort: number;
|
|
29
|
-
routePrefix: string;
|
|
30
36
|
};
|
|
31
37
|
toolkit(): Record<string, ToolkitEntry>;
|
|
32
|
-
executeAgentTool(name: string, args: unknown, signal?: AbortSignal
|
|
33
|
-
|
|
38
|
+
executeAgentTool(name: string, args: unknown, signal?: AbortSignal, context?: {
|
|
39
|
+
resourceId?: string;
|
|
40
|
+
}): Promise<unknown>;
|
|
41
|
+
private forwardMcp;
|
|
42
|
+
private mcpServer;
|
|
43
|
+
private onSupervisorExit;
|
|
44
|
+
private stopSidecars;
|
|
45
|
+
private closeIdleMcpServers;
|
|
34
46
|
}
|
|
35
47
|
export declare const graphiti: import("@databricks/appkit").ToPlugin<typeof GraphitiPlugin, GraphitiPluginConfig, "graphiti">;
|
|
36
48
|
export {};
|