@herdctl/slack 0.0.1 → 0.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 (102) hide show
  1. package/LICENSE +21 -0
  2. package/dist/__tests__/command-handler.test.d.ts +2 -0
  3. package/dist/__tests__/command-handler.test.d.ts.map +1 -0
  4. package/dist/__tests__/command-handler.test.js +141 -0
  5. package/dist/__tests__/command-handler.test.js.map +1 -0
  6. package/dist/__tests__/error-handler.test.d.ts +2 -0
  7. package/dist/__tests__/error-handler.test.d.ts.map +1 -0
  8. package/dist/__tests__/error-handler.test.js +168 -0
  9. package/dist/__tests__/error-handler.test.js.map +1 -0
  10. package/dist/__tests__/errors.test.d.ts +2 -0
  11. package/dist/__tests__/errors.test.d.ts.map +1 -0
  12. package/dist/__tests__/errors.test.js +133 -0
  13. package/dist/__tests__/errors.test.js.map +1 -0
  14. package/dist/__tests__/formatting.test.d.ts +2 -0
  15. package/dist/__tests__/formatting.test.d.ts.map +1 -0
  16. package/dist/__tests__/formatting.test.js +216 -0
  17. package/dist/__tests__/formatting.test.js.map +1 -0
  18. package/dist/__tests__/logger.test.d.ts +2 -0
  19. package/dist/__tests__/logger.test.d.ts.map +1 -0
  20. package/dist/__tests__/logger.test.js +97 -0
  21. package/dist/__tests__/logger.test.js.map +1 -0
  22. package/dist/__tests__/message-handler.test.d.ts +2 -0
  23. package/dist/__tests__/message-handler.test.d.ts.map +1 -0
  24. package/dist/__tests__/message-handler.test.js +78 -0
  25. package/dist/__tests__/message-handler.test.js.map +1 -0
  26. package/dist/__tests__/session-manager.test.d.ts +2 -0
  27. package/dist/__tests__/session-manager.test.d.ts.map +1 -0
  28. package/dist/__tests__/session-manager.test.js +214 -0
  29. package/dist/__tests__/session-manager.test.js.map +1 -0
  30. package/dist/__tests__/slack-connector.test.d.ts +2 -0
  31. package/dist/__tests__/slack-connector.test.d.ts.map +1 -0
  32. package/dist/__tests__/slack-connector.test.js +376 -0
  33. package/dist/__tests__/slack-connector.test.js.map +1 -0
  34. package/dist/commands/command-handler.d.ts +72 -0
  35. package/dist/commands/command-handler.d.ts.map +1 -0
  36. package/dist/commands/command-handler.js +85 -0
  37. package/dist/commands/command-handler.js.map +1 -0
  38. package/dist/commands/help.d.ts +6 -0
  39. package/dist/commands/help.d.ts.map +1 -0
  40. package/dist/commands/help.js +22 -0
  41. package/dist/commands/help.js.map +1 -0
  42. package/dist/commands/index.d.ts +11 -0
  43. package/dist/commands/index.d.ts.map +1 -0
  44. package/dist/commands/index.js +10 -0
  45. package/dist/commands/index.js.map +1 -0
  46. package/dist/commands/reset.d.ts +6 -0
  47. package/dist/commands/reset.d.ts.map +1 -0
  48. package/dist/commands/reset.js +18 -0
  49. package/dist/commands/reset.js.map +1 -0
  50. package/dist/commands/status.d.ts +6 -0
  51. package/dist/commands/status.d.ts.map +1 -0
  52. package/dist/commands/status.js +94 -0
  53. package/dist/commands/status.js.map +1 -0
  54. package/dist/error-handler.d.ts +50 -0
  55. package/dist/error-handler.d.ts.map +1 -0
  56. package/dist/error-handler.js +123 -0
  57. package/dist/error-handler.js.map +1 -0
  58. package/dist/errors.d.ts +59 -0
  59. package/dist/errors.d.ts.map +1 -0
  60. package/dist/errors.js +73 -0
  61. package/dist/errors.js.map +1 -0
  62. package/dist/formatting.d.ts +83 -0
  63. package/dist/formatting.d.ts.map +1 -0
  64. package/dist/formatting.js +155 -0
  65. package/dist/formatting.js.map +1 -0
  66. package/dist/index.d.ts +31 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +34 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/logger.d.ts +28 -0
  71. package/dist/logger.d.ts.map +1 -0
  72. package/dist/logger.js +40 -0
  73. package/dist/logger.js.map +1 -0
  74. package/dist/message-handler.d.ts +62 -0
  75. package/dist/message-handler.d.ts.map +1 -0
  76. package/dist/message-handler.js +85 -0
  77. package/dist/message-handler.js.map +1 -0
  78. package/dist/session-manager/errors.d.ts +58 -0
  79. package/dist/session-manager/errors.d.ts.map +1 -0
  80. package/dist/session-manager/errors.js +70 -0
  81. package/dist/session-manager/errors.js.map +1 -0
  82. package/dist/session-manager/index.d.ts +9 -0
  83. package/dist/session-manager/index.d.ts.map +1 -0
  84. package/dist/session-manager/index.js +13 -0
  85. package/dist/session-manager/index.js.map +1 -0
  86. package/dist/session-manager/session-manager.d.ts +62 -0
  87. package/dist/session-manager/session-manager.d.ts.map +1 -0
  88. package/dist/session-manager/session-manager.js +325 -0
  89. package/dist/session-manager/session-manager.js.map +1 -0
  90. package/dist/session-manager/types.d.ts +154 -0
  91. package/dist/session-manager/types.d.ts.map +1 -0
  92. package/dist/session-manager/types.js +57 -0
  93. package/dist/session-manager/types.js.map +1 -0
  94. package/dist/slack-connector.d.ts +53 -0
  95. package/dist/slack-connector.d.ts.map +1 -0
  96. package/dist/slack-connector.js +447 -0
  97. package/dist/slack-connector.js.map +1 -0
  98. package/dist/types.d.ts +211 -0
  99. package/dist/types.d.ts.map +1 -0
  100. package/dist/types.js +8 -0
  101. package/dist/types.js.map +1 -0
  102. package/package.json +42 -4
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Type definitions for Slack session management
3
+ *
4
+ * Provides interfaces for per-channel session state tracking,
5
+ * enabling conversation context preservation across Slack channels.
6
+ */
7
+ import { z } from "zod";
8
+ /**
9
+ * Schema for individual channel session mapping
10
+ */
11
+ export declare const ChannelSessionSchema: z.ZodObject<{
12
+ /** Claude session ID for resuming conversations */
13
+ sessionId: z.ZodString;
14
+ /** ISO timestamp when last message was sent/received */
15
+ lastMessageAt: z.ZodString;
16
+ }, "strip", z.ZodTypeAny, {
17
+ sessionId: string;
18
+ lastMessageAt: string;
19
+ }, {
20
+ sessionId: string;
21
+ lastMessageAt: string;
22
+ }>;
23
+ /**
24
+ * Schema for the entire agent's Slack session state file
25
+ *
26
+ * Stored at .herdctl/slack-sessions/<agent-name>.yaml
27
+ */
28
+ export declare const SlackSessionStateSchema: z.ZodObject<{
29
+ /** Version for future schema migrations */
30
+ version: z.ZodLiteral<2>;
31
+ /** Agent name this session state belongs to */
32
+ agentName: z.ZodString;
33
+ /** Map of channel ID to session info */
34
+ channels: z.ZodRecord<z.ZodString, z.ZodObject<{
35
+ /** Claude session ID for resuming conversations */
36
+ sessionId: z.ZodString;
37
+ /** ISO timestamp when last message was sent/received */
38
+ lastMessageAt: z.ZodString;
39
+ }, "strip", z.ZodTypeAny, {
40
+ sessionId: string;
41
+ lastMessageAt: string;
42
+ }, {
43
+ sessionId: string;
44
+ lastMessageAt: string;
45
+ }>>;
46
+ }, "strip", z.ZodTypeAny, {
47
+ agentName: string;
48
+ version: 2;
49
+ channels: Record<string, {
50
+ sessionId: string;
51
+ lastMessageAt: string;
52
+ }>;
53
+ }, {
54
+ agentName: string;
55
+ version: 2;
56
+ channels: Record<string, {
57
+ sessionId: string;
58
+ lastMessageAt: string;
59
+ }>;
60
+ }>;
61
+ export type ChannelSession = z.infer<typeof ChannelSessionSchema>;
62
+ export type SlackSessionState = z.infer<typeof SlackSessionStateSchema>;
63
+ /**
64
+ * Logger interface for session manager operations
65
+ */
66
+ export interface SessionManagerLogger {
67
+ debug(message: string, data?: Record<string, unknown>): void;
68
+ info(message: string, data?: Record<string, unknown>): void;
69
+ warn(message: string, data?: Record<string, unknown>): void;
70
+ error(message: string, data?: Record<string, unknown>): void;
71
+ }
72
+ /**
73
+ * Options for configuring the SessionManager
74
+ */
75
+ export interface SessionManagerOptions {
76
+ /** Name of the agent this session manager is for */
77
+ agentName: string;
78
+ /** Root path for state storage (e.g., .herdctl) */
79
+ stateDir: string;
80
+ /** Session expiry timeout in hours (default: 24) */
81
+ sessionExpiryHours?: number;
82
+ /** Logger for session manager operations */
83
+ logger?: SessionManagerLogger;
84
+ }
85
+ /**
86
+ * Result of getting or creating a session
87
+ */
88
+ export interface SessionResult {
89
+ /** Claude session ID */
90
+ sessionId: string;
91
+ /** Whether this is a newly created session */
92
+ isNew: boolean;
93
+ }
94
+ /**
95
+ * Interface that all Slack session managers must implement
96
+ *
97
+ * Keyed by channelId (matching Discord's approach)
98
+ */
99
+ export interface ISessionManager {
100
+ /**
101
+ * Get or create a session for a channel
102
+ *
103
+ * @param channelId - Slack channel ID (conversation key)
104
+ */
105
+ getOrCreateSession(channelId: string): Promise<SessionResult>;
106
+ /**
107
+ * Update the last message timestamp for a session
108
+ *
109
+ * @param channelId - Slack channel ID
110
+ */
111
+ touchSession(channelId: string): Promise<void>;
112
+ /**
113
+ * Get an existing session without creating one
114
+ *
115
+ * @param channelId - Slack channel ID
116
+ * @returns Session if it exists and is not expired, null otherwise
117
+ */
118
+ getSession(channelId: string): Promise<ChannelSession | null>;
119
+ /**
120
+ * Store or update the session ID for a channel
121
+ *
122
+ * @param channelId - Slack channel ID
123
+ * @param sessionId - The Claude Agent SDK session ID
124
+ */
125
+ setSession(channelId: string, sessionId: string): Promise<void>;
126
+ /**
127
+ * Clear a specific session
128
+ *
129
+ * @param channelId - Slack channel ID
130
+ * @returns true if cleared, false if it didn't exist
131
+ */
132
+ clearSession(channelId: string): Promise<boolean>;
133
+ /**
134
+ * Clean up all expired sessions
135
+ *
136
+ * @returns Number of sessions cleaned up
137
+ */
138
+ cleanupExpiredSessions(): Promise<number>;
139
+ /**
140
+ * Get the count of active (non-expired) sessions
141
+ */
142
+ getActiveSessionCount(): Promise<number>;
143
+ /** Name of the agent this session manager is for */
144
+ readonly agentName: string;
145
+ }
146
+ /**
147
+ * Create initial session state for a new agent
148
+ */
149
+ export declare function createInitialSessionState(agentName: string): SlackSessionState;
150
+ /**
151
+ * Create a new channel session
152
+ */
153
+ export declare function createChannelSession(sessionId: string): ChannelSession;
154
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/session-manager/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB;;GAEG;AACH,eAAO,MAAM,oBAAoB;IAC/B,mDAAmD;;IAGnD,wDAAwD;;;;;;;;EAIxD,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,uBAAuB;IAClC,2CAA2C;;IAG3C,+CAA+C;;IAG/C,wCAAwC;;QArBxC,mDAAmD;;QAGnD,wDAAwD;;;;;;;;;;;;;;;;;;;;;;;EAoBxD,CAAC;AAMH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAMxE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9D;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAElB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IAEjB,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,4CAA4C;IAC5C,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B;AAMD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAElB,8CAA8C;IAC9C,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAE9D;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C;;;;;OAKG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAE9D;;;;;OAKG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhE;;;;;OAKG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAElD;;;;OAIG;IACH,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAE1C;;OAEG;IACH,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzC,oDAAoD;IACpD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAMD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,GAChB,iBAAiB,CAMnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAKtE"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Type definitions for Slack session management
3
+ *
4
+ * Provides interfaces for per-channel session state tracking,
5
+ * enabling conversation context preservation across Slack channels.
6
+ */
7
+ import { z } from "zod";
8
+ // =============================================================================
9
+ // Session Schema
10
+ // =============================================================================
11
+ /**
12
+ * Schema for individual channel session mapping
13
+ */
14
+ export const ChannelSessionSchema = z.object({
15
+ /** Claude session ID for resuming conversations */
16
+ sessionId: z.string().min(1, "Session ID cannot be empty"),
17
+ /** ISO timestamp when last message was sent/received */
18
+ lastMessageAt: z.string().datetime({
19
+ message: "lastMessageAt must be a valid ISO datetime string",
20
+ }),
21
+ });
22
+ /**
23
+ * Schema for the entire agent's Slack session state file
24
+ *
25
+ * Stored at .herdctl/slack-sessions/<agent-name>.yaml
26
+ */
27
+ export const SlackSessionStateSchema = z.object({
28
+ /** Version for future schema migrations */
29
+ version: z.literal(2),
30
+ /** Agent name this session state belongs to */
31
+ agentName: z.string().min(1, "Agent name cannot be empty"),
32
+ /** Map of channel ID to session info */
33
+ channels: z.record(z.string(), ChannelSessionSchema),
34
+ });
35
+ // =============================================================================
36
+ // Factory Functions
37
+ // =============================================================================
38
+ /**
39
+ * Create initial session state for a new agent
40
+ */
41
+ export function createInitialSessionState(agentName) {
42
+ return {
43
+ version: 2,
44
+ agentName,
45
+ channels: {},
46
+ };
47
+ }
48
+ /**
49
+ * Create a new channel session
50
+ */
51
+ export function createChannelSession(sessionId) {
52
+ return {
53
+ sessionId,
54
+ lastMessageAt: new Date().toISOString(),
55
+ };
56
+ }
57
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/session-manager/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,mDAAmD;IACnD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,4BAA4B,CAAC;IAE1D,wDAAwD;IACxD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC;QACjC,OAAO,EAAE,mDAAmD;KAC7D,CAAC;CACH,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,2CAA2C;IAC3C,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAErB,+CAA+C;IAC/C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,4BAA4B,CAAC;IAE1D,wCAAwC;IACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC;CACrD,CAAC,CAAC;AAmHH,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,SAAiB;IAEjB,OAAO;QACL,OAAO,EAAE,CAAC;QACV,SAAS;QACT,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,OAAO;QACL,SAAS;QACT,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACxC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Slack Connector
3
+ *
4
+ * Single Bolt App instance with channel->agent routing.
5
+ * Uses Socket Mode for connection (no public URL needed).
6
+ *
7
+ * Key design:
8
+ * - ONE connector shared across all agents (not N connectors)
9
+ * - Channel->agent routing via channelAgentMap
10
+ * - Channel-based conversations (channelId as session key, matching Discord)
11
+ * - Hourglass emoji reaction as typing indicator
12
+ */
13
+ import { EventEmitter } from "node:events";
14
+ import type { SlackConnectorOptions, SlackConnectorState, SlackFileUploadParams, ISlackConnector, SlackConnectorEventMap, SlackConnectorEventName } from "./types.js";
15
+ export declare class SlackConnector extends EventEmitter implements ISlackConnector {
16
+ private readonly botToken;
17
+ private readonly appToken;
18
+ private readonly channelAgentMap;
19
+ private readonly channelConfigs;
20
+ private readonly sessionManagers;
21
+ private readonly logger;
22
+ private app;
23
+ private commandHandler;
24
+ private status;
25
+ private connectedAt;
26
+ private disconnectedAt;
27
+ private reconnectAttempts;
28
+ private lastError;
29
+ private botUserId;
30
+ private botUsername;
31
+ private messagesReceived;
32
+ private messagesSent;
33
+ private messagesIgnored;
34
+ constructor(options: SlackConnectorOptions);
35
+ connect(): Promise<void>;
36
+ disconnect(): Promise<void>;
37
+ isConnected(): boolean;
38
+ getState(): SlackConnectorState;
39
+ uploadFile(params: SlackFileUploadParams): Promise<{
40
+ fileId: string;
41
+ }>;
42
+ private registerEventHandlers;
43
+ /**
44
+ * Try to execute a prefix command. Returns true if a command was handled.
45
+ */
46
+ private tryExecuteCommand;
47
+ private buildMessageEvent;
48
+ emit<K extends SlackConnectorEventName>(event: K, payload: SlackConnectorEventMap[K]): boolean;
49
+ on<K extends SlackConnectorEventName>(event: K, listener: (payload: SlackConnectorEventMap[K]) => void): this;
50
+ once<K extends SlackConnectorEventName>(event: K, listener: (payload: SlackConnectorEventMap[K]) => void): this;
51
+ off<K extends SlackConnectorEventName>(event: K, listener: (payload: SlackConnectorEventMap[K]) => void): this;
52
+ }
53
+ //# sourceMappingURL=slack-connector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-connector.d.ts","sourceRoot":"","sources":["../src/slack-connector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EAKnB,qBAAqB,EACrB,eAAe,EAEf,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAoBpB,qBAAa,cAAe,SAAQ,YAAa,YAAW,eAAe;IACzE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;IACtD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkC;IACjE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoC;IACpE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAI9C,OAAO,CAAC,GAAG,CAAa;IAGxB,OAAO,CAAC,cAAc,CAA+B;IAGrD,OAAO,CAAC,MAAM,CAAyC;IACvD,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,WAAW,CAAuB;IAG1C,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,eAAe,CAAa;gBAExB,OAAO,EAAE,qBAAqB;IAepC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmFxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsCjC,WAAW,IAAI,OAAO;IAItB,QAAQ,IAAI,mBAAmB;IAyBzB,UAAU,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IA4B5E,OAAO,CAAC,qBAAqB;IA4K7B;;OAEG;YACW,iBAAiB;IAkD/B,OAAO,CAAC,iBAAiB;IAiEhB,IAAI,CAAC,CAAC,SAAS,uBAAuB,EAC7C,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,GACjC,OAAO;IAID,EAAE,CAAC,CAAC,SAAS,uBAAuB,EAC3C,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,IAAI,GACrD,IAAI;IAIE,IAAI,CAAC,CAAC,SAAS,uBAAuB,EAC7C,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,IAAI,GACrD,IAAI;IAIE,GAAG,CAAC,CAAC,SAAS,uBAAuB,EAC5C,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,IAAI,GACrD,IAAI;CAGR"}