agent-recall-core 3.3.28 → 3.4.0

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 (72) hide show
  1. package/README.md +1014 -206
  2. package/dist/digest/store.d.ts.map +1 -1
  3. package/dist/digest/store.js +9 -2
  4. package/dist/digest/store.js.map +1 -1
  5. package/dist/index.d.ts +11 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +14 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/palace/awareness.d.ts +3 -2
  10. package/dist/palace/awareness.d.ts.map +1 -1
  11. package/dist/palace/awareness.js +16 -10
  12. package/dist/palace/awareness.js.map +1 -1
  13. package/dist/palace/insights-index.d.ts.map +1 -1
  14. package/dist/palace/insights-index.js +28 -0
  15. package/dist/palace/insights-index.js.map +1 -1
  16. package/dist/palace/rooms.d.ts +1 -1
  17. package/dist/palace/rooms.d.ts.map +1 -1
  18. package/dist/palace/rooms.js +28 -3
  19. package/dist/palace/rooms.js.map +1 -1
  20. package/dist/supabase/client.d.ts +9 -0
  21. package/dist/supabase/client.d.ts.map +1 -0
  22. package/dist/supabase/client.js +22 -0
  23. package/dist/supabase/client.js.map +1 -0
  24. package/dist/supabase/config.d.ts +10 -0
  25. package/dist/supabase/config.d.ts.map +1 -0
  26. package/dist/supabase/config.js +45 -0
  27. package/dist/supabase/config.js.map +1 -0
  28. package/dist/supabase/embedding.d.ts +25 -0
  29. package/dist/supabase/embedding.d.ts.map +1 -0
  30. package/dist/supabase/embedding.js +76 -0
  31. package/dist/supabase/embedding.js.map +1 -0
  32. package/dist/supabase/recall-backend.d.ts +21 -0
  33. package/dist/supabase/recall-backend.d.ts.map +1 -0
  34. package/dist/supabase/recall-backend.js +128 -0
  35. package/dist/supabase/recall-backend.js.map +1 -0
  36. package/dist/supabase/sync.d.ts +21 -0
  37. package/dist/supabase/sync.d.ts.map +1 -0
  38. package/dist/supabase/sync.js +158 -0
  39. package/dist/supabase/sync.js.map +1 -0
  40. package/dist/tools-logic/bootstrap.d.ts +63 -0
  41. package/dist/tools-logic/bootstrap.d.ts.map +1 -0
  42. package/dist/tools-logic/bootstrap.js +650 -0
  43. package/dist/tools-logic/bootstrap.js.map +1 -0
  44. package/dist/tools-logic/journal-write.d.ts.map +1 -1
  45. package/dist/tools-logic/journal-write.js +3 -0
  46. package/dist/tools-logic/journal-write.js.map +1 -1
  47. package/dist/tools-logic/palace-search.d.ts.map +1 -1
  48. package/dist/tools-logic/palace-search.js +3 -0
  49. package/dist/tools-logic/palace-search.js.map +1 -1
  50. package/dist/tools-logic/palace-write.d.ts.map +1 -1
  51. package/dist/tools-logic/palace-write.js +4 -0
  52. package/dist/tools-logic/palace-write.js.map +1 -1
  53. package/dist/tools-logic/recall-backend.d.ts +29 -0
  54. package/dist/tools-logic/recall-backend.d.ts.map +1 -0
  55. package/dist/tools-logic/recall-backend.js +58 -0
  56. package/dist/tools-logic/recall-backend.js.map +1 -0
  57. package/dist/tools-logic/session-end.d.ts.map +1 -1
  58. package/dist/tools-logic/session-end.js +4 -1
  59. package/dist/tools-logic/session-end.js.map +1 -1
  60. package/dist/tools-logic/session-start.d.ts +1 -0
  61. package/dist/tools-logic/session-start.d.ts.map +1 -1
  62. package/dist/tools-logic/session-start.js +57 -3
  63. package/dist/tools-logic/session-start.js.map +1 -1
  64. package/dist/tools-logic/smart-recall.d.ts +10 -0
  65. package/dist/tools-logic/smart-recall.d.ts.map +1 -1
  66. package/dist/tools-logic/smart-recall.js +56 -32
  67. package/dist/tools-logic/smart-recall.js.map +1 -1
  68. package/dist/types.d.ts +1 -1
  69. package/dist/types.d.ts.map +1 -1
  70. package/dist/types.js +1 -1
  71. package/dist/types.js.map +1 -1
  72. package/package.json +6 -4
