opcode-pg-memory 2.2.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 (59) hide show
  1. package/.env.example +42 -0
  2. package/README.md +132 -0
  3. package/dist/cli.js +165 -0
  4. package/dist/index.d.ts +8 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +20938 -0
  7. package/dist/mcp-server.d.ts +8 -0
  8. package/dist/mcp-server.d.ts.map +1 -0
  9. package/dist/mcp-server.js +24047 -0
  10. package/dist/src/cache/semantic-cache.d.ts +120 -0
  11. package/dist/src/cache/semantic-cache.d.ts.map +1 -0
  12. package/dist/src/cli.d.ts +3 -0
  13. package/dist/src/cli.d.ts.map +1 -0
  14. package/dist/src/config.d.ts +39 -0
  15. package/dist/src/config.d.ts.map +1 -0
  16. package/dist/src/db/init-db.d.ts +45 -0
  17. package/dist/src/db/init-db.d.ts.map +1 -0
  18. package/dist/src/hooks/message-part-updated.d.ts +24 -0
  19. package/dist/src/hooks/message-part-updated.d.ts.map +1 -0
  20. package/dist/src/hooks/message-updated.d.ts +24 -0
  21. package/dist/src/hooks/message-updated.d.ts.map +1 -0
  22. package/dist/src/hooks/session-compacting.d.ts +50 -0
  23. package/dist/src/hooks/session-compacting.d.ts.map +1 -0
  24. package/dist/src/hooks/session-completed.d.ts +36 -0
  25. package/dist/src/hooks/session-completed.d.ts.map +1 -0
  26. package/dist/src/hooks/session-created.d.ts +23 -0
  27. package/dist/src/hooks/session-created.d.ts.map +1 -0
  28. package/dist/src/hooks/tool-execute.d.ts +32 -0
  29. package/dist/src/hooks/tool-execute.d.ts.map +1 -0
  30. package/dist/src/index.d.ts +64 -0
  31. package/dist/src/index.d.ts.map +1 -0
  32. package/dist/src/mcp/hindsight-reflect-omo.d.ts +64 -0
  33. package/dist/src/mcp/hindsight-reflect-omo.d.ts.map +1 -0
  34. package/dist/src/mcp/hindsight-reflect.d.ts +75 -0
  35. package/dist/src/mcp/hindsight-reflect.d.ts.map +1 -0
  36. package/dist/src/mcp/recall-memory-omo.d.ts +47 -0
  37. package/dist/src/mcp/recall-memory-omo.d.ts.map +1 -0
  38. package/dist/src/mcp/recall-memory.d.ts +89 -0
  39. package/dist/src/mcp/recall-memory.d.ts.map +1 -0
  40. package/dist/src/omo/adapter.d.ts +144 -0
  41. package/dist/src/omo/adapter.d.ts.map +1 -0
  42. package/dist/src/omo/types.d.ts +132 -0
  43. package/dist/src/omo/types.d.ts.map +1 -0
  44. package/dist/src/services/keyword.d.ts +4 -0
  45. package/dist/src/services/keyword.d.ts.map +1 -0
  46. package/dist/src/services/logger.d.ts +8 -0
  47. package/dist/src/services/logger.d.ts.map +1 -0
  48. package/dist/src/services/privacy.d.ts +4 -0
  49. package/dist/src/services/privacy.d.ts.map +1 -0
  50. package/dist/src/topic/segment-manager.d.ts +165 -0
  51. package/dist/src/topic/segment-manager.d.ts.map +1 -0
  52. package/dist/src/types.d.ts +405 -0
  53. package/dist/src/types.d.ts.map +1 -0
  54. package/dist/src/utils/embedding.d.ts +44 -0
  55. package/dist/src/utils/embedding.d.ts.map +1 -0
  56. package/dist/src/utils/token-budget.d.ts +68 -0
  57. package/dist/src/utils/token-budget.d.ts.map +1 -0
  58. package/package.json +68 -0
  59. package/scripts/migration-v2.sql +187 -0
