@slashfi/agents-sdk 0.24.2 → 0.24.4
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/dist/cjs/agent-definitions/auth.js +678 -0
- package/dist/cjs/agent-definitions/auth.js.map +1 -0
- package/dist/cjs/agent-definitions/integrations.js +1173 -0
- package/dist/cjs/agent-definitions/integrations.js.map +1 -0
- package/dist/cjs/agent-definitions/remote-registry.js +469 -0
- package/dist/cjs/agent-definitions/remote-registry.js.map +1 -0
- package/dist/cjs/agent-definitions/secrets.js +193 -0
- package/dist/cjs/agent-definitions/secrets.js.map +1 -0
- package/dist/cjs/agent-definitions/users.js +440 -0
- package/dist/cjs/agent-definitions/users.js.map +1 -0
- package/dist/cjs/build.js +162 -0
- package/dist/cjs/build.js.map +1 -0
- package/dist/cjs/callback/index.js +74 -0
- package/dist/cjs/callback/index.js.map +1 -0
- package/dist/cjs/client.js +193 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/codegen.js +1027 -0
- package/dist/cjs/codegen.js.map +1 -0
- package/dist/cjs/crypto.js +44 -0
- package/dist/cjs/crypto.js.map +1 -0
- package/dist/cjs/define-config.js +81 -0
- package/dist/cjs/define-config.js.map +1 -0
- package/dist/cjs/define.js +186 -0
- package/dist/cjs/define.js.map +1 -0
- package/dist/cjs/events.js +60 -0
- package/dist/cjs/events.js.map +1 -0
- package/dist/cjs/index.js +195 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/integration-interface.js +105 -0
- package/dist/cjs/integration-interface.js.map +1 -0
- package/dist/cjs/integrations-store.js +53 -0
- package/dist/cjs/integrations-store.js.map +1 -0
- package/dist/cjs/introspect.js +136 -0
- package/dist/cjs/introspect.js.map +1 -0
- package/dist/cjs/jsonc.js +74 -0
- package/dist/cjs/jsonc.js.map +1 -0
- package/dist/cjs/jwt.js +207 -0
- package/dist/cjs/jwt.js.map +1 -0
- package/dist/cjs/key-manager.js +161 -0
- package/dist/cjs/key-manager.js.map +1 -0
- package/dist/cjs/oidc-signin.js +141 -0
- package/dist/cjs/oidc-signin.js.map +1 -0
- package/dist/cjs/pack.js +256 -0
- package/dist/cjs/pack.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/registry-consumer.js +233 -0
- package/dist/cjs/registry-consumer.js.map +1 -0
- package/dist/cjs/registry.js +512 -0
- package/dist/cjs/registry.js.map +1 -0
- package/dist/cjs/secret-collection.js +42 -0
- package/dist/cjs/secret-collection.js.map +1 -0
- package/dist/cjs/serialized.js +45 -0
- package/dist/cjs/serialized.js.map +1 -0
- package/dist/cjs/server.js +974 -0
- package/dist/cjs/server.js.map +1 -0
- package/dist/cjs/test-utils/mock-oidc-server.js +99 -0
- package/dist/cjs/test-utils/mock-oidc-server.js.map +1 -0
- package/dist/cjs/types.js +8 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/validate.js +84 -0
- package/dist/cjs/validate.js.map +1 -0
- package/dist/registry-consumer.d.ts.map +1 -1
- package/dist/registry-consumer.js +1 -1
- package/dist/registry-consumer.js.map +1 -1
- package/package.json +13 -5
- package/src/registry-consumer.ts +3 -1
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Agents SDK
|
|
4
|
+
*
|
|
5
|
+
* SDK for building AI agents with tool definitions, JSON-RPC servers,
|
|
6
|
+
* and built-in OAuth2 authentication.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import {
|
|
11
|
+
* defineAgent,
|
|
12
|
+
* defineTool,
|
|
13
|
+
* createAgentRegistry,
|
|
14
|
+
* createAgentServer,
|
|
15
|
+
* createAuthAgent,
|
|
16
|
+
* } from '@slashfi/agents-sdk';
|
|
17
|
+
*
|
|
18
|
+
* // Define a tool
|
|
19
|
+
* const greet = defineTool({
|
|
20
|
+
* name: 'greet',
|
|
21
|
+
* description: 'Greet a user',
|
|
22
|
+
* inputSchema: {
|
|
23
|
+
* type: 'object',
|
|
24
|
+
* properties: {
|
|
25
|
+
* name: { type: 'string', description: 'Name to greet' }
|
|
26
|
+
* },
|
|
27
|
+
* required: ['name']
|
|
28
|
+
* },
|
|
29
|
+
* execute: async (input) => ({ message: `Hello, ${input.name}!` })
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* // Define an agent
|
|
33
|
+
* const agent = defineAgent({
|
|
34
|
+
* path: '@my-agent',
|
|
35
|
+
* entrypoint: 'You are a helpful assistant.',
|
|
36
|
+
* tools: [greet]
|
|
37
|
+
* });
|
|
38
|
+
*
|
|
39
|
+
* // Create registry with auth
|
|
40
|
+
* const registry = createAgentRegistry();
|
|
41
|
+
* registry.register(createAuthAgent({ rootKey: process.env.ROOT_KEY! }));
|
|
42
|
+
* registry.register(agent);
|
|
43
|
+
*
|
|
44
|
+
* // Start server - auth auto-detected
|
|
45
|
+
* const server = createAgentServer(registry, { port: 3000 });
|
|
46
|
+
* await server.start();
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
49
|
+
* @packageDocumentation
|
|
50
|
+
*/
|
|
51
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
52
|
+
if (k2 === undefined) k2 = k;
|
|
53
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
54
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
55
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
56
|
+
}
|
|
57
|
+
Object.defineProperty(o, k2, desc);
|
|
58
|
+
}) : (function(o, m, k, k2) {
|
|
59
|
+
if (k2 === undefined) k2 = k;
|
|
60
|
+
o[k2] = m[k];
|
|
61
|
+
}));
|
|
62
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
63
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
64
|
+
};
|
|
65
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
66
|
+
exports.serializeAgent = exports.listAgentTools = exports.useAgent = exports.codegen = exports.createRegistryConsumer = exports.isSecretUri = exports.isSecretUrl = exports.normalizeRegistry = exports.normalizeRef = exports.createKeyManager = exports.createInMemoryUserStore = exports.createUsersAgent = exports.createRemoteRegistryAgent = exports.getDefaultRefreshBodyParams = exports.getDefaultTokenBodyParams = exports.refreshAccessToken = exports.exchangeCodeForToken = exports.createInMemoryIntegrationStore = exports.createIntegrationsAgent = exports.buildJwks = exports.importSigningKey = exports.exportSigningKey = exports.generateSigningKey = exports.verifyJwtFromIssuer = exports.verifyJwtLocal = exports.signJwtES256 = exports.verifyJwt = exports.signJwt = exports.decryptSecret = exports.encryptSecret = exports.processSecretParams = exports.isSecretRef = exports.createInMemorySecretStore = exports.createSecretsAgent = exports.buildAgents = exports.createMemoryAuthStore = exports.createAuthAgent = exports.cleanupExpiredCollections = exports.generateCollectionToken = exports.pendingCollections = exports.createOIDCSignIn = exports.canSeeAgent = exports.resolveAuth = exports.detectAuth = exports.createAgentServer = exports.createEventBus = exports.agentFromSerialized = exports.createAgentRegistry = exports.defineTool = exports.defineAgent = void 0;
|
|
67
|
+
exports.assertValidDefinition = exports.validateDefinition = exports.SerializedToolSchema = exports.SerializedAgentDefinitionSchema = exports.validateCallbackTemplates = exports.resolveCallbackTemplates = exports.introspectMcp = exports.publish = exports.pack = exports.readJsoncFile = exports.parseJsonc = exports.createClient = exports.serializeTool = void 0;
|
|
68
|
+
// Define functions
|
|
69
|
+
var define_js_1 = require("./define.js");
|
|
70
|
+
Object.defineProperty(exports, "defineAgent", { enumerable: true, get: function () { return define_js_1.defineAgent; } });
|
|
71
|
+
Object.defineProperty(exports, "defineTool", { enumerable: true, get: function () { return define_js_1.defineTool; } });
|
|
72
|
+
// Registry
|
|
73
|
+
var registry_js_1 = require("./registry.js");
|
|
74
|
+
Object.defineProperty(exports, "createAgentRegistry", { enumerable: true, get: function () { return registry_js_1.createAgentRegistry; } });
|
|
75
|
+
Object.defineProperty(exports, "agentFromSerialized", { enumerable: true, get: function () { return registry_js_1.agentFromSerialized; } });
|
|
76
|
+
// Events
|
|
77
|
+
var events_js_1 = require("./events.js");
|
|
78
|
+
Object.defineProperty(exports, "createEventBus", { enumerable: true, get: function () { return events_js_1.createEventBus; } });
|
|
79
|
+
// Server
|
|
80
|
+
var server_js_1 = require("./server.js");
|
|
81
|
+
Object.defineProperty(exports, "createAgentServer", { enumerable: true, get: function () { return server_js_1.createAgentServer; } });
|
|
82
|
+
Object.defineProperty(exports, "detectAuth", { enumerable: true, get: function () { return server_js_1.detectAuth; } });
|
|
83
|
+
Object.defineProperty(exports, "resolveAuth", { enumerable: true, get: function () { return server_js_1.resolveAuth; } });
|
|
84
|
+
Object.defineProperty(exports, "canSeeAgent", { enumerable: true, get: function () { return server_js_1.canSeeAgent; } });
|
|
85
|
+
var oidc_signin_js_1 = require("./oidc-signin.js");
|
|
86
|
+
Object.defineProperty(exports, "createOIDCSignIn", { enumerable: true, get: function () { return oidc_signin_js_1.createOIDCSignIn; } });
|
|
87
|
+
// Secret Collection
|
|
88
|
+
var secret_collection_js_1 = require("./secret-collection.js");
|
|
89
|
+
Object.defineProperty(exports, "pendingCollections", { enumerable: true, get: function () { return secret_collection_js_1.pendingCollections; } });
|
|
90
|
+
Object.defineProperty(exports, "generateCollectionToken", { enumerable: true, get: function () { return secret_collection_js_1.generateCollectionToken; } });
|
|
91
|
+
Object.defineProperty(exports, "cleanupExpiredCollections", { enumerable: true, get: function () { return secret_collection_js_1.cleanupExpiredCollections; } });
|
|
92
|
+
// Auth
|
|
93
|
+
var auth_js_1 = require("./agent-definitions/auth.js");
|
|
94
|
+
Object.defineProperty(exports, "createAuthAgent", { enumerable: true, get: function () { return auth_js_1.createAuthAgent; } });
|
|
95
|
+
Object.defineProperty(exports, "createMemoryAuthStore", { enumerable: true, get: function () { return auth_js_1.createMemoryAuthStore; } });
|
|
96
|
+
// Build
|
|
97
|
+
var build_js_1 = require("./build.js");
|
|
98
|
+
Object.defineProperty(exports, "buildAgents", { enumerable: true, get: function () { return build_js_1.buildAgents; } });
|
|
99
|
+
// Secrets
|
|
100
|
+
var secrets_js_1 = require("./agent-definitions/secrets.js");
|
|
101
|
+
Object.defineProperty(exports, "createSecretsAgent", { enumerable: true, get: function () { return secrets_js_1.createSecretsAgent; } });
|
|
102
|
+
Object.defineProperty(exports, "createInMemorySecretStore", { enumerable: true, get: function () { return secrets_js_1.createInMemorySecretStore; } });
|
|
103
|
+
Object.defineProperty(exports, "isSecretRef", { enumerable: true, get: function () { return secrets_js_1.isSecretRef; } });
|
|
104
|
+
Object.defineProperty(exports, "processSecretParams", { enumerable: true, get: function () { return secrets_js_1.processSecretParams; } });
|
|
105
|
+
// Crypto
|
|
106
|
+
var crypto_js_1 = require("./crypto.js");
|
|
107
|
+
Object.defineProperty(exports, "encryptSecret", { enumerable: true, get: function () { return crypto_js_1.encryptSecret; } });
|
|
108
|
+
Object.defineProperty(exports, "decryptSecret", { enumerable: true, get: function () { return crypto_js_1.decryptSecret; } });
|
|
109
|
+
// JWT
|
|
110
|
+
var jwt_js_1 = require("./jwt.js");
|
|
111
|
+
Object.defineProperty(exports, "signJwt", { enumerable: true, get: function () { return jwt_js_1.signJwt; } });
|
|
112
|
+
Object.defineProperty(exports, "verifyJwt", { enumerable: true, get: function () { return jwt_js_1.verifyJwt; } });
|
|
113
|
+
Object.defineProperty(exports, "signJwtES256", { enumerable: true, get: function () { return jwt_js_1.signJwtES256; } });
|
|
114
|
+
Object.defineProperty(exports, "verifyJwtLocal", { enumerable: true, get: function () { return jwt_js_1.verifyJwtLocal; } });
|
|
115
|
+
Object.defineProperty(exports, "verifyJwtFromIssuer", { enumerable: true, get: function () { return jwt_js_1.verifyJwtFromIssuer; } });
|
|
116
|
+
Object.defineProperty(exports, "generateSigningKey", { enumerable: true, get: function () { return jwt_js_1.generateSigningKey; } });
|
|
117
|
+
Object.defineProperty(exports, "exportSigningKey", { enumerable: true, get: function () { return jwt_js_1.exportSigningKey; } });
|
|
118
|
+
Object.defineProperty(exports, "importSigningKey", { enumerable: true, get: function () { return jwt_js_1.importSigningKey; } });
|
|
119
|
+
Object.defineProperty(exports, "buildJwks", { enumerable: true, get: function () { return jwt_js_1.buildJwks; } });
|
|
120
|
+
// Postgres Secret Store
|
|
121
|
+
// Integrations
|
|
122
|
+
var integrations_js_1 = require("./agent-definitions/integrations.js");
|
|
123
|
+
Object.defineProperty(exports, "createIntegrationsAgent", { enumerable: true, get: function () { return integrations_js_1.createIntegrationsAgent; } });
|
|
124
|
+
Object.defineProperty(exports, "createInMemoryIntegrationStore", { enumerable: true, get: function () { return integrations_js_1.createInMemoryIntegrationStore; } });
|
|
125
|
+
Object.defineProperty(exports, "exchangeCodeForToken", { enumerable: true, get: function () { return integrations_js_1.exchangeCodeForToken; } });
|
|
126
|
+
Object.defineProperty(exports, "refreshAccessToken", { enumerable: true, get: function () { return integrations_js_1.refreshAccessToken; } });
|
|
127
|
+
Object.defineProperty(exports, "getDefaultTokenBodyParams", { enumerable: true, get: function () { return integrations_js_1.getDefaultTokenBodyParams; } });
|
|
128
|
+
Object.defineProperty(exports, "getDefaultRefreshBodyParams", { enumerable: true, get: function () { return integrations_js_1.getDefaultRefreshBodyParams; } });
|
|
129
|
+
// Remote Registry
|
|
130
|
+
var remote_registry_js_1 = require("./agent-definitions/remote-registry.js");
|
|
131
|
+
Object.defineProperty(exports, "createRemoteRegistryAgent", { enumerable: true, get: function () { return remote_registry_js_1.createRemoteRegistryAgent; } });
|
|
132
|
+
// Users
|
|
133
|
+
var users_js_1 = require("./agent-definitions/users.js");
|
|
134
|
+
Object.defineProperty(exports, "createUsersAgent", { enumerable: true, get: function () { return users_js_1.createUsersAgent; } });
|
|
135
|
+
Object.defineProperty(exports, "createInMemoryUserStore", { enumerable: true, get: function () { return users_js_1.createInMemoryUserStore; } });
|
|
136
|
+
__exportStar(require("./integrations-store.js"), exports);
|
|
137
|
+
__exportStar(require("./integration-interface.js"), exports);
|
|
138
|
+
var key_manager_js_1 = require("./key-manager.js");
|
|
139
|
+
Object.defineProperty(exports, "createKeyManager", { enumerable: true, get: function () { return key_manager_js_1.createKeyManager; } });
|
|
140
|
+
// Config & Consumer
|
|
141
|
+
var define_config_js_1 = require("./define-config.js");
|
|
142
|
+
Object.defineProperty(exports, "normalizeRef", { enumerable: true, get: function () { return define_config_js_1.normalizeRef; } });
|
|
143
|
+
Object.defineProperty(exports, "normalizeRegistry", { enumerable: true, get: function () { return define_config_js_1.normalizeRegistry; } });
|
|
144
|
+
Object.defineProperty(exports, "isSecretUrl", { enumerable: true, get: function () { return define_config_js_1.isSecretUrl; } });
|
|
145
|
+
Object.defineProperty(exports, "isSecretUri", { enumerable: true, get: function () { return define_config_js_1.isSecretUri; } });
|
|
146
|
+
var registry_consumer_js_1 = require("./registry-consumer.js");
|
|
147
|
+
Object.defineProperty(exports, "createRegistryConsumer", { enumerable: true, get: function () { return registry_consumer_js_1.createRegistryConsumer; } });
|
|
148
|
+
// Codegen
|
|
149
|
+
var codegen_js_1 = require("./codegen.js");
|
|
150
|
+
Object.defineProperty(exports, "codegen", { enumerable: true, get: function () { return codegen_js_1.codegen; } });
|
|
151
|
+
Object.defineProperty(exports, "useAgent", { enumerable: true, get: function () { return codegen_js_1.useAgent; } });
|
|
152
|
+
Object.defineProperty(exports, "listAgentTools", { enumerable: true, get: function () { return codegen_js_1.listAgentTools; } });
|
|
153
|
+
// ============================================
|
|
154
|
+
// Serialized Agent Definitions
|
|
155
|
+
// ============================================
|
|
156
|
+
var serialized_js_1 = require("./serialized.js");
|
|
157
|
+
Object.defineProperty(exports, "serializeAgent", { enumerable: true, get: function () { return serialized_js_1.serializeAgent; } });
|
|
158
|
+
Object.defineProperty(exports, "serializeTool", { enumerable: true, get: function () { return serialized_js_1.serializeTool; } });
|
|
159
|
+
// ============================================
|
|
160
|
+
// Agent Client
|
|
161
|
+
// ============================================
|
|
162
|
+
var client_js_1 = require("./client.js");
|
|
163
|
+
Object.defineProperty(exports, "createClient", { enumerable: true, get: function () { return client_js_1.createClient; } });
|
|
164
|
+
// ============================================
|
|
165
|
+
// JSONC Parser
|
|
166
|
+
// ============================================
|
|
167
|
+
var jsonc_js_1 = require("./jsonc.js");
|
|
168
|
+
Object.defineProperty(exports, "parseJsonc", { enumerable: true, get: function () { return jsonc_js_1.parseJsonc; } });
|
|
169
|
+
Object.defineProperty(exports, "readJsoncFile", { enumerable: true, get: function () { return jsonc_js_1.readJsoncFile; } });
|
|
170
|
+
// ============================================
|
|
171
|
+
// Pack & Publish
|
|
172
|
+
// ============================================
|
|
173
|
+
var pack_js_1 = require("./pack.js");
|
|
174
|
+
Object.defineProperty(exports, "pack", { enumerable: true, get: function () { return pack_js_1.pack; } });
|
|
175
|
+
Object.defineProperty(exports, "publish", { enumerable: true, get: function () { return pack_js_1.publish; } });
|
|
176
|
+
// ============================================
|
|
177
|
+
// Introspect
|
|
178
|
+
// ============================================
|
|
179
|
+
var introspect_js_1 = require("./introspect.js");
|
|
180
|
+
Object.defineProperty(exports, "introspectMcp", { enumerable: true, get: function () { return introspect_js_1.introspectMcp; } });
|
|
181
|
+
// ============================================
|
|
182
|
+
// Agent Callbacks (deferred call_agent commands)
|
|
183
|
+
// ============================================
|
|
184
|
+
var index_js_1 = require("./callback/index.js");
|
|
185
|
+
Object.defineProperty(exports, "resolveCallbackTemplates", { enumerable: true, get: function () { return index_js_1.resolveCallbackTemplates; } });
|
|
186
|
+
Object.defineProperty(exports, "validateCallbackTemplates", { enumerable: true, get: function () { return index_js_1.validateCallbackTemplates; } });
|
|
187
|
+
// ============================================
|
|
188
|
+
// Validation
|
|
189
|
+
// ============================================
|
|
190
|
+
var validate_js_1 = require("./validate.js");
|
|
191
|
+
Object.defineProperty(exports, "SerializedAgentDefinitionSchema", { enumerable: true, get: function () { return validate_js_1.SerializedAgentDefinitionSchema; } });
|
|
192
|
+
Object.defineProperty(exports, "SerializedToolSchema", { enumerable: true, get: function () { return validate_js_1.SerializedToolSchema; } });
|
|
193
|
+
Object.defineProperty(exports, "validateDefinition", { enumerable: true, get: function () { return validate_js_1.validateDefinition; } });
|
|
194
|
+
Object.defineProperty(exports, "assertValidDefinition", { enumerable: true, get: function () { return validate_js_1.assertValidDefinition; } });
|
|
195
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Integration interface — standard tools that integration agents implement.
|
|
4
|
+
*
|
|
5
|
+
* Any agent that acts as an integration source should implement these tools.
|
|
6
|
+
* They are all internal visibility and only callable by @integrations.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createIntegrationTools = createIntegrationTools;
|
|
10
|
+
const define_js_1 = require("./define.js");
|
|
11
|
+
/**
|
|
12
|
+
* Create the standard _integration tools for an agent.
|
|
13
|
+
* Returns an array of ToolDefinitions to include in the agent's tools.
|
|
14
|
+
*/
|
|
15
|
+
function createIntegrationTools(config) {
|
|
16
|
+
const { agentPath, store, discover, setup, connect } = config;
|
|
17
|
+
const discoverTool = (0, define_js_1.defineTool)({
|
|
18
|
+
name: "discover_integrations",
|
|
19
|
+
description: `Discover available integrations for ${agentPath}.`,
|
|
20
|
+
visibility: "internal",
|
|
21
|
+
inputSchema: {
|
|
22
|
+
type: "object",
|
|
23
|
+
properties: {},
|
|
24
|
+
},
|
|
25
|
+
execute: async () => {
|
|
26
|
+
const available = await discover();
|
|
27
|
+
return available;
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
const setupTool = (0, define_js_1.defineTool)({
|
|
31
|
+
name: "setup_integration",
|
|
32
|
+
description: `Set up a new integration for ${agentPath}.`,
|
|
33
|
+
visibility: "internal",
|
|
34
|
+
inputSchema: {
|
|
35
|
+
type: "object",
|
|
36
|
+
properties: {
|
|
37
|
+
config: { type: "object", description: "Integration configuration" },
|
|
38
|
+
},
|
|
39
|
+
required: ["config"],
|
|
40
|
+
},
|
|
41
|
+
execute: async (input, ctx) => {
|
|
42
|
+
const result = await setup(input.config, ctx);
|
|
43
|
+
if (result.success && !result.oauthUrl) {
|
|
44
|
+
// Direct setup (no OAuth needed) — create integration row
|
|
45
|
+
const integration = await store.create({
|
|
46
|
+
agentPath,
|
|
47
|
+
config: input.config,
|
|
48
|
+
installedBy: ctx.callerId,
|
|
49
|
+
});
|
|
50
|
+
return { success: true, integrationId: integration.id };
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
const connectTool = (0, define_js_1.defineTool)({
|
|
56
|
+
name: "connect_integration",
|
|
57
|
+
description: `Test or authorize a ${agentPath} integration connection.`,
|
|
58
|
+
visibility: "internal",
|
|
59
|
+
inputSchema: {
|
|
60
|
+
type: "object",
|
|
61
|
+
properties: {
|
|
62
|
+
integration_id: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "Integration ID to connect",
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
required: ["integration_id"],
|
|
68
|
+
},
|
|
69
|
+
execute: async (input, ctx) => {
|
|
70
|
+
if (connect) {
|
|
71
|
+
const result = await connect(input.integration_id, ctx);
|
|
72
|
+
if (result.success) {
|
|
73
|
+
await store.update(input.integration_id, { status: "active" });
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
await store.update(input.integration_id, { status: "error" });
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
return { success: true };
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
const listTool = (0, define_js_1.defineTool)({
|
|
84
|
+
name: "list_integrations",
|
|
85
|
+
description: `List installed integrations for ${agentPath}.`,
|
|
86
|
+
visibility: "internal",
|
|
87
|
+
inputSchema: {
|
|
88
|
+
type: "object",
|
|
89
|
+
properties: {
|
|
90
|
+
tenant_id: { type: "string", description: "Filter by tenant" },
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
execute: async (input) => {
|
|
94
|
+
const integrations = await store.listByAgent(agentPath, input.tenant_id);
|
|
95
|
+
return integrations;
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
return [
|
|
99
|
+
discoverTool,
|
|
100
|
+
setupTool,
|
|
101
|
+
connectTool,
|
|
102
|
+
listTool,
|
|
103
|
+
];
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=integration-interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration-interface.js","sourceRoot":"","sources":["../../src/integration-interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* IntegrationsStore — persistence interface for installed integrations.
|
|
4
|
+
*
|
|
5
|
+
* Each integration is an agent that's been configured and connected.
|
|
6
|
+
* The store tracks what's installed, its config, and status.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createInMemoryIntegrationsStore = createInMemoryIntegrationsStore;
|
|
10
|
+
/** In-memory implementation for testing / lightweight use */
|
|
11
|
+
function createInMemoryIntegrationsStore() {
|
|
12
|
+
const integrations = new Map();
|
|
13
|
+
return {
|
|
14
|
+
async create(input) {
|
|
15
|
+
const id = `int_${Math.random().toString(36).slice(2, 14)}`;
|
|
16
|
+
const now = Date.now();
|
|
17
|
+
const integration = {
|
|
18
|
+
id,
|
|
19
|
+
agentPath: input.agentPath,
|
|
20
|
+
tenantId: input.tenantId,
|
|
21
|
+
status: "active",
|
|
22
|
+
config: input.config,
|
|
23
|
+
installedBy: input.installedBy,
|
|
24
|
+
installedAt: now,
|
|
25
|
+
updatedAt: now,
|
|
26
|
+
};
|
|
27
|
+
integrations.set(id, integration);
|
|
28
|
+
return integration;
|
|
29
|
+
},
|
|
30
|
+
async get(id) {
|
|
31
|
+
return integrations.get(id) ?? null;
|
|
32
|
+
},
|
|
33
|
+
async list(tenantId) {
|
|
34
|
+
const all = Array.from(integrations.values());
|
|
35
|
+
return tenantId ? all.filter((i) => i.tenantId === tenantId) : all;
|
|
36
|
+
},
|
|
37
|
+
async listByAgent(agentPath, tenantId) {
|
|
38
|
+
return Array.from(integrations.values()).filter((i) => i.agentPath === agentPath && (!tenantId || i.tenantId === tenantId));
|
|
39
|
+
},
|
|
40
|
+
async update(id, updates) {
|
|
41
|
+
const existing = integrations.get(id);
|
|
42
|
+
if (!existing)
|
|
43
|
+
return null;
|
|
44
|
+
const updated = { ...existing, ...updates, updatedAt: Date.now() };
|
|
45
|
+
integrations.set(id, updated);
|
|
46
|
+
return updated;
|
|
47
|
+
},
|
|
48
|
+
async delete(id) {
|
|
49
|
+
return integrations.delete(id);
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=integrations-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrations-store.js","sourceRoot":"","sources":["../../src/integrations-store.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAiCH,0EAiDC;AAlDD,6DAA6D;AAC7D,SAAgB,+BAA+B;IAC7C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEpD,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,KAAK;YAChB,MAAM,EAAE,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,WAAW,GAAgB;gBAC/B,EAAE;gBACF,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,WAAW,EAAE,GAAG;gBAChB,SAAS,EAAE,GAAG;aACf,CAAC;YACF,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YAClC,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,EAAE;YACV,OAAO,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;QACtC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,QAAS;YAClB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9C,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACrE,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,QAAS;YACpC,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAC7C,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CACtE,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO;YACtB,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC3B,MAAM,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACnE,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAC9B,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,EAAE;YACb,OAAO,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Introspection
|
|
4
|
+
*
|
|
5
|
+
* Connects to an MCP server, introspects its tools,
|
|
6
|
+
* and outputs a SerializedAgentDefinition (agent.json).
|
|
7
|
+
*
|
|
8
|
+
* Deduplicates shared $defs across tools.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.introspectMcp = introspectMcp;
|
|
12
|
+
const node_child_process_1 = require("node:child_process");
|
|
13
|
+
const node_fs_1 = require("node:fs");
|
|
14
|
+
const node_path_1 = require("node:path");
|
|
15
|
+
function deduplicateDefs(tools) {
|
|
16
|
+
const defsByContent = new Map();
|
|
17
|
+
for (const tool of tools) {
|
|
18
|
+
const schema = tool.inputSchema;
|
|
19
|
+
const defs = schema?.$defs;
|
|
20
|
+
if (!defs || typeof defs !== "object")
|
|
21
|
+
continue;
|
|
22
|
+
for (const [defName, defSchema] of Object.entries(defs)) {
|
|
23
|
+
const key = JSON.stringify(defSchema);
|
|
24
|
+
if (!defsByContent.has(key)) {
|
|
25
|
+
defsByContent.set(key, { name: defName, schema: defSchema });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const sharedDefs = {};
|
|
30
|
+
for (const { name, schema } of Array.from(defsByContent.values())) {
|
|
31
|
+
sharedDefs[name] = schema;
|
|
32
|
+
}
|
|
33
|
+
const cleanedTools = tools.map((t) => {
|
|
34
|
+
const schema = { ...t.inputSchema };
|
|
35
|
+
schema.$defs = undefined;
|
|
36
|
+
return { ...t, inputSchema: schema };
|
|
37
|
+
});
|
|
38
|
+
return { tools: cleanedTools, sharedDefs };
|
|
39
|
+
}
|
|
40
|
+
async function introspectMcp(options) {
|
|
41
|
+
const { server, name, out } = options;
|
|
42
|
+
const parts = server.split(/\s+/);
|
|
43
|
+
const proc = (0, node_child_process_1.spawn)(parts[0], parts.slice(1), {
|
|
44
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
45
|
+
env: { ...process.env, ...options.env },
|
|
46
|
+
});
|
|
47
|
+
let buffer = "";
|
|
48
|
+
let messageId = 0;
|
|
49
|
+
function sendJsonRpc(method, params = {}) {
|
|
50
|
+
const id = ++messageId;
|
|
51
|
+
const msg = JSON.stringify({ jsonrpc: "2.0", id, method, params });
|
|
52
|
+
proc.stdin?.write(`${msg}\n`);
|
|
53
|
+
return id;
|
|
54
|
+
}
|
|
55
|
+
function waitForResponse(targetId) {
|
|
56
|
+
return new Promise((res, reject) => {
|
|
57
|
+
const timeout = setTimeout(() => reject(new Error("Timeout")), 30000);
|
|
58
|
+
const handler = (chunk) => {
|
|
59
|
+
buffer += chunk.toString();
|
|
60
|
+
const lines = buffer.split("\n");
|
|
61
|
+
buffer = lines.pop() || "";
|
|
62
|
+
for (const line of lines) {
|
|
63
|
+
const trimmed = line.trim();
|
|
64
|
+
if (!trimmed)
|
|
65
|
+
continue;
|
|
66
|
+
try {
|
|
67
|
+
const parsed = JSON.parse(trimmed);
|
|
68
|
+
if (parsed.id === targetId) {
|
|
69
|
+
clearTimeout(timeout);
|
|
70
|
+
proc.stdout?.removeListener("data", handler);
|
|
71
|
+
if (parsed.error)
|
|
72
|
+
reject(new Error(JSON.stringify(parsed.error)));
|
|
73
|
+
else
|
|
74
|
+
res(parsed.result);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
/* ignore non-JSON */
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
proc.stdout?.on("data", handler);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
console.log(`Connecting to MCP server: ${server}`);
|
|
87
|
+
const initId = sendJsonRpc("initialize", {
|
|
88
|
+
protocolVersion: "2024-11-05",
|
|
89
|
+
capabilities: {},
|
|
90
|
+
clientInfo: { name: "adk-introspect", version: "1.0.0" },
|
|
91
|
+
});
|
|
92
|
+
const initResult = (await waitForResponse(initId));
|
|
93
|
+
const serverInfo = initResult.serverInfo;
|
|
94
|
+
console.log(`Server: ${serverInfo?.name} v${serverInfo?.version}`);
|
|
95
|
+
proc.stdin?.write(`${JSON.stringify({ jsonrpc: "2.0", method: "notifications/initialized" })}\n`);
|
|
96
|
+
const toolsId = sendJsonRpc("tools/list", {});
|
|
97
|
+
const toolsResult = (await waitForResponse(toolsId));
|
|
98
|
+
const rawTools = (toolsResult.tools || []).map((t) => ({
|
|
99
|
+
name: t.name,
|
|
100
|
+
description: t.description || "",
|
|
101
|
+
inputSchema: t.inputSchema || {
|
|
102
|
+
type: "object",
|
|
103
|
+
properties: {},
|
|
104
|
+
},
|
|
105
|
+
}));
|
|
106
|
+
console.log(`Discovered ${rawTools.length} tools`);
|
|
107
|
+
const { tools, sharedDefs } = deduplicateDefs(rawTools);
|
|
108
|
+
const defsCount = Object.keys(sharedDefs).length;
|
|
109
|
+
if (defsCount > 0) {
|
|
110
|
+
console.log(`Hoisted ${defsCount} shared $defs`);
|
|
111
|
+
}
|
|
112
|
+
const definition = {
|
|
113
|
+
path: name,
|
|
114
|
+
name: serverInfo?.name || name,
|
|
115
|
+
description: `Agent for ${serverInfo?.name || name}`,
|
|
116
|
+
version: serverInfo?.version || "1.0.0",
|
|
117
|
+
visibility: "public",
|
|
118
|
+
serverSource: server,
|
|
119
|
+
serverInfo,
|
|
120
|
+
...(defsCount > 0 ? { $defs: sharedDefs } : {}),
|
|
121
|
+
tools,
|
|
122
|
+
generatedAt: new Date().toISOString(),
|
|
123
|
+
sdkVersion: "0.22.0",
|
|
124
|
+
};
|
|
125
|
+
const outPath = out || `./${name}.json`;
|
|
126
|
+
const resolved = (0, node_path_1.resolve)(outPath);
|
|
127
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(resolved), { recursive: true });
|
|
128
|
+
(0, node_fs_1.writeFileSync)(resolved, `${JSON.stringify(definition, null, 2)}\n`);
|
|
129
|
+
const sizeKB = (JSON.stringify(definition).length / 1024).toFixed(1);
|
|
130
|
+
console.log(`\nWrote ${resolved} (${sizeKB}KB, ${tools.length} tools)`);
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
proc.kill();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=introspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"introspect.js","sourceRoot":"","sources":["../../src/introspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* JSONC Parser
|
|
4
|
+
*
|
|
5
|
+
* Parses JSON with comments (single-line and multi-line)
|
|
6
|
+
* so agent.json files can be annotated.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.parseJsonc = parseJsonc;
|
|
10
|
+
exports.readJsoncFile = readJsoncFile;
|
|
11
|
+
const node_fs_1 = require("node:fs");
|
|
12
|
+
/**
|
|
13
|
+
* Strip comments from JSONC content and parse as JSON.
|
|
14
|
+
*/
|
|
15
|
+
function parseJsonc(content) {
|
|
16
|
+
let result = "";
|
|
17
|
+
let i = 0;
|
|
18
|
+
let inString = false;
|
|
19
|
+
let stringChar = "";
|
|
20
|
+
while (i < content.length) {
|
|
21
|
+
if (inString) {
|
|
22
|
+
if (content[i] === "\\" && i + 1 < content.length) {
|
|
23
|
+
result += content[i] + content[i + 1];
|
|
24
|
+
i += 2;
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (content[i] === stringChar) {
|
|
28
|
+
inString = false;
|
|
29
|
+
}
|
|
30
|
+
result += content[i];
|
|
31
|
+
i++;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (content[i] === '"') {
|
|
35
|
+
inString = true;
|
|
36
|
+
stringChar = content[i];
|
|
37
|
+
result += content[i];
|
|
38
|
+
i++;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
// Single-line comment
|
|
42
|
+
if (content[i] === "/" &&
|
|
43
|
+
i + 1 < content.length &&
|
|
44
|
+
content[i + 1] === "/") {
|
|
45
|
+
while (i < content.length && content[i] !== "\n")
|
|
46
|
+
i++;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
// Multi-line comment
|
|
50
|
+
if (content[i] === "/" &&
|
|
51
|
+
i + 1 < content.length &&
|
|
52
|
+
content[i + 1] === "*") {
|
|
53
|
+
i += 2;
|
|
54
|
+
while (i + 1 < content.length &&
|
|
55
|
+
!(content[i] === "*" && content[i + 1] === "/"))
|
|
56
|
+
i++;
|
|
57
|
+
i += 2;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
result += content[i];
|
|
61
|
+
i++;
|
|
62
|
+
}
|
|
63
|
+
// Handle trailing commas
|
|
64
|
+
const cleaned = result.replace(/,\s*([}\]])/g, "$1");
|
|
65
|
+
return JSON.parse(cleaned);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Read and parse a JSONC file.
|
|
69
|
+
*/
|
|
70
|
+
function readJsoncFile(path) {
|
|
71
|
+
const content = (0, node_fs_1.readFileSync)(path, "utf-8");
|
|
72
|
+
return parseJsonc(content);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=jsonc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonc.js","sourceRoot":"","sources":["../../src/jsonc.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAOH,gCA8DC;AAKD,sCAGC;AA3ED,qCAAuC;AAEvC;;GAEG;AACH,SAAgB,UAAU,CAAC,OAAe;IACxC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;gBAClD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACtC,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;gBAC9B,QAAQ,GAAG,KAAK,CAAC;YACnB,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACvB,QAAQ,GAAG,IAAI,CAAC;YAChB,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,sBAAsB;QACtB,IACE,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;YAClB,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM;YACtB,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EACtB,CAAC;YACD,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI;gBAAE,CAAC,EAAE,CAAC;YACtD,SAAS;QACX,CAAC;QAED,qBAAqB;QACrB,IACE,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;YAClB,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM;YACtB,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EACtB,CAAC;YACD,CAAC,IAAI,CAAC,CAAC;YACP,OACE,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM;gBACtB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;gBAE/C,CAAC,EAAE,CAAC;YACN,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC,EAAE,CAAC;IACN,CAAC;IAED,yBAAyB;IACzB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,IAAY;IACxC,MAAM,OAAO,GAAG,IAAA,sBAAY,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC"}
|