@multiplayer-app/ai-agent-mongo 0.1.0-beta.1

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 (70) hide show
  1. package/README.md +330 -0
  2. package/dist/__tests__/helpers.d.ts +22 -0
  3. package/dist/__tests__/helpers.d.ts.map +1 -0
  4. package/dist/__tests__/helpers.js +75 -0
  5. package/dist/__tests__/helpers.js.map +1 -0
  6. package/dist/__tests__/repositories/MongoAgentChatRepository.test.d.ts +2 -0
  7. package/dist/__tests__/repositories/MongoAgentChatRepository.test.d.ts.map +1 -0
  8. package/dist/__tests__/repositories/MongoAgentChatRepository.test.js +249 -0
  9. package/dist/__tests__/repositories/MongoAgentChatRepository.test.js.map +1 -0
  10. package/dist/__tests__/repositories/MongoAgentMessageRepository.test.d.ts +2 -0
  11. package/dist/__tests__/repositories/MongoAgentMessageRepository.test.d.ts.map +1 -0
  12. package/dist/__tests__/repositories/MongoAgentMessageRepository.test.js +311 -0
  13. package/dist/__tests__/repositories/MongoAgentMessageRepository.test.js.map +1 -0
  14. package/dist/__tests__/schemas/AgentChatSchema.test.d.ts +2 -0
  15. package/dist/__tests__/schemas/AgentChatSchema.test.d.ts.map +1 -0
  16. package/dist/__tests__/schemas/AgentChatSchema.test.js +120 -0
  17. package/dist/__tests__/schemas/AgentChatSchema.test.js.map +1 -0
  18. package/dist/__tests__/schemas/AgentMessageSchema.test.d.ts +2 -0
  19. package/dist/__tests__/schemas/AgentMessageSchema.test.d.ts.map +1 -0
  20. package/dist/__tests__/schemas/AgentMessageSchema.test.js +293 -0
  21. package/dist/__tests__/schemas/AgentMessageSchema.test.js.map +1 -0
  22. package/dist/__tests__/setup.d.ts +2 -0
  23. package/dist/__tests__/setup.d.ts.map +1 -0
  24. package/dist/__tests__/setup.js +25 -0
  25. package/dist/__tests__/setup.js.map +1 -0
  26. package/dist/index.d.ts +9 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +9 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/mongo/config.d.ts +10 -0
  31. package/dist/mongo/config.d.ts.map +1 -0
  32. package/dist/mongo/config.js +10 -0
  33. package/dist/mongo/config.js.map +1 -0
  34. package/dist/mongo/encryption.d.ts +66 -0
  35. package/dist/mongo/encryption.d.ts.map +1 -0
  36. package/dist/mongo/encryption.js +140 -0
  37. package/dist/mongo/encryption.js.map +1 -0
  38. package/dist/mongo/index.d.ts +25 -0
  39. package/dist/mongo/index.d.ts.map +1 -0
  40. package/dist/mongo/index.js +72 -0
  41. package/dist/mongo/index.js.map +1 -0
  42. package/dist/mongo/logger.d.ts +31 -0
  43. package/dist/mongo/logger.d.ts.map +1 -0
  44. package/dist/mongo/logger.js +36 -0
  45. package/dist/mongo/logger.js.map +1 -0
  46. package/dist/repositories/MongoAgentChatRepository.d.ts +37 -0
  47. package/dist/repositories/MongoAgentChatRepository.d.ts.map +1 -0
  48. package/dist/repositories/MongoAgentChatRepository.js +235 -0
  49. package/dist/repositories/MongoAgentChatRepository.js.map +1 -0
  50. package/dist/repositories/MongoAgentMessageRepository.d.ts +24 -0
  51. package/dist/repositories/MongoAgentMessageRepository.d.ts.map +1 -0
  52. package/dist/repositories/MongoAgentMessageRepository.js +140 -0
  53. package/dist/repositories/MongoAgentMessageRepository.js.map +1 -0
  54. package/dist/repositories/index.d.ts +3 -0
  55. package/dist/repositories/index.d.ts.map +1 -0
  56. package/dist/repositories/index.js +3 -0
  57. package/dist/repositories/index.js.map +1 -0
  58. package/dist/schemas/AgentChatSchema.d.ts +29 -0
  59. package/dist/schemas/AgentChatSchema.d.ts.map +1 -0
  60. package/dist/schemas/AgentChatSchema.js +26 -0
  61. package/dist/schemas/AgentChatSchema.js.map +1 -0
  62. package/dist/schemas/AgentMessageSchema.d.ts +30 -0
  63. package/dist/schemas/AgentMessageSchema.d.ts.map +1 -0
  64. package/dist/schemas/AgentMessageSchema.js +54 -0
  65. package/dist/schemas/AgentMessageSchema.js.map +1 -0
  66. package/dist/schemas/index.d.ts +3 -0
  67. package/dist/schemas/index.d.ts.map +1 -0
  68. package/dist/schemas/index.js +3 -0
  69. package/dist/schemas/index.js.map +1 -0
  70. package/package.json +37 -0