@@ -0,0 +1,22 @@
1
+ // packages/core/src/supabase/client.ts
2
+ import { createClient } from "@supabase/supabase-js";
3
+ import { readSupabaseConfig } from "./config.js";
4
+ let _client = null;
5
+ /**
6
+ * Get a Supabase client. Returns null if not configured.
7
+ * Singleton — created once, reused for the process lifetime.
8
+ */
9
+ export function getSupabaseClient() {
10
+ if (_client)
11
+ return _client;
12
+ const config = readSupabaseConfig();
13
+ if (!config)
14
+ return null;
15
+ _client = createClient(config.supabase_url, config.supabase_anon_key);
16
+ return _client;
17
+ }
18
+ /** Reset client (for testing). */
19
+ export function resetSupabaseClient() {
20
+ _client = null;
21
+ }
22
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/supabase/client.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,OAAO,EAAE,YAAY,EAAuB,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,IAAI,OAAO,GAA0B,IAAI,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACpC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACtE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,mBAAmB;IACjC,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface SupabaseConfig {
2
+ supabase_url: string;
3
+ supabase_anon_key: string;
4
+ embedding_provider: "openai" | "voyage";
5
+ embedding_api_key: string;
6
+ sync_enabled: boolean;
7
+ }
8
+ export declare function readSupabaseConfig(): SupabaseConfig | null;
9
+ export declare function writeSupabaseConfig(config: SupabaseConfig): void;
10
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/supabase/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACxC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;CACvB;AAMD,wBAAgB,kBAAkB,IAAI,cAAc,GAAG,IAAI,CA4B1D;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAIhE"}
@@ -0,0 +1,45 @@
1
+ // packages/core/src/supabase/config.ts
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import { getRoot } from "../types.js";
5
+ function configPath() {
6
+ return path.join(getRoot(), "config.json");
7
+ }
8
+ export function readSupabaseConfig() {
9
+ let config = {};
10
+ const p = configPath();
11
+ if (fs.existsSync(p)) {
12
+ try {
13
+ config = JSON.parse(fs.readFileSync(p, "utf-8"));
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ // Env var overrides
20
+ if (process.env.AGENT_RECALL_SUPABASE_URL)
21
+ config.supabase_url = process.env.AGENT_RECALL_SUPABASE_URL;
22
+ if (process.env.AGENT_RECALL_SUPABASE_KEY)
23
+ config.supabase_anon_key = process.env.AGENT_RECALL_SUPABASE_KEY;
24
+ if (process.env.AGENT_RECALL_EMBEDDING_PROVIDER)
25
+ config.embedding_provider = process.env.AGENT_RECALL_EMBEDDING_PROVIDER;
26
+ if (process.env.AGENT_RECALL_EMBEDDING_KEY)
27
+ config.embedding_api_key = process.env.AGENT_RECALL_EMBEDDING_KEY;
28
+ if (!config.supabase_url || !config.supabase_anon_key)
29
+ return null;
30
+ if (config.sync_enabled === false)
31
+ return null;
32
+ return {
33
+ supabase_url: config.supabase_url,
34
+ supabase_anon_key: config.supabase_anon_key,
35
+ embedding_provider: config.embedding_provider ?? "openai",
36
+ embedding_api_key: config.embedding_api_key ?? "",
37
+ sync_enabled: config.sync_enabled ?? true,
38
+ };
39
+ }
40
+ export function writeSupabaseConfig(config) {
41
+ const p = configPath();
42
+ fs.mkdirSync(path.dirname(p), { recursive: true });
43
+ fs.writeFileSync(p, JSON.stringify(config, null, 2), "utf-8");
44
+ }
45
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/supabase/config.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAUtC,SAAS,UAAU;IACjB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,IAAI,MAAM,GAA4B,EAAE,CAAC;IAEzC,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;IACvB,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB;QAAE,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IACvG,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB;QAAE,MAAM,CAAC,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IAC5G,IAAI,OAAO,CAAC,GAAG,CAAC,+BAA+B;QAAE,MAAM,CAAC,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,+BAAsD,CAAC;IAChJ,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B;QAAE,MAAM,CAAC,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;IAE9G,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,iBAAiB;QAAE,OAAO,IAAI,CAAC;IACnE,IAAI,MAAM,CAAC,YAAY,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAE/C,OAAO;QACL,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,QAAQ;QACzD,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,EAAE;QACjD,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAsB;IACxD,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;IACvB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,25 @@
1
+ export interface EmbeddingProvider {
2
+ embed(text: string): Promise<number[]>;
3
+ embedBatch(texts: string[]): Promise<number[][]>;
4
+ readonly dimensions: number;
5
+ }
6
+ export declare function zeroPad(vec: number[], target: number): number[];
7
+ export declare class OpenAIEmbedding implements EmbeddingProvider {
8
+ readonly dimensions = 1536;
9
+ readonly model = "text-embedding-3-small";
10
+ private apiKey;
11
+ constructor(apiKey: string);
12
+ embed(text: string): Promise<number[]>;
13
+ embedBatch(texts: string[]): Promise<number[][]>;
14
+ }
15
+ export declare class VoyageEmbedding implements EmbeddingProvider {
16
+ readonly dimensions = 1536;
17
+ readonly nativeDimensions = 512;
18
+ readonly model = "voyage-3-lite";
19
+ private apiKey;
20
+ constructor(apiKey: string);
21
+ embed(text: string): Promise<number[]>;
22
+ embedBatch(texts: string[]): Promise<number[][]>;
23
+ }
24
+ export declare function createEmbeddingProvider(provider: "openai" | "voyage", apiKey: string): EmbeddingProvider;
25
+ //# sourceMappingURL=embedding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/supabase/embedding.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAK/D;AAED,qBAAa,eAAgB,YAAW,iBAAiB;IACvD,QAAQ,CAAC,UAAU,QAAQ;IAC3B,QAAQ,CAAC,KAAK,4BAA4B;IAC1C,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAIpB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAWtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAUvD;AAED,qBAAa,eAAgB,YAAW,iBAAiB;IACvD,QAAQ,CAAC,UAAU,QAAQ;IAC3B,QAAQ,CAAC,gBAAgB,OAAO;IAChC,QAAQ,CAAC,KAAK,mBAAmB;IACjC,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAIpB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAWtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAUvD;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAGxG"}
@@ -0,0 +1,76 @@
1
+ // packages/core/src/supabase/embedding.ts
2
+ export function zeroPad(vec, target) {
3
+ if (vec.length >= target)
4
+ return vec;
5
+ const padded = new Array(target).fill(0);
6
+ for (let i = 0; i < vec.length; i++)
7
+ padded[i] = vec[i];
8
+ return padded;
9
+ }
10
+ export class OpenAIEmbedding {
11
+ dimensions = 1536;
12
+ model = "text-embedding-3-small";
13
+ apiKey;
14
+ constructor(apiKey) {
15
+ this.apiKey = apiKey;
16
+ }
17
+ async embed(text) {
18
+ const res = await fetch("https://api.openai.com/v1/embeddings", {
19
+ method: "POST",
20
+ headers: { "Content-Type": "application/json", Authorization: `Bearer ${this.apiKey}` },
21
+ body: JSON.stringify({ model: this.model, input: text }),
22
+ });
23
+ if (!res.ok)
24
+ throw new Error(`OpenAI embedding failed: ${res.status}`);
25
+ const data = await res.json();
26
+ return data.data[0].embedding;
27
+ }
28
+ async embedBatch(texts) {
29
+ const res = await fetch("https://api.openai.com/v1/embeddings", {
30
+ method: "POST",
31
+ headers: { "Content-Type": "application/json", Authorization: `Bearer ${this.apiKey}` },
32
+ body: JSON.stringify({ model: this.model, input: texts }),
33
+ });
34
+ if (!res.ok)
35
+ throw new Error(`OpenAI batch embedding failed: ${res.status}`);
36
+ const data = await res.json();
37
+ return data.data.map((d) => d.embedding);
38
+ }
39
+ }
40
+ export class VoyageEmbedding {
41
+ dimensions = 1536;
42
+ nativeDimensions = 512;
43
+ model = "voyage-3-lite";
44
+ apiKey;
45
+ constructor(apiKey) {
46
+ this.apiKey = apiKey;
47
+ }
48
+ async embed(text) {
49
+ const res = await fetch("https://api.voyageai.com/v1/embeddings", {
50
+ method: "POST",
51
+ headers: { "Content-Type": "application/json", Authorization: `Bearer ${this.apiKey}` },
52
+ body: JSON.stringify({ model: this.model, input: [text] }),
53
+ });
54
+ if (!res.ok)
55
+ throw new Error(`Voyage embedding failed: ${res.status}`);
56
+ const data = await res.json();
57
+ return zeroPad(data.data[0].embedding, this.dimensions);
58
+ }
59
+ async embedBatch(texts) {
60
+ const res = await fetch("https://api.voyageai.com/v1/embeddings", {
61
+ method: "POST",
62
+ headers: { "Content-Type": "application/json", Authorization: `Bearer ${this.apiKey}` },
63
+ body: JSON.stringify({ model: this.model, input: texts }),
64
+ });
65
+ if (!res.ok)
66
+ throw new Error(`Voyage batch embedding failed: ${res.status}`);
67
+ const data = await res.json();
68
+ return data.data.map((d) => zeroPad(d.embedding, this.dimensions));
69
+ }
70
+ }
71
+ export function createEmbeddingProvider(provider, apiKey) {
72
+ if (provider === "voyage")
73
+ return new VoyageEmbedding(apiKey);
74
+ return new OpenAIEmbedding(apiKey);
75
+ }
76
+ //# sourceMappingURL=embedding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/supabase/embedding.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAQ1C,MAAM,UAAU,OAAO,CAAC,GAAa,EAAE,MAAc;IACnD,IAAI,GAAG,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,GAAG,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,OAAO,eAAe;IACjB,UAAU,GAAG,IAAI,CAAC;IAClB,KAAK,GAAG,wBAAwB,CAAC;IAClC,MAAM,CAAS;IAEvB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,sCAAsC,EAAE;YAC9D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE;YACvF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;SACzD,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA8C,CAAC;QAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,sCAAsC,EAAE;YAC9D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE;YACvF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;SAC1D,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA8C,CAAC;QAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,OAAO,eAAe;IACjB,UAAU,GAAG,IAAI,CAAC;IAClB,gBAAgB,GAAG,GAAG,CAAC;IACvB,KAAK,GAAG,eAAe,CAAC;IACzB,MAAM,CAAS;IAEvB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,wCAAwC,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE;YACvF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;SAC3D,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA8C,CAAC;QAC1E,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,wCAAwC,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE;YACvF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;SAC1D,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA8C,CAAC;QAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACrE,CAAC;CACF;AAED,MAAM,UAAU,uBAAuB,CAAC,QAA6B,EAAE,MAAc;IACnF,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IAC9D,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { SupabaseConfig } from "./config.js";
2
+ interface RecallResultItem {
3
+ id: string;
4
+ source: "palace" | "journal" | "insight";
5
+ title: string;
6
+ excerpt: string;
7
+ score: number;
8
+ confidence: string;
9
+ room?: string;
10
+ date?: string;
11
+ severity?: string;
12
+ }
13
+ export declare class SupabaseRecallBackend {
14
+ private config;
15
+ private embedding;
16
+ constructor(config: SupabaseConfig);
17
+ available(): boolean;
18
+ search(query: string, project: string | undefined, limit: number): Promise<RecallResultItem[]>;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=recall-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall-backend.d.ts","sourceRoot":"","sources":["../../src/supabase/recall-backend.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAiBlD,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAA2B;gBAEhC,MAAM,EAAE,cAAc;IAOlC,SAAS,IAAI,OAAO;IAId,MAAM,CACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,gBAAgB,EAAE,CAAC;CA6G/B"}
@@ -0,0 +1,128 @@
1
+ // packages/core/src/supabase/recall-backend.ts
2
+ import { getSupabaseClient } from "./client.js";
3
+ import { createEmbeddingProvider } from "./embedding.js";
4
+ // Import the interface type — we can't import directly from recall-backend.ts
5
+ // because it would create a circular dependency (it dynamically imports us).
6
+ // Instead, we define the same shape and the getRecallBackend() factory casts.
7
+ /** RRF constant (same as local backend). */
8
+ const RRF_K = 60;
9
+ // RRF max ≈ num_lists / (k+1) = 3/61 ≈ 0.049. Calibrate thresholds accordingly.
10
+ function scoreLabel(score) {
11
+ if (score >= 0.040)
12
+ return "high"; // top of 2+ lists
13
+ if (score >= 0.025)
14
+ return "medium"; // top of ~1.5 lists
15
+ if (score >= 0.015)
16
+ return "low"; // top of 1 list
17
+ return "weak";
18
+ }
19
+ export class SupabaseRecallBackend {
20
+ config;
21
+ embedding;
22
+ constructor(config) {
23
+ this.config = config;
24
+ this.embedding = config.embedding_api_key
25
+ ? createEmbeddingProvider(config.embedding_provider, config.embedding_api_key)
26
+ : null;
27
+ }
28
+ available() {
29
+ return !!getSupabaseClient() && !!this.embedding;
30
+ }
31
+ async search(query, project, limit) {
32
+ const client = getSupabaseClient();
33
+ if (!client || !this.embedding || !project) {
34
+ // Fallback to local
35
+ const { localRecallSearch } = await import("../tools-logic/smart-recall.js");
36
+ return localRecallSearch(query, project, limit);
37
+ }
38
+ let queryEmbedding;
39
+ try {
40
+ queryEmbedding = await this.embedding.embed(query);
41
+ }
42
+ catch {
43
+ // Embedding failed — fallback to local
44
+ const { localRecallSearch } = await import("../tools-logic/smart-recall.js");
45
+ return localRecallSearch(query, project, limit);
46
+ }
47
+ // Three parallel queries
48
+ const [semanticResults, insightResults, ftsResults] = await Promise.all([
49
+ // 1. pgvector cosine similarity on ar_entries
50
+ client.rpc("ar_semantic_search", {
51
+ query_embedding: queryEmbedding,
52
+ match_project: project,
53
+ match_limit: limit * 2,
54
+ }),
55
+ // 2. pgvector on ar_insights (cross-project)
56
+ client.rpc("ar_insight_search", {
57
+ query_embedding: queryEmbedding,
58
+ match_limit: limit,
59
+ }),
60
+ // 3. PostgreSQL FTS (keyword backup)
61
+ client
62
+ .from("ar_entries")
63
+ .select("id, project, store, room, slug, title, body, tags, metadata")
64
+ .eq("project", project)
65
+ .textSearch("body", query.split(/\s+/).join(" & "), { type: "plain" })
66
+ .limit(limit),
67
+ ]);
68
+ // Convert to RecallResultItem and rank per source
69
+ const semanticItems = (semanticResults.data ?? []).map((r) => ({
70
+ id: r.id,
71
+ source: (r.store === "journal" ? "journal" : "palace"),
72
+ title: (r.title ?? r.slug),
73
+ excerpt: (r.body ?? "").slice(0, 300),
74
+ score: r.similarity ?? 0,
75
+ confidence: scoreLabel(r.similarity ?? 0),
76
+ room: r.room ?? undefined,
77
+ }));
78
+ const insightItemsList = (insightResults.data ?? []).map((r) => ({
79
+ id: r.id,
80
+ source: "insight",
81
+ title: r.title,
82
+ excerpt: `[${r.severity}] confirmed ${r.confirmed}x`,
83
+ score: r.similarity ?? 0,
84
+ confidence: scoreLabel(r.similarity ?? 0),
85
+ severity: r.severity,
86
+ }));
87
+ const ftsItems = (ftsResults.data ?? []).map((r, idx) => ({
88
+ id: r.id,
89
+ source: (r.store === "journal" ? "journal" : "palace"),
90
+ title: (r.title ?? r.slug),
91
+ excerpt: (r.body ?? "").slice(0, 300),
92
+ score: 1 / (idx + 1),
93
+ confidence: scoreLabel(1 / (idx + 1)),
94
+ room: r.room ?? undefined,
95
+ }));
96
+ // RRF merge across all three
97
+ semanticItems.sort((a, b) => b.score - a.score);
98
+ insightItemsList.sort((a, b) => b.score - a.score);
99
+ ftsItems.sort((a, b) => b.score - a.score);
100
+ const rrfMap = new Map();
101
+ for (const items of [semanticItems, insightItemsList, ftsItems]) {
102
+ items.forEach((item, idx) => {
103
+ const rank = idx + 1;
104
+ const contribution = 1 / (RRF_K + rank);
105
+ const existing = rrfMap.get(item.id);
106
+ if (existing) {
107
+ existing.score += contribution;
108
+ }
109
+ else {
110
+ rrfMap.set(item.id, { score: contribution, item });
111
+ }
112
+ });
113
+ }
114
+ // Dedup and sort
115
+ const seen = new Set();
116
+ const deduped = [];
117
+ for (const { score, item } of rrfMap.values()) {
118
+ const key = item.excerpt.toLowerCase().replace(/\s+/g, " ").trim();
119
+ if (seen.has(key))
120
+ continue;
121
+ seen.add(key);
122
+ deduped.push({ ...item, score, confidence: scoreLabel(score) });
123
+ }
124
+ deduped.sort((a, b) => b.score - a.score);
125
+ return deduped.slice(0, limit);
126
+ }
127
+ }
128
+ //# sourceMappingURL=recall-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall-backend.js","sourceRoot":"","sources":["../../src/supabase/recall-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export declare function contentHash(content: string): string;
2
+ export interface ParsedMemoryFile {
3
+ title: string;
4
+ body: string;
5
+ tags: string[];
6
+ metadata: Record<string, unknown>;
7
+ }
8
+ export declare function parseMemoryFile(content: string): ParsedMemoryFile;
9
+ export declare function deriveSlug(filePath: string): string;
10
+ export declare function syncToSupabase(filePath: string, content: string, project: string, store: "journal" | "palace" | "awareness" | "digest", room?: string): void;
11
+ export declare function backfill(project: string, files: Array<{
12
+ path: string;
13
+ content: string;
14
+ store: "journal" | "palace" | "awareness" | "digest";
15
+ room?: string;
16
+ }>): Promise<{
17
+ synced: number;
18
+ skipped: number;
19
+ failed: number;
20
+ }>;
21
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/supabase/sync.ts"],"names":[],"mappings":"AAWA,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CA8BjE;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAanD;AAgBD,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,EACpD,IAAI,CAAC,EAAE,MAAM,GACZ,IAAI,CAIN;AAuED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACnH,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA4B9D"}
@@ -0,0 +1,158 @@
1
+ // packages/core/src/supabase/sync.ts
2
+ import * as crypto from "node:crypto";
3
+ import * as path from "node:path";
4
+ import { getSupabaseClient } from "./client.js";
5
+ import { readSupabaseConfig } from "./config.js";
6
+ import { createEmbeddingProvider } from "./embedding.js";
7
+ // ---------------------------------------------------------------------------
8
+ // Utilities (exported for testing)
9
+ // ---------------------------------------------------------------------------
10
+ export function contentHash(content) {
11
+ return crypto.createHash("sha256").update(content, "utf-8").digest("hex");
12
+ }
13
+ export function parseMemoryFile(content) {
14
+ let body = content;
15
+ let metadata = {};
16
+ // Extract YAML frontmatter
17
+ if (content.startsWith("---")) {
18
+ const endIdx = content.indexOf("---", 3);
19
+ if (endIdx > 0) {
20
+ const fm = content.slice(3, endIdx).trim();
21
+ body = content.slice(endIdx + 3).trim();
22
+ for (const line of fm.split("\n")) {
23
+ const match = line.match(/^(\w+):\s*(.+)/);
24
+ if (match) {
25
+ const val = match[2].trim();
26
+ if (val.startsWith("[")) {
27
+ try {
28
+ metadata[match[1]] = JSON.parse(val);
29
+ }
30
+ catch {
31
+ metadata[match[1]] = val;
32
+ }
33
+ }
34
+ else {
35
+ metadata[match[1]] = val;
36
+ }
37
+ }
38
+ }
39
+ }
40
+ }
41
+ const titleMatch = body.match(/^#\s+(.+)/m);
42
+ const title = titleMatch ? titleMatch[1].trim() : body.slice(0, 80).trim();
43
+ const tags = Array.isArray(metadata.tags) ? metadata.tags : [];
44
+ return { title, body, tags, metadata };
45
+ }
46
+ export function deriveSlug(filePath) {
47
+ const parts = filePath.split(path.sep);
48
+ const fileName = path.basename(filePath, ".md");
49
+ const journalIdx = parts.indexOf("journal");
50
+ const palaceIdx = parts.indexOf("rooms");
51
+ if (journalIdx >= 0)
52
+ return `journal--${fileName}`;
53
+ if (palaceIdx >= 0) {
54
+ const room = parts[palaceIdx + 1] ?? "unknown";
55
+ return `palace--${room}--${fileName}`;
56
+ }
57
+ return `other--${fileName}`;
58
+ }
59
+ // ---------------------------------------------------------------------------
60
+ // Sync (fire-and-forget)
61
+ // ---------------------------------------------------------------------------
62
+ let _embeddingProvider = null;
63
+ function getEmbeddingProvider() {
64
+ if (_embeddingProvider)
65
+ return _embeddingProvider;
66
+ const config = readSupabaseConfig();
67
+ if (!config?.embedding_api_key)
68
+ return null;
69
+ _embeddingProvider = createEmbeddingProvider(config.embedding_provider, config.embedding_api_key);
70
+ return _embeddingProvider;
71
+ }
72
+ export function syncToSupabase(filePath, content, project, store, room) {
73
+ setImmediate(() => {
74
+ void doSync(filePath, content, project, store, room);
75
+ });
76
+ }
77
+ async function doSync(filePath, content, project, store, room) {
78
+ try {
79
+ const client = getSupabaseClient();
80
+ if (!client)
81
+ return;
82
+ const hash = contentHash(content);
83
+ const { data: existing } = await client
84
+ .from("ar_sync_state")
85
+ .select("file_hash")
86
+ .eq("file_path", filePath)
87
+ .single();
88
+ if (existing?.file_hash === hash)
89
+ return;
90
+ const parsed = parseMemoryFile(content);
91
+ const slug = deriveSlug(filePath);
92
+ const { data: entry, error: upsertErr } = await client
93
+ .from("ar_entries")
94
+ .upsert({
95
+ project,
96
+ store,
97
+ room: room ?? null,
98
+ slug,
99
+ title: parsed.title,
100
+ body: parsed.body,
101
+ tags: parsed.tags,
102
+ metadata: parsed.metadata,
103
+ file_path: filePath,
104
+ file_hash: hash,
105
+ updated_at: new Date().toISOString(),
106
+ }, { onConflict: "project,store,slug" })
107
+ .select("id")
108
+ .single();
109
+ if (upsertErr || !entry)
110
+ return;
111
+ const provider = getEmbeddingProvider();
112
+ if (provider) {
113
+ const textForEmbedding = (parsed.title + " " + parsed.body).slice(0, 8000);
114
+ const embedding = await provider.embed(textForEmbedding);
115
+ await client
116
+ .from("ar_entries")
117
+ .update({ embedding })
118
+ .eq("id", entry.id);
119
+ }
120
+ await client.from("ar_sync_state").upsert({
121
+ file_path: filePath,
122
+ file_hash: hash,
123
+ entry_id: entry.id,
124
+ status: provider ? "embedded" : "synced",
125
+ synced_at: new Date().toISOString(),
126
+ });
127
+ }
128
+ catch {
129
+ // Silent failure — local files are source of truth
130
+ }
131
+ }
132
+ export async function backfill(project, files) {
133
+ const client = getSupabaseClient();
134
+ if (!client)
135
+ return { synced: 0, skipped: 0, failed: 0 };
136
+ let synced = 0, skipped = 0, failed = 0;
137
+ for (const file of files) {
138
+ try {
139
+ const hash = contentHash(file.content);
140
+ const { data: existing } = await client
141
+ .from("ar_sync_state")
142
+ .select("file_hash")
143
+ .eq("file_path", file.path)
144
+ .single();
145
+ if (existing?.file_hash === hash) {
146
+ skipped++;
147
+ continue;
148
+ }
149
+ await doSync(file.path, file.content, project, file.store, file.room);
150
+ synced++;
151
+ }
152
+ catch {
153
+ failed++;
154
+ }
155
+ }
156
+ return { synced, skipped, failed };
157
+ }
158
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/supabase/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Bootstrap — Layered Scan + Selective Import Architecture
3
+ *
4
+ * bootstrapScan() — discovers everything available on the machine (read-only)
5
+ * bootstrapImport() — imports selected items into ~/.agent-recall/
6
+ *
7
+ * This gives the orchestrator/CLI/MCP full control over what gets imported.
8
+ */
9
+ export interface DiscoveredProject {
10
+ slug: string;
11
+ name: string;
12
+ path: string;
13
+ sources: Array<{
14
+ type: "git" | "claude-memory" | "claudemd" | "package-json";
15
+ path: string;
16
+ detail: string;
17
+ }>;
18
+ description?: string;
19
+ language?: string;
20
+ last_activity?: string;
21
+ already_in_ar: boolean;
22
+ importable_items: ImportableItem[];
23
+ }
24
+ export interface ImportableItem {
25
+ id: string;
26
+ type: "identity" | "memory" | "architecture" | "trajectory";
27
+ source_path: string;
28
+ size_bytes: number;
29
+ preview: string;
30
+ }
31
+ export interface BootstrapScanResult {
32
+ projects: DiscoveredProject[];
33
+ global_items: ImportableItem[];
34
+ stats: {
35
+ total_projects: number;
36
+ total_importable_items: number;
37
+ total_already_in_ar: number;
38
+ scan_duration_ms: number;
39
+ };
40
+ }
41
+ export interface ImportSelection {
42
+ project_slugs?: string[];
43
+ item_types?: string[];
44
+ skip_items?: string[];
45
+ include_global?: boolean;
46
+ }
47
+ export interface ImportResult {
48
+ projects_created: number;
49
+ items_imported: number;
50
+ items_skipped: number;
51
+ errors: Array<{
52
+ project: string;
53
+ item: string;
54
+ error: string;
55
+ }>;
56
+ duration_ms: number;
57
+ }
58
+ export declare function bootstrapScan(options?: {
59
+ scan_dirs?: string[];
60
+ max_depth?: number;
61
+ }): Promise<BootstrapScanResult>;
62
+ export declare function bootstrapImport(scan: BootstrapScanResult, selection?: ImportSelection): Promise<ImportResult>;
63
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/tools-logic/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAoBH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,KAAK,GAAG,eAAe,GAAG,UAAU,GAAG,cAAc,CAAC;QAC5D,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,cAAc,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,cAAc,GAAG,YAAY,CAAC;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,KAAK,EAAE;QACL,cAAc,EAAE,MAAM,CAAC;QACvB,sBAAsB,EAAE,MAAM,CAAC;QAC/B,mBAAmB,EAAE,MAAM,CAAC;QAC5B,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,WAAW,EAAE,MAAM,CAAC;CACrB;AA0ND,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE;IAC5C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA4P/B;AAMD,wBAAsB,eAAe,CACnC,IAAI,EAAE,mBAAmB,EACzB,SAAS,CAAC,EAAE,eAAe,GAC1B,OAAO,CAAC,YAAY,CAAC,CAgLvB"}