@teneo-protocol/sdk 1.0.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.
- package/.dockerignore +14 -0
- package/.env.test.example +14 -0
- package/.eslintrc.json +26 -0
- package/.github/workflows/claude-code-review.yml +78 -0
- package/.github/workflows/claude-reviewer.yml +64 -0
- package/.github/workflows/publish-npm.yml +38 -0
- package/.github/workflows/push-to-main.yml +23 -0
- package/.node-version +1 -0
- package/.prettierrc +11 -0
- package/Dockerfile +25 -0
- package/LICENCE +661 -0
- package/README.md +709 -0
- package/dist/constants.d.ts +42 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +45 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/websocket-client.d.ts +261 -0
- package/dist/core/websocket-client.d.ts.map +1 -0
- package/dist/core/websocket-client.js +875 -0
- package/dist/core/websocket-client.js.map +1 -0
- package/dist/formatters/response-formatter.d.ts +354 -0
- package/dist/formatters/response-formatter.d.ts.map +1 -0
- package/dist/formatters/response-formatter.js +575 -0
- package/dist/formatters/response-formatter.js.map +1 -0
- package/dist/handlers/message-handler-registry.d.ts +155 -0
- package/dist/handlers/message-handler-registry.d.ts.map +1 -0
- package/dist/handlers/message-handler-registry.js +216 -0
- package/dist/handlers/message-handler-registry.js.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts +112 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.js +40 -0
- package/dist/handlers/message-handlers/agent-selected-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agents-list-handler.d.ts +14 -0
- package/dist/handlers/message-handlers/agents-list-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agents-list-handler.js +25 -0
- package/dist/handlers/message-handlers/agents-list-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts +71 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/auth-error-handler.js +30 -0
- package/dist/handlers/message-handlers/auth-error-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-message-handler.d.ts +18 -0
- package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/auth-message-handler.js +60 -0
- package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-required-handler.d.ts +76 -0
- package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/auth-required-handler.js +23 -0
- package/dist/handlers/message-handlers/auth-required-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-success-handler.d.ts +18 -0
- package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/auth-success-handler.js +51 -0
- package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -0
- package/dist/handlers/message-handlers/base-handler.d.ts +55 -0
- package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/base-handler.js +83 -0
- package/dist/handlers/message-handlers/base-handler.js.map +1 -0
- package/dist/handlers/message-handlers/challenge-handler.d.ts +73 -0
- package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/challenge-handler.js +47 -0
- package/dist/handlers/message-handlers/challenge-handler.js.map +1 -0
- package/dist/handlers/message-handlers/error-message-handler.d.ts +76 -0
- package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/error-message-handler.js +29 -0
- package/dist/handlers/message-handlers/error-message-handler.js.map +1 -0
- package/dist/handlers/message-handlers/index.d.ts +28 -0
- package/dist/handlers/message-handlers/index.d.ts.map +1 -0
- package/dist/handlers/message-handlers/index.js +100 -0
- package/dist/handlers/message-handlers/index.js.map +1 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +122 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.js +30 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts +104 -0
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/ping-pong-handler.js +36 -0
- package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -0
- package/dist/handlers/message-handlers/regular-message-handler.d.ts +56 -0
- package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/regular-message-handler.js +59 -0
- package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +81 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.js +48 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/task-response-handler.d.ts +14 -0
- package/dist/handlers/message-handlers/task-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/task-response-handler.js +44 -0
- package/dist/handlers/message-handlers/task-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/types.d.ts +51 -0
- package/dist/handlers/message-handlers/types.d.ts.map +1 -0
- package/dist/handlers/message-handlers/types.js +7 -0
- package/dist/handlers/message-handlers/types.js.map +1 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +81 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.js +48 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.js.map +1 -0
- package/dist/handlers/webhook-handler.d.ts +202 -0
- package/dist/handlers/webhook-handler.d.ts.map +1 -0
- package/dist/handlers/webhook-handler.js +511 -0
- package/dist/handlers/webhook-handler.js.map +1 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +217 -0
- package/dist/index.js.map +1 -0
- package/dist/managers/agent-registry.d.ts +173 -0
- package/dist/managers/agent-registry.d.ts.map +1 -0
- package/dist/managers/agent-registry.js +310 -0
- package/dist/managers/agent-registry.js.map +1 -0
- package/dist/managers/connection-manager.d.ts +134 -0
- package/dist/managers/connection-manager.d.ts.map +1 -0
- package/dist/managers/connection-manager.js +176 -0
- package/dist/managers/connection-manager.js.map +1 -0
- package/dist/managers/index.d.ts +9 -0
- package/dist/managers/index.d.ts.map +1 -0
- package/dist/managers/index.js +16 -0
- package/dist/managers/index.js.map +1 -0
- package/dist/managers/message-router.d.ts +112 -0
- package/dist/managers/message-router.d.ts.map +1 -0
- package/dist/managers/message-router.js +260 -0
- package/dist/managers/message-router.js.map +1 -0
- package/dist/managers/room-manager.d.ts +165 -0
- package/dist/managers/room-manager.d.ts.map +1 -0
- package/dist/managers/room-manager.js +227 -0
- package/dist/managers/room-manager.js.map +1 -0
- package/dist/teneo-sdk.d.ts +703 -0
- package/dist/teneo-sdk.d.ts.map +1 -0
- package/dist/teneo-sdk.js +907 -0
- package/dist/teneo-sdk.js.map +1 -0
- package/dist/types/config.d.ts +1047 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +720 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/error-codes.d.ts +29 -0
- package/dist/types/error-codes.d.ts.map +1 -0
- package/dist/types/error-codes.js +41 -0
- package/dist/types/error-codes.js.map +1 -0
- package/dist/types/events.d.ts +616 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +261 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/health.d.ts +40 -0
- package/dist/types/health.d.ts.map +1 -0
- package/dist/types/health.js +6 -0
- package/dist/types/health.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +123 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/messages.d.ts +3734 -0
- package/dist/types/messages.d.ts.map +1 -0
- package/dist/types/messages.js +482 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/validation.d.ts +81 -0
- package/dist/types/validation.d.ts.map +1 -0
- package/dist/types/validation.js +115 -0
- package/dist/types/validation.js.map +1 -0
- package/dist/utils/bounded-queue.d.ts +127 -0
- package/dist/utils/bounded-queue.d.ts.map +1 -0
- package/dist/utils/bounded-queue.js +181 -0
- package/dist/utils/bounded-queue.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +141 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +215 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/deduplication-cache.d.ts +110 -0
- package/dist/utils/deduplication-cache.d.ts.map +1 -0
- package/dist/utils/deduplication-cache.js +177 -0
- package/dist/utils/deduplication-cache.js.map +1 -0
- package/dist/utils/event-waiter.d.ts +101 -0
- package/dist/utils/event-waiter.d.ts.map +1 -0
- package/dist/utils/event-waiter.js +118 -0
- package/dist/utils/event-waiter.js.map +1 -0
- package/dist/utils/index.d.ts +51 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +72 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +22 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +91 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +122 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +190 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/retry-policy.d.ts +191 -0
- package/dist/utils/retry-policy.d.ts.map +1 -0
- package/dist/utils/retry-policy.js +225 -0
- package/dist/utils/retry-policy.js.map +1 -0
- package/dist/utils/secure-private-key.d.ts +113 -0
- package/dist/utils/secure-private-key.d.ts.map +1 -0
- package/dist/utils/secure-private-key.js +188 -0
- package/dist/utils/secure-private-key.js.map +1 -0
- package/dist/utils/signature-verifier.d.ts +143 -0
- package/dist/utils/signature-verifier.d.ts.map +1 -0
- package/dist/utils/signature-verifier.js +238 -0
- package/dist/utils/signature-verifier.js.map +1 -0
- package/dist/utils/ssrf-validator.d.ts +36 -0
- package/dist/utils/ssrf-validator.d.ts.map +1 -0
- package/dist/utils/ssrf-validator.js +195 -0
- package/dist/utils/ssrf-validator.js.map +1 -0
- package/examples/.env.example +17 -0
- package/examples/basic-usage.ts +211 -0
- package/examples/production-dashboard/.env.example +153 -0
- package/examples/production-dashboard/package.json +39 -0
- package/examples/production-dashboard/public/dashboard.html +642 -0
- package/examples/production-dashboard/server.ts +753 -0
- package/examples/webhook-integration.ts +239 -0
- package/examples/x-influencer-battle-redesign.html +1065 -0
- package/examples/x-influencer-battle-server.ts +217 -0
- package/examples/x-influencer-battle.html +787 -0
- package/package.json +65 -0
- package/src/constants.ts +43 -0
- package/src/core/websocket-client.test.ts +512 -0
- package/src/core/websocket-client.ts +1056 -0
- package/src/formatters/response-formatter.test.ts +571 -0
- package/src/formatters/response-formatter.ts +677 -0
- package/src/handlers/message-handler-registry.ts +239 -0
- package/src/handlers/message-handlers/agent-selected-handler.ts +40 -0
- package/src/handlers/message-handlers/agents-list-handler.ts +26 -0
- package/src/handlers/message-handlers/auth-error-handler.ts +31 -0
- package/src/handlers/message-handlers/auth-message-handler.ts +66 -0
- package/src/handlers/message-handlers/auth-required-handler.ts +23 -0
- package/src/handlers/message-handlers/auth-success-handler.ts +57 -0
- package/src/handlers/message-handlers/base-handler.ts +101 -0
- package/src/handlers/message-handlers/challenge-handler.ts +57 -0
- package/src/handlers/message-handlers/error-message-handler.ts +27 -0
- package/src/handlers/message-handlers/index.ts +77 -0
- package/src/handlers/message-handlers/list-rooms-response-handler.ts +28 -0
- package/src/handlers/message-handlers/ping-pong-handler.ts +30 -0
- package/src/handlers/message-handlers/regular-message-handler.ts +65 -0
- package/src/handlers/message-handlers/subscribe-response-handler.ts +47 -0
- package/src/handlers/message-handlers/task-response-handler.ts +45 -0
- package/src/handlers/message-handlers/types.ts +77 -0
- package/src/handlers/message-handlers/unsubscribe-response-handler.ts +47 -0
- package/src/handlers/webhook-handler.test.ts +789 -0
- package/src/handlers/webhook-handler.ts +576 -0
- package/src/index.ts +269 -0
- package/src/managers/agent-registry.test.ts +466 -0
- package/src/managers/agent-registry.ts +347 -0
- package/src/managers/connection-manager.ts +195 -0
- package/src/managers/index.ts +9 -0
- package/src/managers/message-router.ts +349 -0
- package/src/managers/room-manager.ts +248 -0
- package/src/teneo-sdk.ts +1022 -0
- package/src/types/config.test.ts +325 -0
- package/src/types/config.ts +799 -0
- package/src/types/error-codes.ts +44 -0
- package/src/types/events.test.ts +302 -0
- package/src/types/events.ts +382 -0
- package/src/types/health.ts +46 -0
- package/src/types/index.ts +199 -0
- package/src/types/messages.test.ts +660 -0
- package/src/types/messages.ts +570 -0
- package/src/types/validation.ts +123 -0
- package/src/utils/bounded-queue.test.ts +356 -0
- package/src/utils/bounded-queue.ts +205 -0
- package/src/utils/circuit-breaker.test.ts +394 -0
- package/src/utils/circuit-breaker.ts +262 -0
- package/src/utils/deduplication-cache.test.ts +380 -0
- package/src/utils/deduplication-cache.ts +198 -0
- package/src/utils/event-waiter.test.ts +381 -0
- package/src/utils/event-waiter.ts +172 -0
- package/src/utils/index.ts +74 -0
- package/src/utils/logger.ts +87 -0
- package/src/utils/rate-limiter.test.ts +341 -0
- package/src/utils/rate-limiter.ts +211 -0
- package/src/utils/retry-policy.test.ts +558 -0
- package/src/utils/retry-policy.ts +272 -0
- package/src/utils/secure-private-key.test.ts +356 -0
- package/src/utils/secure-private-key.ts +205 -0
- package/src/utils/signature-verifier.test.ts +464 -0
- package/src/utils/signature-verifier.ts +298 -0
- package/src/utils/ssrf-validator.test.ts +372 -0
- package/src/utils/ssrf-validator.ts +224 -0
- package/tests/integration/real-server.test.ts +740 -0
- package/tests/integration/websocket.test.ts +381 -0
- package/tests/integration-setup.ts +16 -0
- package/tests/setup.ts +34 -0
- package/tsconfig.json +32 -0
- package/vitest.config.ts +42 -0
- package/vitest.integration.config.ts +23 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Handler for auth_error messages
|
|
4
|
+
* Handles authentication errors
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.AuthErrorHandler = void 0;
|
|
8
|
+
const types_1 = require("../../types");
|
|
9
|
+
const events_1 = require("../../types/events");
|
|
10
|
+
const base_handler_1 = require("./base-handler");
|
|
11
|
+
class AuthErrorHandler extends base_handler_1.BaseMessageHandler {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.type = "auth_error";
|
|
15
|
+
this.schema = types_1.AuthErrorMessageSchema;
|
|
16
|
+
}
|
|
17
|
+
async handleValidated(message, context) {
|
|
18
|
+
const error = message.data.error || "Authentication failed";
|
|
19
|
+
context.logger.error("Authentication failed", { error });
|
|
20
|
+
// Update states
|
|
21
|
+
this.updateAuthState(context, { authenticated: false });
|
|
22
|
+
this.updateConnectionState(context, {
|
|
23
|
+
lastError: new events_1.AuthenticationError(error)
|
|
24
|
+
});
|
|
25
|
+
// Emit error event
|
|
26
|
+
this.emit(context, "auth:error", error);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.AuthErrorHandler = AuthErrorHandler;
|
|
30
|
+
//# sourceMappingURL=auth-error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-error-handler.js","sourceRoot":"","sources":["../../../src/handlers/message-handlers/auth-error-handler.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,uCAAuE;AACvE,+CAAyD;AACzD,iDAAoD;AAGpD,MAAa,gBAAiB,SAAQ,iCAAoC;IAA1E;;QACW,SAAI,GAAG,YAAqB,CAAC;QAC7B,WAAM,GAAG,8BAAsB,CAAC;IAkB3C,CAAC;IAhBW,KAAK,CAAC,eAAe,CAC7B,OAAyB,EACzB,OAAuB;QAEvB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,uBAAuB,CAAC;QAC5D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAEzD,gBAAgB;QAChB,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE;YAClC,SAAS,EAAE,IAAI,4BAAmB,CAAC,KAAK,CAAC;SAC1C,CAAC,CAAC;QAEH,mBAAmB;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;CACF;AApBD,4CAoBC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for auth messages
|
|
3
|
+
* Handles authentication response from server (both fresh and cached)
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { AuthMessage } from "../../types";
|
|
7
|
+
import { BaseMessageHandler } from "./base-handler";
|
|
8
|
+
import { HandlerContext } from "./types";
|
|
9
|
+
export declare class AuthMessageHandler extends BaseMessageHandler<AuthMessage> {
|
|
10
|
+
readonly type: "auth";
|
|
11
|
+
readonly schema: z.ZodSchema<AuthMessage>;
|
|
12
|
+
protected handleValidated(message: AuthMessage, context: HandlerContext): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Extract and normalize rooms from auth data
|
|
15
|
+
*/
|
|
16
|
+
private extractRooms;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=auth-message-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-message-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/message-handlers/auth-message-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAA2B,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,qBAAa,kBAAmB,SAAQ,kBAAkB,CAAC,WAAW,CAAC;IACrE,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAU;IAChC,QAAQ,CAAC,MAAM,EAAwB,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;cAEhD,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA0C7F;;OAEG;IACH,OAAO,CAAC,YAAY;CAMrB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Handler for auth messages
|
|
4
|
+
* Handles authentication response from server (both fresh and cached)
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.AuthMessageHandler = void 0;
|
|
8
|
+
const types_1 = require("../../types");
|
|
9
|
+
const base_handler_1 = require("./base-handler");
|
|
10
|
+
class AuthMessageHandler extends base_handler_1.BaseMessageHandler {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments);
|
|
13
|
+
this.type = "auth";
|
|
14
|
+
this.schema = types_1.AuthMessageSchema;
|
|
15
|
+
}
|
|
16
|
+
async handleValidated(message, context) {
|
|
17
|
+
context.logger.info("Handling auth message", {
|
|
18
|
+
hasData: !!message.data,
|
|
19
|
+
dataKeys: message.data ? Object.keys(message.data) : [],
|
|
20
|
+
to: message.to
|
|
21
|
+
});
|
|
22
|
+
// Check if this is a successful auth response by looking for required fields
|
|
23
|
+
if (message.data?.id || message.data?.address || message.data?.cached_auth || message.to) {
|
|
24
|
+
const isCachedAuth = !!message.data?.cached_auth;
|
|
25
|
+
context.logger.info(isCachedAuth ? "Using cached authentication" : "Authentication successful");
|
|
26
|
+
// Extract rooms
|
|
27
|
+
const rooms = this.extractRooms(message.data?.rooms);
|
|
28
|
+
// Update connection state
|
|
29
|
+
this.updateConnectionState(context, { authenticated: true });
|
|
30
|
+
// Update auth state
|
|
31
|
+
this.updateAuthState(context, {
|
|
32
|
+
authenticated: true,
|
|
33
|
+
clientId: message.data?.id || message.to || "",
|
|
34
|
+
walletAddress: message.data?.address || "",
|
|
35
|
+
isWhitelisted: message.data?.is_whitelisted,
|
|
36
|
+
isAdmin: message.data?.is_admin_whitelisted,
|
|
37
|
+
nftVerified: message.data?.nft_verified,
|
|
38
|
+
rooms: rooms.map((r) => r.id),
|
|
39
|
+
roomObjects: rooms,
|
|
40
|
+
privateRoomId: message.data?.private_room_id
|
|
41
|
+
});
|
|
42
|
+
// Get updated auth state
|
|
43
|
+
const authState = context.getAuthState();
|
|
44
|
+
// Emit events
|
|
45
|
+
this.emit(context, "auth:success", authState);
|
|
46
|
+
this.emit(context, "ready");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Extract and normalize rooms from auth data
|
|
51
|
+
*/
|
|
52
|
+
extractRooms(rooms) {
|
|
53
|
+
if (!rooms || !Array.isArray(rooms)) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
return rooms;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.AuthMessageHandler = AuthMessageHandler;
|
|
60
|
+
//# sourceMappingURL=auth-message-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-message-handler.js","sourceRoot":"","sources":["../../../src/handlers/message-handlers/auth-message-handler.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,uCAAmE;AACnE,iDAAoD;AAGpD,MAAa,kBAAmB,SAAQ,iCAA+B;IAAvE;;QACW,SAAI,GAAG,MAAe,CAAC;QACvB,WAAM,GAAG,yBAA6C,CAAC;IAqDlE,CAAC;IAnDW,KAAK,CAAC,eAAe,CAAC,OAAoB,EAAE,OAAuB;QAC3E,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;YAC3C,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI;YACvB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;YACvD,EAAE,EAAE,OAAO,CAAC,EAAE;SACf,CAAC,CAAC;QAEH,6EAA6E;QAC7E,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,WAAW,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YACzF,MAAM,YAAY,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC;YACjD,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,YAAY,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,2BAA2B,CAC3E,CAAC;YAEF,gBAAgB;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAErD,0BAA0B;YAC1B,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAE7D,oBAAoB;YACpB,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE;gBAC5B,aAAa,EAAE,IAAI;gBACnB,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE;gBAC9C,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE;gBAC1C,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,cAAc;gBAC3C,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,oBAAoB;gBAC3C,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,YAAY;gBACvC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7B,WAAW,EAAE,KAAK;gBAClB,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,eAAe;aAC7C,CAAC,CAAC;YAEH,yBAAyB;YACzB,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YAEzC,cAAc;YACd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,KAAc;QACjC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAvDD,gDAuDC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for auth_required messages
|
|
3
|
+
* Server is requesting authentication
|
|
4
|
+
*/
|
|
5
|
+
import { AuthRequiredMessage } from "../../types";
|
|
6
|
+
import { BaseMessageHandler } from "./base-handler";
|
|
7
|
+
import { HandlerContext } from "./types";
|
|
8
|
+
export declare class AuthRequiredHandler extends BaseMessageHandler<AuthRequiredMessage> {
|
|
9
|
+
readonly type: "auth_required";
|
|
10
|
+
readonly schema: import("zod").ZodObject<{
|
|
11
|
+
content_type: import("zod").ZodOptional<import("zod").ZodEnum<["text/plain", "text/markdown", "text/html", "application/json", "image/*", "STRING", "JSON", "MD", "ARRAY"]>>;
|
|
12
|
+
to: import("zod").ZodOptional<import("zod").ZodString>;
|
|
13
|
+
room: import("zod").ZodOptional<import("zod").ZodString>;
|
|
14
|
+
timestamp: import("zod").ZodOptional<import("zod").ZodString>;
|
|
15
|
+
signature: import("zod").ZodOptional<import("zod").ZodString>;
|
|
16
|
+
publicKey: import("zod").ZodOptional<import("zod").ZodString>;
|
|
17
|
+
reasoning: import("zod").ZodOptional<import("zod").ZodString>;
|
|
18
|
+
task_id: import("zod").ZodOptional<import("zod").ZodString>;
|
|
19
|
+
id: import("zod").ZodOptional<import("zod").ZodString>;
|
|
20
|
+
} & {
|
|
21
|
+
type: import("zod").ZodLiteral<"auth_required">;
|
|
22
|
+
content: import("zod").ZodOptional<import("zod").ZodString>;
|
|
23
|
+
from: import("zod").ZodOptional<import("zod").ZodLiteral<"system">>;
|
|
24
|
+
data: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
25
|
+
cache_ttl_hours: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
26
|
+
supported_auth_methods: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
|
|
27
|
+
supports_cache_check: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
28
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
29
|
+
cache_ttl_hours?: number | undefined;
|
|
30
|
+
supported_auth_methods?: string[] | undefined;
|
|
31
|
+
supports_cache_check?: boolean | undefined;
|
|
32
|
+
}, {
|
|
33
|
+
cache_ttl_hours?: number | undefined;
|
|
34
|
+
supported_auth_methods?: string[] | undefined;
|
|
35
|
+
supports_cache_check?: boolean | undefined;
|
|
36
|
+
}>>;
|
|
37
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
38
|
+
type: "auth_required";
|
|
39
|
+
id?: string | undefined;
|
|
40
|
+
room?: string | undefined;
|
|
41
|
+
content?: string | undefined;
|
|
42
|
+
content_type?: "text/plain" | "text/markdown" | "text/html" | "application/json" | "image/*" | "STRING" | "JSON" | "MD" | "ARRAY" | undefined;
|
|
43
|
+
from?: "system" | undefined;
|
|
44
|
+
to?: string | undefined;
|
|
45
|
+
timestamp?: string | undefined;
|
|
46
|
+
data?: {
|
|
47
|
+
cache_ttl_hours?: number | undefined;
|
|
48
|
+
supported_auth_methods?: string[] | undefined;
|
|
49
|
+
supports_cache_check?: boolean | undefined;
|
|
50
|
+
} | undefined;
|
|
51
|
+
signature?: string | undefined;
|
|
52
|
+
publicKey?: string | undefined;
|
|
53
|
+
reasoning?: string | undefined;
|
|
54
|
+
task_id?: string | undefined;
|
|
55
|
+
}, {
|
|
56
|
+
type: "auth_required";
|
|
57
|
+
id?: string | undefined;
|
|
58
|
+
room?: string | undefined;
|
|
59
|
+
content?: string | undefined;
|
|
60
|
+
content_type?: "text/plain" | "text/markdown" | "text/html" | "application/json" | "image/*" | "STRING" | "JSON" | "MD" | "ARRAY" | undefined;
|
|
61
|
+
from?: "system" | undefined;
|
|
62
|
+
to?: string | undefined;
|
|
63
|
+
timestamp?: string | undefined;
|
|
64
|
+
data?: {
|
|
65
|
+
cache_ttl_hours?: number | undefined;
|
|
66
|
+
supported_auth_methods?: string[] | undefined;
|
|
67
|
+
supports_cache_check?: boolean | undefined;
|
|
68
|
+
} | undefined;
|
|
69
|
+
signature?: string | undefined;
|
|
70
|
+
publicKey?: string | undefined;
|
|
71
|
+
reasoning?: string | undefined;
|
|
72
|
+
task_id?: string | undefined;
|
|
73
|
+
}>;
|
|
74
|
+
protected handleValidated(_message: AuthRequiredMessage, context: HandlerContext): Promise<void>;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=auth-required-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-required-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/message-handlers/auth-required-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAA6B,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,qBAAa,mBAAoB,SAAQ,kBAAkB,CAAC,mBAAmB,CAAC;IAC9E,QAAQ,CAAC,IAAI,EAAG,eAAe,CAAU;IACzC,QAAQ,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAA6B;cAE5B,eAAe,CAC7B,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC;CAMjB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Handler for auth_required messages
|
|
4
|
+
* Server is requesting authentication
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.AuthRequiredHandler = void 0;
|
|
8
|
+
const types_1 = require("../../types");
|
|
9
|
+
const base_handler_1 = require("./base-handler");
|
|
10
|
+
class AuthRequiredHandler extends base_handler_1.BaseMessageHandler {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments);
|
|
13
|
+
this.type = "auth_required";
|
|
14
|
+
this.schema = types_1.AuthRequiredMessageSchema;
|
|
15
|
+
}
|
|
16
|
+
async handleValidated(_message, context) {
|
|
17
|
+
context.logger.debug("Server requesting authentication");
|
|
18
|
+
// Emit auth:required event
|
|
19
|
+
this.emit(context, "auth:required");
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.AuthRequiredHandler = AuthRequiredHandler;
|
|
23
|
+
//# sourceMappingURL=auth-required-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-required-handler.js","sourceRoot":"","sources":["../../../src/handlers/message-handlers/auth-required-handler.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,uCAA6E;AAC7E,iDAAoD;AAGpD,MAAa,mBAAoB,SAAQ,iCAAuC;IAAhF;;QACW,SAAI,GAAG,eAAwB,CAAC;QAChC,WAAM,GAAG,iCAAyB,CAAC;IAW9C,CAAC;IATW,KAAK,CAAC,eAAe,CAC7B,QAA6B,EAC7B,OAAuB;QAEvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAEzD,2BAA2B;QAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACtC,CAAC;CACF;AAbD,kDAaC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for auth_success messages
|
|
3
|
+
* Legacy support for explicit auth_success message type
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { AuthSuccessMessage } from "../../types";
|
|
7
|
+
import { BaseMessageHandler } from "./base-handler";
|
|
8
|
+
import { HandlerContext } from "./types";
|
|
9
|
+
export declare class AuthSuccessHandler extends BaseMessageHandler<AuthSuccessMessage> {
|
|
10
|
+
readonly type: "auth_success";
|
|
11
|
+
readonly schema: z.ZodSchema<AuthSuccessMessage>;
|
|
12
|
+
protected handleValidated(message: AuthSuccessMessage, context: HandlerContext): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Extract and normalize rooms from auth data
|
|
15
|
+
*/
|
|
16
|
+
private extractRooms;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=auth-success-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-success-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/message-handlers/auth-success-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAkC,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,qBAAa,kBAAmB,SAAQ,kBAAkB,CAAC,kBAAkB,CAAC;IAC5E,QAAQ,CAAC,IAAI,EAAG,cAAc,CAAU;IACxC,QAAQ,CAAC,MAAM,EAA+B,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;cAE9D,eAAe,CAC7B,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC;IA8BhB;;OAEG;IACH,OAAO,CAAC,YAAY;CAMrB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Handler for auth_success messages
|
|
4
|
+
* Legacy support for explicit auth_success message type
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.AuthSuccessHandler = void 0;
|
|
8
|
+
const types_1 = require("../../types");
|
|
9
|
+
const base_handler_1 = require("./base-handler");
|
|
10
|
+
class AuthSuccessHandler extends base_handler_1.BaseMessageHandler {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments);
|
|
13
|
+
this.type = "auth_success";
|
|
14
|
+
this.schema = types_1.AuthSuccessMessageSchema;
|
|
15
|
+
}
|
|
16
|
+
async handleValidated(message, context) {
|
|
17
|
+
context.logger.info("Authentication successful");
|
|
18
|
+
// Extract rooms
|
|
19
|
+
const rooms = this.extractRooms(message.data.rooms);
|
|
20
|
+
// Update connection state
|
|
21
|
+
this.updateConnectionState(context, { authenticated: true });
|
|
22
|
+
// Update auth state
|
|
23
|
+
this.updateAuthState(context, {
|
|
24
|
+
authenticated: true,
|
|
25
|
+
clientId: message.data.id,
|
|
26
|
+
walletAddress: message.data.address,
|
|
27
|
+
isWhitelisted: message.data.is_whitelisted,
|
|
28
|
+
isAdmin: message.data.is_admin_whitelisted,
|
|
29
|
+
nftVerified: message.data.nft_verified,
|
|
30
|
+
rooms: rooms.map((r) => r.id),
|
|
31
|
+
roomObjects: rooms,
|
|
32
|
+
privateRoomId: message.data.private_room_id
|
|
33
|
+
});
|
|
34
|
+
// Get updated auth state
|
|
35
|
+
const authState = context.getAuthState();
|
|
36
|
+
// Emit events
|
|
37
|
+
this.emit(context, "auth:success", authState);
|
|
38
|
+
this.emit(context, "ready");
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Extract and normalize rooms from auth data
|
|
42
|
+
*/
|
|
43
|
+
extractRooms(rooms) {
|
|
44
|
+
if (!rooms || !Array.isArray(rooms)) {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
return rooms;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.AuthSuccessHandler = AuthSuccessHandler;
|
|
51
|
+
//# sourceMappingURL=auth-success-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-success-handler.js","sourceRoot":"","sources":["../../../src/handlers/message-handlers/auth-success-handler.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,uCAAiF;AACjF,iDAAoD;AAGpD,MAAa,kBAAmB,SAAQ,iCAAsC;IAA9E;;QACW,SAAI,GAAG,cAAuB,CAAC;QAC/B,WAAM,GAAG,gCAA2D,CAAC;IA4ChF,CAAC;IA1CW,KAAK,CAAC,eAAe,CAC7B,OAA2B,EAC3B,OAAuB;QAEvB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAEjD,gBAAgB;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEpD,0BAA0B;QAC1B,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7D,oBAAoB;QACpB,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE;YAC5B,aAAa,EAAE,IAAI;YACnB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;YACzB,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO;YACnC,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc;YAC1C,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,oBAAoB;YAC1C,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY;YACtC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,WAAW,EAAE,KAAK;YAClB,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,eAAe;SAC5C,CAAC,CAAC;QAEH,yBAAyB;QACzB,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;QAEzC,cAAc;QACd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,KAAc;QACjC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA9CD,gDA8CC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base abstract class for message handlers
|
|
3
|
+
* Implements the template method pattern for consistent message handling
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { BaseMessage, MessageType } from "../../types";
|
|
7
|
+
import { MessageHandler, HandlerContext } from "./types";
|
|
8
|
+
/**
|
|
9
|
+
* Abstract base class for message handlers
|
|
10
|
+
* Provides common functionality and enforces consistent structure
|
|
11
|
+
*/
|
|
12
|
+
export declare abstract class BaseMessageHandler<T extends BaseMessage = BaseMessage> implements MessageHandler<T> {
|
|
13
|
+
abstract readonly type: MessageType;
|
|
14
|
+
abstract readonly schema: z.ZodSchema<T>;
|
|
15
|
+
/**
|
|
16
|
+
* Check if this handler can handle the given message
|
|
17
|
+
*/
|
|
18
|
+
canHandle(message: BaseMessage): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Main handle method - implements template method pattern
|
|
21
|
+
* 1. Validates message
|
|
22
|
+
* 2. Calls handleValidated (implemented by subclasses)
|
|
23
|
+
* 3. Handles errors
|
|
24
|
+
*/
|
|
25
|
+
handle(message: BaseMessage, context: HandlerContext): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Validate message against schema
|
|
28
|
+
*/
|
|
29
|
+
protected validate(message: BaseMessage): T;
|
|
30
|
+
/**
|
|
31
|
+
* Handle validated message - implemented by subclasses
|
|
32
|
+
*/
|
|
33
|
+
protected abstract handleValidated(message: T, context: HandlerContext): Promise<void> | void;
|
|
34
|
+
/**
|
|
35
|
+
* Handle errors - can be overridden by subclasses
|
|
36
|
+
*/
|
|
37
|
+
protected onError(error: unknown, message: BaseMessage, context: HandlerContext): void;
|
|
38
|
+
/**
|
|
39
|
+
* Helper: emit event
|
|
40
|
+
*/
|
|
41
|
+
protected emit(context: HandlerContext, event: string, ...args: any[]): void;
|
|
42
|
+
/**
|
|
43
|
+
* Helper: send webhook (fire-and-forget pattern)
|
|
44
|
+
*/
|
|
45
|
+
protected sendWebhook(context: HandlerContext, type: string, data: any, metadata?: any): void;
|
|
46
|
+
/**
|
|
47
|
+
* Helper: update connection state
|
|
48
|
+
*/
|
|
49
|
+
protected updateConnectionState(context: HandlerContext, update: any): void;
|
|
50
|
+
/**
|
|
51
|
+
* Helper: update auth state
|
|
52
|
+
*/
|
|
53
|
+
protected updateAuthState(context: HandlerContext, update: any): void;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=base-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/message-handlers/base-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzD;;;GAGG;AACH,8BAAsB,kBAAkB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CAC1E,YAAW,cAAc,CAAC,CAAC,CAAC;IAG5B,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAEzC;;OAEG;IACI,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO;IAI/C;;;;;OAKG;IACU,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAajF;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,CAAC;IAQ3C;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAE7F;;OAEG;IACH,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAKtF;;OAEG;IACH,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI5E;;OAEG;IACH,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IAO7F;;OAEG;IACH,SAAS,CAAC,qBAAqB,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI;IAI3E;;OAEG;IACH,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI;CAGtE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Base abstract class for message handlers
|
|
4
|
+
* Implements the template method pattern for consistent message handling
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.BaseMessageHandler = void 0;
|
|
8
|
+
/**
|
|
9
|
+
* Abstract base class for message handlers
|
|
10
|
+
* Provides common functionality and enforces consistent structure
|
|
11
|
+
*/
|
|
12
|
+
class BaseMessageHandler {
|
|
13
|
+
/**
|
|
14
|
+
* Check if this handler can handle the given message
|
|
15
|
+
*/
|
|
16
|
+
canHandle(message) {
|
|
17
|
+
return message.type === this.type;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Main handle method - implements template method pattern
|
|
21
|
+
* 1. Validates message
|
|
22
|
+
* 2. Calls handleValidated (implemented by subclasses)
|
|
23
|
+
* 3. Handles errors
|
|
24
|
+
*/
|
|
25
|
+
async handle(message, context) {
|
|
26
|
+
try {
|
|
27
|
+
// Validate message with Zod schema
|
|
28
|
+
const validated = this.validate(message);
|
|
29
|
+
// Call subclass implementation
|
|
30
|
+
await this.handleValidated(validated, context);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
context.logger.error(`Error handling ${this.type} message`, error);
|
|
34
|
+
this.onError(error, message, context);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Validate message against schema
|
|
39
|
+
*/
|
|
40
|
+
validate(message) {
|
|
41
|
+
const result = this.schema.safeParse(message);
|
|
42
|
+
if (!result.success) {
|
|
43
|
+
throw new Error(`Invalid ${this.type} message: ${result.error.message}`);
|
|
44
|
+
}
|
|
45
|
+
return result.data;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Handle errors - can be overridden by subclasses
|
|
49
|
+
*/
|
|
50
|
+
onError(error, message, context) {
|
|
51
|
+
// Default: emit error event
|
|
52
|
+
context.emit("message:error", error, message);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Helper: emit event
|
|
56
|
+
*/
|
|
57
|
+
emit(context, event, ...args) {
|
|
58
|
+
context.emit(event, ...args);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Helper: send webhook (fire-and-forget pattern)
|
|
62
|
+
*/
|
|
63
|
+
sendWebhook(context, type, data, metadata) {
|
|
64
|
+
// Fire and forget - don't block event emission
|
|
65
|
+
context.sendWebhook(type, data, metadata).catch((error) => {
|
|
66
|
+
context.logger.error(`Failed to send webhook for ${this.type}`, error);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Helper: update connection state
|
|
71
|
+
*/
|
|
72
|
+
updateConnectionState(context, update) {
|
|
73
|
+
context.updateConnectionState(update);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Helper: update auth state
|
|
77
|
+
*/
|
|
78
|
+
updateAuthState(context, update) {
|
|
79
|
+
context.updateAuthState(update);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.BaseMessageHandler = BaseMessageHandler;
|
|
83
|
+
//# sourceMappingURL=base-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-handler.js","sourceRoot":"","sources":["../../../src/handlers/message-handlers/base-handler.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAMH;;;GAGG;AACH,MAAsB,kBAAkB;IAOtC;;OAEG;IACI,SAAS,CAAC,OAAoB;QACnC,OAAO,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;IACpC,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,MAAM,CAAC,OAAoB,EAAE,OAAuB;QAC/D,IAAI,CAAC;YACH,mCAAmC;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEzC,+BAA+B;YAC/B,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,IAAI,UAAU,EAAE,KAAK,CAAC,CAAC;YACnE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED;;OAEG;IACO,QAAQ,CAAC,OAAoB;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,IAAI,aAAa,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAOD;;OAEG;IACO,OAAO,CAAC,KAAc,EAAE,OAAoB,EAAE,OAAuB;QAC7E,4BAA4B;QAC5B,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACO,IAAI,CAAC,OAAuB,EAAE,KAAa,EAAE,GAAG,IAAW;QACnE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACO,WAAW,CAAC,OAAuB,EAAE,IAAY,EAAE,IAAS,EAAE,QAAc;QACpF,+CAA+C;QAC/C,OAAO,CAAC,WAAW,CAAC,IAAW,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACO,qBAAqB,CAAC,OAAuB,EAAE,MAAW;QAClE,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACO,eAAe,CAAC,OAAuB,EAAE,MAAW;QAC5D,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;CACF;AAvFD,gDAuFC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for challenge messages
|
|
3
|
+
* Handles authentication challenge-response flow
|
|
4
|
+
*/
|
|
5
|
+
import { ChallengeMessage } from "../../types";
|
|
6
|
+
import { BaseMessageHandler } from "./base-handler";
|
|
7
|
+
import { HandlerContext } from "./types";
|
|
8
|
+
export declare class ChallengeHandler extends BaseMessageHandler<ChallengeMessage> {
|
|
9
|
+
readonly type: "challenge";
|
|
10
|
+
readonly schema: import("zod").ZodObject<{
|
|
11
|
+
content: import("zod").ZodOptional<import("zod").ZodAny>;
|
|
12
|
+
content_type: import("zod").ZodOptional<import("zod").ZodEnum<["text/plain", "text/markdown", "text/html", "application/json", "image/*", "STRING", "JSON", "MD", "ARRAY"]>>;
|
|
13
|
+
from: import("zod").ZodOptional<import("zod").ZodString>;
|
|
14
|
+
to: import("zod").ZodOptional<import("zod").ZodString>;
|
|
15
|
+
room: import("zod").ZodOptional<import("zod").ZodString>;
|
|
16
|
+
timestamp: import("zod").ZodOptional<import("zod").ZodString>;
|
|
17
|
+
signature: import("zod").ZodOptional<import("zod").ZodString>;
|
|
18
|
+
publicKey: import("zod").ZodOptional<import("zod").ZodString>;
|
|
19
|
+
reasoning: import("zod").ZodOptional<import("zod").ZodString>;
|
|
20
|
+
task_id: import("zod").ZodOptional<import("zod").ZodString>;
|
|
21
|
+
id: import("zod").ZodOptional<import("zod").ZodString>;
|
|
22
|
+
} & {
|
|
23
|
+
type: import("zod").ZodLiteral<"challenge">;
|
|
24
|
+
data: import("zod").ZodObject<{
|
|
25
|
+
challenge: import("zod").ZodString;
|
|
26
|
+
timestamp: import("zod").ZodNumber;
|
|
27
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
28
|
+
challenge: string;
|
|
29
|
+
timestamp: number;
|
|
30
|
+
}, {
|
|
31
|
+
challenge: string;
|
|
32
|
+
timestamp: number;
|
|
33
|
+
}>;
|
|
34
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
35
|
+
type: "challenge";
|
|
36
|
+
data: {
|
|
37
|
+
challenge: string;
|
|
38
|
+
timestamp: number;
|
|
39
|
+
};
|
|
40
|
+
id?: string | undefined;
|
|
41
|
+
room?: string | undefined;
|
|
42
|
+
content?: any;
|
|
43
|
+
content_type?: "text/plain" | "text/markdown" | "text/html" | "application/json" | "image/*" | "STRING" | "JSON" | "MD" | "ARRAY" | undefined;
|
|
44
|
+
from?: string | undefined;
|
|
45
|
+
to?: string | undefined;
|
|
46
|
+
timestamp?: string | undefined;
|
|
47
|
+
signature?: string | undefined;
|
|
48
|
+
publicKey?: string | undefined;
|
|
49
|
+
reasoning?: string | undefined;
|
|
50
|
+
task_id?: string | undefined;
|
|
51
|
+
}, {
|
|
52
|
+
type: "challenge";
|
|
53
|
+
data: {
|
|
54
|
+
challenge: string;
|
|
55
|
+
timestamp: number;
|
|
56
|
+
};
|
|
57
|
+
id?: string | undefined;
|
|
58
|
+
room?: string | undefined;
|
|
59
|
+
content?: any;
|
|
60
|
+
content_type?: "text/plain" | "text/markdown" | "text/html" | "application/json" | "image/*" | "STRING" | "JSON" | "MD" | "ARRAY" | undefined;
|
|
61
|
+
from?: string | undefined;
|
|
62
|
+
to?: string | undefined;
|
|
63
|
+
timestamp?: string | undefined;
|
|
64
|
+
signature?: string | undefined;
|
|
65
|
+
publicKey?: string | undefined;
|
|
66
|
+
reasoning?: string | undefined;
|
|
67
|
+
task_id?: string | undefined;
|
|
68
|
+
}>;
|
|
69
|
+
private clientType;
|
|
70
|
+
constructor(clientType?: "user" | "agent" | "coordinator");
|
|
71
|
+
protected handleValidated(message: ChallengeMessage, context: HandlerContext): Promise<void>;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=challenge-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"challenge-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/message-handlers/challenge-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAsC,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,qBAAa,gBAAiB,SAAQ,kBAAkB,CAAC,gBAAgB,CAAC;IACxE,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;IACrC,QAAQ,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAA0B;IACzC,OAAO,CAAC,UAAU,CAAmC;gBAEzC,UAAU,GAAE,MAAM,GAAG,OAAO,GAAG,aAAsB;cAKjD,eAAe,CAC7B,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC;CAkCjB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Handler for challenge messages
|
|
4
|
+
* Handles authentication challenge-response flow
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ChallengeHandler = void 0;
|
|
8
|
+
const types_1 = require("../../types");
|
|
9
|
+
const base_handler_1 = require("./base-handler");
|
|
10
|
+
class ChallengeHandler extends base_handler_1.BaseMessageHandler {
|
|
11
|
+
constructor(clientType = "user") {
|
|
12
|
+
super();
|
|
13
|
+
this.type = "challenge";
|
|
14
|
+
this.schema = types_1.ChallengeMessageSchema;
|
|
15
|
+
this.clientType = clientType;
|
|
16
|
+
}
|
|
17
|
+
async handleValidated(message, context) {
|
|
18
|
+
if (!context.account) {
|
|
19
|
+
context.logger.error("Received challenge but no account configured");
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const challenge = message.data.challenge;
|
|
23
|
+
context.logger.debug("Received authentication challenge");
|
|
24
|
+
// Update auth state with challenge
|
|
25
|
+
this.updateAuthState(context, {
|
|
26
|
+
challenge,
|
|
27
|
+
challengeTimestamp: message.data.timestamp
|
|
28
|
+
});
|
|
29
|
+
// Emit challenge event
|
|
30
|
+
this.emit(context, "auth:challenge", challenge);
|
|
31
|
+
try {
|
|
32
|
+
// Sign challenge
|
|
33
|
+
const messageToSign = `Teneo authentication challenge: ${challenge}`;
|
|
34
|
+
const signature = await context.account.signMessage({
|
|
35
|
+
message: messageToSign
|
|
36
|
+
});
|
|
37
|
+
// Send authentication
|
|
38
|
+
await context.sendMessage((0, types_1.createAuth)(context.account.address, signature, messageToSign, this.clientType));
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
context.logger.error("Failed to sign challenge", error);
|
|
42
|
+
this.emit(context, "auth:error", "Failed to sign challenge");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.ChallengeHandler = ChallengeHandler;
|
|
47
|
+
//# sourceMappingURL=challenge-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"challenge-handler.js","sourceRoot":"","sources":["../../../src/handlers/message-handlers/challenge-handler.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,uCAAmF;AACnF,iDAAoD;AAGpD,MAAa,gBAAiB,SAAQ,iCAAoC;IAKxE,YAAY,aAA+C,MAAM;QAC/D,KAAK,EAAE,CAAC;QALD,SAAI,GAAG,WAAoB,CAAC;QAC5B,WAAM,GAAG,8BAAsB,CAAC;QAKvC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAES,KAAK,CAAC,eAAe,CAC7B,OAAyB,EACzB,OAAuB;QAEvB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;QACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAE1D,mCAAmC;QACnC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE;YAC5B,SAAS;YACT,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS;SAC3C,CAAC,CAAC;QAEH,uBAAuB;QACvB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;QAEhD,IAAI,CAAC;YACH,iBAAiB;YACjB,MAAM,aAAa,GAAG,mCAAmC,SAAS,EAAE,CAAC;YACrE,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;gBAClD,OAAO,EAAE,aAAa;aACvB,CAAC,CAAC;YAEH,sBAAsB;YACtB,MAAM,OAAO,CAAC,WAAW,CACvB,IAAA,kBAAU,EAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,CAC/E,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACxD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,0BAA0B,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;CACF;AA/CD,4CA+CC"}
|