@@ -0,0 +1,140 @@
1
+ import { MongoClient, ClientEncryption } from 'mongodb';
2
+ import { getLogger } from './logger';
3
+ import { MONGODB_DB_NAME, MONGODB_URI, MONGODB_ENCRYPTION_KEY_VAULT_DB_NAME, MONGODB_ENCRYPTION_KEY_VAULT_COLLECTION_NAME, MONGODB_ENCRYPTION_DEK_NAME, MONGODB_ENCRYPTION_MASTER_KEY_PROVIDER, AWS_KMS_KEY_ARN, AWS_REGION, } from './config';
4
+ const logger = getLogger();
5
+ let dataKeyId;
6
+ const MONGODB_URI_MASKED = MONGODB_URI === null || MONGODB_URI === void 0 ? void 0 : MONGODB_URI.replace(/:\/\/(.*):(.*)@/, '://***:***@');
7
+ const encryptionAlgorythm = 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic';
8
+ export const encrypt = (data) => clientEncryption.encrypt(data, {
9
+ algorithm: encryptionAlgorythm,
10
+ keyId: dataKeyId,
11
+ });
12
+ export const decrypt = (data) => clientEncryption.decrypt(data);
13
+ export const kmsProviders = {};
14
+ let keyProvider;
15
+ let masterKey;
16
+ if (MONGODB_ENCRYPTION_MASTER_KEY_PROVIDER === 'local') {
17
+ keyProvider = 'local';
18
+ const arr = [];
19
+ for (let i = 0; i < 96; ++i) {
20
+ arr.push(i);
21
+ }
22
+ const key = Buffer.from(arr);
23
+ kmsProviders.local = { key };
24
+ }
25
+ else {
26
+ kmsProviders.aws = {};
27
+ keyProvider = 'aws';
28
+ masterKey = {
29
+ key: AWS_KMS_KEY_ARN,
30
+ region: AWS_REGION,
31
+ };
32
+ }
33
+ export const keyVaultNamespace = `${MONGODB_ENCRYPTION_KEY_VAULT_DB_NAME}.${MONGODB_ENCRYPTION_KEY_VAULT_COLLECTION_NAME}`;
34
+ let unencryptedClient;
35
+ let clientEncryption;
36
+ export const connect = async () => {
37
+ if (!unencryptedClient) {
38
+ unencryptedClient = await new MongoClient(MONGODB_URI).connect();
39
+ unencryptedClient.on('connectionReady', () => {
40
+ logger.info(`[MONGO] Unencrypted Client Connected to ${MONGODB_URI_MASKED}`);
41
+ });
42
+ unencryptedClient.on('connectionClosed', () => {
43
+ logger.info(`[MONGO] Unencrypted Client disconnected from ${MONGODB_URI_MASKED}`);
44
+ });
45
+ clientEncryption = new ClientEncryption(unencryptedClient, {
46
+ kmsProviders,
47
+ keyVaultNamespace,
48
+ });
49
+ }
50
+ return true;
51
+ };
52
+ export const disconnect = async () => {
53
+ if (unencryptedClient) {
54
+ await unencryptedClient.close();
55
+ }
56
+ };
57
+ export const getKeyId = async () => {
58
+ logger.info(`[MONGO] Using key provider: ${keyProvider}`);
59
+ dataKeyId = await unencryptedClient
60
+ .db(MONGODB_ENCRYPTION_KEY_VAULT_DB_NAME)
61
+ .collection(MONGODB_ENCRYPTION_KEY_VAULT_COLLECTION_NAME)
62
+ .findOne({
63
+ keyAltNames: MONGODB_ENCRYPTION_DEK_NAME,
64
+ 'masterKey.provider': keyProvider,
65
+ });
66
+ if (dataKeyId === null) {
67
+ logger.info('[MONGO] Creating new DEK');
68
+ dataKeyId = await clientEncryption
69
+ .createDataKey(keyProvider, {
70
+ keyAltNames: [MONGODB_ENCRYPTION_DEK_NAME],
71
+ masterKey,
72
+ });
73
+ }
74
+ else {
75
+ logger.info('[MONGO] Found existing DEK');
76
+ dataKeyId = dataKeyId._id;
77
+ }
78
+ return dataKeyId;
79
+ };
80
+ export const getEncryptionSchemaMap = (encryptionKeyId) => {
81
+ const schemaMap = {
82
+ [`${MONGODB_DB_NAME}.integrations`]: {
83
+ bsonType: 'object',
84
+ properties: {
85
+ metadata: {
86
+ bsonType: 'object',
87
+ properties: {
88
+ accessToken: {
89
+ encrypt: {
90
+ bsonType: 'string',
91
+ keyId: [encryptionKeyId],
92
+ algorithm: encryptionAlgorythm,
93
+ },
94
+ },
95
+ refreshToken: {
96
+ encrypt: {
97
+ bsonType: 'string',
98
+ keyId: [encryptionKeyId],
99
+ algorithm: encryptionAlgorythm,
100
+ },
101
+ },
102
+ apiKey: {
103
+ encrypt: {
104
+ bsonType: 'string',
105
+ keyId: [encryptionKeyId],
106
+ algorithm: encryptionAlgorythm,
107
+ },
108
+ },
109
+ },
110
+ },
111
+ },
112
+ },
113
+ [`${MONGODB_DB_NAME}.workspace-users`]: {
114
+ bsonType: 'object',
115
+ properties: {
116
+ googleWorkspaceToken: {
117
+ bsonType: 'object',
118
+ properties: {
119
+ access_token: {
120
+ encrypt: {
121
+ bsonType: 'string',
122
+ keyId: [encryptionKeyId],
123
+ algorithm: encryptionAlgorythm,
124
+ },
125
+ },
126
+ refresh_token: {
127
+ encrypt: {
128
+ bsonType: 'string',
129
+ keyId: [encryptionKeyId],
130
+ algorithm: encryptionAlgorythm,
131
+ },
132
+ },
133
+ },
134
+ },
135
+ },
136
+ },
137
+ };
138
+ return schemaMap;
139
+ };
140
+ //# sourceMappingURL=encryption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../src/mongo/encryption.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EACL,eAAe,EACf,WAAW,EACX,oCAAoC,EACpC,4CAA4C,EAC5C,2BAA2B,EAC3B,sCAAsC,EACtC,eAAe,EACf,UAAU,GACX,MAAM,UAAU,CAAA;AAEjB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;AAE1B,IAAI,SAAS,CAAA;AAEb,MAAM,kBAAkB,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAA;AAEjF,MAAM,mBAAmB,GAAG,6CAA6C,CAAA;AAEzE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CACvD,IAAI,EACJ;IACE,SAAS,EAAE,mBAAmB;IAC9B,KAAK,EAAE,SAAS;CACjB,CACF,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAE/D,MAAM,CAAC,MAAM,YAAY,GAAQ,EAAE,CAAA;AACnC,IAAI,WAAW,CAAA;AACf,IAAI,SAAS,CAAA;AAEb,IAAI,sCAAsC,KAAK,OAAO,EAAE,CAAC;IACvD,WAAW,GAAG,OAAO,CAAA;IACrB,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACb,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAE5B,YAAY,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,CAAA;AAC9B,CAAC;KAAM,CAAC;IACN,YAAY,CAAC,GAAG,GAAG,EAAE,CAAA;IACrB,WAAW,GAAG,KAAK,CAAA;IAEnB,SAAS,GAAG;QACV,GAAG,EAAE,eAAe;QACpB,MAAM,EAAE,UAAU;KACnB,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,oCAAoC,IAAI,4CAA4C,EAAE,CAAA;AAE1H,IAAI,iBAA8B,CAAA;AAElC,IAAI,gBAAkC,CAAA;AAEtC,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;IAChC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,iBAAiB,GAAG,MAAM,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAA;QAEhE,iBAAiB,CAAC,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;YAC3C,MAAM,CAAC,IAAI,CAAC,2CAA2C,kBAAkB,EAAE,CAAC,CAAA;QAC9E,CAAC,CAAC,CAAA;QAEF,iBAAiB,CAAC,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;YAC5C,MAAM,CAAC,IAAI,CAAC,gDAAgD,kBAAkB,EAAE,CAAC,CAAA;QACnF,CAAC,CAAC,CAAA;QAEF,gBAAgB,GAAG,IAAI,gBAAgB,CACrC,iBAAiB,EACjB;YACE,YAAY;YACZ,iBAAiB;SAClB,CACF,CAAA;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;IACnC,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,iBAAiB,CAAC,KAAK,EAAE,CAAA;IACjC,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;IACjC,MAAM,CAAC,IAAI,CAAC,+BAA+B,WAAW,EAAE,CAAC,CAAA;IAEzD,SAAS,GAAG,MAAM,iBAAiB;SAChC,EAAE,CAAC,oCAAoC,CAAC;SACxC,UAAU,CAAC,4CAA4C,CAAC;SACxD,OAAO,CAAC;QACP,WAAW,EAAE,2BAA2B;QACxC,oBAAoB,EAAE,WAAW;KAClC,CAAC,CAAA;IAEJ,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QAEvC,SAAS,GAAG,MAAM,gBAAgB;aAC/B,aAAa,CACZ,WAAW,EACX;YACE,WAAW,EAAE,CAAC,2BAA2B,CAAC;YAC1C,SAAS;SACV,CACF,CAAA;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;QACzC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAA;IAC3B,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,eAAe,EAAE,EAAE;IACxD,MAAM,SAAS,GAAG;QAChB,CAAC,GAAG,eAAe,eAAe,CAAC,EAAE;YACnC,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,QAAQ,EAAE,QAAQ;oBAClB,UAAU,EAAE;wBACV,WAAW,EAAE;4BACX,OAAO,EAAE;gCACP,QAAQ,EAAE,QAAQ;gCAClB,KAAK,EAAE,CAAC,eAAe,CAAC;gCACxB,SAAS,EAAE,mBAAmB;6BAC/B;yBACF;wBACD,YAAY,EAAE;4BACZ,OAAO,EAAE;gCACP,QAAQ,EAAE,QAAQ;gCAClB,KAAK,EAAE,CAAC,eAAe,CAAC;gCACxB,SAAS,EAAE,mBAAmB;6BAC/B;yBACF;wBACD,MAAM,EAAE;4BACN,OAAO,EAAE;gCACP,QAAQ,EAAE,QAAQ;gCAClB,KAAK,EAAE,CAAC,eAAe,CAAC;gCACxB,SAAS,EAAE,mBAAmB;6BAC/B;yBACF;qBACF;iBACF;aACF;SACF;QACD,CAAC,GAAG,eAAe,kBAAkB,CAAC,EAAE;YACtC,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE;gBACV,oBAAoB,EAAE;oBACpB,QAAQ,EAAE,QAAQ;oBAClB,UAAU,EAAE;wBACV,YAAY,EAAE;4BACZ,OAAO,EAAE;gCACP,QAAQ,EAAE,QAAQ;gCAClB,KAAK,EAAE,CAAC,eAAe,CAAC;gCACxB,SAAS,EAAE,mBAAmB;6BAC/B;yBACF;wBACD,aAAa,EAAE;4BACb,OAAO,EAAE;gCACP,QAAQ,EAAE,QAAQ;gCAClB,KAAK,EAAE,CAAC,eAAe,CAAC;gCACxB,SAAS,EAAE,mBAAmB;6BAC/B;yBACF;qBACF;iBACF;aACF;SACF;KACF,CAAA;IAED,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA"}
@@ -0,0 +1,25 @@
1
+ import Mongoose from 'mongoose';
2
+ import * as _Config from './config';
3
+ import * as _encryption from './encryption';
4
+ export declare const encryption: typeof _encryption;
5
+ export declare const mongoose: typeof Mongoose;
6
+ export declare const ObjectId: typeof Mongoose.Types.ObjectId;
7
+ export type ObjectId = Mongoose.Types.ObjectId;
8
+ export type { Document } from 'mongoose';
9
+ export { type Binary } from 'bson';
10
+ export declare const Schema: typeof Mongoose.Schema;
11
+ export declare const Model: Mongoose.Model<any, {}, {}, {}, any, any>;
12
+ export declare const Config: typeof _Config;
13
+ export declare const connected: () => boolean;
14
+ declare const _default: {
15
+ encryption: typeof _encryption;
16
+ connect: () => Promise<void>;
17
+ disconnect: () => Promise<void>;
18
+ connected: () => boolean;
19
+ mongoose: typeof Mongoose;
20
+ ObjectId: typeof Mongoose.Types.ObjectId;
21
+ Schema: typeof Mongoose.Schema;
22
+ Model: Mongoose.Model<any, {}, {}, {}, any, any>;
23
+ };
24
+ export default _default;
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mongo/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAA4B,MAAM,UAAU,CAAA;AAEnD,OAAO,KAAK,OAAO,MAAM,UAAU,CAAA;AACnC,OAAO,KAAK,WAAW,MAAM,cAAc,CAAA;AAI3C,eAAO,MAAM,UAAU,oBAAc,CAAA;AAIrC,eAAO,MAAM,QAAQ,iBAAW,CAAA;AAEhC,eAAO,MAAM,QAAQ,gCAA0B,CAAA;AAE/C,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAA;AAE9C,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAA;AAElC,eAAO,MAAM,MAAM,wBAAkB,CAAA;AAErC,eAAO,MAAM,KAAK,2CAAiB,CAAA;AAEnC,eAAO,MAAM,MAAM,gBAAU,CAAA;AAmD7B,eAAO,MAAM,SAAS,eAA6C,CAAA;;;;;;;;;;;AAUnE,wBASC"}
@@ -0,0 +1,72 @@
1
+ var _a;
2
+ import Mongoose from 'mongoose';
3
+ import { getLogger } from './logger';
4
+ import * as _Config from './config';
5
+ import * as _encryption from './encryption';
6
+ const logger = getLogger();
7
+ export const encryption = _encryption;
8
+ const MONGODB_URI_MASKED = (_a = _Config.MONGODB_URI) === null || _a === void 0 ? void 0 : _a.replace(/:\/\/(.*):(.*)@/, '://***:***@');
9
+ export const mongoose = Mongoose;
10
+ export const ObjectId = Mongoose.Types.ObjectId;
11
+ export const Schema = Mongoose.Schema;
12
+ export const Model = Mongoose.Model;
13
+ export const Config = _Config;
14
+ Mongoose.set('debug', _Config.MONGO_DEBUG);
15
+ Mongoose.connection.on('connected', () => {
16
+ logger.info(`[MONGO] Connected to ${MONGODB_URI_MASKED}`);
17
+ });
18
+ Mongoose.connection.on('error', error => {
19
+ logger.error(error, `[MONGO] Connection to MongoDB failed: ${error.message}`);
20
+ });
21
+ Mongoose.connection.on('reconnected', () => {
22
+ logger.info(`[MONGO] Reconnected to ${MONGODB_URI_MASKED}`);
23
+ });
24
+ Mongoose.connection.on('disconnected', () => {
25
+ logger.info(`[MONGO] Disconnected from ${MONGODB_URI_MASKED}`);
26
+ });
27
+ Mongoose.connection.on('close', () => {
28
+ logger.info(`[MONGO] Connection closed ${MONGODB_URI_MASKED}`);
29
+ });
30
+ Mongoose.connection.on('reconnectFailed', () => {
31
+ logger.error(`[MONGO] Reconnect Failed ${MONGODB_URI_MASKED}`);
32
+ });
33
+ const connect = async () => {
34
+ await encryption.connect();
35
+ const encryptionKeyId = await encryption.getKeyId();
36
+ const options = {
37
+ autoIndex: true,
38
+ connectTimeoutMS: 10000,
39
+ socketTimeoutMS: 25000,
40
+ minPoolSize: 3,
41
+ autoEncryption: {
42
+ bypassAutoEncryption: true,
43
+ keyVaultNamespace: encryption.keyVaultNamespace,
44
+ kmsProviders: encryption.kmsProviders,
45
+ schemaMap: encryption.getEncryptionSchemaMap(encryptionKeyId),
46
+ extraOptions: {
47
+ mongocryptdURI: Config.MONGODB_URI,
48
+ },
49
+ },
50
+ };
51
+ await Mongoose.connect(_Config.MONGODB_URI, options);
52
+ };
53
+ export const connected = () => Mongoose.connection.readyState === 1;
54
+ const disconnect = async () => {
55
+ if (!connected())
56
+ return;
57
+ await Promise.allSettled([
58
+ Mongoose.connection.close(),
59
+ encryption.disconnect(),
60
+ ]);
61
+ };
62
+ export default {
63
+ encryption,
64
+ connect,
65
+ disconnect,
66
+ connected,
67
+ mongoose,
68
+ ObjectId: Mongoose.Types.ObjectId,
69
+ Schema: Mongoose.Schema,
70
+ Model: Mongoose.Model,
71
+ };
72
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mongo/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Logger interface for MongoDB operations.
3
+ * Compatible with most common Node.js loggers (pino, winston, bunyan, etc.)
4
+ */
5
+ export interface MongoLogger {
6
+ info(message: string): void;
7
+ error(errorOrMessage: Error | unknown | string, message?: string): void;
8
+ warn?(message: string): void;
9
+ debug?(message: string): void;
10
+ }
11
+ /**
12
+ * Sets a custom logger for MongoDB operations.
13
+ * If not called, all logging is silently discarded.
14
+ *
15
+ * @param customLogger - Logger instance implementing MongoLogger interface
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * import { setLogger } from '@multiplayer-app/ai-agent-mongo';
20
+ * import pino from 'pino';
21
+ *
22
+ * setLogger(pino());
23
+ * ```
24
+ */
25
+ export declare function setLogger(customLogger: MongoLogger): void;
26
+ /**
27
+ * Gets the current logger instance.
28
+ * @internal
29
+ */
30
+ export declare function getLogger(): MongoLogger;
31
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/mongo/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,cAAc,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxE,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAeD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,YAAY,EAAE,WAAW,GAAG,IAAI,CAEzD;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,WAAW,CAEvC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * No-op logger that discards all log messages.
3
+ * Used as default when no logger is provided.
4
+ */
5
+ const noOpLogger = {
6
+ info: () => { },
7
+ error: () => { },
8
+ warn: () => { },
9
+ debug: () => { },
10
+ };
11
+ let logger = noOpLogger;
12
+ /**
13
+ * Sets a custom logger for MongoDB operations.
14
+ * If not called, all logging is silently discarded.
15
+ *
16
+ * @param customLogger - Logger instance implementing MongoLogger interface
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * import { setLogger } from '@multiplayer-app/ai-agent-mongo';
21
+ * import pino from 'pino';
22
+ *
23
+ * setLogger(pino());
24
+ * ```
25
+ */
26
+ export function setLogger(customLogger) {
27
+ logger = customLogger;
28
+ }
29
+ /**
30
+ * Gets the current logger instance.
31
+ * @internal
32
+ */
33
+ export function getLogger() {
34
+ return logger;
35
+ }
36
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/mongo/logger.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,MAAM,UAAU,GAAgB;IAC9B,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;IACf,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;CAChB,CAAC;AAEF,IAAI,MAAM,GAAgB,UAAU,CAAC;AAErC;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,SAAS,CAAC,YAAyB;IACjD,MAAM,GAAG,YAAY,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { AgentChat, AgentChatResponse } from '@multiplayer-app/ai-agent-types';
2
+ import { SortOrder } from '@multiplayer-app/ai-agent-types';
3
+ import type { AgentChatRepository } from '@multiplayer-app/ai-agent-db';
4
+ /**
5
+ * MongoDB implementation of AgentChatRepository
6
+ */
7
+ export declare class MongoAgentChatRepository implements AgentChatRepository {
8
+ findById(id: string): Promise<AgentChat | null>;
9
+ find(filter?: Partial<AgentChat>, options?: {
10
+ sort?: {
11
+ field: string;
12
+ order: SortOrder;
13
+ };
14
+ limit?: number;
15
+ }): Promise<AgentChat[]>;
16
+ findOne(filter: Partial<AgentChat>): Promise<AgentChat | null>;
17
+ create(entity: Omit<AgentChat, 'id' | 'createdAt' | 'updatedAt'>): Promise<AgentChat>;
18
+ update(id: string, updates: Partial<Omit<AgentChat, 'id' | 'createdAt'>>): Promise<AgentChat | null>;
19
+ delete(id: string): Promise<boolean>;
20
+ exists(id: string): Promise<boolean>;
21
+ count(filter?: Partial<AgentChat>): Promise<number>;
22
+ findByUserId(userId: string): Promise<AgentChat[]>;
23
+ findByContextKey(contextKey: string): Promise<AgentChat[]>;
24
+ findByUserIdAndContextKey(userId: string, contextKey: string): Promise<AgentChat[]>;
25
+ findGuestChatsByContextKey(contextKey: string): Promise<AgentChat[]>;
26
+ updateTitle(id: string, title: string): Promise<AgentChat | null>;
27
+ deleteByUserId(userId: string): Promise<number>;
28
+ deleteByContextKey(contextKey: string): Promise<number>;
29
+ findWithMessages(filter?: Partial<AgentChat>, options?: {
30
+ sort?: {
31
+ field: string;
32
+ order: SortOrder;
33
+ };
34
+ limit?: number;
35
+ }): Promise<AgentChatResponse[]>;
36
+ }
37
+ //# sourceMappingURL=MongoAgentChatRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MongoAgentChatRepository.d.ts","sourceRoot":"","sources":["../../src/repositories/MongoAgentChatRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAY,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AA0BxE;;GAEG;AACH,qBAAa,wBAAyB,YAAW,mBAAmB;IAC5D,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAK/C,IAAI,CACR,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,EAC3B,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,SAAS,CAAA;SAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GACvE,OAAO,CAAC,SAAS,EAAE,CAAC;IA4BjB,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAa9D,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAgBrF,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAUpG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUpC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpC,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAcnD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAKlD,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAK1D,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAKnF,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAQpE,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAUjE,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/C,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKvD,gBAAgB,CACpB,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,EAC3B,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,SAAS,CAAA;SAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GACvE,OAAO,CAAC,iBAAiB,EAAE,CAAC;CA2GhC"}
@@ -0,0 +1,235 @@
1
+ import { ChatType, SortOrder } from '@multiplayer-app/ai-agent-types';
2
+ import { AgentChatModel } from '../schemas/AgentChatSchema';
3
+ import { AgentMessageModel } from '../schemas/AgentMessageSchema';
4
+ import { ObjectId } from '../mongo';
5
+ /**
6
+ * Helper function to convert Mongoose document to AgentChat type
7
+ */
8
+ function toAgentChat(doc) {
9
+ if (!doc)
10
+ return null;
11
+ const chat = doc.toObject ? doc.toObject() : doc;
12
+ return {
13
+ id: doc._id.toString(),
14
+ title: chat.title,
15
+ type: chat.type || ChatType.Chat,
16
+ status: chat.status,
17
+ contextKey: chat.contextKey,
18
+ model: chat.model,
19
+ createdAt: chat.createdAt,
20
+ updatedAt: chat.updatedAt,
21
+ metadata: chat.metadata,
22
+ userId: chat.userId
23
+ };
24
+ }
25
+ /**
26
+ * MongoDB implementation of AgentChatRepository
27
+ */
28
+ export class MongoAgentChatRepository {
29
+ async findById(id) {
30
+ const doc = await AgentChatModel.findById(id).exec();
31
+ return toAgentChat(doc);
32
+ }
33
+ async find(filter, options) {
34
+ const query = {};
35
+ if (filter) {
36
+ if (filter.id) {
37
+ query._id = filter.id;
38
+ delete filter.id;
39
+ }
40
+ Object.assign(query, filter);
41
+ }
42
+ let queryBuilder = AgentChatModel.find(query);
43
+ // Apply sorting
44
+ if (options === null || options === void 0 ? void 0 : options.sort) {
45
+ const sortOrder = options.sort.order === SortOrder.Asc ? 1 : -1;
46
+ queryBuilder = queryBuilder.sort({ [options.sort.field]: sortOrder });
47
+ }
48
+ // Apply limit
49
+ if (options === null || options === void 0 ? void 0 : options.limit) {
50
+ queryBuilder = queryBuilder.limit(options.limit);
51
+ }
52
+ const docs = await queryBuilder.exec();
53
+ return docs.map(doc => toAgentChat(doc)).filter(Boolean);
54
+ }
55
+ async findOne(filter) {
56
+ const query = {};
57
+ if (filter.id) {
58
+ query._id = filter.id;
59
+ delete filter.id;
60
+ }
61
+ Object.assign(query, filter);
62
+ const doc = await AgentChatModel.findOne(query).exec();
63
+ return toAgentChat(doc);
64
+ }
65
+ async create(entity) {
66
+ const now = new Date().toISOString();
67
+ const doc = new AgentChatModel({
68
+ ...entity,
69
+ createdAt: now,
70
+ updatedAt: now,
71
+ });
72
+ const saved = await doc.save();
73
+ const result = toAgentChat(saved);
74
+ if (!result) {
75
+ throw new Error('Failed to create chat');
76
+ }
77
+ return result;
78
+ }
79
+ async update(id, updates) {
80
+ const doc = await AgentChatModel.findByIdAndUpdate(id, { $set: { ...updates, updatedAt: new Date().toISOString() } }, { new: true }).exec();
81
+ return toAgentChat(doc);
82
+ }
83
+ async delete(id) {
84
+ // Delete all related messages first
85
+ await AgentMessageModel.deleteMany({ chat: id }).exec();
86
+ // Then delete the chat
87
+ const result = await AgentChatModel.findByIdAndDelete(id).exec();
88
+ return !!result;
89
+ }
90
+ async exists(id) {
91
+ const count = await AgentChatModel.countDocuments({ _id: id }).exec();
92
+ return count > 0;
93
+ }
94
+ async count(filter) {
95
+ const query = {};
96
+ if (filter) {
97
+ if (filter.id) {
98
+ query._id = filter.id;
99
+ delete filter.id;
100
+ }
101
+ Object.assign(query, filter);
102
+ }
103
+ return AgentChatModel.countDocuments(query).exec();
104
+ }
105
+ async findByUserId(userId) {
106
+ const docs = await AgentChatModel.find({ userId }).exec();
107
+ return docs.map(doc => toAgentChat(doc)).filter(Boolean);
108
+ }
109
+ async findByContextKey(contextKey) {
110
+ const docs = await AgentChatModel.find({ contextKey }).exec();
111
+ return docs.map(doc => toAgentChat(doc)).filter(Boolean);
112
+ }
113
+ async findByUserIdAndContextKey(userId, contextKey) {
114
+ const docs = await AgentChatModel.find({ userId, contextKey }).exec();
115
+ return docs.map(doc => toAgentChat(doc)).filter(Boolean);
116
+ }
117
+ async findGuestChatsByContextKey(contextKey) {
118
+ const docs = await AgentChatModel.find({
119
+ contextKey,
120
+ userId: { $exists: false }
121
+ }).exec();
122
+ return docs.map(doc => toAgentChat(doc)).filter(Boolean);
123
+ }
124
+ async updateTitle(id, title) {
125
+ const doc = await AgentChatModel.findByIdAndUpdate(id, { $set: { title, updatedAt: new Date().toISOString() } }, { new: true }).exec();
126
+ return toAgentChat(doc);
127
+ }
128
+ async deleteByUserId(userId) {
129
+ const result = await AgentChatModel.deleteMany({ userId }).exec();
130
+ return result.deletedCount || 0;
131
+ }
132
+ async deleteByContextKey(contextKey) {
133
+ const result = await AgentChatModel.deleteMany({ contextKey }).exec();
134
+ return result.deletedCount || 0;
135
+ }
136
+ async findWithMessages(filter, options) {
137
+ // Build match stage for filtering
138
+ const matchStage = {};
139
+ if (filter) {
140
+ if (filter.id) {
141
+ matchStage._id = new ObjectId(filter.id);
142
+ }
143
+ if (filter.userId !== undefined) {
144
+ matchStage.userId = filter.userId;
145
+ }
146
+ if (filter.contextKey !== undefined) {
147
+ matchStage.contextKey = filter.contextKey;
148
+ }
149
+ if (filter.type !== undefined) {
150
+ matchStage.type = filter.type;
151
+ }
152
+ if (filter.status !== undefined) {
153
+ matchStage.status = filter.status;
154
+ }
155
+ if (filter.model !== undefined) {
156
+ matchStage.model = filter.model;
157
+ }
158
+ }
159
+ // Build aggregation pipeline
160
+ const pipeline = [
161
+ { $match: matchStage }
162
+ ];
163
+ // Add sort stage before lookup (for better performance)
164
+ if (options === null || options === void 0 ? void 0 : options.sort) {
165
+ const sortField = options.sort.field === 'id' ? '_id' : options.sort.field;
166
+ const sortOrder = options.sort.order === SortOrder.Asc ? 1 : -1;
167
+ pipeline.push({ $sort: { [sortField]: sortOrder } });
168
+ }
169
+ // Add limit before lookup if specified (for better performance)
170
+ if (options === null || options === void 0 ? void 0 : options.limit) {
171
+ pipeline.push({ $limit: options.limit });
172
+ }
173
+ // Lookup messages
174
+ pipeline.push({
175
+ $lookup: {
176
+ from: 'agentmessages',
177
+ localField: '_id',
178
+ foreignField: 'chat',
179
+ as: 'messages'
180
+ }
181
+ });
182
+ // Transform messages
183
+ pipeline.push({
184
+ $addFields: {
185
+ messages: {
186
+ $map: {
187
+ input: { $sortArray: { input: '$messages', sortBy: { createdAt: 1 } } },
188
+ as: 'msg',
189
+ in: {
190
+ id: { $toString: '$$msg._id' },
191
+ chat: { $toString: '$$msg.chat' },
192
+ role: '$$msg.role',
193
+ content: '$$msg.content',
194
+ createdAt: '$$msg.createdAt',
195
+ toolCalls: { $ifNull: ['$$msg.toolCalls', []] },
196
+ attachments: { $ifNull: ['$$msg.attachments', []] },
197
+ annotations: '$$msg.annotations'
198
+ }
199
+ }
200
+ }
201
+ }
202
+ });
203
+ // Project final shape
204
+ pipeline.push({
205
+ $project: {
206
+ id: { $toString: '$_id' },
207
+ title: 1,
208
+ type: { $ifNull: ['$type', ChatType.Chat] },
209
+ status: 1,
210
+ contextKey: 1,
211
+ model: 1,
212
+ createdAt: 1,
213
+ updatedAt: 1,
214
+ metadata: 1,
215
+ userId: 1,
216
+ messages: 1
217
+ }
218
+ });
219
+ const results = await AgentChatModel.aggregate(pipeline).exec();
220
+ return results.map((result) => ({
221
+ id: result.id,
222
+ title: result.title,
223
+ type: result.type || ChatType.Chat,
224
+ status: result.status,
225
+ contextKey: result.contextKey,
226
+ model: result.model,
227
+ createdAt: result.createdAt,
228
+ updatedAt: result.updatedAt,
229
+ metadata: result.metadata,
230
+ userId: result.userId,
231
+ messages: result.messages || []
232
+ }));
233
+ }
234
+ }
235
+ //# sourceMappingURL=MongoAgentChatRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MongoAgentChatRepository.js","sourceRoot":"","sources":["../../src/repositories/MongoAgentChatRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { AgentMessage, MessageRole } from '@multiplayer-app/ai-agent-types';
2
+ import type { AgentMessageRepository } from '@multiplayer-app/ai-agent-db';
3
+ /**
4
+ * MongoDB implementation of AgentMessageRepository
5
+ */
6
+ export declare class MongoAgentMessageRepository implements AgentMessageRepository {
7
+ findById(id: string): Promise<AgentMessage | null>;
8
+ find(filter?: Partial<AgentMessage>): Promise<AgentMessage[]>;
9
+ findOne(filter: Partial<AgentMessage>): Promise<AgentMessage | null>;
10
+ create(entity: Omit<AgentMessage, 'id' | 'createdAt'>, id?: string): Promise<AgentMessage>;
11
+ update(id: string, updates: Partial<Omit<AgentMessage, 'id' | 'createdAt'>>): Promise<AgentMessage | null>;
12
+ delete(id: string): Promise<boolean>;
13
+ exists(id: string): Promise<boolean>;
14
+ count(filter?: Partial<AgentMessage>): Promise<number>;
15
+ findByChatId(chatId: string): Promise<AgentMessage[]>;
16
+ findByRole(role: MessageRole): Promise<AgentMessage[]>;
17
+ findByChatIdAndRole(chatId: string, role?: MessageRole): Promise<AgentMessage[]>;
18
+ findWithToolCalls(chatId?: string): Promise<AgentMessage[]>;
19
+ findWithAttachments(chatId?: string): Promise<AgentMessage[]>;
20
+ deleteByChatId(chatId: string): Promise<number>;
21
+ deleteByRole(role: MessageRole): Promise<number>;
22
+ deleteByChatIdAndRole(chatId: string, role: MessageRole): Promise<number>;
23
+ }
24
+ //# sourceMappingURL=MongoAgentMessageRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MongoAgentMessageRepository.d.ts","sourceRoot":"","sources":["../../src/repositories/MongoAgentMessageRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACjF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AA0B3E;;GAEG;AACH,qBAAa,2BAA4B,YAAW,sBAAsB;IAClE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAKlD,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAe7D,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAapE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,WAAW,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAgB1F,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAU1G,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpC,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IActD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAKrD,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAKtD,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAShF,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAa3D,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAa7D,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/C,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAKhD,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CAIhF"}