@@ -0,0 +1,120 @@
1
+ import { Pool } from 'pg';
2
+ import { CacheResult } from '../types';
3
+ export interface SemanticCacheConfig {
4
+ initialThreshold: number;
5
+ adjustmentStep: number;
6
+ minThreshold: number;
7
+ maxThreshold: number;
8
+ queryWindowSize: number;
9
+ enabled: boolean;
10
+ }
11
+ /**
12
+ * 语义缓存管理器
13
+ *
14
+ * 功能:
15
+ * 1. 使用 HNSW 索引实现亚 10ms 级检索
16
+ * 2. 动态阈值调整(初始 0.92,每 100 次查询根据命中率 ±0.02)
17
+ * 3. 与 DCP 协同,设置最高检索优先级
18
+ * 4. 缓存命中后直接返回,零 token 消耗
19
+ */
20
+ export declare class SemanticCacheManager {
21
+ private pool;
22
+ private config;
23
+ private currentThreshold;
24
+ private queryCount;
25
+ private hitCount;
26
+ constructor(pool: Pool, config?: Partial<SemanticCacheConfig>);
27
+ /**
28
+ * 检查缓存
29
+ *
30
+ * 流程:
31
+ * 1. 生成查询哈希
32
+ * 2. 使用 HNSW 索引快速检索候选
33
+ * 3. 检查相似度是否达到阈值
34
+ * 4. 更新命中统计
35
+ */
36
+ checkCache(queryText: string): Promise<CacheResult & {
37
+ cached?: boolean;
38
+ cacheId?: string;
39
+ similarity?: number;
40
+ }>;
41
+ /**
42
+ * 存储缓存
43
+ */
44
+ storeCache(queryText: string, responseText: string, sessionId?: string): Promise<string | null>;
45
+ /**
46
+ * 记录缓存命中
47
+ */
48
+ private recordHit;
49
+ /**
50
+ * 记录缓存未命中
51
+ */
52
+ private recordMiss;
53
+ /**
54
+ * 动态调整阈值
55
+ *
56
+ * 策略:
57
+ * - 每 100 次查询检查一次
58
+ * - 命中率 < 30%:降低阈值(提高命中率)
59
+ * - 命中率 > 80%:提高阈值(提高精确度)
60
+ */
61
+ private maybeAdjustThreshold;
62
+ /**
63
+ * 生成查询哈希
64
+ */
65
+ private generateQueryHash;
66
+ /**
67
+ * 生成查询向量
68
+ *
69
+ * 注意:实际应调用 embedding API
70
+ */
71
+ private generateQueryEmbedding;
72
+ /**
73
+ * 标记缓存为已压缩(DCP 协同)
74
+ */
75
+ markAsPruned(cacheId: string): Promise<void>;
76
+ /**
77
+ * 批量标记缓存为已压缩
78
+ */
79
+ markMultipleAsPruned(cacheIds: string[]): Promise<void>;
80
+ /**
81
+ * 获取缓存统计
82
+ */
83
+ getStats(): Promise<{
84
+ totalEntries: number;
85
+ prunedEntries: number;
86
+ totalHits: number;
87
+ currentThreshold: number;
88
+ averageHitCount: number;
89
+ }>;
90
+ /**
91
+ * 清理过期缓存
92
+ */
93
+ cleanupExpiredCache(maxAgeDays?: number): Promise<number>;
94
+ /**
95
+ * 获取当前阈值
96
+ */
97
+ getCurrentThreshold(): number;
98
+ /**
99
+ * 手动设置阈值
100
+ */
101
+ setThreshold(threshold: number): Promise<void>;
102
+ }
103
+ /**
104
+ * 带缓存优先级的查询包装器
105
+ *
106
+ * 使用方式:
107
+ * 1. 首先检查语义缓存
108
+ * 2. 缓存命中:直接返回,零 token 消耗
109
+ * 3. 缓存未命中:执行实际查询,并存入缓存
110
+ */
111
+ export declare function queryWithCachePriority<T>(queryText: string, actualQuery: () => Promise<T>, cacheManager: SemanticCacheManager, shouldCache?: (result: T) => boolean): Promise<{
112
+ result: T;
113
+ fromCache: boolean;
114
+ similarity?: number;
115
+ }>;
116
+ /**
117
+ * 创建缓存管理器实例
118
+ */
119
+ export declare function createCacheManager(pool: Pool, config?: Partial<SemanticCacheConfig>): SemanticCacheManager;
120
+ //# sourceMappingURL=semantic-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-cache.d.ts","sourceRoot":"","sources":["../../../src/cache/semantic-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE1B,OAAO,EAAiB,WAAW,EAAE,MAAM,UAAU,CAAC;AAEtD,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;CAClB;AAWD;;;;;;;;GAQG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;gBAEb,IAAI,EAAE,IAAI,EAAE,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM;IAQjE;;;;;;;;OAQG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG;QACzD,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAsFF;;OAEG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAuDzB;;OAEG;YACW,SAAS;IAcvB;;OAEG;YACW,UAAU;IAKxB;;;;;;;OAOG;YACW,oBAAoB;IA+ClC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAazB;;;;OAIG;YACW,sBAAsB;IAQpC;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlD;;OAEG;IACG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7D;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;QACzB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IAmBF;;OAEG;IACG,mBAAmB,CAAC,UAAU,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAanE;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAerD;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC7B,YAAY,EAAE,oBAAoB,EAClC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,GACnC,OAAO,CAAC;IACT,MAAM,EAAE,CAAC,CAAC;IACV,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,CA0BD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,oBAAoB,CAEtB"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ export interface PgMemoryConfig {
2
+ pgHost?: string;
3
+ pgPort?: number;
4
+ pgDatabase?: string;
5
+ pgUser?: string;
6
+ pgPassword?: string;
7
+ embeddingProvider?: "ollama" | "deepseek" | "openai";
8
+ embeddingModel?: string;
9
+ embeddingDimensions?: number;
10
+ embeddingBatchSize?: number;
11
+ similarityThreshold?: number;
12
+ maxMemories?: number;
13
+ logLevel?: "debug" | "info" | "warn" | "error";
14
+ compactionThreshold?: number;
15
+ }
16
+ export declare const CONFIG: {
17
+ pgHost: string;
18
+ pgPort: number;
19
+ pgDatabase: string;
20
+ pgUser: string;
21
+ pgPassword: string;
22
+ embeddingProvider: "ollama" | "deepseek" | "openai";
23
+ embeddingModel: string;
24
+ embeddingDimensions: number;
25
+ embeddingBatchSize: number;
26
+ similarityThreshold: number;
27
+ maxMemories: number;
28
+ logLevel: "debug" | "info" | "warn" | "error";
29
+ compactionThreshold: number;
30
+ };
31
+ export declare function isConfigured(): boolean;
32
+ export declare function getDatabaseConfig(): {
33
+ host: string;
34
+ port: number;
35
+ database: string;
36
+ user: string;
37
+ password: string;
38
+ };
39
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC/C,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AA8CD,eAAO,MAAM,MAAM;;;;;;uBAMoG,QAAQ,GAAG,UAAU,GAAG,QAAQ;;;;;;cAM1D,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO;;CAE/H,CAAC;AAEF,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wBAAgB,iBAAiB;;;;;;EAQhC"}
@@ -0,0 +1,45 @@
1
+ import { Pool } from 'pg';
2
+ export interface DatabaseConfig {
3
+ host: string;
4
+ port: number;
5
+ database: string;
6
+ user: string;
7
+ password: string;
8
+ ssl?: boolean | object;
9
+ maxConnections?: number;
10
+ }
11
+ export declare const DEFAULT_DB_CONFIG: DatabaseConfig;
12
+ export declare class DatabaseInitializer {
13
+ private pool;
14
+ private config;
15
+ constructor(config?: Partial<DatabaseConfig>);
16
+ initialize(): Promise<Pool>;
17
+ private testConnection;
18
+ private setupDatabase;
19
+ private createExtensions;
20
+ private createEnums;
21
+ private createTables;
22
+ private createIndexes;
23
+ /**
24
+ * 迁移旧列名 session_id → session_map_id
25
+ *
26
+ * 兼容从 v1.x 升级的场景:旧 schema 中 entities/observations 等子表
27
+ * 使用 session_id 列名,但新 schema 使用 session_map_id。
28
+ * 重命名是 PostgreSQL 元数据操作,不重写数据行,FK 关联自动继承新列名。
29
+ */
30
+ private migrateLegacyColumnNames;
31
+ /**
32
+ * 将旧 sessions 表的数据迁移到新的 session_map 表。
33
+ * 旧 sessions 表保留不删除(_legacy),仅复制元数据映射。
34
+ * 注意:子表(entities/observations 等)的 session_map_id 不会自动填充,
35
+ * 需要单独的迁移脚本处理 FK 重映射。
36
+ */
37
+ private migrateSessionsData;
38
+ private initializeOmOSchema;
39
+ close(): Promise<void>;
40
+ getPool(): Pool;
41
+ }
42
+ export declare function getDatabaseInitializer(config?: Partial<DatabaseConfig>): DatabaseInitializer;
43
+ export declare function initializeDatabase(config?: Partial<DatabaseConfig>): Promise<Pool>;
44
+ export declare function closeDatabase(): Promise<void>;
45
+ //# sourceMappingURL=init-db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-db.d.ts","sourceRoot":"","sources":["../../../src/db/init-db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAc,MAAM,IAAI,CAAC;AAGtC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,iBAAiB,EAAE,cAQ/B,CAAC;AAEF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM;IAI1C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YA4BnB,cAAc;YAYd,aAAa;YAqCb,gBAAgB;YAQhB,WAAW;YAgBX,YAAY;YAgKZ,aAAa;IAkI3B;;;;;;OAMG;YACW,wBAAwB;IA8BtC;;;;;OAKG;YACW,mBAAmB;YA8BnB,mBAAmB;IAmF3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,OAAO,IAAI,IAAI;CAMhB;AAKD,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,mBAAmB,CAK5F;AAED,wBAAsB,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxF;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAKnD"}
@@ -0,0 +1,24 @@
1
+ import { Pool } from 'pg';
2
+ import { MessagePartUpdatedInput, MessagePartUpdatedOutput } from '../types';
3
+ export interface MessagePartUpdatedHandlerConfig {
4
+ maxContentLength: number;
5
+ accumulationTimeoutMs: number;
6
+ }
7
+ /**
8
+ * 处理 message.part.updated 事件
9
+ *
10
+ * 功能:
11
+ * 1. 监听工具输出的增量更新
12
+ * 2. 触发经验增量记录
13
+ * 3. 累积部分内容,在 isComplete = true 时统一处理
14
+ *
15
+ * 签名规范:(input, output) => Promise<void>
16
+ */
17
+ export declare function handleMessagePartUpdated(input: MessagePartUpdatedInput, output: MessagePartUpdatedOutput, // ✅ 添加 output 参数
18
+ pool: Pool, config?: Partial<MessagePartUpdatedHandlerConfig>): Promise<void>;
19
+ /**
20
+ * 清理过期的累积器(防止内存泄漏)
21
+ * 应定期调用
22
+ */
23
+ export declare function cleanupExpiredAccumulators(maxAgeMs?: number): void;
24
+ //# sourceMappingURL=message-part-updated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-part-updated.d.ts","sourceRoot":"","sources":["../../../src/hooks/message-part-updated.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAE7E,MAAM,WAAW,+BAA+B;IAC9C,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAgBD;;;;;;;;;GASG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,uBAAuB,EAC9B,MAAM,EAAE,wBAAwB,EAAK,iBAAiB;AACtD,IAAI,EAAE,IAAI,EACV,MAAM,GAAE,OAAO,CAAC,+BAA+B,CAAM,GACpD,OAAO,CAAC,IAAI,CAAC,CAkDf;AA0JD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,GAAE,MAAe,GAAG,IAAI,CAc1E"}
@@ -0,0 +1,24 @@
1
+ import { Pool } from 'pg';
2
+ import { MessageUpdatedInput, MessageUpdatedOutput } from '../types';
3
+ export interface MessageUpdatedHandlerConfig {
4
+ minConfidence: number;
5
+ minEntityNameLength: number;
6
+ maxEntitiesPerMessage: number;
7
+ maxRelationsPerEntity: number;
8
+ }
9
+ /**
10
+ * 处理 message.updated 事件
11
+ *
12
+ * 功能:
13
+ * 1. 存储原始消息到 messages 表
14
+ * 2. 异步调用 LLM 提取命名实体
15
+ * 3. 识别实体间关系
16
+ * 4. 写入 entities 表(置信度 < 0.5 的不写入)
17
+ * 5. 写入 relations 表(置信度 < 0.5 的不写入)
18
+ * 6. 更新实体 weight 和 last_seen_at
19
+ *
20
+ * 签名规范:(input, output) => Promise<void>
21
+ */
22
+ export declare function handleMessageUpdated(input: MessageUpdatedInput, output: MessageUpdatedOutput, // ✅ 添加 output 参数
23
+ pool: Pool, config?: Partial<MessageUpdatedHandlerConfig>): Promise<void>;
24
+ //# sourceMappingURL=message-updated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-updated.d.ts","sourceRoot":"","sources":["../../../src/hooks/message-updated.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EAGrB,MAAM,UAAU,CAAC;AAIlB,MAAM,WAAW,2BAA2B;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AASD;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,mBAAmB,EAC1B,MAAM,EAAE,oBAAoB,EAAK,iBAAiB;AAClD,IAAI,EAAE,IAAI,EACV,MAAM,GAAE,OAAO,CAAC,2BAA2B,CAAM,GAChD,OAAO,CAAC,IAAI,CAAC,CAyCf"}
@@ -0,0 +1,50 @@
1
+ import { Pool } from 'pg';
2
+ import { SessionCompactingInput, SessionCompactingOutput } from '../types';
3
+ export interface SessionCompactingHandlerConfig {
4
+ preserveHighImportanceObservations: boolean;
5
+ minImportanceToPreserve: number;
6
+ markPrunedInCache: boolean;
7
+ }
8
+ /**
9
+ * 处理 experimental.session.compacting / session.compacted 事件
10
+ *
11
+ * 功能:
12
+ * 1. 标记将被压缩的低价值消息
13
+ * 2. 避免对已压缩消息重复产生缓存
14
+ * 3. 与 DCP 协同,semantic_cache 检索优先级设为最高
15
+ *
16
+ * 签名规范:(input, output) => Promise<void>
17
+ */
18
+ export declare function handleSessionCompacting(input: SessionCompactingInput, output: SessionCompactingOutput, // ✅ 添加 output 参数
19
+ pool: Pool, config?: Partial<SessionCompactingHandlerConfig>): Promise<void>;
20
+ /**
21
+ * 获取缓存优先级配置
22
+ *
23
+ * 说明:
24
+ * - semantic_cache 检索优先级设为最高(在 DCP 处理之前执行缓存查找)
25
+ * - 缓存命中后直接返回,无需进入 DCP 通道(零 token 消耗)
26
+ */
27
+ export declare function getCachePriorityConfig(): {
28
+ priority: number;
29
+ bypassDCPOnHit: boolean;
30
+ };
31
+ /**
32
+ * 处理 session.compacted 事件(压缩完成后)
33
+ *
34
+ * 签名规范:(input, output) => Promise<void>
35
+ */
36
+ export declare function handleSessionCompacted(input: SessionCompactingInput, output: SessionCompactingOutput, // ✅ 添加 output 参数
37
+ pool: Pool, config?: Partial<SessionCompactingHandlerConfig>): Promise<void>;
38
+ /**
39
+ * 检查消息是否已被压缩
40
+ */
41
+ export declare function isMessageCompacted(sessionId: string, messageId: string, pool: Pool): Promise<boolean>;
42
+ /**
43
+ * 获取会话的压缩统计
44
+ */
45
+ export declare function getCompactionStats(sessionId: string, pool: Pool): Promise<{
46
+ totalObservations: number;
47
+ prunedCacheEntries: number;
48
+ highImportanceObservations: number;
49
+ }>;
50
+ //# sourceMappingURL=session-compacting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-compacting.d.ts","sourceRoot":"","sources":["../../../src/hooks/session-compacting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAE3E,MAAM,WAAW,8BAA8B;IAC7C,kCAAkC,EAAE,OAAO,CAAC;IAC5C,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAQD;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,sBAAsB,EAC7B,MAAM,EAAE,uBAAuB,EAAK,iBAAiB;AACrD,IAAI,EAAE,IAAI,EACV,MAAM,GAAE,OAAO,CAAC,8BAA8B,CAAM,GACnD,OAAO,CAAC,IAAI,CAAC,CA0Df;AAgED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;CACzB,CAOA;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,sBAAsB,EAC7B,MAAM,EAAE,uBAAuB,EAAK,iBAAiB;AACrD,IAAI,EAAE,IAAI,EACV,MAAM,GAAE,OAAO,CAAC,8BAA8B,CAAM,GACnD,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,IAAI,GACT,OAAO,CAAC;IACT,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,0BAA0B,EAAE,MAAM,CAAC;CACpC,CAAC,CA2BD"}
@@ -0,0 +1,36 @@
1
+ import { Pool } from 'pg';
2
+ import { SessionCompletedInput, SessionCompletedOutput } from '../types';
3
+ export interface SessionCompletedHandlerConfig {
4
+ reflectionThreshold: number;
5
+ minObservationThreshold: number;
6
+ maxObservationThreshold: number;
7
+ enableReflection: boolean;
8
+ offPeakHours: number[];
9
+ }
10
+ /**
11
+ * 处理 session.completed 事件
12
+ *
13
+ * 功能:
14
+ * 1. 异步触发 hindsight_reflect 反思任务
15
+ * 2. 检查 observations 数量是否达到阈值 (30-50条)
16
+ * 3. 更新 sessions.reflection_last_at
17
+ * 4. 使用 7B 蒸馏模型在低峰期执行
18
+ *
19
+ * 签名规范:(input, output) => Promise<void>
20
+ */
21
+ export declare function handleSessionCompleted(input: SessionCompletedInput, output: SessionCompletedOutput, // ✅ 添加 output 参数
22
+ pool: Pool, config?: Partial<SessionCompletedHandlerConfig>): Promise<void>;
23
+ /**
24
+ * 获取反思队列(供定时任务调用)
25
+ */
26
+ export declare function getPendingReflections(pool: Pool): Promise<Array<{
27
+ sessionId: string;
28
+ externalSessionId: string;
29
+ observationCount: number;
30
+ queuedAt: Date;
31
+ }>>;
32
+ /**
33
+ * 处理反思错误重试
34
+ */
35
+ export declare function retryFailedReflections(pool: Pool, maxRetries?: number): Promise<void>;
36
+ //# sourceMappingURL=session-completed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-completed.d.ts","sourceRoot":"","sources":["../../../src/hooks/session-completed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAEzE,MAAM,WAAW,6BAA6B;IAC5C,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uBAAuB,EAAE,MAAM,CAAC;IAChC,uBAAuB,EAAE,MAAM,CAAC;IAChC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAUD;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,qBAAqB,EAC5B,MAAM,EAAE,sBAAsB,EAAK,iBAAiB;AACpD,IAAI,EAAE,IAAI,EACV,MAAM,GAAE,OAAO,CAAC,6BAA6B,CAAM,GAClD,OAAO,CAAC,IAAI,CAAC,CAuFf;AA6RD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,KAAK,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,IAAI,CAAC;CAChB,CAAC,CAAC,CAmBF;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,EACV,UAAU,GAAE,MAAU,GACrB,OAAO,CAAC,IAAI,CAAC,CAkCf"}
@@ -0,0 +1,23 @@
1
+ import { Pool } from 'pg';
2
+ import { SessionCreatedInput, SessionCreatedOutput } from '../types';
3
+ export interface SessionCreatedHandlerConfig {
4
+ contextLimitRatio: number;
5
+ minTokens: number;
6
+ maxTokens: number;
7
+ minConfidence: number;
8
+ minWeight: number;
9
+ }
10
+ /**
11
+ * 处理 session.created 事件
12
+ *
13
+ * 功能:
14
+ * 1. 创建或更新 sessions 表记录
15
+ * 2. 基于 Token 预算检索 entities 和 reflections
16
+ * 3. 优先注入 permanent 级别事实,其次 project,最后 session
17
+ *
18
+ * 签名规范:(input, output) => Promise<void>
19
+ * output 为可变对象,通过突变 output 影响行为
20
+ */
21
+ export declare function handleSessionCreated(input: SessionCreatedInput, output: SessionCreatedOutput, // ✅ 添加 output 参数
22
+ pool: Pool, config?: Partial<SessionCreatedHandlerConfig>): Promise<void>;
23
+ //# sourceMappingURL=session-created.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-created.d.ts","sourceRoot":"","sources":["../../../src/hooks/session-created.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EAIrB,MAAM,UAAU,CAAC;AAQlB,MAAM,WAAW,2BAA2B;IAC1C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,mBAAmB,EAC1B,MAAM,EAAE,oBAAoB,EAAK,iBAAiB;AAClD,IAAI,EAAE,IAAI,EACV,MAAM,GAAE,OAAO,CAAC,2BAA2B,CAAM,GAChD,OAAO,CAAC,IAAI,CAAC,CAyCf"}
@@ -0,0 +1,32 @@
1
+ import { Pool } from 'pg';
2
+ import { ToolExecuteBeforeInput, ToolExecuteBeforeOutput, ToolExecuteAfterInput, ToolExecuteAfterOutput } from '../types';
3
+ export interface ToolExecuteHandlerConfig {
4
+ maxInputSummaryLength: number;
5
+ maxOutputSummaryLength: number;
6
+ defaultImportance: number;
7
+ }
8
+ /**
9
+ * 处理 tool.execute.before 事件
10
+ *
11
+ * 功能:
12
+ * 1. 记录工具调用参数摘要到 observations 表
13
+ * 2. 零 token 开销,仅做记录
14
+ *
15
+ * 签名规范:(input, output) => Promise<void>
16
+ */
17
+ export declare function handleToolExecuteBefore(input: ToolExecuteBeforeInput, output: ToolExecuteBeforeOutput, // ✅ 添加 output 参数
18
+ pool: Pool, config?: Partial<ToolExecuteHandlerConfig>): Promise<void>;
19
+ /**
20
+ * 处理 tool.execute.after 事件
21
+ *
22
+ * 功能:
23
+ * 1. 生成工具输出摘要
24
+ * 2. 异步向量化摘要内容
25
+ * 3. 更新 observations 表
26
+ * 4. 记录 token 使用
27
+ *
28
+ * 签名规范:(input, output) => Promise<void>
29
+ */
30
+ export declare function handleToolExecuteAfter(input: ToolExecuteAfterInput, output: ToolExecuteAfterOutput, // ✅ 添加 output 参数
31
+ pool: Pool, config?: Partial<ToolExecuteHandlerConfig>): Promise<void>;
32
+ //# sourceMappingURL=tool-execute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-execute.d.ts","sourceRoot":"","sources":["../../../src/hooks/tool-execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,UAAU,CAAC;AAGlB,MAAM,WAAW,wBAAwB;IACvC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAQD;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,sBAAsB,EAC7B,MAAM,EAAE,uBAAuB,EAAK,iBAAiB;AACrD,IAAI,EAAE,IAAI,EACV,MAAM,GAAE,OAAO,CAAC,wBAAwB,CAAM,GAC7C,OAAO,CAAC,IAAI,CAAC,CAuDf;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,qBAAqB,EAC5B,MAAM,EAAE,sBAAsB,EAAK,iBAAiB;AACpD,IAAI,EAAE,IAAI,EACV,MAAM,GAAE,OAAO,CAAC,wBAAwB,CAAM,GAC7C,OAAO,CAAC,IAAI,CAAC,CAyGf"}
@@ -0,0 +1,64 @@
1
+ interface PluginContext {
2
+ /** OpenCode SDK client */
3
+ client: any;
4
+ /** Project metadata */
5
+ project: any;
6
+ /** Working directory */
7
+ directory: string;
8
+ }
9
+ /** Official Plugin export signature */
10
+ type Plugin = (ctx: PluginContext) => Promise<PluginHooks>;
11
+ interface PluginHooks {
12
+ /** Unified event hook - receives ALL bus events */
13
+ event?: (input: {
14
+ event: {
15
+ type: string;
16
+ properties: Record<string, any>;
17
+ };
18
+ }) => Promise<void>;
19
+ /** Tool execute before - args mutation */
20
+ 'tool.execute.before'?: (input: {
21
+ tool: string;
22
+ sessionID: string;
23
+ callID: string;
24
+ }, output: {
25
+ args: any;
26
+ }) => Promise<void>;
27
+ /** Tool execute after - title/output mutation */
28
+ 'tool.execute.after'?: (input: {
29
+ tool: string;
30
+ sessionID: string;
31
+ callID: string;
32
+ args: any;
33
+ }, output: {
34
+ title: string;
35
+ output: string;
36
+ metadata: any;
37
+ }) => Promise<void>;
38
+ /** Session compacting hook */
39
+ 'experimental.session.compacting'?: (input: {
40
+ sessionID: string;
41
+ }, output: {
42
+ context: string[];
43
+ prompt?: string;
44
+ }) => Promise<void>;
45
+ /** Custom MCP tools */
46
+ tool?: Record<string, PluginTool>;
47
+ [key: string]: any;
48
+ }
49
+ interface PluginTool {
50
+ description: string;
51
+ args: Record<string, any>;
52
+ execute: (args: any, context: {
53
+ client: any;
54
+ sessionID?: string;
55
+ }) => Promise<any>;
56
+ }
57
+ export declare const OpenCodePGMemory: Plugin;
58
+ export * from './types';
59
+ export * from './db/init-db';
60
+ export * from './utils/token-budget';
61
+ export * from './cache/semantic-cache';
62
+ export { recallMemory } from './mcp/recall-memory';
63
+ export { hindsightReflect } from './mcp/hindsight-reflect';
64
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAoBA,UAAU,aAAa;IACrB,0BAA0B;IAC1B,MAAM,EAAE,GAAG,CAAC;IACZ,uBAAuB;IACvB,OAAO,EAAE,GAAG,CAAC;IACb,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,uCAAuC;AACvC,KAAK,MAAM,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAE3D,UAAU,WAAW;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;SAAE,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/F,0CAA0C;IAC1C,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,EAAE;QAAE,IAAI,EAAE,GAAG,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7H,iDAAiD;IACjD,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,EAAE,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1K,8BAA8B;IAC9B,iCAAiC,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpI,uBAAuB;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE;QAAE,MAAM,EAAE,GAAG,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CACpF;AAwJD,eAAO,MAAM,gBAAgB,EAAE,MA2f9B,CAAC;AA8JF,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * hindsight_reflect MCP 工具 - OmO 适配版本
3
+ *
4
+ * 针对 Oh My OpenAgent 多 Agent 环境优化的反思工具
5
+ * 与 OmO Wisdom Accumulation 机制集成
6
+ */
7
+ import { Pool } from 'pg';
8
+ import { HindsightReflectInput, HindsightReflectOutput } from './hindsight-reflect';
9
+ export interface HindsightReflectOmOInput extends HindsightReflectInput {
10
+ agent_id: string;
11
+ task_id?: string;
12
+ parent_session_id?: string;
13
+ sync_to_omo_wisdom?: boolean;
14
+ omo_wisdom_tags?: string[];
15
+ reflection_scope?: 'agent-only' | 'task-only' | 'session-wide' | 'hierarchical';
16
+ respect_omo_timeout?: boolean;
17
+ omo_timeout_deadline?: string;
18
+ }
19
+ export interface HindsightReflectOmOOutput extends HindsightReflectOutput {
20
+ agent_id: string;
21
+ task_id?: string;
22
+ success?: boolean;
23
+ error?: string;
24
+ omo_wisdom_synced: boolean;
25
+ omo_wisdom_entries?: Array<{
26
+ id: string;
27
+ type: string;
28
+ content: string;
29
+ }>;
30
+ cross_agent_stats?: {
31
+ total_observations: number;
32
+ own_observations: number;
33
+ inherited_observations: number;
34
+ child_agent_observations: number;
35
+ };
36
+ coordination_status: {
37
+ completed_before_timeout: boolean;
38
+ timeout_was_respected: boolean;
39
+ omo_acknowledged: boolean;
40
+ };
41
+ }
42
+ /**
43
+ * OmO 版本的 hindsight_reflect 工具
44
+ *
45
+ * 主要差异:
46
+ * 1. 支持按 Agent 范围反思
47
+ * 2. 与 OmO Wisdom Accumulation 同步
48
+ * 3. 尊重 OmO 后台超时控制
49
+ * 4. 支持层级反思(父子 Agent)
50
+ */
51
+ export declare function hindsightReflectOmO(input: HindsightReflectOmOInput, pool: Pool): Promise<HindsightReflectOmOOutput>;
52
+ /**
53
+ * 获取排队的反思任务
54
+ */
55
+ export declare function getQueuedReflections(pool: Pool): Promise<Array<{
56
+ session_id: string;
57
+ agent_id: string;
58
+ coordination_data: any;
59
+ }>>;
60
+ /**
61
+ * 处理排队的反思任务
62
+ */
63
+ export declare function processQueuedReflections(pool: Pool): Promise<void>;
64
+ //# sourceMappingURL=hindsight-reflect-omo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hindsight-reflect-omo.d.ts","sourceRoot":"","sources":["../../../src/mcp/hindsight-reflect-omo.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EAAoB,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAEtG,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;IAErE,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAG3B,gBAAgB,CAAC,EAAE,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,cAAc,CAAC;IAGhF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,yBAA0B,SAAQ,sBAAsB;IAEvE,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,iBAAiB,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,KAAK,CAAC;QACzB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IAGH,iBAAiB,CAAC,EAAE;QAClB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,gBAAgB,EAAE,MAAM,CAAC;QACzB,sBAAsB,EAAE,MAAM,CAAC;QAC/B,wBAAwB,EAAE,MAAM,CAAC;KAClC,CAAC;IAGF,mBAAmB,EAAE;QACnB,wBAAwB,EAAE,OAAO,CAAC;QAClC,qBAAqB,EAAE,OAAO,CAAC;QAC/B,gBAAgB,EAAE,OAAO,CAAC;KAC3B,CAAC;CACH;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,wBAAwB,EAC/B,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,yBAAyB,CAAC,CA6FpC;AAuND;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,KAAK,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,GAAG,CAAC;CACxB,CAAC,CAAC,CASF;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBxE"}