@herdctl/discord 0.0.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 (137) hide show
  1. package/dist/__tests__/auto-mode-handler.test.d.ts +2 -0
  2. package/dist/__tests__/auto-mode-handler.test.d.ts.map +1 -0
  3. package/dist/__tests__/auto-mode-handler.test.js +362 -0
  4. package/dist/__tests__/auto-mode-handler.test.js.map +1 -0
  5. package/dist/__tests__/discord-connector.test.d.ts +2 -0
  6. package/dist/__tests__/discord-connector.test.d.ts.map +1 -0
  7. package/dist/__tests__/discord-connector.test.js +958 -0
  8. package/dist/__tests__/discord-connector.test.js.map +1 -0
  9. package/dist/__tests__/error-handler.test.d.ts +2 -0
  10. package/dist/__tests__/error-handler.test.d.ts.map +1 -0
  11. package/dist/__tests__/error-handler.test.js +509 -0
  12. package/dist/__tests__/error-handler.test.js.map +1 -0
  13. package/dist/__tests__/errors.test.d.ts +2 -0
  14. package/dist/__tests__/errors.test.d.ts.map +1 -0
  15. package/dist/__tests__/errors.test.js +152 -0
  16. package/dist/__tests__/errors.test.js.map +1 -0
  17. package/dist/__tests__/logger.test.d.ts +2 -0
  18. package/dist/__tests__/logger.test.d.ts.map +1 -0
  19. package/dist/__tests__/logger.test.js +282 -0
  20. package/dist/__tests__/logger.test.js.map +1 -0
  21. package/dist/__tests__/mention-handler.test.d.ts +2 -0
  22. package/dist/__tests__/mention-handler.test.d.ts.map +1 -0
  23. package/dist/__tests__/mention-handler.test.js +547 -0
  24. package/dist/__tests__/mention-handler.test.js.map +1 -0
  25. package/dist/auto-mode-handler.d.ts +145 -0
  26. package/dist/auto-mode-handler.d.ts.map +1 -0
  27. package/dist/auto-mode-handler.js +211 -0
  28. package/dist/auto-mode-handler.js.map +1 -0
  29. package/dist/commands/__tests__/command-manager.test.d.ts +2 -0
  30. package/dist/commands/__tests__/command-manager.test.d.ts.map +1 -0
  31. package/dist/commands/__tests__/command-manager.test.js +307 -0
  32. package/dist/commands/__tests__/command-manager.test.js.map +1 -0
  33. package/dist/commands/__tests__/help.test.d.ts +2 -0
  34. package/dist/commands/__tests__/help.test.d.ts.map +1 -0
  35. package/dist/commands/__tests__/help.test.js +105 -0
  36. package/dist/commands/__tests__/help.test.js.map +1 -0
  37. package/dist/commands/__tests__/reset.test.d.ts +2 -0
  38. package/dist/commands/__tests__/reset.test.d.ts.map +1 -0
  39. package/dist/commands/__tests__/reset.test.js +140 -0
  40. package/dist/commands/__tests__/reset.test.js.map +1 -0
  41. package/dist/commands/__tests__/status.test.d.ts +2 -0
  42. package/dist/commands/__tests__/status.test.d.ts.map +1 -0
  43. package/dist/commands/__tests__/status.test.js +205 -0
  44. package/dist/commands/__tests__/status.test.js.map +1 -0
  45. package/dist/commands/command-manager.d.ts +66 -0
  46. package/dist/commands/command-manager.d.ts.map +1 -0
  47. package/dist/commands/command-manager.js +191 -0
  48. package/dist/commands/command-manager.js.map +1 -0
  49. package/dist/commands/help.d.ts +8 -0
  50. package/dist/commands/help.d.ts.map +1 -0
  51. package/dist/commands/help.js +27 -0
  52. package/dist/commands/help.js.map +1 -0
  53. package/dist/commands/index.d.ts +12 -0
  54. package/dist/commands/index.d.ts.map +1 -0
  55. package/dist/commands/index.js +13 -0
  56. package/dist/commands/index.js.map +1 -0
  57. package/dist/commands/reset.d.ts +9 -0
  58. package/dist/commands/reset.d.ts.map +1 -0
  59. package/dist/commands/reset.js +28 -0
  60. package/dist/commands/reset.js.map +1 -0
  61. package/dist/commands/status.d.ts +9 -0
  62. package/dist/commands/status.d.ts.map +1 -0
  63. package/dist/commands/status.js +102 -0
  64. package/dist/commands/status.js.map +1 -0
  65. package/dist/commands/types.d.ts +87 -0
  66. package/dist/commands/types.d.ts.map +1 -0
  67. package/dist/commands/types.js +8 -0
  68. package/dist/commands/types.js.map +1 -0
  69. package/dist/discord-connector.d.ts +154 -0
  70. package/dist/discord-connector.d.ts.map +1 -0
  71. package/dist/discord-connector.js +638 -0
  72. package/dist/discord-connector.js.map +1 -0
  73. package/dist/error-handler.d.ts +237 -0
  74. package/dist/error-handler.d.ts.map +1 -0
  75. package/dist/error-handler.js +433 -0
  76. package/dist/error-handler.js.map +1 -0
  77. package/dist/errors.d.ts +61 -0
  78. package/dist/errors.d.ts.map +1 -0
  79. package/dist/errors.js +77 -0
  80. package/dist/errors.js.map +1 -0
  81. package/dist/index.d.ts +34 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +36 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/logger.d.ts +119 -0
  86. package/dist/logger.d.ts.map +1 -0
  87. package/dist/logger.js +198 -0
  88. package/dist/logger.js.map +1 -0
  89. package/dist/mention-handler.d.ts +176 -0
  90. package/dist/mention-handler.d.ts.map +1 -0
  91. package/dist/mention-handler.js +236 -0
  92. package/dist/mention-handler.js.map +1 -0
  93. package/dist/session-manager/__tests__/errors.test.d.ts +2 -0
  94. package/dist/session-manager/__tests__/errors.test.d.ts.map +1 -0
  95. package/dist/session-manager/__tests__/errors.test.js +124 -0
  96. package/dist/session-manager/__tests__/errors.test.js.map +1 -0
  97. package/dist/session-manager/__tests__/session-manager.test.d.ts +2 -0
  98. package/dist/session-manager/__tests__/session-manager.test.d.ts.map +1 -0
  99. package/dist/session-manager/__tests__/session-manager.test.js +517 -0
  100. package/dist/session-manager/__tests__/session-manager.test.js.map +1 -0
  101. package/dist/session-manager/__tests__/types.test.d.ts +2 -0
  102. package/dist/session-manager/__tests__/types.test.d.ts.map +1 -0
  103. package/dist/session-manager/__tests__/types.test.js +169 -0
  104. package/dist/session-manager/__tests__/types.test.js.map +1 -0
  105. package/dist/session-manager/errors.d.ts +58 -0
  106. package/dist/session-manager/errors.d.ts.map +1 -0
  107. package/dist/session-manager/errors.js +70 -0
  108. package/dist/session-manager/errors.js.map +1 -0
  109. package/dist/session-manager/index.d.ts +11 -0
  110. package/dist/session-manager/index.d.ts.map +1 -0
  111. package/dist/session-manager/index.js +12 -0
  112. package/dist/session-manager/index.js.map +1 -0
  113. package/dist/session-manager/session-manager.d.ts +107 -0
  114. package/dist/session-manager/session-manager.d.ts.map +1 -0
  115. package/dist/session-manager/session-manager.js +347 -0
  116. package/dist/session-manager/session-manager.js.map +1 -0
  117. package/dist/session-manager/types.d.ts +167 -0
  118. package/dist/session-manager/types.d.ts.map +1 -0
  119. package/dist/session-manager/types.js +57 -0
  120. package/dist/session-manager/types.js.map +1 -0
  121. package/dist/types.d.ts +323 -0
  122. package/dist/types.d.ts.map +1 -0
  123. package/dist/types.js +8 -0
  124. package/dist/types.js.map +1 -0
  125. package/dist/utils/__tests__/formatting.test.d.ts +2 -0
  126. package/dist/utils/__tests__/formatting.test.d.ts.map +1 -0
  127. package/dist/utils/__tests__/formatting.test.js +571 -0
  128. package/dist/utils/__tests__/formatting.test.js.map +1 -0
  129. package/dist/utils/formatting.d.ts +211 -0
  130. package/dist/utils/formatting.d.ts.map +1 -0
  131. package/dist/utils/formatting.js +305 -0
  132. package/dist/utils/formatting.js.map +1 -0
  133. package/dist/utils/index.d.ts +5 -0
  134. package/dist/utils/index.d.ts.map +1 -0
  135. package/dist/utils/index.js +9 -0
  136. package/dist/utils/index.js.map +1 -0
  137. package/package.json +49 -0
