@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 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
- - inherits the Lakebase environment resolved by `@dbx-tools/appkit` and native
9
- `lakebase()`, enabling the Python Postgres write journal automatically;
10
- - starts mise-managed Caddy on `DATABRICKS_APP_PORT`;
11
- - routes `/graphiti/*` to Graphiti and all other traffic to AppKit;
12
- - selects a free loopback port for Graphiti unless one is explicitly configured;
13
- - discovers the upstream MCP tools and exposes them through
14
- `plugins.graphiti?.toolkit()` for Mastra and AppKit agents;
15
- - binds both child processes to the shared concurrently-style supervisor so
16
- signals propagate and any child exit tears down the app;
17
- - exposes the internal AppKit port and public MCP path through plugin exports.
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 process
22
- lifecycle and single-port routing while `dbx-tools-graphiti` owns
23
- Graphiti, Neo4j, LiteLLM, and Postgres recovery.
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, then register
28
- native `lakebase()` before the Graphiti plugin:
34
+ Install `dbx-tools-graphiti` in the app's Python dependencies and register the
35
+ plugin:
29
36
 
30
37
  ```ts
31
- import { lakebase, server } from "@databricks/appkit";
38
+ import { server } from "@databricks/appkit";
32
39
  import { appkit } from "@dbx-tools/appkit";
33
- import { config as graphitiConfig, plugin as graphitiPlugin } from "@dbx-tools/appkit-graphiti";
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
- The public MCP endpoint is `/graphiti/mcp/`. Caddy listens on the platform's
47
- `DATABRICKS_APP_PORT`; AppKit and Graphiti remain loopback-only.
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
- - `routePrefix` / `GRAPHITI_ROUTE_PREFIX`: public Graphiti prefix, default
69
- `/graphiti`;
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` then `default`.
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, process command, route prefix, and journal namespace;
93
+ - `config` resolves sidecar ports, the Python command, and journal namespace;
80
94
  - `plugin` starts and supervises Graphiti and Caddy.
@@ -1,53 +1,41 @@
1
1
  /**
2
- * AppKit Graphiti sidecar ports, route prefix, and Python command.
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
- routePrefix?: string;
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
- routePrefix: string;
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
- publicPort: {
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
- graphitiPort: {
29
+ litellmPort: {
39
30
  type: "integer";
40
31
  minimum: number;
41
32
  maximum: number;
42
33
  };
43
- litellmPort: {
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, route prefix, and Python command.
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
- routePrefix: { type: "string" },
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 configuredPorts = [publicPort, appPort, graphitiPort, litellmPort].filter(Boolean);
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 public, AppKit, and sidecar ports must be distinct");
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
- routePrefix,
37
+ proxyPort,
45
38
  python,
46
39
  journalNamespace,
47
40
  };
48
41
  }
49
- /** Return the internal port an AppKit `server()` plugin should bind. */
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=
@@ -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 children;
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): Promise<unknown>;
33
- private stopGraphiti;
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 {};