@agnt5/sdk 0.2.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.
- package/README.md +183 -0
- package/dist/__tests__/integration/helpers.d.ts +41 -0
- package/dist/__tests__/integration/helpers.d.ts.map +1 -0
- package/dist/__tests__/integration/helpers.js +78 -0
- package/dist/__tests__/integration/helpers.js.map +1 -0
- package/dist/agent.d.ts +260 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +493 -0
- package/dist/agent.js.map +1 -0
- package/dist/async-context.d.ts +57 -0
- package/dist/async-context.d.ts.map +1 -0
- package/dist/async-context.js +52 -0
- package/dist/async-context.js.map +1 -0
- package/dist/batch.d.ts +116 -0
- package/dist/batch.d.ts.map +1 -0
- package/dist/batch.js +98 -0
- package/dist/batch.js.map +1 -0
- package/dist/chat.d.ts +137 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +278 -0
- package/dist/chat.js.map +1 -0
- package/dist/client.d.ts +394 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +757 -0
- package/dist/client.js.map +1 -0
- package/dist/context.d.ts +47 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +244 -0
- package/dist/context.js.map +1 -0
- package/dist/errors.d.ts +148 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +201 -0
- package/dist/errors.js.map +1 -0
- package/dist/eval.d.ts +242 -0
- package/dist/eval.d.ts.map +1 -0
- package/dist/eval.js +452 -0
- package/dist/eval.js.map +1 -0
- package/dist/event-emitter.d.ts +28 -0
- package/dist/event-emitter.d.ts.map +1 -0
- package/dist/event-emitter.js +79 -0
- package/dist/event-emitter.js.map +1 -0
- package/dist/events.d.ts +285 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +256 -0
- package/dist/events.js.map +1 -0
- package/dist/function.d.ts +61 -0
- package/dist/function.d.ts.map +1 -0
- package/dist/function.js +78 -0
- package/dist/function.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +80 -0
- package/dist/index.js.map +1 -0
- package/dist/lm.d.ts +301 -0
- package/dist/lm.d.ts.map +1 -0
- package/dist/lm.js +283 -0
- package/dist/lm.js.map +1 -0
- package/dist/logging.d.ts +68 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +165 -0
- package/dist/logging.js.map +1 -0
- package/dist/mcp-server.d.ts +98 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +307 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp.d.ts +73 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +224 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory.d.ts +234 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +609 -0
- package/dist/memory.js.map +1 -0
- package/dist/platform-adapters.d.ts +121 -0
- package/dist/platform-adapters.d.ts.map +1 -0
- package/dist/platform-adapters.js +174 -0
- package/dist/platform-adapters.js.map +1 -0
- package/dist/platform-context.d.ts +55 -0
- package/dist/platform-context.d.ts.map +1 -0
- package/dist/platform-context.js +196 -0
- package/dist/platform-context.js.map +1 -0
- package/dist/retry-utils.d.ts +169 -0
- package/dist/retry-utils.d.ts.map +1 -0
- package/dist/retry-utils.js +304 -0
- package/dist/retry-utils.js.map +1 -0
- package/dist/sandbox.d.ts +103 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +168 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/schema-utils.d.ts +250 -0
- package/dist/schema-utils.d.ts.map +1 -0
- package/dist/schema-utils.js +444 -0
- package/dist/schema-utils.js.map +1 -0
- package/dist/scorer.d.ts +130 -0
- package/dist/scorer.d.ts.map +1 -0
- package/dist/scorer.js +211 -0
- package/dist/scorer.js.map +1 -0
- package/dist/state.d.ts +92 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +151 -0
- package/dist/state.js.map +1 -0
- package/dist/tool.d.ts +120 -0
- package/dist/tool.d.ts.map +1 -0
- package/dist/tool.js +215 -0
- package/dist/tool.js.map +1 -0
- package/dist/tracing.d.ts +82 -0
- package/dist/tracing.d.ts.map +1 -0
- package/dist/tracing.js +206 -0
- package/dist/tracing.js.map +1 -0
- package/dist/types.d.ts +139 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/worker.d.ts +111 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +944 -0
- package/dist/worker.js.map +1 -0
- package/dist/workflow-utils.d.ts +257 -0
- package/dist/workflow-utils.d.ts.map +1 -0
- package/dist/workflow-utils.js +370 -0
- package/dist/workflow-utils.js.map +1 -0
- package/dist/workflow.d.ts +78 -0
- package/dist/workflow.d.ts.map +1 -0
- package/dist/workflow.js +138 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +86 -0
package/dist/batch.d.ts
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch execution types for running components with multiple inputs.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Configuration for batch execution.
|
|
6
|
+
*/
|
|
7
|
+
export interface BatchConfig {
|
|
8
|
+
/** Maximum concurrent executions (default: 10) */
|
|
9
|
+
maxConcurrency?: number;
|
|
10
|
+
/** Continue executing remaining items after a failure (default: true) */
|
|
11
|
+
continueOnFailure?: boolean;
|
|
12
|
+
/** Overall batch timeout in milliseconds (default: 3600000 = 1 hour) */
|
|
13
|
+
batchTimeoutMs?: number;
|
|
14
|
+
/** Default per-item timeout in milliseconds (default: 30000 = 30s) */
|
|
15
|
+
defaultItemTimeoutMs?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Input for a single batch item.
|
|
19
|
+
*/
|
|
20
|
+
export interface BatchItemInput {
|
|
21
|
+
/** Input data for the component */
|
|
22
|
+
input: Record<string, any>;
|
|
23
|
+
/** Optional item index (auto-assigned if omitted) */
|
|
24
|
+
index?: number;
|
|
25
|
+
/** Optional unique item identifier */
|
|
26
|
+
itemId?: string;
|
|
27
|
+
/** Optional per-item metadata */
|
|
28
|
+
metadata?: Record<string, string>;
|
|
29
|
+
/** Override timeout for this item in milliseconds */
|
|
30
|
+
timeoutMs?: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Error detail for a failed batch item.
|
|
34
|
+
*/
|
|
35
|
+
export interface BatchItemError {
|
|
36
|
+
code?: string;
|
|
37
|
+
message?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Result of a single batch item execution.
|
|
41
|
+
*/
|
|
42
|
+
export interface BatchItemResult {
|
|
43
|
+
index: number;
|
|
44
|
+
runId: string;
|
|
45
|
+
status: 'completed' | 'failed' | 'cancelled';
|
|
46
|
+
itemId?: string;
|
|
47
|
+
output?: any;
|
|
48
|
+
error?: BatchItemError;
|
|
49
|
+
durationMs?: number;
|
|
50
|
+
startedAt?: string;
|
|
51
|
+
completedAt?: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Aggregate statistics for a batch execution.
|
|
55
|
+
*/
|
|
56
|
+
export interface BatchStats {
|
|
57
|
+
totalItems: number;
|
|
58
|
+
completedItems: number;
|
|
59
|
+
failedItems: number;
|
|
60
|
+
cancelledItems: number;
|
|
61
|
+
pendingItems: number;
|
|
62
|
+
durationMs: number;
|
|
63
|
+
avgItemDurationMs: number;
|
|
64
|
+
}
|
|
65
|
+
/** Batch execution status */
|
|
66
|
+
export type BatchStatus = 'completed' | 'partial_failure' | 'failed' | 'cancelled' | 'pending' | 'queued' | 'running';
|
|
67
|
+
/**
|
|
68
|
+
* Result of a batch execution.
|
|
69
|
+
*/
|
|
70
|
+
export declare class BatchResult {
|
|
71
|
+
readonly batchId: string;
|
|
72
|
+
readonly status: BatchStatus;
|
|
73
|
+
readonly results: BatchItemResult[];
|
|
74
|
+
readonly stats: BatchStats | undefined;
|
|
75
|
+
readonly traceId: string | undefined;
|
|
76
|
+
readonly createdAt: string | undefined;
|
|
77
|
+
constructor(raw: Record<string, any>);
|
|
78
|
+
/** True if all items completed successfully */
|
|
79
|
+
get isSuccess(): boolean;
|
|
80
|
+
/** True if some items failed but others succeeded */
|
|
81
|
+
get isPartialFailure(): boolean;
|
|
82
|
+
/** Get outputs from all items sorted by index (failed items return undefined) */
|
|
83
|
+
get outputs(): (any | undefined)[];
|
|
84
|
+
/** Get outputs only from successfully completed items */
|
|
85
|
+
successfulOutputs(): any[];
|
|
86
|
+
/** Get items that failed */
|
|
87
|
+
failedItems(): BatchItemResult[];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Result of a batch status query.
|
|
91
|
+
*/
|
|
92
|
+
export declare class BatchStatusResult {
|
|
93
|
+
readonly batchId: string;
|
|
94
|
+
readonly status: BatchStatus;
|
|
95
|
+
readonly results: BatchItemResult[];
|
|
96
|
+
readonly stats: BatchStats | undefined;
|
|
97
|
+
readonly traceId: string | undefined;
|
|
98
|
+
readonly submittedAt: string | undefined;
|
|
99
|
+
readonly startedAt: string | undefined;
|
|
100
|
+
readonly completedAt: string | undefined;
|
|
101
|
+
constructor(raw: Record<string, any>);
|
|
102
|
+
/** True if batch is still running */
|
|
103
|
+
get isRunning(): boolean;
|
|
104
|
+
/** True if batch has completed (successfully or with failures) */
|
|
105
|
+
get isCompleted(): boolean;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Result of cancelling a batch.
|
|
109
|
+
*/
|
|
110
|
+
export interface CancelBatchResult {
|
|
111
|
+
batchId: string;
|
|
112
|
+
status: string;
|
|
113
|
+
cancelledItems: number;
|
|
114
|
+
completedItems: number;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=batch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../src/batch.ts"],"names":[],"mappings":"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"}
|
package/dist/batch.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch execution types for running components with multiple inputs.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Result of a batch execution.
|
|
6
|
+
*/
|
|
7
|
+
export class BatchResult {
|
|
8
|
+
constructor(raw) {
|
|
9
|
+
this.batchId = raw.batch_id || raw.batchId || '';
|
|
10
|
+
this.status = raw.status || 'completed';
|
|
11
|
+
this.traceId = raw.trace_id || raw.traceId;
|
|
12
|
+
this.createdAt = raw.created_at || raw.createdAt;
|
|
13
|
+
this.results = (raw.results || []).map((r) => ({
|
|
14
|
+
index: r.index ?? 0,
|
|
15
|
+
runId: r.run_id || r.runId || '',
|
|
16
|
+
status: r.status || 'failed',
|
|
17
|
+
itemId: r.item_id || r.itemId,
|
|
18
|
+
output: r.output,
|
|
19
|
+
error: r.error ? { code: r.error.code, message: r.error.message || String(r.error) } : undefined,
|
|
20
|
+
durationMs: r.duration_ms || r.durationMs,
|
|
21
|
+
startedAt: r.started_at || r.startedAt,
|
|
22
|
+
completedAt: r.completed_at || r.completedAt,
|
|
23
|
+
}));
|
|
24
|
+
this.stats = raw.stats ? {
|
|
25
|
+
totalItems: raw.stats.total_items ?? raw.stats.totalItems ?? 0,
|
|
26
|
+
completedItems: raw.stats.completed_items ?? raw.stats.completedItems ?? 0,
|
|
27
|
+
failedItems: raw.stats.failed_items ?? raw.stats.failedItems ?? 0,
|
|
28
|
+
cancelledItems: raw.stats.cancelled_items ?? raw.stats.cancelledItems ?? 0,
|
|
29
|
+
pendingItems: raw.stats.pending_items ?? raw.stats.pendingItems ?? 0,
|
|
30
|
+
durationMs: raw.stats.duration_ms ?? raw.stats.durationMs ?? 0,
|
|
31
|
+
avgItemDurationMs: raw.stats.avg_item_duration_ms ?? raw.stats.avgItemDurationMs ?? 0,
|
|
32
|
+
} : undefined;
|
|
33
|
+
}
|
|
34
|
+
/** True if all items completed successfully */
|
|
35
|
+
get isSuccess() {
|
|
36
|
+
return this.status === 'completed';
|
|
37
|
+
}
|
|
38
|
+
/** True if some items failed but others succeeded */
|
|
39
|
+
get isPartialFailure() {
|
|
40
|
+
return this.status === 'partial_failure';
|
|
41
|
+
}
|
|
42
|
+
/** Get outputs from all items sorted by index (failed items return undefined) */
|
|
43
|
+
get outputs() {
|
|
44
|
+
return [...this.results]
|
|
45
|
+
.sort((a, b) => a.index - b.index)
|
|
46
|
+
.map(r => r.output);
|
|
47
|
+
}
|
|
48
|
+
/** Get outputs only from successfully completed items */
|
|
49
|
+
successfulOutputs() {
|
|
50
|
+
return this.results.filter(r => r.status === 'completed').map(r => r.output);
|
|
51
|
+
}
|
|
52
|
+
/** Get items that failed */
|
|
53
|
+
failedItems() {
|
|
54
|
+
return this.results.filter(r => r.status === 'failed');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Result of a batch status query.
|
|
59
|
+
*/
|
|
60
|
+
export class BatchStatusResult {
|
|
61
|
+
constructor(raw) {
|
|
62
|
+
this.batchId = raw.batch_id || raw.batchId || '';
|
|
63
|
+
this.status = raw.status || 'pending';
|
|
64
|
+
this.traceId = raw.trace_id || raw.traceId;
|
|
65
|
+
this.submittedAt = raw.submitted_at || raw.submittedAt;
|
|
66
|
+
this.startedAt = raw.started_at || raw.startedAt;
|
|
67
|
+
this.completedAt = raw.completed_at || raw.completedAt;
|
|
68
|
+
this.results = (raw.results || []).map((r) => ({
|
|
69
|
+
index: r.index ?? 0,
|
|
70
|
+
runId: r.run_id || r.runId || '',
|
|
71
|
+
status: r.status || 'failed',
|
|
72
|
+
itemId: r.item_id || r.itemId,
|
|
73
|
+
output: r.output,
|
|
74
|
+
error: r.error ? { code: r.error.code, message: r.error.message || String(r.error) } : undefined,
|
|
75
|
+
durationMs: r.duration_ms || r.durationMs,
|
|
76
|
+
startedAt: r.started_at || r.startedAt,
|
|
77
|
+
completedAt: r.completed_at || r.completedAt,
|
|
78
|
+
}));
|
|
79
|
+
this.stats = raw.stats ? {
|
|
80
|
+
totalItems: raw.stats.total_items ?? raw.stats.totalItems ?? 0,
|
|
81
|
+
completedItems: raw.stats.completed_items ?? raw.stats.completedItems ?? 0,
|
|
82
|
+
failedItems: raw.stats.failed_items ?? raw.stats.failedItems ?? 0,
|
|
83
|
+
cancelledItems: raw.stats.cancelled_items ?? raw.stats.cancelledItems ?? 0,
|
|
84
|
+
pendingItems: raw.stats.pending_items ?? raw.stats.pendingItems ?? 0,
|
|
85
|
+
durationMs: raw.stats.duration_ms ?? raw.stats.durationMs ?? 0,
|
|
86
|
+
avgItemDurationMs: raw.stats.avg_item_duration_ms ?? raw.stats.avgItemDurationMs ?? 0,
|
|
87
|
+
} : undefined;
|
|
88
|
+
}
|
|
89
|
+
/** True if batch is still running */
|
|
90
|
+
get isRunning() {
|
|
91
|
+
return ['pending', 'queued', 'running'].includes(this.status);
|
|
92
|
+
}
|
|
93
|
+
/** True if batch has completed (successfully or with failures) */
|
|
94
|
+
get isCompleted() {
|
|
95
|
+
return ['completed', 'partial_failure', 'failed', 'cancelled'].includes(this.status);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=batch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch.js","sourceRoot":"","sources":["../src/batch.ts"],"names":[],"mappings":"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"}
|
package/dist/chat.d.ts
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AGNT5 Chat SDK — connect agents to Slack, Discord, Teams, and Telegram.
|
|
3
|
+
*
|
|
4
|
+
* The ChatBot class wraps an Agent and bridges it to chat platforms via
|
|
5
|
+
* Rust core bindings for webhook verification, event parsing, and
|
|
6
|
+
* platform API request construction.
|
|
7
|
+
*/
|
|
8
|
+
import type { Agent } from './agent.js';
|
|
9
|
+
export interface SlackConfig {
|
|
10
|
+
platform: 'slack';
|
|
11
|
+
botToken: string;
|
|
12
|
+
signingSecret: string;
|
|
13
|
+
appToken?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface DiscordConfig {
|
|
16
|
+
platform: 'discord';
|
|
17
|
+
botToken: string;
|
|
18
|
+
publicKey: string;
|
|
19
|
+
applicationId: string;
|
|
20
|
+
}
|
|
21
|
+
export interface TeamsConfig {
|
|
22
|
+
platform: 'teams';
|
|
23
|
+
appId: string;
|
|
24
|
+
appPassword: string;
|
|
25
|
+
tenantId?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface TelegramConfig {
|
|
28
|
+
platform: 'telegram';
|
|
29
|
+
botToken: string;
|
|
30
|
+
webhookSecret?: string;
|
|
31
|
+
}
|
|
32
|
+
export type PlatformConfig = SlackConfig | DiscordConfig | TeamsConfig | TelegramConfig;
|
|
33
|
+
export interface ChatUser {
|
|
34
|
+
id: string;
|
|
35
|
+
name: string;
|
|
36
|
+
platform: string;
|
|
37
|
+
}
|
|
38
|
+
export interface Attachment {
|
|
39
|
+
filename: string;
|
|
40
|
+
mimeType?: string;
|
|
41
|
+
url?: string;
|
|
42
|
+
sizeBytes?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface ChatMessage {
|
|
45
|
+
id: string;
|
|
46
|
+
platform: string;
|
|
47
|
+
channelId: string;
|
|
48
|
+
threadId?: string;
|
|
49
|
+
author: ChatUser;
|
|
50
|
+
content: string;
|
|
51
|
+
attachments: Attachment[];
|
|
52
|
+
isMention: boolean;
|
|
53
|
+
isDm: boolean;
|
|
54
|
+
metadata: Record<string, string>;
|
|
55
|
+
}
|
|
56
|
+
export interface ChatEvent {
|
|
57
|
+
eventType: string;
|
|
58
|
+
message?: ChatMessage;
|
|
59
|
+
channelId?: string;
|
|
60
|
+
threadId?: string;
|
|
61
|
+
user?: ChatUser;
|
|
62
|
+
challenge?: string;
|
|
63
|
+
emoji?: string;
|
|
64
|
+
command?: string;
|
|
65
|
+
args?: string;
|
|
66
|
+
actionId?: string;
|
|
67
|
+
}
|
|
68
|
+
export interface PlatformRequest {
|
|
69
|
+
url: string;
|
|
70
|
+
method: string;
|
|
71
|
+
headers: Record<string, string>;
|
|
72
|
+
body: Buffer;
|
|
73
|
+
}
|
|
74
|
+
export type ChatEventHandler = (event: ChatEvent) => Promise<string | null>;
|
|
75
|
+
/**
|
|
76
|
+
* Connects an AGNT5 Agent to chat platforms.
|
|
77
|
+
*
|
|
78
|
+
* ```typescript
|
|
79
|
+
* import { Agent, Worker } from '@agnt5/sdk';
|
|
80
|
+
* import { ChatBot, SlackConfig } from '@agnt5/sdk/chat';
|
|
81
|
+
*
|
|
82
|
+
* const agent = new Agent({
|
|
83
|
+
* name: 'support-bot',
|
|
84
|
+
* model: 'anthropic/claude-sonnet-4-20250514',
|
|
85
|
+
* instructions: 'You are a helpful support agent.',
|
|
86
|
+
* });
|
|
87
|
+
*
|
|
88
|
+
* const bot = new ChatBot(agent, [
|
|
89
|
+
* { platform: 'slack', botToken: process.env.SLACK_BOT_TOKEN!, signingSecret: process.env.SLACK_SIGNING_SECRET! },
|
|
90
|
+
* ]);
|
|
91
|
+
*
|
|
92
|
+
* const worker = new Worker({ serviceName: 'support-bot' });
|
|
93
|
+
* worker.register(bot);
|
|
94
|
+
* await worker.run();
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export declare class ChatBot {
|
|
98
|
+
private agent;
|
|
99
|
+
private adapters;
|
|
100
|
+
private handlers;
|
|
101
|
+
constructor(agent: Agent, adapters: PlatformConfig[]);
|
|
102
|
+
/** Component name (delegates to the wrapped agent). */
|
|
103
|
+
get name(): string;
|
|
104
|
+
onMention(handler: ChatEventHandler): this;
|
|
105
|
+
onMessage(handler: ChatEventHandler): this;
|
|
106
|
+
onReaction(handler: ChatEventHandler): this;
|
|
107
|
+
onAction(handler: ChatEventHandler): this;
|
|
108
|
+
onSlashCommand(handler: ChatEventHandler): this;
|
|
109
|
+
/**
|
|
110
|
+
* Process an incoming webhook from a chat platform.
|
|
111
|
+
* Returns a challenge response for URL verification, or null for normal events.
|
|
112
|
+
*/
|
|
113
|
+
handleWebhook(platform: string, headers: Record<string, string>, body: Buffer): Promise<{
|
|
114
|
+
challenge: string;
|
|
115
|
+
} | null>;
|
|
116
|
+
/**
|
|
117
|
+
* Process a webhook with streaming agent response (post-then-edit).
|
|
118
|
+
*/
|
|
119
|
+
handleWebhookStreaming(platform: string, headers: Record<string, string>, body: Buffer): Promise<{
|
|
120
|
+
challenge: string;
|
|
121
|
+
} | null>;
|
|
122
|
+
private defaultHandler;
|
|
123
|
+
/**
|
|
124
|
+
* Derive a deterministic session ID from a platform thread.
|
|
125
|
+
* Implements UUID v5 (RFC 4122) — identical to Python's uuid.uuid5().
|
|
126
|
+
*/
|
|
127
|
+
private threadToSession;
|
|
128
|
+
private sendResponse;
|
|
129
|
+
private executeRequest;
|
|
130
|
+
private toNativePlatform;
|
|
131
|
+
/**
|
|
132
|
+
* Normalize the native JsChatEvent (snake_case keys) to our TS ChatEvent (camelCase).
|
|
133
|
+
*/
|
|
134
|
+
private normalizeEvent;
|
|
135
|
+
private getSigningSecret;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"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"}
|
package/dist/chat.js
ADDED
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AGNT5 Chat SDK — connect agents to Slack, Discord, Teams, and Telegram.
|
|
3
|
+
*
|
|
4
|
+
* The ChatBot class wraps an Agent and bridges it to chat platforms via
|
|
5
|
+
* Rust core bindings for webhook verification, event parsing, and
|
|
6
|
+
* platform API request construction.
|
|
7
|
+
*/
|
|
8
|
+
import { ContextImpl } from './context.js';
|
|
9
|
+
import { createHash } from 'crypto';
|
|
10
|
+
// Native bindings (napi-rs)
|
|
11
|
+
let native;
|
|
12
|
+
try {
|
|
13
|
+
native = require('../native/index.js');
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// Native bindings not available — will throw at runtime if chat is used
|
|
17
|
+
native = null;
|
|
18
|
+
}
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// ChatBot
|
|
21
|
+
// ============================================================================
|
|
22
|
+
/**
|
|
23
|
+
* Connects an AGNT5 Agent to chat platforms.
|
|
24
|
+
*
|
|
25
|
+
* ```typescript
|
|
26
|
+
* import { Agent, Worker } from '@agnt5/sdk';
|
|
27
|
+
* import { ChatBot, SlackConfig } from '@agnt5/sdk/chat';
|
|
28
|
+
*
|
|
29
|
+
* const agent = new Agent({
|
|
30
|
+
* name: 'support-bot',
|
|
31
|
+
* model: 'anthropic/claude-sonnet-4-20250514',
|
|
32
|
+
* instructions: 'You are a helpful support agent.',
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* const bot = new ChatBot(agent, [
|
|
36
|
+
* { platform: 'slack', botToken: process.env.SLACK_BOT_TOKEN!, signingSecret: process.env.SLACK_SIGNING_SECRET! },
|
|
37
|
+
* ]);
|
|
38
|
+
*
|
|
39
|
+
* const worker = new Worker({ serviceName: 'support-bot' });
|
|
40
|
+
* worker.register(bot);
|
|
41
|
+
* await worker.run();
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export class ChatBot {
|
|
45
|
+
constructor(agent, adapters) {
|
|
46
|
+
this.handlers = new Map();
|
|
47
|
+
if (!native) {
|
|
48
|
+
throw new Error('Native bindings not available. Chat SDK requires the native addon.');
|
|
49
|
+
}
|
|
50
|
+
this.agent = agent;
|
|
51
|
+
this.adapters = new Map(adapters.map(a => [a.platform, a]));
|
|
52
|
+
}
|
|
53
|
+
/** Component name (delegates to the wrapped agent). */
|
|
54
|
+
get name() {
|
|
55
|
+
return this.agent.name;
|
|
56
|
+
}
|
|
57
|
+
// -- Handler registration --------------------------------------------------
|
|
58
|
+
onMention(handler) {
|
|
59
|
+
this.handlers.set('mention', handler);
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
onMessage(handler) {
|
|
63
|
+
this.handlers.set('message', handler);
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
onReaction(handler) {
|
|
67
|
+
this.handlers.set('reaction', handler);
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
onAction(handler) {
|
|
71
|
+
this.handlers.set('action', handler);
|
|
72
|
+
return this;
|
|
73
|
+
}
|
|
74
|
+
onSlashCommand(handler) {
|
|
75
|
+
this.handlers.set('slash_command', handler);
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
// -- Webhook handling ------------------------------------------------------
|
|
79
|
+
/**
|
|
80
|
+
* Process an incoming webhook from a chat platform.
|
|
81
|
+
* Returns a challenge response for URL verification, or null for normal events.
|
|
82
|
+
*/
|
|
83
|
+
async handleWebhook(platform, headers, body) {
|
|
84
|
+
const config = this.adapters.get(platform);
|
|
85
|
+
if (!config) {
|
|
86
|
+
throw new Error(`No adapter configured for platform: ${platform}`);
|
|
87
|
+
}
|
|
88
|
+
// Map platform string to native enum
|
|
89
|
+
const nativePlatform = this.toNativePlatform(platform);
|
|
90
|
+
// Verify webhook signature
|
|
91
|
+
const signingSecret = this.getSigningSecret(config);
|
|
92
|
+
if (signingSecret) {
|
|
93
|
+
const valid = native.verifyWebhook(nativePlatform, signingSecret, headers, body);
|
|
94
|
+
if (!valid) {
|
|
95
|
+
throw new Error('Invalid webhook signature');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Parse event
|
|
99
|
+
const rawEvent = native.parseEvent(nativePlatform, body);
|
|
100
|
+
const event = this.normalizeEvent(rawEvent);
|
|
101
|
+
// Handle URL verification challenge
|
|
102
|
+
if (event.eventType === 'url_verification' && event.challenge) {
|
|
103
|
+
return { challenge: event.challenge };
|
|
104
|
+
}
|
|
105
|
+
// Route to handler
|
|
106
|
+
const handler = this.handlers.get(event.eventType) ?? this.defaultHandler.bind(this);
|
|
107
|
+
const responseText = await handler(event);
|
|
108
|
+
if (responseText === null || responseText === undefined) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
// Send response back to platform
|
|
112
|
+
await this.sendResponse(config, event, responseText);
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Process a webhook with streaming agent response (post-then-edit).
|
|
117
|
+
*/
|
|
118
|
+
async handleWebhookStreaming(platform, headers, body) {
|
|
119
|
+
const config = this.adapters.get(platform);
|
|
120
|
+
if (!config) {
|
|
121
|
+
throw new Error(`No adapter configured for platform: ${platform}`);
|
|
122
|
+
}
|
|
123
|
+
const nativePlatform = this.toNativePlatform(platform);
|
|
124
|
+
// Verify + parse
|
|
125
|
+
const signingSecret = this.getSigningSecret(config);
|
|
126
|
+
if (signingSecret) {
|
|
127
|
+
const valid = native.verifyWebhook(nativePlatform, signingSecret, headers, body);
|
|
128
|
+
if (!valid) {
|
|
129
|
+
throw new Error('Invalid webhook signature');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const rawEvent = native.parseEvent(nativePlatform, body);
|
|
133
|
+
const event = this.normalizeEvent(rawEvent);
|
|
134
|
+
if (event.eventType === 'url_verification' && event.challenge) {
|
|
135
|
+
return { challenge: event.challenge };
|
|
136
|
+
}
|
|
137
|
+
if (!event.message) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
const msg = event.message;
|
|
141
|
+
const threadTs = msg.threadId || msg.id;
|
|
142
|
+
// Post initial "thinking" message
|
|
143
|
+
const slackConfig = config;
|
|
144
|
+
const initialReq = native.slackPostMessage(slackConfig.botToken, msg.channelId, 'Thinking...', threadTs);
|
|
145
|
+
const initialResp = await this.executeRequest(initialReq);
|
|
146
|
+
const respData = await initialResp.json();
|
|
147
|
+
const messageTs = respData.ts || '';
|
|
148
|
+
// Stream agent response with buffer
|
|
149
|
+
const buffer = new native.StreamingMessageBuffer(500);
|
|
150
|
+
for await (const agentEvent of this.agent.stream(msg.content)) {
|
|
151
|
+
const delta = agentEvent.delta;
|
|
152
|
+
if (delta === undefined || delta === null)
|
|
153
|
+
continue;
|
|
154
|
+
buffer.push(delta);
|
|
155
|
+
if (buffer.shouldFlush()) {
|
|
156
|
+
const content = buffer.flush();
|
|
157
|
+
if (content !== null && content !== undefined) {
|
|
158
|
+
const updateReq = native.slackUpdateMessage(slackConfig.botToken, msg.channelId, messageTs, content);
|
|
159
|
+
await this.executeRequest(updateReq);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Final update with complete content
|
|
164
|
+
const finalContent = buffer.finalize();
|
|
165
|
+
if (finalContent) {
|
|
166
|
+
const finalReq = native.slackUpdateMessage(slackConfig.botToken, msg.channelId, messageTs, finalContent);
|
|
167
|
+
await this.executeRequest(finalReq);
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
// -- Internal helpers ------------------------------------------------------
|
|
172
|
+
async defaultHandler(event) {
|
|
173
|
+
if (!event.message)
|
|
174
|
+
return null;
|
|
175
|
+
const msg = event.message;
|
|
176
|
+
// Derive session_id from thread context:
|
|
177
|
+
// - If in a thread, use threadId (all replies share the same session)
|
|
178
|
+
// - If a top-level message, use the message id (starts a new session)
|
|
179
|
+
const threadKey = msg.threadId || msg.id;
|
|
180
|
+
const sessionId = this.threadToSession(msg.platform, msg.channelId, threadKey);
|
|
181
|
+
const ctx = new ContextImpl(sessionId, // invocationId
|
|
182
|
+
sessionId, // runId — same thread = same session
|
|
183
|
+
0, // attempt
|
|
184
|
+
this.agent.name);
|
|
185
|
+
const result = await this.agent.run(msg.content, ctx);
|
|
186
|
+
return result.output != null ? String(result.output) : null;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Derive a deterministic session ID from a platform thread.
|
|
190
|
+
* Implements UUID v5 (RFC 4122) — identical to Python's uuid.uuid5().
|
|
191
|
+
*/
|
|
192
|
+
threadToSession(platform, channelId, threadId) {
|
|
193
|
+
// Namespace UUID for AGNT5 chat sessions (matches Python SDK)
|
|
194
|
+
const ns = 'a1b2c3d4-e5f6-7890-abcd-ef1234567890';
|
|
195
|
+
const name = `${platform}:${channelId}:${threadId}`;
|
|
196
|
+
// UUID v5: SHA-1(namespace_bytes + name_bytes), then set version & variant bits
|
|
197
|
+
const nsBytes = Buffer.from(ns.replace(/-/g, ''), 'hex');
|
|
198
|
+
const hash = createHash('sha1').update(Buffer.concat([nsBytes, Buffer.from(name)])).digest();
|
|
199
|
+
// Set version to 5
|
|
200
|
+
hash[6] = (hash[6] & 0x0f) | 0x50;
|
|
201
|
+
// Set variant to RFC 4122
|
|
202
|
+
hash[8] = (hash[8] & 0x3f) | 0x80;
|
|
203
|
+
const hex = hash.subarray(0, 16).toString('hex');
|
|
204
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;
|
|
205
|
+
}
|
|
206
|
+
async sendResponse(config, event, text) {
|
|
207
|
+
if (config.platform === 'slack') {
|
|
208
|
+
const slackConfig = config;
|
|
209
|
+
const threadTs = event.message?.threadId || event.message?.id || undefined;
|
|
210
|
+
const req = native.slackPostMessage(slackConfig.botToken, event.channelId, text, threadTs);
|
|
211
|
+
await this.executeRequest(req);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
throw new Error(`Platform ${config.platform} not yet supported`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
async executeRequest(req) {
|
|
218
|
+
const response = await fetch(req.url, {
|
|
219
|
+
method: req.method,
|
|
220
|
+
headers: req.headers,
|
|
221
|
+
body: req.body,
|
|
222
|
+
});
|
|
223
|
+
if (!response.ok) {
|
|
224
|
+
console.warn(`Platform API error: ${req.method} ${req.url} -> ${response.status} ${await response.text().catch(() => '')}`);
|
|
225
|
+
}
|
|
226
|
+
return response;
|
|
227
|
+
}
|
|
228
|
+
toNativePlatform(platform) {
|
|
229
|
+
// native.JsPlatform expects capitalized enum values
|
|
230
|
+
return platform.charAt(0).toUpperCase() + platform.slice(1);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Normalize the native JsChatEvent (snake_case keys) to our TS ChatEvent (camelCase).
|
|
234
|
+
*/
|
|
235
|
+
normalizeEvent(raw) {
|
|
236
|
+
const msg = raw.message
|
|
237
|
+
? {
|
|
238
|
+
id: raw.message.id,
|
|
239
|
+
platform: raw.message.platform,
|
|
240
|
+
channelId: raw.message.channel_id ?? raw.message.channelId,
|
|
241
|
+
threadId: raw.message.thread_id ?? raw.message.threadId,
|
|
242
|
+
author: raw.message.author,
|
|
243
|
+
content: raw.message.content,
|
|
244
|
+
attachments: (raw.message.attachments || []).map((a) => ({
|
|
245
|
+
filename: a.filename,
|
|
246
|
+
mimeType: a.mime_type ?? a.mimeType,
|
|
247
|
+
url: a.url,
|
|
248
|
+
sizeBytes: a.size_bytes ?? a.sizeBytes,
|
|
249
|
+
})),
|
|
250
|
+
isMention: raw.message.is_mention ?? raw.message.isMention,
|
|
251
|
+
isDm: raw.message.is_dm ?? raw.message.isDm,
|
|
252
|
+
metadata: raw.message.metadata || {},
|
|
253
|
+
}
|
|
254
|
+
: undefined;
|
|
255
|
+
return {
|
|
256
|
+
eventType: raw.event_type ?? raw.eventType,
|
|
257
|
+
message: msg,
|
|
258
|
+
channelId: raw.channel_id ?? raw.channelId,
|
|
259
|
+
threadId: raw.thread_id ?? raw.threadId,
|
|
260
|
+
user: raw.user,
|
|
261
|
+
challenge: raw.challenge,
|
|
262
|
+
emoji: raw.emoji,
|
|
263
|
+
command: raw.command,
|
|
264
|
+
args: raw.args,
|
|
265
|
+
actionId: raw.action_id ?? raw.actionId,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
getSigningSecret(config) {
|
|
269
|
+
switch (config.platform) {
|
|
270
|
+
case 'slack':
|
|
271
|
+
return config.signingSecret;
|
|
272
|
+
// TODO: Discord publicKey, Teams appPassword, Telegram webhookSecret
|
|
273
|
+
default:
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=chat.js.map
|
package/dist/chat.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,4BAA4B;AAC5B,IAAI,MAAW,CAAC;AAChB,IAAI,CAAC;IACH,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AACzC,CAAC;AAAC,MAAM,CAAC;IACP,wEAAwE;IACxE,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC;AAuFD,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,OAAO;IAKlB,YAAY,KAAY,EAAE,QAA0B;QAF5C,aAAQ,GAAkC,IAAI,GAAG,EAAE,CAAC;QAG1D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,uDAAuD;IACvD,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,6EAA6E;IAE7E,SAAS,CAAC,OAAyB;QACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,OAAyB;QACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,UAAU,CAAC,OAAyB;QAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,OAAyB;QAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc,CAAC,OAAyB;QACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6EAA6E;IAE7E;;;OAGG;IACH,KAAK,CAAC,aAAa,CACjB,QAAgB,EAChB,OAA+B,EAC/B,IAAY;QAEZ,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,qCAAqC;QACrC,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAEvD,2BAA2B;QAC3B,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACjF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,cAAc;QACd,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAE5C,oCAAoC;QACpC,IAAI,KAAK,CAAC,SAAS,KAAK,kBAAkB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAC9D,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;QACxC,CAAC;QAED,mBAAmB;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrF,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;QAE1C,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,iCAAiC;QACjC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB,CAC1B,QAAgB,EAChB,OAA+B,EAC/B,IAAY;QAEZ,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAEvD,iBAAiB;QACjB,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACjF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAE5C,IAAI,KAAK,CAAC,SAAS,KAAK,kBAAkB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAC9D,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;QAC1B,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,EAAE,CAAC;QAExC,kCAAkC;QAClC,MAAM,WAAW,GAAG,MAAqB,CAAC;QAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,gBAAgB,CACxC,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,CAC7D,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,EAAyB,CAAC;QACjE,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;QAEpC,oCAAoC;QACpC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAEtD,IAAI,KAAK,EAAE,MAAM,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9D,MAAM,KAAK,GAAI,UAAkB,CAAC,KAAK,CAAC;YACxC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;gBAAE,SAAS;YAEpD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEnB,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC/B,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,kBAAkB,CACzC,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CACxD,CAAC;oBACF,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CACxC,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,CAC7D,CAAC;YACF,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6EAA6E;IAErE,KAAK,CAAC,cAAc,CAAC,KAAgB;QAC3C,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAEhC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;QAE1B,yCAAyC;QACzC,sEAAsE;QACtE,sEAAsE;QACtE,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAE/E,MAAM,GAAG,GAAG,IAAI,WAAW,CACzB,SAAS,EAAK,eAAe;QAC7B,SAAS,EAAK,qCAAqC;QACnD,CAAC,EAAa,UAAU;QACxB,IAAI,CAAC,KAAK,CAAC,IAAI,CAChB,CAAC;QAEF,MAAM,MAAM,GAAgB,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACnE,OAAO,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,QAAgB,EAAE,SAAiB,EAAE,QAAgB;QAC3E,8DAA8D;QAC9D,MAAM,EAAE,GAAG,sCAAsC,CAAC;QAClD,MAAM,IAAI,GAAG,GAAG,QAAQ,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAC;QAEpD,gFAAgF;QAChF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAE7F,mBAAmB;QACnB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QAClC,0BAA0B;QAC1B,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QAElC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjD,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IACjH,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,MAAsB,EACtB,KAAgB,EAChB,IAAY;QAEZ,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,MAAqB,CAAC;YAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,SAAS,CAAC;YAC3E,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CACjC,WAAW,CAAC,QAAQ,EACpB,KAAK,CAAC,SAAU,EAChB,IAAI,EACJ,QAAQ,CACT,CAAC;YACF,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,YAAY,MAAM,CAAC,QAAQ,oBAAoB,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,GAAoB;QAC/C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YACpC,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CACV,uBAAuB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,QAAQ,CAAC,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAC9G,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,gBAAgB,CAAC,QAAgB;QACvC,oDAAoD;QACpD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,GAAQ;QAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO;YACrB,CAAC,CAAC;gBACE,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE;gBAClB,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ;gBAC9B,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS;gBAC1D,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ;gBACvD,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM;gBAC1B,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO;gBAC5B,WAAW,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;oBAC5D,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,QAAQ,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,QAAQ;oBACnC,GAAG,EAAE,CAAC,CAAC,GAAG;oBACV,SAAS,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,SAAS;iBACvC,CAAC,CAAC;gBACH,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS;gBAC1D,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI;gBAC3C,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE;aACrC;YACH,CAAC,CAAC,SAAS,CAAC;QAEd,OAAO;YACL,SAAS,EAAE,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,SAAS;YAC1C,OAAO,EAAE,GAAG;YACZ,SAAS,EAAE,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,SAAS;YAC1C,QAAQ,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,QAAQ;YACvC,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,QAAQ,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,QAAQ;SACxC,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,MAAsB;QAC7C,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxB,KAAK,OAAO;gBACV,OAAQ,MAAsB,CAAC,aAAa,CAAC;YAC/C,qEAAqE;YACrE;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;CACF"}
|