@@ -0,0 +1,169 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { ChannelSessionSchema, DiscordSessionStateSchema, createInitialSessionState, createChannelSession, } from "../types.js";
3
+ // =============================================================================
4
+ // ChannelSessionSchema Tests
5
+ // =============================================================================
6
+ describe("ChannelSessionSchema", () => {
7
+ it("validates valid channel session", () => {
8
+ const session = {
9
+ sessionId: "discord-test-123",
10
+ lastMessageAt: "2024-01-15T10:30:00.000Z",
11
+ };
12
+ const result = ChannelSessionSchema.safeParse(session);
13
+ expect(result.success).toBe(true);
14
+ if (result.success) {
15
+ expect(result.data.sessionId).toBe("discord-test-123");
16
+ expect(result.data.lastMessageAt).toBe("2024-01-15T10:30:00.000Z");
17
+ }
18
+ });
19
+ it("rejects empty sessionId", () => {
20
+ const session = {
21
+ sessionId: "",
22
+ lastMessageAt: "2024-01-15T10:30:00.000Z",
23
+ };
24
+ const result = ChannelSessionSchema.safeParse(session);
25
+ expect(result.success).toBe(false);
26
+ });
27
+ it("rejects invalid lastMessageAt", () => {
28
+ const session = {
29
+ sessionId: "discord-test-123",
30
+ lastMessageAt: "not-a-date",
31
+ };
32
+ const result = ChannelSessionSchema.safeParse(session);
33
+ expect(result.success).toBe(false);
34
+ });
35
+ it("rejects missing fields", () => {
36
+ const sessions = [
37
+ { sessionId: "test" },
38
+ { lastMessageAt: "2024-01-15T10:30:00.000Z" },
39
+ {},
40
+ ];
41
+ for (const session of sessions) {
42
+ const result = ChannelSessionSchema.safeParse(session);
43
+ expect(result.success).toBe(false);
44
+ }
45
+ });
46
+ });
47
+ // =============================================================================
48
+ // DiscordSessionStateSchema Tests
49
+ // =============================================================================
50
+ describe("DiscordSessionStateSchema", () => {
51
+ it("validates valid session state", () => {
52
+ const state = {
53
+ version: 1,
54
+ agentName: "test-agent",
55
+ channels: {
56
+ "channel-123": {
57
+ sessionId: "discord-test-123",
58
+ lastMessageAt: "2024-01-15T10:30:00.000Z",
59
+ },
60
+ },
61
+ };
62
+ const result = DiscordSessionStateSchema.safeParse(state);
63
+ expect(result.success).toBe(true);
64
+ if (result.success) {
65
+ expect(result.data.version).toBe(1);
66
+ expect(result.data.agentName).toBe("test-agent");
67
+ expect(result.data.channels["channel-123"].sessionId).toBe("discord-test-123");
68
+ }
69
+ });
70
+ it("validates empty channels", () => {
71
+ const state = {
72
+ version: 1,
73
+ agentName: "test-agent",
74
+ channels: {},
75
+ };
76
+ const result = DiscordSessionStateSchema.safeParse(state);
77
+ expect(result.success).toBe(true);
78
+ });
79
+ it("rejects wrong version", () => {
80
+ const state = {
81
+ version: 2,
82
+ agentName: "test-agent",
83
+ channels: {},
84
+ };
85
+ const result = DiscordSessionStateSchema.safeParse(state);
86
+ expect(result.success).toBe(false);
87
+ });
88
+ it("rejects empty agentName", () => {
89
+ const state = {
90
+ version: 1,
91
+ agentName: "",
92
+ channels: {},
93
+ };
94
+ const result = DiscordSessionStateSchema.safeParse(state);
95
+ expect(result.success).toBe(false);
96
+ });
97
+ it("rejects invalid channel session", () => {
98
+ const state = {
99
+ version: 1,
100
+ agentName: "test-agent",
101
+ channels: {
102
+ "channel-123": {
103
+ sessionId: "",
104
+ lastMessageAt: "2024-01-15T10:30:00.000Z",
105
+ },
106
+ },
107
+ };
108
+ const result = DiscordSessionStateSchema.safeParse(state);
109
+ expect(result.success).toBe(false);
110
+ });
111
+ it("validates multiple channels", () => {
112
+ const state = {
113
+ version: 1,
114
+ agentName: "test-agent",
115
+ channels: {
116
+ "channel-1": {
117
+ sessionId: "session-1",
118
+ lastMessageAt: "2024-01-15T10:30:00.000Z",
119
+ },
120
+ "channel-2": {
121
+ sessionId: "session-2",
122
+ lastMessageAt: "2024-01-15T11:30:00.000Z",
123
+ },
124
+ },
125
+ };
126
+ const result = DiscordSessionStateSchema.safeParse(state);
127
+ expect(result.success).toBe(true);
128
+ if (result.success) {
129
+ expect(Object.keys(result.data.channels)).toHaveLength(2);
130
+ }
131
+ });
132
+ });
133
+ // =============================================================================
134
+ // Factory Function Tests
135
+ // =============================================================================
136
+ describe("createInitialSessionState", () => {
137
+ it("creates initial state with correct values", () => {
138
+ const state = createInitialSessionState("my-agent");
139
+ expect(state.version).toBe(1);
140
+ expect(state.agentName).toBe("my-agent");
141
+ expect(state.channels).toEqual({});
142
+ });
143
+ it("creates valid schema-compliant state", () => {
144
+ const state = createInitialSessionState("test-agent");
145
+ const result = DiscordSessionStateSchema.safeParse(state);
146
+ expect(result.success).toBe(true);
147
+ });
148
+ });
149
+ describe("createChannelSession", () => {
150
+ it("creates session with provided sessionId", () => {
151
+ const session = createChannelSession("my-session-id");
152
+ expect(session.sessionId).toBe("my-session-id");
153
+ expect(session.lastMessageAt).toBeTruthy();
154
+ });
155
+ it("sets lastMessageAt to current time", () => {
156
+ const before = new Date();
157
+ const session = createChannelSession("test-session");
158
+ const after = new Date();
159
+ const timestamp = new Date(session.lastMessageAt);
160
+ expect(timestamp.getTime()).toBeGreaterThanOrEqual(before.getTime());
161
+ expect(timestamp.getTime()).toBeLessThanOrEqual(after.getTime());
162
+ });
163
+ it("creates valid schema-compliant session", () => {
164
+ const session = createChannelSession("test-session");
165
+ const result = ChannelSessionSchema.safeParse(session);
166
+ expect(result.success).toBe(true);
167
+ });
168
+ });
169
+ //# sourceMappingURL=types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../../src/session-manager/__tests__/types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAErB,gFAAgF;AAChF,6BAA6B;AAC7B,gFAAgF;AAEhF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,OAAO,GAAG;YACd,SAAS,EAAE,kBAAkB;YAC7B,aAAa,EAAE,0BAA0B;SAC1C,CAAC;QAEF,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAEvD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACrE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,OAAO,GAAG;YACd,SAAS,EAAE,EAAE;YACb,aAAa,EAAE,0BAA0B;SAC1C,CAAC;QAEF,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAEvD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,OAAO,GAAG;YACd,SAAS,EAAE,kBAAkB;YAC7B,aAAa,EAAE,YAAY;SAC5B,CAAC;QAEF,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAEvD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,QAAQ,GAAG;YACf,EAAE,SAAS,EAAE,MAAM,EAAE;YACrB,EAAE,aAAa,EAAE,0BAA0B,EAAE;YAC7C,EAAE;SACH,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAChF,kCAAkC;AAClC,gFAAgF;AAEhF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,YAAY;YACvB,QAAQ,EAAE;gBACR,aAAa,EAAE;oBACb,SAAS,EAAE,kBAAkB;oBAC7B,aAAa,EAAE,0BAA0B;iBAC1C;aACF;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE1D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CACxD,kBAAkB,CACnB,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,YAAY;YACvB,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE1D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,YAAY;YACvB,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE1D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE1D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,YAAY;YACvB,QAAQ,EAAE;gBACR,aAAa,EAAE;oBACb,SAAS,EAAE,EAAE;oBACb,aAAa,EAAE,0BAA0B;iBAC1C;aACF;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE1D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,YAAY;YACvB,QAAQ,EAAE;gBACR,WAAW,EAAE;oBACX,SAAS,EAAE,WAAW;oBACtB,aAAa,EAAE,0BAA0B;iBAC1C;gBACD,WAAW,EAAE;oBACX,SAAS,EAAE,WAAW;oBACtB,aAAa,EAAE,0BAA0B;iBAC1C;aACF;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE1D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAEhF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,KAAK,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;QAEpD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,KAAK,GAAG,yBAAyB,CAAC,YAAY,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE1D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,OAAO,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC;QAEtD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,UAAU,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;QAEzB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,OAAO,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAEvD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Error classes for Discord session management
3
+ *
4
+ * Provides typed errors for session persistence and retrieval failures.
5
+ */
6
+ /**
7
+ * Error codes for session manager operations
8
+ */
9
+ export declare enum SessionErrorCode {
10
+ STATE_READ_FAILED = "SESSION_STATE_READ_FAILED",
11
+ STATE_WRITE_FAILED = "SESSION_STATE_WRITE_FAILED",
12
+ DIRECTORY_CREATE_FAILED = "SESSION_DIRECTORY_CREATE_FAILED",
13
+ SESSION_NOT_FOUND = "SESSION_NOT_FOUND",
14
+ SESSION_EXPIRED = "SESSION_EXPIRED",
15
+ INVALID_STATE = "SESSION_INVALID_STATE"
16
+ }
17
+ /**
18
+ * Base error class for session manager operations
19
+ */
20
+ export declare class SessionManagerError extends Error {
21
+ readonly code: SessionErrorCode;
22
+ readonly agentName: string;
23
+ constructor(message: string, code: SessionErrorCode, agentName: string, options?: {
24
+ cause?: Error;
25
+ });
26
+ }
27
+ /**
28
+ * Error thrown when session state file cannot be read
29
+ */
30
+ export declare class SessionStateReadError extends SessionManagerError {
31
+ readonly path: string;
32
+ constructor(agentName: string, path: string, options?: {
33
+ cause?: Error;
34
+ });
35
+ }
36
+ /**
37
+ * Error thrown when session state file cannot be written
38
+ */
39
+ export declare class SessionStateWriteError extends SessionManagerError {
40
+ readonly path: string;
41
+ constructor(agentName: string, path: string, options?: {
42
+ cause?: Error;
43
+ });
44
+ }
45
+ /**
46
+ * Error thrown when session directory cannot be created
47
+ */
48
+ export declare class SessionDirectoryCreateError extends SessionManagerError {
49
+ readonly path: string;
50
+ constructor(agentName: string, path: string, options?: {
51
+ cause?: Error;
52
+ });
53
+ }
54
+ /**
55
+ * Type guard to check if an error is a SessionManagerError
56
+ */
57
+ export declare function isSessionManagerError(error: unknown): error is SessionManagerError;
58
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/session-manager/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,oBAAY,gBAAgB;IAC1B,iBAAiB,8BAA8B;IAC/C,kBAAkB,+BAA+B;IACjD,uBAAuB,oCAAoC;IAC3D,iBAAiB,sBAAsB;IACvC,eAAe,oBAAoB;IACnC,aAAa,0BAA0B;CACxC;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,SAAgB,IAAI,EAAE,gBAAgB,CAAC;IACvC,SAAgB,SAAS,EAAE,MAAM,CAAC;gBAGhC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;CAO9B;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,mBAAmB;IAC5D,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAG3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;CAW9B;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,mBAAmB;IAC7D,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAG3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;CAW9B;AAED;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,mBAAmB;IAClE,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAG3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;CAW9B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,mBAAmB,CAE9B"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Error classes for Discord session management
3
+ *
4
+ * Provides typed errors for session persistence and retrieval failures.
5
+ */
6
+ /**
7
+ * Error codes for session manager operations
8
+ */
9
+ export var SessionErrorCode;
10
+ (function (SessionErrorCode) {
11
+ SessionErrorCode["STATE_READ_FAILED"] = "SESSION_STATE_READ_FAILED";
12
+ SessionErrorCode["STATE_WRITE_FAILED"] = "SESSION_STATE_WRITE_FAILED";
13
+ SessionErrorCode["DIRECTORY_CREATE_FAILED"] = "SESSION_DIRECTORY_CREATE_FAILED";
14
+ SessionErrorCode["SESSION_NOT_FOUND"] = "SESSION_NOT_FOUND";
15
+ SessionErrorCode["SESSION_EXPIRED"] = "SESSION_EXPIRED";
16
+ SessionErrorCode["INVALID_STATE"] = "SESSION_INVALID_STATE";
17
+ })(SessionErrorCode || (SessionErrorCode = {}));
18
+ /**
19
+ * Base error class for session manager operations
20
+ */
21
+ export class SessionManagerError extends Error {
22
+ code;
23
+ agentName;
24
+ constructor(message, code, agentName, options) {
25
+ super(message, options);
26
+ this.name = "SessionManagerError";
27
+ this.code = code;
28
+ this.agentName = agentName;
29
+ }
30
+ }
31
+ /**
32
+ * Error thrown when session state file cannot be read
33
+ */
34
+ export class SessionStateReadError extends SessionManagerError {
35
+ path;
36
+ constructor(agentName, path, options) {
37
+ super(`Failed to read session state for agent '${agentName}' from '${path}'`, SessionErrorCode.STATE_READ_FAILED, agentName, options);
38
+ this.name = "SessionStateReadError";
39
+ this.path = path;
40
+ }
41
+ }
42
+ /**
43
+ * Error thrown when session state file cannot be written
44
+ */
45
+ export class SessionStateWriteError extends SessionManagerError {
46
+ path;
47
+ constructor(agentName, path, options) {
48
+ super(`Failed to write session state for agent '${agentName}' to '${path}'`, SessionErrorCode.STATE_WRITE_FAILED, agentName, options);
49
+ this.name = "SessionStateWriteError";
50
+ this.path = path;
51
+ }
52
+ }
53
+ /**
54
+ * Error thrown when session directory cannot be created
55
+ */
56
+ export class SessionDirectoryCreateError extends SessionManagerError {
57
+ path;
58
+ constructor(agentName, path, options) {
59
+ super(`Failed to create session directory for agent '${agentName}' at '${path}'`, SessionErrorCode.DIRECTORY_CREATE_FAILED, agentName, options);
60
+ this.name = "SessionDirectoryCreateError";
61
+ this.path = path;
62
+ }
63
+ }
64
+ /**
65
+ * Type guard to check if an error is a SessionManagerError
66
+ */
67
+ export function isSessionManagerError(error) {
68
+ return error instanceof SessionManagerError;
69
+ }
70
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/session-manager/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,CAAN,IAAY,gBAOX;AAPD,WAAY,gBAAgB;IAC1B,mEAA+C,CAAA;IAC/C,qEAAiD,CAAA;IACjD,+EAA2D,CAAA;IAC3D,2DAAuC,CAAA;IACvC,uDAAmC,CAAA;IACnC,2DAAuC,CAAA;AACzC,CAAC,EAPW,gBAAgB,KAAhB,gBAAgB,QAO3B;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5B,IAAI,CAAmB;IACvB,SAAS,CAAS;IAElC,YACE,OAAe,EACf,IAAsB,EACtB,SAAiB,EACjB,OAA2B;QAE3B,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,mBAAmB;IAC5C,IAAI,CAAS;IAE7B,YACE,SAAiB,EACjB,IAAY,EACZ,OAA2B;QAE3B,KAAK,CACH,2CAA2C,SAAS,WAAW,IAAI,GAAG,EACtE,gBAAgB,CAAC,iBAAiB,EAClC,SAAS,EACT,OAAO,CACR,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,mBAAmB;IAC7C,IAAI,CAAS;IAE7B,YACE,SAAiB,EACjB,IAAY,EACZ,OAA2B;QAE3B,KAAK,CACH,4CAA4C,SAAS,SAAS,IAAI,GAAG,EACrE,gBAAgB,CAAC,kBAAkB,EACnC,SAAS,EACT,OAAO,CACR,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,mBAAmB;IAClD,IAAI,CAAS;IAE7B,YACE,SAAiB,EACjB,IAAY,EACZ,OAA2B;QAE3B,KAAK,CACH,iDAAiD,SAAS,SAAS,IAAI,GAAG,EAC1E,gBAAgB,CAAC,uBAAuB,EACxC,SAAS,EACT,OAAO,CACR,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAc;IAEd,OAAO,KAAK,YAAY,mBAAmB,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Session manager module for Discord channel conversations
3
+ *
4
+ * Provides per-channel session management for Claude conversations,
5
+ * enabling conversation context preservation across Discord channels.
6
+ */
7
+ export { SessionManager } from "./session-manager.js";
8
+ export type { SessionManagerOptions, SessionManagerLogger, ISessionManager, SessionResult, ChannelSession, DiscordSessionState, } from "./types.js";
9
+ export { DiscordSessionStateSchema, ChannelSessionSchema, createInitialSessionState, createChannelSession, } from "./types.js";
10
+ export { SessionErrorCode, SessionManagerError, SessionStateReadError, SessionStateWriteError, SessionDirectoryCreateError, isSessionManagerError, } from "./errors.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session-manager/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,cAAc,EACd,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Session manager module for Discord channel conversations
3
+ *
4
+ * Provides per-channel session management for Claude conversations,
5
+ * enabling conversation context preservation across Discord channels.
6
+ */
7
+ // Main class
8
+ export { SessionManager } from "./session-manager.js";
9
+ export { DiscordSessionStateSchema, ChannelSessionSchema, createInitialSessionState, createChannelSession, } from "./types.js";
10
+ // Errors
11
+ export { SessionErrorCode, SessionManagerError, SessionStateReadError, SessionStateWriteError, SessionDirectoryCreateError, isSessionManagerError, } from "./errors.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session-manager/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,aAAa;AACb,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAYtD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,SAAS;AACT,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Session manager for Discord channel conversations
3
+ *
4
+ * Provides per-channel session management for Claude conversations,
5
+ * enabling conversation context preservation across Discord channels.
6
+ *
7
+ * Sessions are stored at .herdctl/discord-sessions/<agent-name>.yaml
8
+ */
9
+ import { type SessionManagerOptions, type ISessionManager, type SessionResult, type ChannelSession } from "./types.js";
10
+ /**
11
+ * SessionManager manages per-channel Claude sessions for a Discord agent.
12
+ *
13
+ * Each agent has its own SessionManager instance, storing session mappings
14
+ * in a YAML file at .herdctl/discord-sessions/<agent-name>.yaml
15
+ *
16
+ * Features:
17
+ * - Create new sessions for channels/DMs
18
+ * - Resume existing sessions when user sends messages
19
+ * - Automatic session expiry based on configurable timeout
20
+ * - Cleanup expired sessions on startup
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const sessionManager = new SessionManager({
25
+ * agentName: 'my-agent',
26
+ * stateDir: '.herdctl',
27
+ * sessionExpiryHours: 24,
28
+ * });
29
+ *
30
+ * // Get or create a session for a channel
31
+ * const { sessionId, isNew } = await sessionManager.getOrCreateSession('channel-123');
32
+ *
33
+ * // After sending/receiving a message
34
+ * await sessionManager.touchSession('channel-123');
35
+ *
36
+ * // Cleanup expired sessions on startup
37
+ * const cleanedUp = await sessionManager.cleanupExpiredSessions();
38
+ * ```
39
+ */
40
+ export declare class SessionManager implements ISessionManager {
41
+ readonly agentName: string;
42
+ private readonly stateDir;
43
+ private readonly sessionExpiryHours;
44
+ private readonly logger;
45
+ private readonly stateFilePath;
46
+ private state;
47
+ constructor(options: SessionManagerOptions);
48
+ /**
49
+ * Get or create a session for a channel/DM
50
+ *
51
+ * If an active (non-expired) session exists, returns it.
52
+ * Otherwise, creates a new session with a generated session ID.
53
+ */
54
+ getOrCreateSession(channelId: string): Promise<SessionResult>;
55
+ /**
56
+ * Update the last message timestamp for a session
57
+ */
58
+ touchSession(channelId: string): Promise<void>;
59
+ /**
60
+ * Get an existing session without creating one
61
+ *
62
+ * Returns null if no session exists or if the session is expired.
63
+ */
64
+ getSession(channelId: string): Promise<ChannelSession | null>;
65
+ /**
66
+ * Clear a specific session
67
+ */
68
+ clearSession(channelId: string): Promise<boolean>;
69
+ /**
70
+ * Clean up all expired sessions
71
+ *
72
+ * Should be called on connector startup and periodically.
73
+ */
74
+ cleanupExpiredSessions(): Promise<number>;
75
+ /**
76
+ * Generate a unique session ID
77
+ */
78
+ private generateSessionId;
79
+ /**
80
+ * Check if a session is expired
81
+ */
82
+ private isSessionExpired;
83
+ /**
84
+ * Load session state from disk
85
+ *
86
+ * Returns cached state if available, otherwise loads from file.
87
+ * Creates initial state if file doesn't exist.
88
+ */
89
+ private loadState;
90
+ /**
91
+ * Save session state to disk atomically
92
+ */
93
+ private saveState;
94
+ /**
95
+ * Ensure the discord-sessions directory exists
96
+ */
97
+ private ensureDirectoryExists;
98
+ /**
99
+ * Generate a temp file path for atomic writes
100
+ */
101
+ private generateTempPath;
102
+ /**
103
+ * Rename with retry logic for Windows compatibility
104
+ */
105
+ private renameWithRetry;
106
+ }
107
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session-manager/session-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,EACL,KAAK,qBAAqB,EAE1B,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,cAAc,EAKpB,MAAM,YAAY,CAAC;AA6BpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,cAAe,YAAW,eAAe;IACpD,SAAgB,SAAS,EAAE,MAAM,CAAC;IAElC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAGvC,OAAO,CAAC,KAAK,CAAoC;gBAErC,OAAO,EAAE,qBAAqB;IAmB1C;;;;;OAKG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAkCnE;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBpD;;;;OAIG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAsBnE;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAevD;;;;OAIG;IACG,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IA8B/C;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;;;;OAKG;YACW,SAAS;IAyDvB;;OAEG;YACW,SAAS;IA8BvB;;OAEG;YACW,qBAAqB;IAiBnC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;YACW,eAAe;CA+B9B"}