@dbx-tools/appkit-memory 0.0.0-stage → 0.9.132

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.
Files changed (42) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +116 -2
  3. package/index.ts +17 -0
  4. package/lib/index.d.ts +13 -0
  5. package/lib/index.js +14 -0
  6. package/lib/smoke/mastra-tool.d.ts +1 -0
  7. package/lib/smoke/mastra-tool.js +46 -0
  8. package/lib/src/_contracts.d.ts +71 -0
  9. package/lib/src/_contracts.js +63 -0
  10. package/lib/src/_mastra.d.ts +11 -0
  11. package/lib/src/_mastra.js +66 -0
  12. package/lib/src/config.d.ts +70 -0
  13. package/lib/src/config.js +87 -0
  14. package/lib/src/databricks/_runtime.d.ts +18 -0
  15. package/lib/src/databricks/_runtime.js +79 -0
  16. package/lib/src/databricks/client.d.ts +48 -0
  17. package/lib/src/databricks/client.js +174 -0
  18. package/lib/src/databricks/index.d.ts +3 -0
  19. package/lib/src/databricks/index.js +6 -0
  20. package/lib/src/graphiti/_backend.d.ts +9 -0
  21. package/lib/src/graphiti/_backend.js +214 -0
  22. package/lib/src/graphiti/index.d.ts +3 -0
  23. package/lib/src/graphiti/index.js +6 -0
  24. package/lib/src/graphiti/options.d.ts +7 -0
  25. package/lib/src/graphiti/options.js +7 -0
  26. package/lib/src/graphiti/runtime.d.ts +49 -0
  27. package/lib/src/graphiti/runtime.js +170 -0
  28. package/lib/src/plugin.d.ts +38 -0
  29. package/lib/src/plugin.js +196 -0
  30. package/lib/tsconfig.tsbuildinfo +1 -0
  31. package/package.json +104 -4
  32. package/src/_contracts.ts +107 -0
  33. package/src/_mastra.ts +80 -0
  34. package/src/config.ts +134 -0
  35. package/src/databricks/_runtime.ts +103 -0
  36. package/src/databricks/client.ts +251 -0
  37. package/src/databricks/index.ts +7 -0
  38. package/src/graphiti/_backend.ts +282 -0
  39. package/src/graphiti/index.ts +7 -0
  40. package/src/graphiti/options.ts +17 -0
  41. package/src/graphiti/runtime.ts +261 -0
  42. package/src/plugin.ts +254 -0
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Optional Mastra output-processor attachment.
3
+ *
4
+ * Loaded only when the memory plugin finds a registered Mastra sibling.
5
+ *
6
+ * @module
7
+ */
8
+ import { pluginRegistry } from "@dbx-tools/appkit";
9
+ import { errorUtils, log, object } from "@dbx-tools/shared-core";
10
+ const logger = log.logger("memory/mastra");
11
+ /** Attach a memory-owned turn saver through Mastra's generic processor extension. */
12
+ export async function attachMastraTurnSaver(context, saveTurn) {
13
+ const mastraModule = await import("@dbx-tools/appkit-mastra");
14
+ const plugin = pluginRegistry.instance(context, mastraModule.mastra);
15
+ if (!plugin)
16
+ return false;
17
+ plugin.exports().registerOutputProcessor((agentId) => ({
18
+ id: `appkit_memory_${agentId}`,
19
+ name: "AppKit memory turn saver",
20
+ description: "Saves completed turns to the configured fallback memory backend.",
21
+ processOutputResult: async ({ messageList, requestContext, abortSignal }) => {
22
+ const scope = mastraModule.memory.requestMemoryScope(requestContext);
23
+ if (!scope)
24
+ return messageList;
25
+ const actorId = typeof scope.resource === "string" ? scope.resource : undefined;
26
+ const threadId = typeof scope.thread === "string" ? scope.thread : undefined;
27
+ if (!actorId || !threadId)
28
+ return messageList;
29
+ const user = latestText(messageList.get.input.db(), "user");
30
+ const assistant = latestText(messageList.get.response.db(), "assistant");
31
+ if (!user || !assistant)
32
+ return messageList;
33
+ try {
34
+ await saveTurn({
35
+ agentId,
36
+ actorId,
37
+ threadId,
38
+ user,
39
+ assistant,
40
+ }, abortSignal);
41
+ }
42
+ catch (error) {
43
+ logger.warn("turn save failed", { error: errorUtils.toError(error), agentId });
44
+ }
45
+ return messageList;
46
+ },
47
+ }));
48
+ return true;
49
+ }
50
+ function latestText(messages, role) {
51
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
52
+ const message = messages[index];
53
+ if (message?.role !== role)
54
+ continue;
55
+ const text = message.content.parts
56
+ .flatMap((part) => object.isRecord(part) && part.type === "text" && typeof part.text === "string"
57
+ ? [part.text]
58
+ : [])
59
+ .join("\n")
60
+ .trim();
61
+ if (text)
62
+ return text;
63
+ }
64
+ return undefined;
65
+ }
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX21hc3RyYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fbWFzdHJhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUlqRSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBTzNDLHFGQUFxRjtBQUNyRixNQUFNLENBQUMsS0FBSyxVQUFVLHFCQUFxQixDQUN6QyxPQUF5QyxFQUN6QyxRQUFtRTtJQUVuRSxNQUFNLFlBQVksR0FBRyxNQUFNLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzlELE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyRSxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyRCxFQUFFLEVBQUUsaUJBQWlCLE9BQU8sRUFBRTtRQUM5QixJQUFJLEVBQUUsMEJBQTBCO1FBQ2hDLFdBQVcsRUFBRSxrRUFBa0U7UUFDL0UsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFO1lBQzFFLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsT0FBTyxXQUFXLENBQUM7WUFDL0IsTUFBTSxPQUFPLEdBQUcsT0FBTyxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2hGLE1BQU0sUUFBUSxHQUFHLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM3RSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUTtnQkFBRSxPQUFPLFdBQVcsQ0FBQztZQUM5QyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDNUQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTO2dCQUFFLE9BQU8sV0FBVyxDQUFDO1lBQzVDLElBQUksQ0FBQztnQkFDSCxNQUFNLFFBQVEsQ0FDWjtvQkFDRSxPQUFPO29CQUNQLE9BQU87b0JBQ1AsUUFBUTtvQkFDUixJQUFJO29CQUNKLFNBQVM7aUJBQ1YsRUFDRCxXQUFXLENBQ1osQ0FBQztZQUNKLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2pGLENBQUM7WUFDRCxPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDO0tBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FDakIsUUFBa0MsRUFDbEMsSUFBMEI7SUFFMUIsS0FBSyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM3RCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxPQUFPLEVBQUUsSUFBSSxLQUFLLElBQUk7WUFBRSxTQUFTO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSzthQUMvQixPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNoQixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRO1lBQzVFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDYixDQUFDLENBQUMsRUFBRSxDQUNQO2FBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNWLElBQUksRUFBRSxDQUFDO1FBQ1YsSUFBSSxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE9wdGlvbmFsIE1hc3RyYSBvdXRwdXQtcHJvY2Vzc29yIGF0dGFjaG1lbnQuXG4gKlxuICogTG9hZGVkIG9ubHkgd2hlbiB0aGUgbWVtb3J5IHBsdWdpbiBmaW5kcyBhIHJlZ2lzdGVyZWQgTWFzdHJhIHNpYmxpbmcuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHBsdWdpblJlZ2lzdHJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2csIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmltcG9ydCB0eXBlIHsgTWVtb3J5VHVybiB9IGZyb20gXCIuL19jb250cmFjdHMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1lbW9yeS9tYXN0cmFcIik7XG5cbmludGVyZmFjZSBNZW1vcnlNZXNzYWdlIHtcbiAgcmVhZG9ubHkgcm9sZTogc3RyaW5nO1xuICByZWFkb25seSBjb250ZW50OiB7IHJlYWRvbmx5IHBhcnRzOiByZWFkb25seSB1bmtub3duW10gfTtcbn1cblxuLyoqIEF0dGFjaCBhIG1lbW9yeS1vd25lZCB0dXJuIHNhdmVyIHRocm91Z2ggTWFzdHJhJ3MgZ2VuZXJpYyBwcm9jZXNzb3IgZXh0ZW5zaW9uLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGF0dGFjaE1hc3RyYVR1cm5TYXZlcihcbiAgY29udGV4dDogcGx1Z2luUmVnaXN0cnkuUGx1Z2luQ29udGV4dExpa2UsXG4gIHNhdmVUdXJuOiAodHVybjogTWVtb3J5VHVybiwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+IFByb21pc2U8dm9pZD4sXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgbWFzdHJhTW9kdWxlID0gYXdhaXQgaW1wb3J0KFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCIpO1xuICBjb25zdCBwbHVnaW4gPSBwbHVnaW5SZWdpc3RyeS5pbnN0YW5jZShjb250ZXh0LCBtYXN0cmFNb2R1bGUubWFzdHJhKTtcbiAgaWYgKCFwbHVnaW4pIHJldHVybiBmYWxzZTtcbiAgcGx1Z2luLmV4cG9ydHMoKS5yZWdpc3Rlck91dHB1dFByb2Nlc3NvcigoYWdlbnRJZCkgPT4gKHtcbiAgICBpZDogYGFwcGtpdF9tZW1vcnlfJHthZ2VudElkfWAsXG4gICAgbmFtZTogXCJBcHBLaXQgbWVtb3J5IHR1cm4gc2F2ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTYXZlcyBjb21wbGV0ZWQgdHVybnMgdG8gdGhlIGNvbmZpZ3VyZWQgZmFsbGJhY2sgbWVtb3J5IGJhY2tlbmQuXCIsXG4gICAgcHJvY2Vzc091dHB1dFJlc3VsdDogYXN5bmMgKHsgbWVzc2FnZUxpc3QsIHJlcXVlc3RDb250ZXh0LCBhYm9ydFNpZ25hbCB9KSA9PiB7XG4gICAgICBjb25zdCBzY29wZSA9IG1hc3RyYU1vZHVsZS5tZW1vcnkucmVxdWVzdE1lbW9yeVNjb3BlKHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIGlmICghc2NvcGUpIHJldHVybiBtZXNzYWdlTGlzdDtcbiAgICAgIGNvbnN0IGFjdG9ySWQgPSB0eXBlb2Ygc2NvcGUucmVzb3VyY2UgPT09IFwic3RyaW5nXCIgPyBzY29wZS5yZXNvdXJjZSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHRocmVhZElkID0gdHlwZW9mIHNjb3BlLnRocmVhZCA9PT0gXCJzdHJpbmdcIiA/IHNjb3BlLnRocmVhZCA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICghYWN0b3JJZCB8fCAhdGhyZWFkSWQpIHJldHVybiBtZXNzYWdlTGlzdDtcbiAgICAgIGNvbnN0IHVzZXIgPSBsYXRlc3RUZXh0KG1lc3NhZ2VMaXN0LmdldC5pbnB1dC5kYigpLCBcInVzZXJcIik7XG4gICAgICBjb25zdCBhc3Npc3RhbnQgPSBsYXRlc3RUZXh0KG1lc3NhZ2VMaXN0LmdldC5yZXNwb25zZS5kYigpLCBcImFzc2lzdGFudFwiKTtcbiAgICAgIGlmICghdXNlciB8fCAhYXNzaXN0YW50KSByZXR1cm4gbWVzc2FnZUxpc3Q7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzYXZlVHVybihcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgYWN0b3JJZCxcbiAgICAgICAgICAgIHRocmVhZElkLFxuICAgICAgICAgICAgdXNlcixcbiAgICAgICAgICAgIGFzc2lzdGFudCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJ0dXJuIHNhdmUgZmFpbGVkXCIsIHsgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnJvciksIGFnZW50SWQgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWVzc2FnZUxpc3Q7XG4gICAgfSxcbiAgfSkpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbGF0ZXN0VGV4dChcbiAgbWVzc2FnZXM6IHJlYWRvbmx5IE1lbW9yeU1lc3NhZ2VbXSxcbiAgcm9sZTogXCJ1c2VyXCIgfCBcImFzc2lzdGFudFwiLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChsZXQgaW5kZXggPSBtZXNzYWdlcy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleCAtPSAxKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzW2luZGV4XTtcbiAgICBpZiAobWVzc2FnZT8ucm9sZSAhPT0gcm9sZSkgY29udGludWU7XG4gICAgY29uc3QgdGV4dCA9IG1lc3NhZ2UuY29udGVudC5wYXJ0c1xuICAgICAgLmZsYXRNYXAoKHBhcnQpID0+XG4gICAgICAgIG9iamVjdC5pc1JlY29yZChwYXJ0KSAmJiBwYXJ0LnR5cGUgPT09IFwidGV4dFwiICYmIHR5cGVvZiBwYXJ0LnRleHQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IFtwYXJ0LnRleHRdXG4gICAgICAgICAgOiBbXSxcbiAgICAgIClcbiAgICAgIC5qb2luKFwiXFxuXCIpXG4gICAgICAudHJpbSgpO1xuICAgIGlmICh0ZXh0KSByZXR1cm4gdGV4dDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Top-level AppKit memory plugin configuration.
3
+ *
4
+ * @module
5
+ */
6
+ import type { BasePluginConfig } from "@databricks/appkit";
7
+ import { type GraphitiOptions } from "@dbx-tools/shared-graphiti";
8
+ import type { JSONSchema7 } from "json-schema";
9
+ import { z } from "zod";
10
+ export declare const DatabricksMemoryOptionsSchema: z.ZodObject<{
11
+ memoryStore: z.ZodOptional<z.ZodString>;
12
+ mode: z.ZodDefault<z.ZodEnum<{
13
+ auto: "auto";
14
+ required: "required";
15
+ }>>;
16
+ }, z.core.$strict>;
17
+ export type DatabricksMemoryOptions = z.input<typeof DatabricksMemoryOptionsSchema>;
18
+ export declare const MemoryPluginOptionsSchema: z.ZodObject<{
19
+ databricks: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodBoolean, z.ZodObject<{
20
+ memoryStore: z.ZodOptional<z.ZodString>;
21
+ mode: z.ZodDefault<z.ZodEnum<{
22
+ auto: "auto";
23
+ required: "required";
24
+ }>>;
25
+ }, z.core.$strict>]>>;
26
+ graphiti: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
27
+ postgresRole: z.ZodOptional<z.ZodOptional<z.ZodString>>;
28
+ profile: z.ZodOptional<z.ZodOptional<z.ZodString>>;
29
+ bearer: z.ZodOptional<z.ZodOptional<z.ZodString>>;
30
+ graphitiHome: z.ZodOptional<z.ZodOptional<z.ZodString>>;
31
+ modelClass: z.ZodOptional<z.ZodDefault<z.ZodOptional<z.ZodEnum<{
32
+ "chat-thinking": "chat-thinking";
33
+ "chat-balanced": "chat-balanced";
34
+ "chat-fast": "chat-fast";
35
+ }>>>>;
36
+ temperature: z.ZodOptional<z.ZodDefault<z.ZodCoercedNumber<number>>>;
37
+ structuredOutputMode: z.ZodOptional<z.ZodDefault<z.ZodString>>;
38
+ startupTimeoutMs: z.ZodOptional<z.ZodDefault<z.ZodCoercedNumber<number>>>;
39
+ listen: z.ZodOptional<z.ZodDefault<z.ZodType<{
40
+ scheme: "tcp";
41
+ host: string;
42
+ port: number;
43
+ }, unknown, z.core.$ZodTypeInternals<{
44
+ scheme: "tcp";
45
+ host: string;
46
+ port: number;
47
+ }, unknown>>>>;
48
+ databaseUrl: z.ZodOptional<z.ZodOptional<z.ZodString>>;
49
+ databaseSchema: z.ZodOptional<z.ZodDefault<z.ZodString>>;
50
+ }, z.core.$strict>]>>;
51
+ saveTurns: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodBoolean]>>;
52
+ }, z.core.$strict>;
53
+ export type MemoryPluginOptions = z.input<typeof MemoryPluginOptionsSchema>;
54
+ /** AppKit base configuration plus the memory plugin's serialized options. */
55
+ export type MemoryPluginConfig = BasePluginConfig & MemoryPluginOptions;
56
+ /** Resolved Databricks store identity and availability policy. */
57
+ export interface ResolvedDatabricksMemoryOptions {
58
+ readonly memoryStore: string;
59
+ readonly mode: "auto" | "required";
60
+ }
61
+ /** Fully resolved top-level memory configuration. */
62
+ export interface ResolvedMemoryPluginConfig {
63
+ readonly databricks: false | ResolvedDatabricksMemoryOptions;
64
+ readonly graphiti: false | GraphitiOptions;
65
+ readonly saveTurns: "auto" | boolean;
66
+ }
67
+ /** JSON Schema published through the AppKit memory plugin manifest. */
68
+ export declare const MEMORY_CONFIG_SCHEMA: JSONSchema7;
69
+ /** Resolve plugin defaults without parsing unrelated AppKit base fields. */
70
+ export declare function resolveMemoryPluginConfig(config?: MemoryPluginConfig): ResolvedMemoryPluginConfig;
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Top-level AppKit memory plugin configuration.
3
+ *
4
+ * @module
5
+ */
6
+ import { projectUtils } from "@dbx-tools/core";
7
+ import { stringUtils } from "@dbx-tools/shared-core";
8
+ import { GraphitiOptionsSchema, graphitiOptionOverrides, } from "@dbx-tools/shared-graphiti";
9
+ import { z } from "zod";
10
+ export const DatabricksMemoryOptionsSchema = z
11
+ .object({
12
+ memoryStore: z
13
+ .string()
14
+ .trim()
15
+ .min(1)
16
+ .optional()
17
+ .describe("Existing Databricks Agent Memory Store id or resource name."),
18
+ mode: z
19
+ .enum(["auto", "required"])
20
+ .default("auto")
21
+ .describe("Whether an inaccessible managed-memory store falls back or fails."),
22
+ })
23
+ .strict()
24
+ .describe("Databricks managed-memory backend configuration.");
25
+ const GraphitiMemoryOptionsSchema = GraphitiOptionsSchema.partial().describe("Graphiti option overrides for the lazy fallback.");
26
+ export const MemoryPluginOptionsSchema = z
27
+ .object({
28
+ databricks: z
29
+ .union([z.literal("auto"), z.boolean(), DatabricksMemoryOptionsSchema])
30
+ .default("auto")
31
+ .describe("Databricks managed memory mode: auto falls back, true requires access, and false disables it."),
32
+ graphiti: z
33
+ .union([z.boolean(), GraphitiMemoryOptionsSchema])
34
+ .default(true)
35
+ .describe("Lazy Graphiti fallback configuration, enabled by default."),
36
+ saveTurns: z
37
+ .union([z.literal("auto"), z.boolean()])
38
+ .default("auto")
39
+ .describe("Completed-turn saving mode: auto attaches when possible, true requires attachment, and false disables it."),
40
+ })
41
+ .strict()
42
+ .describe("AppKit memory plugin options.");
43
+ /** JSON Schema published through the AppKit memory plugin manifest. */
44
+ export const MEMORY_CONFIG_SCHEMA = z.toJSONSchema(MemoryPluginOptionsSchema);
45
+ /** Resolve plugin defaults without parsing unrelated AppKit base fields. */
46
+ export function resolveMemoryPluginConfig(config = {}) {
47
+ const parsed = MemoryPluginOptionsSchema.parse({
48
+ databricks: config.databricks,
49
+ graphiti: config.graphiti,
50
+ saveTurns: config.saveTurns,
51
+ });
52
+ if (parsed.databricks === false && parsed.graphiti === false) {
53
+ throw new Error("AppKit memory requires at least one enabled backend");
54
+ }
55
+ return {
56
+ databricks: parsed.databricks === false
57
+ ? false
58
+ : {
59
+ memoryStore: typeof parsed.databricks === "object" && parsed.databricks.memoryStore
60
+ ? resourceId(parsed.databricks.memoryStore, "memory-stores")
61
+ : defaultMemoryStore(),
62
+ mode: parsed.databricks === true
63
+ ? "required"
64
+ : typeof parsed.databricks === "object"
65
+ ? parsed.databricks.mode
66
+ : "auto",
67
+ },
68
+ graphiti: config.graphiti === false
69
+ ? false
70
+ : config.graphiti === undefined || config.graphiti === true
71
+ ? {}
72
+ : graphitiOptionOverrides(config.graphiti),
73
+ saveTurns: parsed.saveTurns,
74
+ };
75
+ }
76
+ function defaultMemoryStore() {
77
+ const slug = stringUtils.toSlugWithOptions({ maxLength: 56, truncateStrategy: "hash" }, projectUtils.name());
78
+ const id = /^[a-z]/.test(slug) ? slug : `app-${slug}`;
79
+ return (id.length < 3 ? `${id}-store` : id).slice(0, 56);
80
+ }
81
+ function resourceId(value, prefix) {
82
+ const trimmed = value.trim().replace(new RegExp(`^${prefix}/`), "");
83
+ if (!trimmed)
84
+ throw new Error(`${prefix} id is required`);
85
+ return trimmed;
86
+ }
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBR0gsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHVCQUF1QixHQUV4QixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsQ0FBQztLQUMzQyxNQUFNLENBQUM7SUFDTixXQUFXLEVBQUUsQ0FBQztTQUNYLE1BQU0sRUFBRTtTQUNSLElBQUksRUFBRTtTQUNOLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDTixRQUFRLEVBQUU7U0FDVixRQUFRLENBQUMsNkRBQTZELENBQUM7SUFDMUUsSUFBSSxFQUFFLENBQUM7U0FDSixJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDMUIsT0FBTyxDQUFDLE1BQU0sQ0FBQztTQUNmLFFBQVEsQ0FBQyxtRUFBbUUsQ0FBQztDQUNqRixDQUFDO0tBQ0QsTUFBTSxFQUFFO0tBQ1IsUUFBUSxDQUFDLGtEQUFrRCxDQUFDLENBQUM7QUFJaEUsTUFBTSwyQkFBMkIsR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQzFFLGtEQUFrRCxDQUNuRCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQztLQUN2QyxNQUFNLENBQUM7SUFDTixVQUFVLEVBQUUsQ0FBQztTQUNWLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLDZCQUE2QixDQUFDLENBQUM7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LENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBYSxFQUFFLE1BQWM7SUFDL0MsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcEUsSUFBSSxDQUFDLE9BQU87UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxDQUFDO0lBQzFELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRvcC1sZXZlbCBBcHBLaXQgbWVtb3J5IHBsdWdpbiBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VQbHVnaW5Db25maWcgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwcm9qZWN0VXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBHcmFwaGl0aU9wdGlvbnNTY2hlbWEsXG4gIGdyYXBoaXRpT3B0aW9uT3ZlcnJpZGVzLFxuICB0eXBlIEdyYXBoaXRpT3B0aW9ucyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWdyYXBoaXRpXCI7XG5pbXBvcnQgdHlwZSB7IEpTT05TY2hlbWE3IH0gZnJvbSBcImpzb24tc2NoZW1hXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5leHBvcnQgY29uc3QgRGF0YWJyaWNrc01lbW9yeU9wdGlvbnNTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIG1lbW9yeVN0b3JlOiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC50cmltKClcbiAgICAgIC5taW4oMSlcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXCJFeGlzdGluZyBEYXRhYnJpY2tzIEFnZW50IE1lbW9yeSBTdG9yZSBpZCBvciByZXNvdXJjZSBuYW1lLlwiKSxcbiAgICBtb2RlOiB6XG4gICAgICAuZW51bShbXCJhdXRvXCIsIFwicmVxdWlyZWRcIl0pXG4gICAgICAuZGVmYXVsdChcImF1dG9cIilcbiAgICAgIC5kZXNjcmliZShcIldoZXRoZXIgYW4gaW5hY2Nlc3NpYmxlIG1hbmFnZWQtbWVtb3J5IHN0b3JlIGZhbGxzIGJhY2sgb3IgZmFpbHMuXCIpLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFwiRGF0YWJyaWNrcyBtYW5hZ2VkLW1lbW9yeSBiYWNrZW5kIGNvbmZpZ3VyYXRpb24uXCIpO1xuXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzTWVtb3J5T3B0aW9ucyA9IHouaW5wdXQ8dHlwZW9mIERhdGFicmlja3NNZW1vcnlPcHRpb25zU2NoZW1hPjtcblxuY29uc3QgR3JhcGhpdGlNZW1vcnlPcHRpb25zU2NoZW1hID0gR3JhcGhpdGlPcHRpb25zU2NoZW1hLnBhcnRpYWwoKS5kZXNjcmliZShcbiAgXCJHcmFwaGl0aSBvcHRpb24gb3ZlcnJpZGVzIGZvciB0aGUgbGF6eSBmYWxsYmFjay5cIixcbik7XG5cbmV4cG9ydCBjb25zdCBNZW1vcnlQbHVnaW5PcHRpb25zU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBkYXRhYnJpY2tzOiB6XG4gICAgICAudW5pb24oW3oubGl0ZXJhbChcImF1dG9cIiksIHouYm9vbGVhbigpLCBEYXRhYnJpY2tzTWVtb3J5T3B0aW9uc1NjaGVtYV0pXG4gICAgICAuZGVmYXVsdChcImF1dG9cIilcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgXCJEYXRhYnJpY2tzIG1hbmFnZWQgbWVtb3J5IG1vZGU6IGF1dG8gZmFsbHMgYmFjaywgdHJ1ZSByZXF1aXJlcyBhY2Nlc3MsIGFuZCBmYWxzZSBkaXNhYmxlcyBpdC5cIixcbiAgICAgICksXG4gICAgZ3JhcGhpdGk6IHpcbiAgICAgIC51bmlvbihbei5ib29sZWFuKCksIEdyYXBoaXRpTWVtb3J5T3B0aW9uc1NjaGVtYV0pXG4gICAgICAuZGVmYXVsdCh0cnVlKVxuICAgICAgLmRlc2NyaWJlKFwiTGF6eSBHcmFwaGl0aSBmYWxsYmFjayBjb25maWd1cmF0aW9uLCBlbmFibGVkIGJ5IGRlZmF1bHQuXCIpLFxuICAgIHNhdmVUdXJuczogelxuICAgICAgLnVuaW9uKFt6LmxpdGVyYWwoXCJhdXRvXCIpLCB6LmJvb2xlYW4oKV0pXG4gICAgICAuZGVmYXVsdChcImF1dG9cIilcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgXCJDb21wbGV0ZWQtdHVybiBzYXZpbmcgbW9kZTogYXV0byBhdHRhY2hlcyB3aGVuIHBvc3NpYmxlLCB0cnVlIHJlcXVpcmVzIGF0dGFjaG1lbnQsIGFuZCBmYWxzZSBkaXNhYmxlcyBpdC5cIixcbiAgICAgICksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJBcHBLaXQgbWVtb3J5IHBsdWdpbiBvcHRpb25zLlwiKTtcblxuZXhwb3J0IHR5cGUgTWVtb3J5UGx1Z2luT3B0aW9ucyA9IHouaW5wdXQ8dHlwZW9mIE1lbW9yeVBsdWdpbk9wdGlvbnNTY2hlbWE+O1xuXG4vKiogQXBwS2l0IGJhc2UgY29uZmlndXJhdGlvbiBwbHVzIHRoZSBtZW1vcnkgcGx1Z2luJ3Mgc2VyaWFsaXplZCBvcHRpb25zLiAqL1xuZXhwb3J0IHR5cGUgTWVtb3J5UGx1Z2luQ29uZmlnID0gQmFzZVBsdWdpbkNvbmZpZyAmIE1lbW9yeVBsdWdpbk9wdGlvbnM7XG5cbi8qKiBSZXNvbHZlZCBEYXRhYnJpY2tzIHN0b3JlIGlkZW50aXR5IGFuZCBhdmFpbGFiaWxpdHkgcG9saWN5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZERhdGFicmlja3NNZW1vcnlPcHRpb25zIHtcbiAgcmVhZG9ubHkgbWVtb3J5U3RvcmU6IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kZTogXCJhdXRvXCIgfCBcInJlcXVpcmVkXCI7XG59XG5cbi8qKiBGdWxseSByZXNvbHZlZCB0b3AtbGV2ZWwgbWVtb3J5IGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkTWVtb3J5UGx1Z2luQ29uZmlnIHtcbiAgcmVhZG9ubHkgZGF0YWJyaWNrczogZmFsc2UgfCBSZXNvbHZlZERhdGFicmlja3NNZW1vcnlPcHRpb25zO1xuICByZWFkb25seSBncmFwaGl0aTogZmFsc2UgfCBHcmFwaGl0aU9wdGlvbnM7XG4gIHJlYWRvbmx5IHNhdmVUdXJuczogXCJhdXRvXCIgfCBib29sZWFuO1xufVxuXG4vKiogSlNPTiBTY2hlbWEgcHVibGlzaGVkIHRocm91Z2ggdGhlIEFwcEtpdCBtZW1vcnkgcGx1Z2luIG1hbmlmZXN0LiAqL1xuZXhwb3J0IGNvbnN0IE1FTU9SWV9DT05GSUdfU0NIRU1BID0gei50b0pTT05TY2hlbWEoTWVtb3J5UGx1Z2luT3B0aW9uc1NjaGVtYSkgYXMgSlNPTlNjaGVtYTc7XG5cbi8qKiBSZXNvbHZlIHBsdWdpbiBkZWZhdWx0cyB3aXRob3V0IHBhcnNpbmcgdW5yZWxhdGVkIEFwcEtpdCBiYXNlIGZpZWxkcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTWVtb3J5UGx1Z2luQ29uZmlnKFxuICBjb25maWc6IE1lbW9yeVBsdWdpbkNvbmZpZyA9IHt9LFxuKTogUmVzb2x2ZWRNZW1vcnlQbHVnaW5Db25maWcge1xuICBjb25zdCBwYXJzZWQgPSBNZW1vcnlQbHVnaW5PcHRpb25zU2NoZW1hLnBhcnNlKHtcbiAgICBkYXRhYnJpY2tzOiBjb25maWcuZGF0YWJyaWNrcyxcbiAgICBncmFwaGl0aTogY29uZmlnLmdyYXBoaXRpLFxuICAgIHNhdmVUdXJuczogY29uZmlnLnNhdmVUdXJucyxcbiAgfSk7XG4gIGlmIChwYXJzZWQuZGF0YWJyaWNrcyA9PT0gZmFsc2UgJiYgcGFyc2VkLmdyYXBoaXRpID09PSBmYWxzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkFwcEtpdCBtZW1vcnkgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGVuYWJsZWQgYmFja2VuZFwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGRhdGFicmlja3M6XG4gICAgICBwYXJzZWQuZGF0YWJyaWNrcyA9PT0gZmFsc2VcbiAgICAgICAgPyBmYWxzZVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIG1lbW9yeVN0b3JlOlxuICAgICAgICAgICAgICB0eXBlb2YgcGFyc2VkLmRhdGFicmlja3MgPT09IFwib2JqZWN0XCIgJiYgcGFyc2VkLmRhdGFicmlja3MubWVtb3J5U3RvcmVcbiAgICAgICAgICAgICAgICA/IHJlc291cmNlSWQocGFyc2VkLmRhdGFicmlja3MubWVtb3J5U3RvcmUsIFwibWVtb3J5LXN0b3Jlc1wiKVxuICAgICAgICAgICAgICAgIDogZGVmYXVsdE1lbW9yeVN0b3JlKCksXG4gICAgICAgICAgICBtb2RlOlxuICAgICAgICAgICAgICBwYXJzZWQuZGF0YWJyaWNrcyA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgID8gXCJyZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgOiB0eXBlb2YgcGFyc2VkLmRhdGFicmlja3MgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgID8gcGFyc2VkLmRhdGFicmlja3MubW9kZVxuICAgICAgICAgICAgICAgICAgOiBcImF1dG9cIixcbiAgICAgICAgICB9LFxuICAgIGdyYXBoaXRpOlxuICAgICAgY29uZmlnLmdyYXBoaXRpID09PSBmYWxzZVxuICAgICAgICA/IGZhbHNlXG4gICAgICAgIDogY29uZmlnLmdyYXBoaXRpID09PSB1bmRlZmluZWQgfHwgY29uZmlnLmdyYXBoaXRpID09PSB0cnVlXG4gICAgICAgICAgPyB7fVxuICAgICAgICAgIDogZ3JhcGhpdGlPcHRpb25PdmVycmlkZXMoY29uZmlnLmdyYXBoaXRpKSxcbiAgICBzYXZlVHVybnM6IHBhcnNlZC5zYXZlVHVybnMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRNZW1vcnlTdG9yZSgpOiBzdHJpbmcge1xuICBjb25zdCBzbHVnID0gc3RyaW5nVXRpbHMudG9TbHVnV2l0aE9wdGlvbnMoXG4gICAgeyBtYXhMZW5ndGg6IDU2LCB0cnVuY2F0ZVN0cmF0ZWd5OiBcImhhc2hcIiB9LFxuICAgIHByb2plY3RVdGlscy5uYW1lKCksXG4gICk7XG4gIGNvbnN0IGlkID0gL15bYS16XS8udGVzdChzbHVnKSA/IHNsdWcgOiBgYXBwLSR7c2x1Z31gO1xuICByZXR1cm4gKGlkLmxlbmd0aCA8IDMgPyBgJHtpZH0tc3RvcmVgIDogaWQpLnNsaWNlKDAsIDU2KTtcbn1cblxuZnVuY3Rpb24gcmVzb3VyY2VJZCh2YWx1ZTogc3RyaW5nLCBwcmVmaXg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZShuZXcgUmVnRXhwKGBeJHtwcmVmaXh9L2ApLCBcIlwiKTtcbiAgaWYgKCF0cmltbWVkKSB0aHJvdyBuZXcgRXJyb3IoYCR7cHJlZml4fSBpZCBpcyByZXF1aXJlZGApO1xuICByZXR1cm4gdHJpbW1lZDtcbn1cbiJdfQ==
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Request-scoped Databricks managed-memory routing.
3
+ *
4
+ * @module
5
+ */
6
+ import { type WorkspaceClient } from "@databricks/appkit";
7
+ import { type RecallMemoryInput, type RecallMemoryResult, type RememberMemoryInput, type RememberMemoryResult } from "../_contracts.ts";
8
+ import type { ResolvedDatabricksMemoryOptions } from "../config.ts";
9
+ /** Databricks backend that selects the active request credential for each call. */
10
+ export declare class DatabricksMemoryRuntime {
11
+ private readonly workspaceClient;
12
+ readonly options: ResolvedDatabricksMemoryOptions;
13
+ constructor(workspaceClient: WorkspaceClient, options: ResolvedDatabricksMemoryOptions);
14
+ available(actorId: string, signal?: AbortSignal): Promise<boolean>;
15
+ remember(actorId: string, input: RememberMemoryInput, signal?: AbortSignal): Promise<RememberMemoryResult>;
16
+ recall(actorId: string, input: RecallMemoryInput, signal?: AbortSignal): Promise<RecallMemoryResult>;
17
+ private requestClient;
18
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Request-scoped Databricks managed-memory routing.
3
+ *
4
+ * @module
5
+ */
6
+ import { getExecutionContext } from "@databricks/appkit";
7
+ import { createCache, getOrSet } from "@dbx-tools/cache/cache";
8
+ import { RecallMemoryInputSchema, } from "../_contracts.js";
9
+ import { ManagedAgentMemoryClient } from "./client.js";
10
+ const ACCESS_CACHE_TTL_MS = 5 * 60_000;
11
+ const accessCache = createCache({
12
+ maxEntries: 1_000,
13
+ ttl: ACCESS_CACHE_TTL_MS,
14
+ useClone: false,
15
+ });
16
+ /** Databricks backend that selects the active request credential for each call. */
17
+ export class DatabricksMemoryRuntime {
18
+ workspaceClient;
19
+ options;
20
+ constructor(workspaceClient, options) {
21
+ this.workspaceClient = workspaceClient;
22
+ this.options = options;
23
+ }
24
+ async available(actorId, signal) {
25
+ const request = this.requestClient(actorId);
26
+ return ((await getOrSet(accessCache, request.cacheKey, () => request.client.available(signal))) ??
27
+ false);
28
+ }
29
+ async remember(actorId, input, signal) {
30
+ const entry = await this.requestClient(actorId).client.saveMemory({
31
+ actorId,
32
+ ...input,
33
+ ...(signal ? { signal } : {}),
34
+ });
35
+ return {
36
+ backend: "databricks",
37
+ memory: {
38
+ path: entry.path,
39
+ content: entry.content ?? input.content,
40
+ ...(entry.description ? { description: entry.description } : {}),
41
+ },
42
+ };
43
+ }
44
+ async recall(actorId, input, signal) {
45
+ const parsed = RecallMemoryInputSchema.parse(input);
46
+ const results = await this.requestClient(actorId).client.searchMemory({
47
+ actorId,
48
+ query: parsed.query,
49
+ limit: parsed.limit,
50
+ ...(signal ? { signal } : {}),
51
+ });
52
+ return {
53
+ backend: "databricks",
54
+ memories: results.map(({ entry, score }) => ({
55
+ path: entry.path,
56
+ content: entry.content ?? "",
57
+ ...(entry.description ? { description: entry.description } : {}),
58
+ ...(score === undefined ? {} : { score }),
59
+ })),
60
+ };
61
+ }
62
+ requestClient(actorId) {
63
+ let workspaceClient = this.workspaceClient;
64
+ let credentialId = actorId;
65
+ try {
66
+ const execution = getExecutionContext();
67
+ workspaceClient = execution.client;
68
+ credentialId = "userId" in execution ? execution.userId : execution.serviceUserId;
69
+ }
70
+ catch {
71
+ // Startup and tests have no active AppKit request context.
72
+ }
73
+ return {
74
+ client: new ManagedAgentMemoryClient(workspaceClient, this.options),
75
+ cacheKey: `${this.options.memoryStore}:${credentialId}:${actorId}`,
76
+ };
77
+ }
78
+ }
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3J1bnRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YWJyaWNrcy9fcnVudGltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUF3QixNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFL0QsT0FBTyxFQUNMLHVCQUF1QixHQUt4QixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV2RCxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDdkMsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQzlCLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLEdBQUcsRUFBRSxtQkFBbUI7SUFDeEIsUUFBUSxFQUFFLEtBQUs7Q0FDaEIsQ0FBQyxDQUFDO0FBRUgsbUZBQW1GO0FBQ25GLE1BQU0sT0FBTyx1QkFBdUI7SUFFZjtJQUNSO0lBRlgsWUFDbUIsZUFBZ0MsRUFDeEMsT0FBd0M7UUFEaEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ3hDLFlBQU8sR0FBUCxPQUFPLENBQWlDO0lBQ2hELENBQUM7SUFFSixLQUFLLENBQUMsU0FBUyxDQUFDLE9BQWUsRUFBRSxNQUFvQjtRQUNuRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLE9BQU8sQ0FDTCxDQUFDLE1BQU0sUUFBUSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDdkYsS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FD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cGVkIERhdGFicmlja3MgbWFuYWdlZC1tZW1vcnkgcm91dGluZy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZ2V0RXhlY3V0aW9uQ29udGV4dCwgdHlwZSBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBjcmVhdGVDYWNoZSwgZ2V0T3JTZXQgfSBmcm9tIFwiQGRieC10b29scy9jYWNoZS9jYWNoZVwiO1xuXG5pbXBvcnQge1xuICBSZWNhbGxNZW1vcnlJbnB1dFNjaGVtYSxcbiAgdHlwZSBSZWNhbGxNZW1vcnlJbnB1dCxcbiAgdHlwZSBSZWNhbGxNZW1vcnlSZXN1bHQsXG4gIHR5cGUgUmVtZW1iZXJNZW1vcnlJbnB1dCxcbiAgdHlwZSBSZW1lbWJlck1lbW9yeVJlc3VsdCxcbn0gZnJvbSBcIi4uL19jb250cmFjdHMudHNcIjtcbmltcG9ydCB0eXBlIHsgUmVzb2x2ZWREYXRhYnJpY2tzTWVtb3J5T3B0aW9ucyB9IGZyb20gXCIuLi9jb25maWcudHNcIjtcbmltcG9ydCB7IE1hbmFnZWRBZ2VudE1lbW9yeUNsaWVudCB9IGZyb20gXCIuL2NsaWVudC50c1wiO1xuXG5jb25zdCBBQ0NFU1NfQ0FDSEVfVFRMX01TID0gNSAqIDYwXzAwMDtcbmNvbnN0IGFjY2Vzc0NhY2hlID0gY3JlYXRlQ2FjaGUoe1xuICBtYXhFbnRyaWVzOiAxXzAwMCxcbiAgdHRsOiBBQ0NFU1NfQ0FDSEVfVFRMX01TLFxuICB1c2VDbG9uZTogZmFsc2UsXG59KTtcblxuLyoqIERhdGFicmlja3MgYmFja2VuZCB0aGF0IHNlbGVjdHMgdGhlIGFjdGl2ZSByZXF1ZXN0IGNyZWRlbnRpYWwgZm9yIGVhY2ggY2FsbC4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYnJpY2tzTWVtb3J5UnVudGltZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd29ya3NwYWNlQ2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gICAgcmVhZG9ubHkgb3B0aW9uczogUmVzb2x2ZWREYXRhYnJpY2tzTWVtb3J5T3B0aW9ucyxcbiAgKSB7fVxuXG4gIGFzeW5jIGF2YWlsYWJsZShhY3RvcklkOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdENsaWVudChhY3RvcklkKTtcbiAgICByZXR1cm4gKFxuICAgICAgKGF3YWl0IGdldE9yU2V0KGFjY2Vzc0NhY2hlLCByZXF1ZXN0LmNhY2hlS2V5LCAoKSA9PiByZXF1ZXN0LmNsaWVudC5hdmFpbGFibGUoc2lnbmFsKSkpID8/XG4gICAgICBmYWxzZVxuICAgICk7XG4gIH1cblxuICBhc3luYyByZW1lbWJlcihcbiAgICBhY3RvcklkOiBzdHJpbmcsXG4gICAgaW5wdXQ6IFJlbWVtYmVyTWVtb3J5SW5wdXQsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8UmVtZW1iZXJNZW1vcnlSZXN1bHQ+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMucmVxdWVzdENsaWVudChhY3RvcklkKS5jbGllbnQuc2F2ZU1lbW9yeSh7XG4gICAgICBhY3RvcklkLFxuICAgICAgLi4uaW5wdXQsXG4gICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgYmFja2VuZDogXCJkYXRhYnJpY2tzXCIsXG4gICAgICBtZW1vcnk6IHtcbiAgICAgICAgcGF0aDogZW50cnkucGF0aCxcbiAgICAgICAgY29udGVudDogZW50cnkuY29udGVudCA/PyBpbnB1dC5jb250ZW50LFxuICAgICAgICAuLi4oZW50cnkuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBlbnRyeS5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcmVjYWxsKFxuICAgIGFjdG9ySWQ6IHN0cmluZyxcbiAgICBpbnB1dDogUmVjYWxsTWVtb3J5SW5wdXQsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8UmVjYWxsTWVtb3J5UmVzdWx0PiB7XG4gICAgY29uc3QgcGFyc2VkID0gUmVjYWxsTWVtb3J5SW5wdXRTY2hlbWEucGFyc2UoaW5wdXQpO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnJlcXVlc3RDbGllbnQoYWN0b3JJZCkuY2xpZW50LnNlYXJjaE1lbW9yeSh7XG4gICAgICBhY3RvcklkLFxuICAgICAgcXVlcnk6IHBhcnNlZC5xdWVyeSxcbiAgICAgIGxpbWl0OiBwYXJzZWQubGltaXQsXG4gICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgYmFja2VuZDogXCJkYXRhYnJpY2tzXCIsXG4gICAgICBtZW1vcmllczogcmVzdWx0cy5tYXAoKHsgZW50cnksIHNjb3JlIH0pID0+ICh7XG4gICAgICAgIHBhdGg6IGVudHJ5LnBhdGgsXG4gICAgICAgIGNvbnRlbnQ6IGVudHJ5LmNvbnRlbnQgPz8gXCJcIixcbiAgICAgICAgLi4uKGVudHJ5LmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogZW50cnkuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgICAgLi4uKHNjb3JlID09PSB1bmRlZmluZWQgPyB7fSA6IHsgc2NvcmUgfSksXG4gICAgICB9KSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWVzdENsaWVudChhY3RvcklkOiBzdHJpbmcpOiB7XG4gICAgY2xpZW50OiBNYW5hZ2VkQWdlbnRNZW1vcnlDbGllbnQ7XG4gICAgY2FjaGVLZXk6IHN0cmluZztcbiAgfSB7XG4gICAgbGV0IHdvcmtzcGFjZUNsaWVudCA9IHRoaXMud29ya3NwYWNlQ2xpZW50O1xuICAgIGxldCBjcmVkZW50aWFsSWQgPSBhY3RvcklkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGVjdXRpb24gPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgICB3b3Jrc3BhY2VDbGllbnQgPSBleGVjdXRpb24uY2xpZW50O1xuICAgICAgY3JlZGVudGlhbElkID0gXCJ1c2VySWRcIiBpbiBleGVjdXRpb24gPyBleGVjdXRpb24udXNlcklkIDogZXhlY3V0aW9uLnNlcnZpY2VVc2VySWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTdGFydHVwIGFuZCB0ZXN0cyBoYXZlIG5vIGFjdGl2ZSBBcHBLaXQgcmVxdWVzdCBjb250ZXh0LlxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50OiBuZXcgTWFuYWdlZEFnZW50TWVtb3J5Q2xpZW50KHdvcmtzcGFjZUNsaWVudCwgdGhpcy5vcHRpb25zKSxcbiAgICAgIGNhY2hlS2V5OiBgJHt0aGlzLm9wdGlvbnMubWVtb3J5U3RvcmV9OiR7Y3JlZGVudGlhbElkfToke2FjdG9ySWR9YCxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Databricks Agent Memory REST client.
3
+ *
4
+ * @module
5
+ */
6
+ import type { WorkspaceClient } from "@databricks/appkit";
7
+ import { z } from "zod";
8
+ import type { ResolvedDatabricksMemoryOptions } from "../config.ts";
9
+ export declare const ManagedMemoryEntrySchema: z.ZodObject<{
10
+ name: z.ZodOptional<z.ZodString>;
11
+ actor_id: z.ZodString;
12
+ session_id: z.ZodOptional<z.ZodString>;
13
+ path: z.ZodString;
14
+ content: z.ZodOptional<z.ZodString>;
15
+ description: z.ZodOptional<z.ZodString>;
16
+ source_type: z.ZodOptional<z.ZodString>;
17
+ create_time: z.ZodOptional<z.ZodString>;
18
+ update_time: z.ZodOptional<z.ZodString>;
19
+ }, z.core.$loose>;
20
+ export type ManagedMemoryEntry = z.infer<typeof ManagedMemoryEntrySchema>;
21
+ /** One managed-memory search result with its optional backend score. */
22
+ export interface ManagedMemorySearchResult {
23
+ readonly entry: ManagedMemoryEntry;
24
+ readonly score?: number;
25
+ }
26
+ /** Thin REST client for actor-scoped Databricks Agent Memory operations. */
27
+ export declare class ManagedAgentMemoryClient {
28
+ private readonly client;
29
+ readonly memoryStore: string;
30
+ constructor(client: WorkspaceClient, options: ResolvedDatabricksMemoryOptions);
31
+ available(signal?: AbortSignal): Promise<boolean>;
32
+ searchMemory(input: {
33
+ actorId: string;
34
+ query: string;
35
+ limit: number;
36
+ signal?: AbortSignal;
37
+ }): Promise<ManagedMemorySearchResult[]>;
38
+ saveMemory(input: {
39
+ actorId: string;
40
+ path: string;
41
+ content: string;
42
+ description?: string;
43
+ signal?: AbortSignal;
44
+ }): Promise<ManagedMemoryEntry>;
45
+ private createMemory;
46
+ private listMemoryEntries;
47
+ private updateMemory;
48
+ }
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Databricks Agent Memory REST client.
3
+ *
4
+ * @module
5
+ */
6
+ import { databricks } from "@dbx-tools/appkit";
7
+ import { errorUtils } from "@dbx-tools/shared-core";
8
+ import { z } from "zod";
9
+ export const ManagedMemoryEntrySchema = z
10
+ .object({
11
+ name: z.string().optional().describe("Managed memory entry resource name."),
12
+ actor_id: z.string().describe("Trusted application actor identifier."),
13
+ session_id: z.string().optional().describe("Associated session identifier."),
14
+ path: z.string().describe("Absolute memory path."),
15
+ content: z.string().optional().describe("Memory content."),
16
+ description: z.string().optional().describe("Memory retrieval description."),
17
+ source_type: z.string().optional().describe("Entry writer type."),
18
+ create_time: z.string().optional().describe("Entry creation timestamp."),
19
+ update_time: z.string().optional().describe("Entry update timestamp."),
20
+ })
21
+ .loose()
22
+ .describe("Databricks managed memory entry.");
23
+ const SearchMemoryResponseSchema = z
24
+ .object({
25
+ managed_memory_entries: z
26
+ .array(ManagedMemoryEntrySchema)
27
+ .optional()
28
+ .describe("Compatibility list of matching entries."),
29
+ results: z
30
+ .array(z
31
+ .object({
32
+ managed_memory_entry: ManagedMemoryEntrySchema.describe("Matching memory entry."),
33
+ score: z.number().optional().describe("BM25 relevance score."),
34
+ })
35
+ .loose())
36
+ .optional()
37
+ .describe("Ranked memory search results."),
38
+ })
39
+ .loose()
40
+ .describe("Databricks managed memory search response.");
41
+ const ListMemoryResponseSchema = z
42
+ .object({
43
+ managed_memory_entries: z
44
+ .array(ManagedMemoryEntrySchema)
45
+ .optional()
46
+ .describe("Managed memory entries in this page."),
47
+ next_page_token: z.string().optional().describe("Next page token."),
48
+ })
49
+ .loose()
50
+ .describe("Page of Databricks managed memory entries.");
51
+ /** Thin REST client for actor-scoped Databricks Agent Memory operations. */
52
+ export class ManagedAgentMemoryClient {
53
+ client;
54
+ memoryStore;
55
+ constructor(client, options) {
56
+ this.client = client;
57
+ this.memoryStore = options.memoryStore;
58
+ }
59
+ async available(signal) {
60
+ try {
61
+ await this.client.apiClient.request({
62
+ path: `/api/2.0/agents/memory-stores/${encodeURIComponent(this.memoryStore)}`,
63
+ method: "GET",
64
+ headers: new Headers({ accept: "application/json" }),
65
+ raw: false,
66
+ }, signal ? databricks.toContext(signal) : undefined);
67
+ return true;
68
+ }
69
+ catch (error) {
70
+ if (errorUtils.errorContext(error).hasStatusCode(403, 404))
71
+ return false;
72
+ throw error;
73
+ }
74
+ }
75
+ async searchMemory(input) {
76
+ const response = SearchMemoryResponseSchema.parse(await this.client.apiClient.request({
77
+ path: `/api/2.0/agents/memory-stores/${encodeURIComponent(this.memoryStore)}/entries:search`,
78
+ method: "POST",
79
+ headers: new Headers({
80
+ accept: "application/json",
81
+ "content-type": "application/json",
82
+ }),
83
+ raw: false,
84
+ payload: {
85
+ actor_id: input.actorId,
86
+ query: input.query,
87
+ page_size: input.limit,
88
+ },
89
+ }, input.signal ? databricks.toContext(input.signal) : undefined));
90
+ if (response.results) {
91
+ return response.results.map((result) => ({
92
+ entry: result.managed_memory_entry,
93
+ ...(result.score === undefined ? {} : { score: result.score }),
94
+ }));
95
+ }
96
+ return (response.managed_memory_entries ?? []).map((entry) => ({ entry }));
97
+ }
98
+ async saveMemory(input) {
99
+ const existing = (await this.listMemoryEntries(input))[0];
100
+ if (existing?.name) {
101
+ return this.updateMemory(existing, input);
102
+ }
103
+ try {
104
+ return await this.createMemory(input);
105
+ }
106
+ catch (error) {
107
+ if (!errorUtils.errorContext(error).hasStatusCode(409))
108
+ throw error;
109
+ const raced = (await this.listMemoryEntries(input))[0];
110
+ if (!raced?.name)
111
+ throw error;
112
+ return this.updateMemory(raced, input);
113
+ }
114
+ }
115
+ async createMemory(input) {
116
+ return ManagedMemoryEntrySchema.parse(await this.client.apiClient.request({
117
+ path: `/api/2.0/agents/memory-stores/${encodeURIComponent(this.memoryStore)}/entries`,
118
+ method: "POST",
119
+ headers: new Headers({
120
+ accept: "application/json",
121
+ "content-type": "application/json",
122
+ }),
123
+ raw: false,
124
+ payload: {
125
+ actor_id: input.actorId,
126
+ path: input.path,
127
+ content: input.content,
128
+ ...(input.description ? { description: input.description } : {}),
129
+ source_type: "MANAGED_MEMORY_ENTRY_SOURCE_TYPE_AGENT",
130
+ },
131
+ }, input.signal ? databricks.toContext(input.signal) : undefined));
132
+ }
133
+ async listMemoryEntries(input) {
134
+ const response = ListMemoryResponseSchema.parse(await this.client.apiClient.request({
135
+ path: `/api/2.0/agents/memory-stores/${encodeURIComponent(this.memoryStore)}/entries`,
136
+ method: "GET",
137
+ headers: new Headers({ accept: "application/json" }),
138
+ query: {
139
+ actor_id: input.actorId,
140
+ path: input.path,
141
+ page_size: 100,
142
+ },
143
+ raw: false,
144
+ }, input.signal ? databricks.toContext(input.signal) : undefined));
145
+ return (response.managed_memory_entries ?? []).filter((entry) => entry.path === input.path);
146
+ }
147
+ async updateMemory(current, input) {
148
+ const headers = new Headers({
149
+ accept: "application/json",
150
+ "content-type": "application/json",
151
+ });
152
+ await this.client.config.authenticate(headers);
153
+ const response = await fetch(new URL(`/api/2.0/agents/${current.name
154
+ .split("/")
155
+ .map((part) => encodeURIComponent(part))
156
+ .join("/")}?update_mask=content,description`, (await this.client.config.getHost()).toString()), {
157
+ method: "PATCH",
158
+ headers,
159
+ body: JSON.stringify({
160
+ actor_id: input.actorId,
161
+ path: input.path,
162
+ content: input.content,
163
+ ...(input.description ? { description: input.description } : {}),
164
+ }),
165
+ ...(input.signal ? { signal: input.signal } : {}),
166
+ });
167
+ const body = await response.json().catch(() => undefined);
168
+ if (!response.ok) {
169
+ throw Object.assign(new Error(`Databricks Agent Memory request failed (${response.status})`), { statusCode: response.status, response: body });
170
+ }
171
+ return ManagedMemoryEntrySchema.parse(body);
172
+ }
173
+ }
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RhdGFicmlja3MvY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFHSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFJeEIsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQztLQUN0QyxNQUFNLENBQUM7SUFDTixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxxQ0FBcUMsQ0FBQztJQUMzRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyx1Q0FBdUMsQ0FBQztJQUN0RSxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxnQ0FBZ0MsQ0FBQztJQUM1RSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQztJQUNsRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztJQUMxRCxXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQywrQkFBK0IsQ0FBQztJQUM1RSxXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQztJQUNqRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIs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TUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakIsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUNqQixJQUFJLEtBQUssQ0FBQywyQ0FBMkMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ3hFLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUNoRCxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sd0JBQXdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGF0YWJyaWNrcyBBZ2VudCBNZW1vcnkgUkVTVCBjbGllbnQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZGF0YWJyaWNrcyB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkRGF0YWJyaWNrc01lbW9yeU9wdGlvbnMgfSBmcm9tIFwiLi4vY29uZmlnLnRzXCI7XG5cbmV4cG9ydCBjb25zdCBNYW5hZ2VkTWVtb3J5RW50cnlTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIG5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIk1hbmFnZWQgbWVtb3J5IGVudHJ5IHJlc291cmNlIG5hbWUuXCIpLFxuICAgIGFjdG9yX2lkOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiVHJ1c3RlZCBhcHBsaWNhdGlvbiBhY3RvciBpZGVudGlmaWVyLlwiKSxcbiAgICBzZXNzaW9uX2lkOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJBc3NvY2lhdGVkIHNlc3Npb24gaWRlbnRpZmllci5cIiksXG4gICAgcGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIkFic29sdXRlIG1lbW9yeSBwYXRoLlwiKSxcbiAgICBjb250ZW50OiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJNZW1vcnkgY29udGVudC5cIiksXG4gICAgZGVzY3JpcHRpb246IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIk1lbW9yeSByZXRyaWV2YWwgZGVzY3JpcHRpb24uXCIpLFxuICAgIHNvdXJjZV90eXBlOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJFbnRyeSB3cml0ZXIgdHlwZS5cIiksXG4gICAgY3JlYXRlX3RpbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkVudHJ5IGNyZWF0aW9uIHRpbWVzdGFtcC5cIiksXG4gICAgdXBkYXRlX3RpbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkVudHJ5IHVwZGF0ZSB0aW1lc3RhbXAuXCIpLFxuICB9KVxuICAubG9vc2UoKVxuICAuZGVzY3JpYmUoXCJEYXRhYnJpY2tzIG1hbmFnZWQgbWVtb3J5IGVudHJ5LlwiKTtcblxuZXhwb3J0IHR5cGUgTWFuYWdlZE1lbW9yeUVudHJ5ID0gei5pbmZlcjx0eXBlb2YgTWFuYWdlZE1lbW9yeUVudHJ5U2NoZW1hPjtcblxuY29uc3QgU2VhcmNoTWVtb3J5UmVzcG9uc2VTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIG1hbmFnZWRfbWVtb3J5X2VudHJpZXM6IHpcbiAgICAgIC5hcnJheShNYW5hZ2VkTWVtb3J5RW50cnlTY2hlbWEpXG4gICAgICAub3B0aW9uYWwoKVxuICAgICAgLmRlc2NyaWJlKFwiQ29tcGF0aWJpbGl0eSBsaXN0IG9mIG1hdGNoaW5nIGVudHJpZXMuXCIpLFxuICAgIHJlc3VsdHM6IHpcbiAgICAgIC5hcnJheShcbiAgICAgICAgelxuICAgICAgICAgIC5vYmplY3Qoe1xuICAgICAgICAgICAgbWFuYWdlZF9tZW1vcnlfZW50cnk6IE1hbmFnZWRNZW1vcnlFbnRyeVNjaGVtYS5kZXNjcmliZShcIk1hdGNoaW5nIG1lbW9yeSBlbnRyeS5cIiksXG4gICAgICAgICAgICBzY29yZTogei5udW1iZXIoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiQk0yNSByZWxldmFuY2Ugc2NvcmUuXCIpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmxvb3NlKCksXG4gICAgICApXG4gICAgICAub3B0aW9uYWwoKVxuICAgICAgLmRlc2NyaWJlKFwiUmFua2VkIG1lbW9yeSBzZWFyY2ggcmVzdWx0cy5cIiksXG4gIH0pXG4gIC5sb29zZSgpXG4gIC5kZXNjcmliZShcIkRhdGFicmlja3MgbWFuYWdlZCBtZW1vcnkgc2VhcmNoIHJlc3BvbnNlLlwiKTtcblxuY29uc3QgTGlzdE1lbW9yeVJlc3BvbnNlU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBtYW5hZ2VkX21lbW9yeV9lbnRyaWVzOiB6XG4gICAgICAuYXJyYXkoTWFuYWdlZE1lbW9yeUVudHJ5U2NoZW1hKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIk1hbmFnZWQgbWVtb3J5IGVudHJpZXMgaW4gdGhpcyBwYWdlLlwiKSxcbiAgICBuZXh0X3BhZ2VfdG9rZW46IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIk5leHQgcGFnZSB0b2tlbi5cIiksXG4gIH0pXG4gIC5sb29zZSgpXG4gIC5kZXNjcmliZShcIlBhZ2Ugb2YgRGF0YWJyaWNrcyBtYW5hZ2VkIG1lbW9yeSBlbnRyaWVzLlwiKTtcblxuLyoqIE9uZSBtYW5hZ2VkLW1lbW9yeSBzZWFyY2ggcmVzdWx0IHdpdGggaXRzIG9wdGlvbmFsIGJhY2tlbmQgc2NvcmUuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hbmFnZWRNZW1vcnlTZWFyY2hSZXN1bHQge1xuICByZWFkb25seSBlbnRyeTogTWFuYWdlZE1lbW9yeUVudHJ5O1xuICByZWFkb25seSBzY29yZT86IG51bWJlcjtcbn1cblxuLyoqIFRoaW4gUkVTVCBjbGllbnQgZm9yIGFjdG9yLXNjb3BlZCBEYXRhYnJpY2tzIEFnZW50IE1lbW9yeSBvcGVyYXRpb25zLiAqL1xuZXhwb3J0IGNsYXNzIE1hbmFnZWRBZ2VudE1lbW9yeUNsaWVudCB7XG4gIHJlYWRvbmx5IG1lbW9yeVN0b3JlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgICBvcHRpb25zOiBSZXNvbHZlZERhdGFicmlja3NNZW1vcnlPcHRpb25zLFxuICApIHtcbiAgICB0aGlzLm1lbW9yeVN0b3JlID0gb3B0aW9ucy5tZW1vcnlTdG9yZTtcbiAgfVxuXG4gIGFzeW5jIGF2YWlsYWJsZShzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNsaWVudC5hcGlDbGllbnQucmVxdWVzdChcbiAgICAgICAge1xuICAgICAgICAgIHBhdGg6IGAvYXBpLzIuMC9hZ2VudHMvbWVtb3J5LXN0b3Jlcy8ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLm1lbW9yeVN0b3JlKX1gLFxuICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7IGFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSksXG4gICAgICAgICAgcmF3OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgc2lnbmFsID8gZGF0YWJyaWNrcy50b0NvbnRleHQoc2lnbmFsKSA6IHVuZGVmaW5lZCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yVXRpbHMuZXJyb3JDb250ZXh0KGVycm9yKS5oYXNTdGF0dXNDb2RlKDQwMywgNDA0KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2VhcmNoTWVtb3J5KGlucHV0OiB7XG4gICAgYWN0b3JJZDogc3RyaW5nO1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgbGltaXQ6IG51bWJlcjtcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8TWFuYWdlZE1lbW9yeVNlYXJjaFJlc3VsdFtdPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBTZWFyY2hNZW1vcnlSZXNwb25zZVNjaGVtYS5wYXJzZShcbiAgICAgIGF3YWl0IHRoaXMuY2xpZW50LmFwaUNsaWVudC5yZXF1ZXN0KFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aDogYC9hcGkvMi4wL2FnZW50cy9tZW1vcnktc3RvcmVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubWVtb3J5U3RvcmUpfS9lbnRyaWVzOnNlYXJjaGAsXG4gICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgICBhY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcmF3OiBmYWxzZSxcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBhY3Rvcl9pZDogaW5wdXQuYWN0b3JJZCxcbiAgICAgICAgICAgIHF1ZXJ5OiBpbnB1dC5xdWVyeSxcbiAgICAgICAgICAgIHBhZ2Vfc2l6ZTogaW5wdXQubGltaXQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgaW5wdXQuc2lnbmFsID8gZGF0YWJyaWNrcy50b0NvbnRleHQoaW5wdXQuc2lnbmFsKSA6IHVuZGVmaW5lZCxcbiAgICAgICksXG4gICAgKTtcbiAgICBpZiAocmVzcG9uc2UucmVzdWx0cykge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdHMubWFwKChyZXN1bHQpID0+ICh7XG4gICAgICAgIGVudHJ5OiByZXN1bHQubWFuYWdlZF9tZW1vcnlfZW50cnksXG4gICAgICAgIC4uLihyZXN1bHQuc2NvcmUgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBzY29yZTogcmVzdWx0LnNjb3JlIH0pLFxuICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gKHJlc3BvbnNlLm1hbmFnZWRfbWVtb3J5X2VudHJpZXMgPz8gW10pLm1hcCgoZW50cnkpID0+ICh7IGVudHJ5IH0pKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVNZW1vcnkoaW5wdXQ6IHtcbiAgICBhY3RvcklkOiBzdHJpbmc7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8TWFuYWdlZE1lbW9yeUVudHJ5PiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSAoYXdhaXQgdGhpcy5saXN0TWVtb3J5RW50cmllcyhpbnB1dCkpWzBdO1xuICAgIGlmIChleGlzdGluZz8ubmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlTWVtb3J5KGV4aXN0aW5nIGFzIE1hbmFnZWRNZW1vcnlFbnRyeSAmIHsgbmFtZTogc3RyaW5nIH0sIGlucHV0KTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZU1lbW9yeShpbnB1dCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghZXJyb3JVdGlscy5lcnJvckNvbnRleHQoZXJyb3IpLmhhc1N0YXR1c0NvZGUoNDA5KSkgdGhyb3cgZXJyb3I7XG4gICAgICBjb25zdCByYWNlZCA9IChhd2FpdCB0aGlzLmxpc3RNZW1vcnlFbnRyaWVzKGlucHV0KSlbMF07XG4gICAgICBpZiAoIXJhY2VkPy5uYW1lKSB0aHJvdyBlcnJvcjtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU1lbW9yeShyYWNlZCBhcyBNYW5hZ2VkTWVtb3J5RW50cnkgJiB7IG5hbWU6IHN0cmluZyB9LCBpbnB1dCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVNZW1vcnkoaW5wdXQ6IHtcbiAgICBhY3RvcklkOiBzdHJpbmc7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8TWFuYWdlZE1lbW9yeUVudHJ5PiB7XG4gICAgcmV0dXJuIE1hbmFnZWRNZW1vcnlFbnRyeVNjaGVtYS5wYXJzZShcbiAgICAgIGF3YWl0IHRoaXMuY2xpZW50LmFwaUNsaWVudC5yZXF1ZXN0KFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aDogYC9hcGkvMi4wL2FnZW50cy9tZW1vcnktc3RvcmVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubWVtb3J5U3RvcmUpfS9lbnRyaWVzYCxcbiAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgICAgIGFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICByYXc6IGZhbHNlLFxuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGFjdG9yX2lkOiBpbnB1dC5hY3RvcklkLFxuICAgICAgICAgICAgcGF0aDogaW5wdXQucGF0aCxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGlucHV0LmNvbnRlbnQsXG4gICAgICAgICAgICAuLi4oaW5wdXQuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBpbnB1dC5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgICAgICAgc291cmNlX3R5cGU6IFwiTUFOQUdFRF9NRU1PUllfRU5UUllfU09VUkNFX1RZUEVfQUdFTlRcIixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBpbnB1dC5zaWduYWwgPyBkYXRhYnJpY2tzLnRvQ29udGV4dChpbnB1dC5zaWduYWwpIDogdW5kZWZpbmVkLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsaXN0TWVtb3J5RW50cmllcyhpbnB1dDoge1xuICAgIGFjdG9ySWQ6IHN0cmluZztcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPE1hbmFnZWRNZW1vcnlFbnRyeVtdPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBMaXN0TWVtb3J5UmVzcG9uc2VTY2hlbWEucGFyc2UoXG4gICAgICBhd2FpdCB0aGlzLmNsaWVudC5hcGlDbGllbnQucmVxdWVzdChcbiAgICAgICAge1xuICAgICAgICAgIHBhdGg6IGAvYXBpLzIuMC9hZ2VudHMvbWVtb3J5LXN0b3Jlcy8ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLm1lbW9yeVN0b3JlKX0vZW50cmllc2AsXG4gICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHsgYWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIiB9KSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgYWN0b3JfaWQ6IGlucHV0LmFjdG9ySWQsXG4gICAgICAgICAgICBwYXRoOiBpbnB1dC5wYXRoLFxuICAgICAgICAgICAgcGFnZV9zaXplOiAxMDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByYXc6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBpbnB1dC5zaWduYWwgPyBkYXRhYnJpY2tzLnRvQ29udGV4dChpbnB1dC5zaWduYWwpIDogdW5kZWZpbmVkLFxuICAgICAgKSxcbiAgICApO1xuICAgIHJldHVybiAocmVzcG9uc2UubWFuYWdlZF9tZW1vcnlfZW50cmllcyA/PyBbXSkuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkucGF0aCA9PT0gaW5wdXQucGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZU1lbW9yeShcbiAgICBjdXJyZW50OiBNYW5hZ2VkTWVtb3J5RW50cnkgJiB7IG5hbWU6IHN0cmluZyB9LFxuICAgIGlucHV0OiB7XG4gICAgICBhY3RvcklkOiBzdHJpbmc7XG4gICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICBjb250ZW50OiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAgIH0sXG4gICk6IFByb21pc2U8TWFuYWdlZE1lbW9yeUVudHJ5PiB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHtcbiAgICAgIGFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5jb25maWcuYXV0aGVudGljYXRlKGhlYWRlcnMpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICBuZXcgVVJMKFxuICAgICAgICBgL2FwaS8yLjAvYWdlbnRzLyR7Y3VycmVudC5uYW1lXG4gICAgICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgICAgIC5tYXAoKHBhcnQpID0+IGVuY29kZVVSSUNvbXBvbmVudChwYXJ0KSlcbiAgICAgICAgICAuam9pbihcIi9cIil9P3VwZGF0ZV9tYXNrPWNvbnRlbnQsZGVzY3JpcHRpb25gLFxuICAgICAgICAoYXdhaXQgdGhpcy5jbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKSxcbiAgICAgICksXG4gICAgICB7XG4gICAgICAgIG1ldGhvZDogXCJQQVRDSFwiLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgYWN0b3JfaWQ6IGlucHV0LmFjdG9ySWQsXG4gICAgICAgICAgcGF0aDogaW5wdXQucGF0aCxcbiAgICAgICAgICBjb250ZW50OiBpbnB1dC5jb250ZW50LFxuICAgICAgICAgIC4uLihpbnB1dC5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IGlucHV0LmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIH0pLFxuICAgICAgICAuLi4oaW5wdXQuc2lnbmFsID8geyBzaWduYWw6IGlucHV0LnNpZ25hbCB9IDoge30pLFxuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKFxuICAgICAgICBuZXcgRXJyb3IoYERhdGFicmlja3MgQWdlbnQgTWVtb3J5IHJlcXVlc3QgZmFpbGVkICgke3Jlc3BvbnNlLnN0YXR1c30pYCksXG4gICAgICAgIHsgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZTogYm9keSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIE1hbmFnZWRNZW1vcnlFbnRyeVNjaGVtYS5wYXJzZShib2R5KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ export * as client from "./client.ts";
2
+ export { ManagedMemoryEntrySchema, ManagedAgentMemoryClient } from "./client.ts";
3
+ export type { ManagedMemoryEntry, ManagedMemorySearchResult } from "./client.ts";
@@ -0,0 +1,6 @@
1
+ // GENERATED by projen watch - DO NOT EDIT.
2
+ // Regenerated from the exporting modules in ./src.
3
+ // Hand edits are overwritten on the next watch; this file is read-only.
4
+ export * as client from "./client.js";
5
+ export { ManagedMemoryEntrySchema, ManagedAgentMemoryClient } from "./client.js";
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YWJyaWNrcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgKiBhcyBjbGllbnQgZnJvbSBcIi4vY2xpZW50LnRzXCI7XG5leHBvcnQgeyBNYW5hZ2VkTWVtb3J5RW50cnlTY2hlbWEsIE1hbmFnZWRBZ2VudE1lbW9yeUNsaWVudCB9IGZyb20gXCIuL2NsaWVudC50c1wiO1xuZXhwb3J0IHR5cGUgeyBNYW5hZ2VkTWVtb3J5RW50cnksIE1hbmFnZWRNZW1vcnlTZWFyY2hSZXN1bHQgfSBmcm9tIFwiLi9jbGllbnQudHNcIjtcbiJdfQ==