@dbx-tools/appkit-mastra 0.9.128 → 0.9.131
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 +90 -31
- package/index.ts +10 -8
- package/lib/index.d.ts +10 -8
- package/lib/index.js +8 -7
- package/lib/src/agents.d.ts +4 -0
- package/lib/src/agents.js +12 -3
- package/lib/src/config.d.ts +7 -2
- package/lib/src/config.js +6 -3
- package/lib/src/defaults.d.ts +9 -0
- package/lib/src/defaults.js +29 -1
- package/lib/src/genie-chat.d.ts +71 -0
- package/lib/src/genie-chat.js +272 -0
- package/lib/src/genie.d.ts +2 -0
- package/lib/src/genie.js +11 -8
- package/lib/src/memory.d.ts +5 -5
- package/lib/src/memory.js +10 -3
- package/lib/src/observability.d.ts +3 -0
- package/lib/src/observability.js +2 -2
- package/lib/src/plugin.d.ts +36 -7
- package/lib/src/plugin.js +220 -33
- package/lib/src/request-context.d.ts +2 -0
- package/lib/src/request-context.js +3 -0
- package/lib/src/server.d.ts +4 -0
- package/lib/src/server.js +40 -2
- package/lib/src/statement.d.ts +16 -1
- package/lib/src/statement.js +50 -18
- package/lib/src/telemetry.d.ts +22 -1
- package/lib/src/telemetry.js +174 -18
- package/lib/src/workspaces.d.ts +2 -2
- package/lib/src/workspaces.js +3 -2
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +32 -25
- package/src/agents.ts +15 -1
- package/src/config.ts +10 -4
- package/src/defaults.ts +30 -0
- package/src/genie-chat.ts +341 -0
- package/src/genie.ts +11 -7
- package/src/memory.ts +9 -4
- package/src/observability.ts +6 -2
- package/src/plugin.ts +262 -31
- package/src/request-context.ts +2 -0
- package/src/server.ts +35 -0
- package/src/statement.ts +71 -19
- package/src/telemetry.ts +206 -16
- package/src/workspaces.ts +4 -3
- package/exports.ts +0 -7
- package/lib/exports.d.ts +0 -1
- package/lib/exports.js +0 -2
- package/lib/src/openapi-tool.d.ts +0 -29
- package/lib/src/openapi-tool.js +0 -175
- package/src/openapi-tool.ts +0 -245
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Direct Genie chat over the Mastra chat wire.
|
|
3
|
+
*
|
|
4
|
+
* Serves one Genie space as a chat without an agent, model, or Mastra Memory.
|
|
5
|
+
* Genie owns every piece of state: conversations are the chat threads, Genie
|
|
6
|
+
* messages are the transcript, and a turn is one Genie message. Each turn is
|
|
7
|
+
* projected onto the same AI SDK UI chunks an agent turn produces when it
|
|
8
|
+
* calls `ask_genie` (a native tool part, `data-genie-progress` events, and the
|
|
9
|
+
* answer text), so the Mastra chat UI renders pills, thoughts, suggestions,
|
|
10
|
+
* and embeds identically for both.
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import { databricks } from "@dbx-tools/appkit";
|
|
15
|
+
import { agentMode, chat } from "@dbx-tools/genie";
|
|
16
|
+
import { errorUtils, hash, log, object } from "@dbx-tools/shared-core";
|
|
17
|
+
import { event as genieEvent, genieModel } from "@dbx-tools/shared-genie";
|
|
18
|
+
import { markers, wire, } from "@dbx-tools/shared-mastra";
|
|
19
|
+
import { createUIMessageStream } from "ai";
|
|
20
|
+
import { askGenieToolId } from "./genie.js";
|
|
21
|
+
const logger = log.logger("mastra/genie-chat");
|
|
22
|
+
/** Page size used while walking Genie's paginated list endpoints. */
|
|
23
|
+
const LIST_PAGE_SIZE = 100;
|
|
24
|
+
/** Upper bound on conversations surfaced in the thread list. */
|
|
25
|
+
const THREAD_LIMIT = 100;
|
|
26
|
+
const AGENT_CONVERSATION_TYPE = "GENIE_CONVERSATION_TYPE_AGENT";
|
|
27
|
+
const DIRECT_GENIE_ERROR = "Genie could not complete the request.";
|
|
28
|
+
/** Suffix that keeps a Genie question's user message id distinct from its answer. */
|
|
29
|
+
const QUESTION_ID_SUFFIX = ":question";
|
|
30
|
+
/**
|
|
31
|
+
* Compose the visible answer for one terminal Genie message: its narrative text
|
|
32
|
+
* first, then one embed per query that produced a warehouse statement. A query
|
|
33
|
+
* Genie chose to visualize embeds `[visualization:<statement_id>]`, which
|
|
34
|
+
* AppKit UI renders with its native Genie visualization. Any other query embeds
|
|
35
|
+
* `[data:<statement_id>]`. Agent Mode's Markdown copy of a query result is
|
|
36
|
+
* dropped because either embed renders the same rows.
|
|
37
|
+
*/
|
|
38
|
+
export function genieAnswerText(message) {
|
|
39
|
+
const attachments = message.attachments ?? [];
|
|
40
|
+
const visualizedQueries = new Set(attachments.flatMap((attachment) => attachment.viz?.query_attachment_id ? [attachment.viz.query_attachment_id] : []));
|
|
41
|
+
const prose = [];
|
|
42
|
+
const embeds = [];
|
|
43
|
+
for (const attachment of attachments) {
|
|
44
|
+
const text = attachment.text?.content?.trim();
|
|
45
|
+
if (text && !isQueryOutputText(attachment.text?.metadata))
|
|
46
|
+
prose.push(text);
|
|
47
|
+
const statementId = attachment.query?.statement_id;
|
|
48
|
+
if (!statementId)
|
|
49
|
+
continue;
|
|
50
|
+
const description = attachment.query?.description?.trim();
|
|
51
|
+
if (description)
|
|
52
|
+
embeds.push(description);
|
|
53
|
+
embeds.push(visualizedQueries.has(attachment.attachment_id ?? "")
|
|
54
|
+
? markers.formatMarker("visualization", statementId)
|
|
55
|
+
: markers.formatMarker("data", statementId));
|
|
56
|
+
}
|
|
57
|
+
const sections = [...prose, ...embeds];
|
|
58
|
+
if (sections.length === 0 && message.error?.error)
|
|
59
|
+
sections.push(message.error.error);
|
|
60
|
+
return sections.join("\n\n");
|
|
61
|
+
}
|
|
62
|
+
/** Whether a text attachment is Agent Mode's Markdown copy of a query result. */
|
|
63
|
+
function isQueryOutputText(metadata) {
|
|
64
|
+
return object.isRecord(metadata) && typeof metadata.statement_id === "string";
|
|
65
|
+
}
|
|
66
|
+
/** Error text for a terminal Genie message that did not complete, or `undefined`. */
|
|
67
|
+
function genieFailure(message) {
|
|
68
|
+
if (message.status === "COMPLETED")
|
|
69
|
+
return undefined;
|
|
70
|
+
return message.error?.error ?? `Genie ${genieModel.humanizeStatus(message.status)}`;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Project one persisted Genie message onto the user question and the assistant
|
|
74
|
+
* answer the chat transcript renders. The assistant owns an `ask_genie` tool
|
|
75
|
+
* part whose progress is re-derived from the terminal snapshot, so reloaded
|
|
76
|
+
* history shows the same pill, SQL, and suggestions as the live turn.
|
|
77
|
+
*/
|
|
78
|
+
export function genieMessageToUiMessages(message, space) {
|
|
79
|
+
const messageId = message.message_id || message.id;
|
|
80
|
+
const toolCallId = messageId;
|
|
81
|
+
const input = { question: message.content };
|
|
82
|
+
const failure = genieFailure(message);
|
|
83
|
+
const progress = [...genieEvent.eventsFromMessage(message, undefined, space.spaceId)].map((progressEvent) => ({
|
|
84
|
+
type: wire.GENIE_PROGRESS_PART_TYPE,
|
|
85
|
+
data: { toolCallId, event: progressEvent },
|
|
86
|
+
}));
|
|
87
|
+
const toolPart = failure
|
|
88
|
+
? {
|
|
89
|
+
type: `tool-${askGenieToolId(space.alias)}`,
|
|
90
|
+
toolCallId,
|
|
91
|
+
state: "output-error",
|
|
92
|
+
input,
|
|
93
|
+
errorText: failure,
|
|
94
|
+
}
|
|
95
|
+
: {
|
|
96
|
+
type: `tool-${askGenieToolId(space.alias)}`,
|
|
97
|
+
toolCallId,
|
|
98
|
+
state: "output-available",
|
|
99
|
+
input,
|
|
100
|
+
output: { message },
|
|
101
|
+
};
|
|
102
|
+
const answer = genieAnswerText(message);
|
|
103
|
+
const assistantParts = [
|
|
104
|
+
toolPart,
|
|
105
|
+
...progress,
|
|
106
|
+
...(answer ? [{ type: "text", text: answer, state: "done" }] : []),
|
|
107
|
+
];
|
|
108
|
+
return [
|
|
109
|
+
{
|
|
110
|
+
id: `${messageId}${QUESTION_ID_SUFFIX}`,
|
|
111
|
+
role: "user",
|
|
112
|
+
parts: [{ type: "text", text: message.content }],
|
|
113
|
+
},
|
|
114
|
+
{ id: messageId, role: "assistant", parts: assistantParts },
|
|
115
|
+
];
|
|
116
|
+
}
|
|
117
|
+
/** List the caller's conversations in one space, newest first. */
|
|
118
|
+
export async function listGenieThreads(client, space, signal) {
|
|
119
|
+
const context = signal ? databricks.toContext(signal) : undefined;
|
|
120
|
+
const threads = [];
|
|
121
|
+
let pageToken;
|
|
122
|
+
do {
|
|
123
|
+
const page = await client.genie.listConversations({
|
|
124
|
+
space_id: space.spaceId,
|
|
125
|
+
page_size: LIST_PAGE_SIZE,
|
|
126
|
+
...(pageToken ? { page_token: pageToken } : {}),
|
|
127
|
+
}, context);
|
|
128
|
+
for (const conversation of page.conversations ?? []) {
|
|
129
|
+
if (!object.isRecord(conversation) || conversation.agent_type !== AGENT_CONVERSATION_TYPE) {
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
threads.push({
|
|
133
|
+
id: conversation.conversation_id,
|
|
134
|
+
...(conversation.title ? { title: conversation.title } : {}),
|
|
135
|
+
createdAt: new Date(conversation.created_timestamp).toISOString(),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
pageToken = page.next_page_token || undefined;
|
|
139
|
+
} while (pageToken && threads.length < THREAD_LIMIT);
|
|
140
|
+
return threads.sort((a, b) => b.createdAt.localeCompare(a.createdAt)).slice(0, THREAD_LIMIT);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Load one conversation's messages as chronological chat transcript messages.
|
|
144
|
+
* Conversation items come only from the Agent Mode items API, which retains
|
|
145
|
+
* user messages, reasoning, queries, results, reports, and final answers.
|
|
146
|
+
*/
|
|
147
|
+
export async function listGenieThreadMessages(options) {
|
|
148
|
+
const { space } = options;
|
|
149
|
+
const messages = await agentMode.listAgentModeConversation(options.client, space.spaceId, options.conversationId, {
|
|
150
|
+
...(options.signal ? { context: options.signal } : {}),
|
|
151
|
+
});
|
|
152
|
+
return messages.flatMap((message) => genieMessageToUiMessages(message, space));
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Stream one Genie turn as AI SDK UI chunks shaped like an agent's
|
|
156
|
+
* `ask_genie` call. The conversation identity is announced through a transient
|
|
157
|
+
* {@link wire.GENIE_CONVERSATION_PART_TYPE} part as soon as Genie assigns it,
|
|
158
|
+
* so the browser can adopt the conversation id as its thread id. Agent Mode
|
|
159
|
+
* receives Genie's native visualization tool; visualization attachments become
|
|
160
|
+
* AppKit UI embed markers in the answer.
|
|
161
|
+
*/
|
|
162
|
+
export function genieChatStream(options) {
|
|
163
|
+
const { client, space, request, signal } = options;
|
|
164
|
+
const toolCallId = hash.id();
|
|
165
|
+
const toolName = askGenieToolId(space.alias);
|
|
166
|
+
return createUIMessageStream({
|
|
167
|
+
onError: () => DIRECT_GENIE_ERROR,
|
|
168
|
+
execute: async ({ writer }) => {
|
|
169
|
+
const progress = (progressEvent) => writer.write({
|
|
170
|
+
type: wire.GENIE_PROGRESS_PART_TYPE,
|
|
171
|
+
data: { toolCallId, event: progressEvent },
|
|
172
|
+
});
|
|
173
|
+
writer.write({ type: "start" });
|
|
174
|
+
writer.write({ type: "start-step" });
|
|
175
|
+
writer.write({
|
|
176
|
+
type: "tool-input-available",
|
|
177
|
+
toolCallId,
|
|
178
|
+
toolName,
|
|
179
|
+
input: { question: request.question },
|
|
180
|
+
});
|
|
181
|
+
const started = {
|
|
182
|
+
type: "started",
|
|
183
|
+
spaceId: space.spaceId,
|
|
184
|
+
content: request.question,
|
|
185
|
+
};
|
|
186
|
+
progress(started);
|
|
187
|
+
let announced;
|
|
188
|
+
let finalMessage;
|
|
189
|
+
try {
|
|
190
|
+
for await (const chatEvent of chat.genieEventChat(space.spaceId, request.question, {
|
|
191
|
+
workspaceClient: client,
|
|
192
|
+
agentMode: true,
|
|
193
|
+
agentModeFallback: false,
|
|
194
|
+
enableVisualization: true,
|
|
195
|
+
...(request.conversationId ? { conversationId: request.conversationId } : {}),
|
|
196
|
+
...(signal ? { context: signal } : {}),
|
|
197
|
+
})) {
|
|
198
|
+
const conversationId = chatEvent.conversation_id ?? request.conversationId;
|
|
199
|
+
const messageId = chatEvent.message_id;
|
|
200
|
+
// Re-announce only when the identity gains information (the message
|
|
201
|
+
// id commonly lands one snapshot after the conversation id).
|
|
202
|
+
if (conversationId &&
|
|
203
|
+
(announced?.conversationId !== conversationId ||
|
|
204
|
+
(messageId && announced.messageId !== messageId))) {
|
|
205
|
+
announced = { conversationId, ...(messageId ? { messageId } : {}) };
|
|
206
|
+
writer.write({
|
|
207
|
+
type: wire.GENIE_CONVERSATION_PART_TYPE,
|
|
208
|
+
data: announced,
|
|
209
|
+
transient: true,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
if (chatEvent.type === "result")
|
|
213
|
+
finalMessage = chatEvent.message;
|
|
214
|
+
else if (chatEvent.type !== "message")
|
|
215
|
+
progress(chatEvent);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
logger.warn("turn:error", {
|
|
220
|
+
spaceId: space.spaceId,
|
|
221
|
+
error: errorUtils.toError(error),
|
|
222
|
+
});
|
|
223
|
+
writer.write({
|
|
224
|
+
type: "tool-output-error",
|
|
225
|
+
toolCallId,
|
|
226
|
+
errorText: DIRECT_GENIE_ERROR,
|
|
227
|
+
});
|
|
228
|
+
throw error;
|
|
229
|
+
}
|
|
230
|
+
if (!finalMessage)
|
|
231
|
+
throw new Error("Genie ended the turn without a result");
|
|
232
|
+
const failure = genieFailure(finalMessage);
|
|
233
|
+
writer.write(failure
|
|
234
|
+
? { type: "tool-output-error", toolCallId, errorText: failure }
|
|
235
|
+
: { type: "tool-output-available", toolCallId, output: { message: finalMessage } });
|
|
236
|
+
writer.write({ type: "finish-step" });
|
|
237
|
+
const answer = genieAnswerText(finalMessage);
|
|
238
|
+
if (answer) {
|
|
239
|
+
const textId = hash.id();
|
|
240
|
+
writer.write({ type: "start-step" });
|
|
241
|
+
writer.write({ type: "text-start", id: textId });
|
|
242
|
+
writer.write({ type: "text-delta", id: textId, delta: answer });
|
|
243
|
+
writer.write({ type: "text-end", id: textId });
|
|
244
|
+
writer.write({ type: "finish-step" });
|
|
245
|
+
}
|
|
246
|
+
writer.write({ type: "finish", finishReason: failure ? "error" : "stop" });
|
|
247
|
+
logger.debug("turn:done", {
|
|
248
|
+
spaceId: space.spaceId,
|
|
249
|
+
conversationId: announced?.conversationId,
|
|
250
|
+
status: finalMessage.status,
|
|
251
|
+
});
|
|
252
|
+
},
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
/** Delete one Genie conversation owned by the caller. */
|
|
256
|
+
export async function deleteGenieThread(client, space, conversationId) {
|
|
257
|
+
await client.genie.deleteConversation({
|
|
258
|
+
space_id: space.spaceId,
|
|
259
|
+
conversation_id: conversationId,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
/** Delete one Genie message, accepting either its answer or question transcript id. */
|
|
263
|
+
export async function deleteGenieThreadMessage(client, space, conversationId, messageId) {
|
|
264
|
+
await client.genie.deleteConversationMessage({
|
|
265
|
+
space_id: space.spaceId,
|
|
266
|
+
conversation_id: conversationId,
|
|
267
|
+
message_id: messageId.endsWith(QUESTION_ID_SUFFIX)
|
|
268
|
+
? messageId.slice(0, -QUESTION_ID_SUFFIX.length)
|
|
269
|
+
: messageId,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuaWUtY2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5pZS1jaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUdILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsS0FBSyxJQUFJLFVBQVUsRUFBRSxVQUFVLEVBQXFCLE1BQU0seUJBQXlCLENBQUM7QUFDN0YsT0FBTyxFQUNMLE9BQU8sRUFDUCxJQUFJLEdBSUwsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUscUJBQXFCLEVBQXVDLE1BQU0sSUFBSSxDQUFDO0FBRWhGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFNUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRS9DLHFFQUFxRTtBQUNyRSxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUM7QUFFM0IsZ0VBQWdFO0FBQ2hFLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQztBQUN6QixNQUFNLHVCQUF1QixHQUFHLCtCQUErQixDQUFDO0FBQ2hFLE1BQU0sa0JBQWtCLEdBQUcsdUNBQXVDLENBQUM7QUFFbkUscUZBQXFGO0FBQ3JGLE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDO0FBVXZDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLE9BQXFCO0lBQ25ELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO0lBQzlDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENB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QUFDLEtBQUssVUFBVSx3QkFBd0IsQ0FDNUMsTUFBdUIsRUFDdkIsS0FBcUIsRUFDckIsY0FBc0IsRUFDdEIsU0FBaUI7SUFFakIsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDO1FBQzNDLFFBQVEsRUFBRSxLQUFLLENBQUMsT0FBTztRQUN2QixlQUFlLEVBQUUsY0FBYztRQUMvQixVQUFVLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztZQUNoRCxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7WUFDaEQsQ0FBQyxDQUFDLFNBQVM7S0FDZCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEaXJlY3QgR2VuaWUgY2hhdCBvdmVyIHRoZSBNYXN0cmEgY2hhdCB3aXJlLlxuICpcbiAqIFNlcnZlcyBvbmUgR2VuaWUgc3BhY2UgYXMgYSBjaGF0IHdpdGhvdXQgYW4gYWdlbnQsIG1vZGVsLCBvciBNYXN0cmEgTWVtb3J5LlxuICogR2VuaWUgb3ducyBldmVyeSBwaWVjZSBvZiBzdGF0ZTogY29udmVyc2F0aW9ucyBhcmUgdGhlIGNoYXQgdGhyZWFkcywgR2VuaWVcbiAqIG1lc3NhZ2VzIGFyZSB0aGUgdHJhbnNjcmlwdCwgYW5kIGEgdHVybiBpcyBvbmUgR2VuaWUgbWVzc2FnZS4gRWFjaCB0dXJuIGlzXG4gKiBwcm9qZWN0ZWQgb250byB0aGUgc2FtZSBBSSBTREsgVUkgY2h1bmtzIGFuIGFnZW50IHR1cm4gcHJvZHVjZXMgd2hlbiBpdFxuICogY2FsbHMgYGFza19nZW5pZWAgKGEgbmF0aXZlIHRvb2wgcGFydCwgYGRhdGEtZ2VuaWUtcHJvZ3Jlc3NgIGV2ZW50cywgYW5kIHRoZVxuICogYW5zd2VyIHRleHQpLCBzbyB0aGUgTWFzdHJhIGNoYXQgVUkgcmVuZGVycyBwaWxscywgdGhvdWdodHMsIHN1Z2dlc3Rpb25zLFxuICogYW5kIGVtYmVkcyBpZGVudGljYWxseSBmb3IgYm90aC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBkYXRhYnJpY2tzIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBhZ2VudE1vZGUsIGNoYXQgfSBmcm9tIFwiQGRieC10b29scy9nZW5pZVwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgaGFzaCwgbG9nLCBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgZXZlbnQgYXMgZ2VuaWVFdmVudCwgZ2VuaWVNb2RlbCwgdHlwZSBHZW5pZU1lc3NhZ2UgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZ2VuaWVcIjtcbmltcG9ydCB7XG4gIG1hcmtlcnMsXG4gIHdpcmUsXG4gIHR5cGUgR2VuaWVDaGF0UmVxdWVzdCxcbiAgdHlwZSBHZW5pZVRocmVhZCxcbiAgdHlwZSBTdGFydGVkRXZlbnQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IGNyZWF0ZVVJTWVzc2FnZVN0cmVhbSwgdHlwZSBVSU1lc3NhZ2UsIHR5cGUgVUlNZXNzYWdlQ2h1bmsgfSBmcm9tIFwiYWlcIjtcblxuaW1wb3J0IHsgYXNrR2VuaWVUb29sSWQgfSBmcm9tIFwiLi9nZW5pZS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL2dlbmllLWNoYXRcIik7XG5cbi8qKiBQYWdlIHNpemUgdXNlZCB3aGlsZSB3YWxraW5nIEdlbmllJ3MgcGFnaW5hdGVkIGxpc3QgZW5kcG9pbnRzLiAqL1xuY29uc3QgTElTVF9QQUdFX1NJWkUgPSAxMDA7XG5cbi8qKiBVcHBlciBib3VuZCBvbiBjb252ZXJzYXRpb25zIHN1cmZhY2VkIGluIHRoZSB0aHJlYWQgbGlzdC4gKi9cbmNvbnN0IFRIUkVBRF9MSU1JVCA9IDEwMDtcbmNvbnN0IEFHRU5UX0NPTlZFUlNBVElPTl9UWVBFID0gXCJHRU5JRV9DT05WRVJTQVRJT05fVFlQRV9BR0VOVFwiO1xuY29uc3QgRElSRUNUX0dFTklFX0VSUk9SID0gXCJHZW5pZSBjb3VsZCBub3QgY29tcGxldGUgdGhlIHJlcXVlc3QuXCI7XG5cbi8qKiBTdWZmaXggdGhhdCBrZWVwcyBhIEdlbmllIHF1ZXN0aW9uJ3MgdXNlciBtZXNzYWdlIGlkIGRpc3RpbmN0IGZyb20gaXRzIGFuc3dlci4gKi9cbmNvbnN0IFFVRVNUSU9OX0lEX1NVRkZJWCA9IFwiOnF1ZXN0aW9uXCI7XG5cbi8qKiBPbmUgY29uZmlndXJlZCBHZW5pZSBzcGFjZSBhZGRyZXNzZWQgYnkgdGhlIGRpcmVjdCBjaGF0IHJvdXRlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuaWVDaGF0U3BhY2Uge1xuICAvKiogU3BhY2UgYWxpYXMgZnJvbSB0aGUgcm91dGUsIHdoaWNoIGFsc28gc2VsZWN0cyB0aGUgYGFza19nZW5pZWAgdG9vbCBpZC4gKi9cbiAgYWxpYXM6IHN0cmluZztcbiAgLyoqIEdlbmllIGBzcGFjZV9pZGAuICovXG4gIHNwYWNlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb21wb3NlIHRoZSB2aXNpYmxlIGFuc3dlciBmb3Igb25lIHRlcm1pbmFsIEdlbmllIG1lc3NhZ2U6IGl0cyBuYXJyYXRpdmUgdGV4dFxuICogZmlyc3QsIHRoZW4gb25lIGVtYmVkIHBlciBxdWVyeSB0aGF0IHByb2R1Y2VkIGEgd2FyZWhvdXNlIHN0YXRlbWVudC4gQSBxdWVyeVxuICogR2VuaWUgY2hvc2UgdG8gdmlzdWFsaXplIGVtYmVkcyBgW3Zpc3VhbGl6YXRpb246PHN0YXRlbWVudF9pZD5dYCwgd2hpY2hcbiAqIEFwcEtpdCBVSSByZW5kZXJzIHdpdGggaXRzIG5hdGl2ZSBHZW5pZSB2aXN1YWxpemF0aW9uLiBBbnkgb3RoZXIgcXVlcnkgZW1iZWRzXG4gKiBgW2RhdGE6PHN0YXRlbWVudF9pZD5dYC4gQWdlbnQgTW9kZSdzIE1hcmtkb3duIGNvcHkgb2YgYSBxdWVyeSByZXN1bHQgaXNcbiAqIGRyb3BwZWQgYmVjYXVzZSBlaXRoZXIgZW1iZWQgcmVuZGVycyB0aGUgc2FtZSByb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuaWVBbnN3ZXJUZXh0KG1lc3NhZ2U6IEdlbmllTWVzc2FnZSk6IHN0cmluZyB7XG4gIGNvbnN0IGF0dGFjaG1lbnRzID0gbWVzc2FnZS5hdHRhY2htZW50cyA/PyBbXTtcbiAgY29uc3QgdmlzdWFsaXplZFF1ZXJpZXMgPSBuZXcgU2V0KFxuICAgIGF0dGFjaG1lbnRzLmZsYXRNYXAoKGF0dGFjaG1lbnQpID0+XG4gICAgICBhdHRhY2htZW50LnZpej8ucXVlcnlfYXR0YWNobWVudF9pZCA/IFthdHRhY2htZW50LnZpei5xdWVyeV9hdHRhY2htZW50X2lkXSA6IFtdLFxuICAgICksXG4gICk7XG4gIGNvbnN0IHByb3NlOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBlbWJlZHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgYXR0YWNobWVudCBvZiBhdHRhY2htZW50cykge1xuICAgIGNvbnN0IHRleHQgPSBhdHRhY2htZW50LnRleHQ/LmNvbnRlbnQ/LnRyaW0oKTtcbiAgICBpZiAodGV4dCAmJiAhaXNRdWVyeU91dHB1dFRleHQoYXR0YWNobWVudC50ZXh0Py5tZXRhZGF0YSkpIHByb3NlLnB1c2godGV4dCk7XG4gICAgY29uc3Qgc3RhdGVtZW50SWQgPSBhdHRhY2htZW50LnF1ZXJ5Py5zdGF0ZW1lbnRfaWQ7XG4gICAgaWYgKCFzdGF0ZW1lbnRJZCkgY29udGludWU7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBhdHRhY2htZW50LnF1ZXJ5Py5kZXNjcmlwdGlvbj8udHJpbSgpO1xuICAgIGlmIChkZXNjcmlwdGlvbikgZW1iZWRzLnB1c2goZGVzY3JpcHRpb24pO1xuICAgIGVtYmVkcy5wdXNoKFxuICAgICAgdmlzdWFsaXplZFF1ZXJpZXMuaGFzKGF0dGFjaG1lbnQuYXR0YWNobWVudF9pZCA/PyBcIlwiKVxuICAgICAgICA/IG1hcmtlcnMuZm9ybWF0TWFya2VyKFwidmlzdWFsaXphdGlvblwiLCBzdGF0ZW1lbnRJZClcbiAgICAgICAgOiBtYXJrZXJzLmZvcm1hdE1hcmtlcihcImRhdGFcIiwgc3RhdGVtZW50SWQpLFxuICAgICk7XG4gIH1cbiAgY29uc3Qgc2VjdGlvbnMgPSBbLi4ucHJvc2UsIC4uLmVtYmVkc107XG4gIGlmIChzZWN0aW9ucy5sZW5ndGggPT09IDAgJiYgbWVzc2FnZS5lcnJvcj8uZXJyb3IpIHNlY3Rpb25zLnB1c2gobWVzc2FnZS5lcnJvci5lcnJvcik7XG4gIHJldHVybiBzZWN0aW9ucy5qb2luKFwiXFxuXFxuXCIpO1xufVxuXG4vKiogV2hldGhlciBhIHRleHQgYXR0YWNobWVudCBpcyBBZ2VudCBNb2RlJ3MgTWFya2Rvd24gY29weSBvZiBhIHF1ZXJ5IHJlc3VsdC4gKi9cbmZ1bmN0aW9uIGlzUXVlcnlPdXRwdXRUZXh0KG1ldGFkYXRhOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmplY3QuaXNSZWNvcmQobWV0YWRhdGEpICYmIHR5cGVvZiBtZXRhZGF0YS5zdGF0ZW1lbnRfaWQgPT09IFwic3RyaW5nXCI7XG59XG5cbi8qKiBFcnJvciB0ZXh0IGZvciBhIHRlcm1pbmFsIEdlbmllIG1lc3NhZ2UgdGhhdCBkaWQgbm90IGNvbXBsZXRlLCBvciBgdW5kZWZpbmVkYC4gKi9cbmZ1bmN0aW9uIGdlbmllRmFpbHVyZShtZXNzYWdlOiBHZW5pZU1lc3NhZ2UpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAobWVzc2FnZS5zdGF0dXMgPT09IFwiQ09NUExFVEVEXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBtZXNzYWdlLmVycm9yPy5lcnJvciA/PyBgR2VuaWUgJHtnZW5pZU1vZGVsLmh1bWFuaXplU3RhdHVzKG1lc3NhZ2Uuc3RhdHVzISl9YDtcbn1cblxuLyoqXG4gKiBQcm9qZWN0IG9uZSBwZXJzaXN0ZWQgR2VuaWUgbWVzc2FnZSBvbnRvIHRoZSB1c2VyIHF1ZXN0aW9uIGFuZCB0aGUgYXNzaXN0YW50XG4gKiBhbnN3ZXIgdGhlIGNoYXQgdHJhbnNjcmlwdCByZW5kZXJzLiBUaGUgYXNzaXN0YW50IG93bnMgYW4gYGFza19nZW5pZWAgdG9vbFxuICogcGFydCB3aG9zZSBwcm9ncmVzcyBpcyByZS1kZXJpdmVkIGZyb20gdGhlIHRlcm1pbmFsIHNuYXBzaG90LCBzbyByZWxvYWRlZFxuICogaGlzdG9yeSBzaG93cyB0aGUgc2FtZSBwaWxsLCBTUUwsIGFuZCBzdWdnZXN0aW9ucyBhcyB0aGUgbGl2ZSB0dXJuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuaWVNZXNzYWdlVG9VaU1lc3NhZ2VzKFxuICBtZXNzYWdlOiBHZW5pZU1lc3NhZ2UsXG4gIHNwYWNlOiBHZW5pZUNoYXRTcGFjZSxcbik6IFVJTWVzc2FnZVtdIHtcbiAgY29uc3QgbWVzc2FnZUlkID0gbWVzc2FnZS5tZXNzYWdlX2lkIHx8IG1lc3NhZ2UuaWQ7XG4gIGNvbnN0IHRvb2xDYWxsSWQgPSBtZXNzYWdlSWQ7XG4gIGNvbnN0IGlucHV0ID0geyBxdWVzdGlvbjogbWVzc2FnZS5jb250ZW50IH07XG4gIGNvbnN0IGZhaWx1cmUgPSBnZW5pZUZhaWx1cmUobWVzc2FnZSk7XG4gIGNvbnN0IHByb2dyZXNzID0gWy4uLmdlbmllRXZlbnQuZXZlbnRzRnJvbU1lc3NhZ2UobWVzc2FnZSwgdW5kZWZpbmVkLCBzcGFjZS5zcGFjZUlkKV0ubWFwKFxuICAgIChwcm9ncmVzc0V2ZW50KSA9PiAoe1xuICAgICAgdHlwZTogd2lyZS5HRU5JRV9QUk9HUkVTU19QQVJUX1RZUEUsXG4gICAgICBkYXRhOiB7IHRvb2xDYWxsSWQsIGV2ZW50OiBwcm9ncmVzc0V2ZW50IH0sXG4gICAgfSksXG4gICk7XG4gIGNvbnN0IHRvb2xQYXJ0ID0gZmFpbHVyZVxuICAgID8ge1xuICAgICAgICB0eXBlOiBgdG9vbC0ke2Fza0dlbmllVG9vbElkKHNwYWNlLmFsaWFzKX1gLFxuICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICBzdGF0ZTogXCJvdXRwdXQtZXJyb3JcIixcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIGVycm9yVGV4dDogZmFpbHVyZSxcbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgdHlwZTogYHRvb2wtJHthc2tHZW5pZVRvb2xJZChzcGFjZS5hbGlhcyl9YCxcbiAgICAgICAgdG9vbENhbGxJZCxcbiAgICAgICAgc3RhdGU6IFwib3V0cHV0LWF2YWlsYWJsZVwiLFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgb3V0cHV0OiB7IG1lc3NhZ2UgfSxcbiAgICAgIH07XG4gIGNvbnN0IGFuc3dlciA9IGdlbmllQW5zd2VyVGV4dChtZXNzYWdlKTtcbiAgY29uc3QgYXNzaXN0YW50UGFydHMgPSBbXG4gICAgdG9vbFBhcnQsXG4gICAgLi4ucHJvZ3Jlc3MsXG4gICAgLi4uKGFuc3dlciA/IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBhbnN3ZXIsIHN0YXRlOiBcImRvbmVcIiB9XSA6IFtdKSxcbiAgXSBhcyBVSU1lc3NhZ2VbXCJwYXJ0c1wiXTtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBpZDogYCR7bWVzc2FnZUlkfSR7UVVFU1RJT05fSURfU1VGRklYfWAsXG4gICAgICByb2xlOiBcInVzZXJcIixcbiAgICAgIHBhcnRzOiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogbWVzc2FnZS5jb250ZW50IH1dLFxuICAgIH0sXG4gICAgeyBpZDogbWVzc2FnZUlkLCByb2xlOiBcImFzc2lzdGFudFwiLCBwYXJ0czogYXNzaXN0YW50UGFydHMgfSxcbiAgXTtcbn1cblxuLyoqIExpc3QgdGhlIGNhbGxlcidzIGNvbnZlcnNhdGlvbnMgaW4gb25lIHNwYWNlLCBuZXdlc3QgZmlyc3QuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdEdlbmllVGhyZWFkcyhcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIHNwYWNlOiBHZW5pZUNoYXRTcGFjZSxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPEdlbmllVGhyZWFkW10+IHtcbiAgY29uc3QgY29udGV4dCA9IHNpZ25hbCA/IGRhdGFicmlja3MudG9Db250ZXh0KHNpZ25hbCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRocmVhZHM6IEdlbmllVGhyZWFkW10gPSBbXTtcbiAgbGV0IHBhZ2VUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBkbyB7XG4gICAgY29uc3QgcGFnZSA9IGF3YWl0IGNsaWVudC5nZW5pZS5saXN0Q29udmVyc2F0aW9ucyhcbiAgICAgIHtcbiAgICAgICAgc3BhY2VfaWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgICAgIHBhZ2Vfc2l6ZTogTElTVF9QQUdFX1NJWkUsXG4gICAgICAgIC4uLihwYWdlVG9rZW4gPyB7IHBhZ2VfdG9rZW46IHBhZ2VUb2tlbiB9IDoge30pLFxuICAgICAgfSxcbiAgICAgIGNvbnRleHQsXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGNvbnZlcnNhdGlvbiBvZiBwYWdlLmNvbnZlcnNhdGlvbnMgPz8gW10pIHtcbiAgICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKGNvbnZlcnNhdGlvbikgfHwgY29udmVyc2F0aW9uLmFnZW50X3R5cGUgIT09IEFHRU5UX0NPTlZFUlNBVElPTl9UWVBFKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhyZWFkcy5wdXNoKHtcbiAgICAgICAgaWQ6IGNvbnZlcnNhdGlvbi5jb252ZXJzYXRpb25faWQsXG4gICAgICAgIC4uLihjb252ZXJzYXRpb24udGl0bGUgPyB7IHRpdGxlOiBjb252ZXJzYXRpb24udGl0bGUgfSA6IHt9KSxcbiAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZShjb252ZXJzYXRpb24uY3JlYXRlZF90aW1lc3RhbXApLnRvSVNPU3RyaW5nKCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcGFnZVRva2VuID0gcGFnZS5uZXh0X3BhZ2VfdG9rZW4gfHwgdW5kZWZpbmVkO1xuICB9IHdoaWxlIChwYWdlVG9rZW4gJiYgdGhyZWFkcy5sZW5ndGggPCBUSFJFQURfTElNSVQpO1xuICByZXR1cm4gdGhyZWFkcy5zb3J0KChhLCBiKSA9PiBiLmNyZWF0ZWRBdC5sb2NhbGVDb21wYXJlKGEuY3JlYXRlZEF0KSkuc2xpY2UoMCwgVEhSRUFEX0xJTUlUKTtcbn1cblxuLyoqXG4gKiBMb2FkIG9uZSBjb252ZXJzYXRpb24ncyBtZXNzYWdlcyBhcyBjaHJvbm9sb2dpY2FsIGNoYXQgdHJhbnNjcmlwdCBtZXNzYWdlcy5cbiAqIENvbnZlcnNhdGlvbiBpdGVtcyBjb21lIG9ubHkgZnJvbSB0aGUgQWdlbnQgTW9kZSBpdGVtcyBBUEksIHdoaWNoIHJldGFpbnNcbiAqIHVzZXIgbWVzc2FnZXMsIHJlYXNvbmluZywgcXVlcmllcywgcmVzdWx0cywgcmVwb3J0cywgYW5kIGZpbmFsIGFuc3dlcnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0R2VuaWVUaHJlYWRNZXNzYWdlcyhvcHRpb25zOiB7XG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICBzcGFjZTogR2VuaWVDaGF0U3BhY2U7XG4gIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufSk6IFByb21pc2U8VUlNZXNzYWdlW10+IHtcbiAgY29uc3QgeyBzcGFjZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgbWVzc2FnZXMgPSBhd2FpdCBhZ2VudE1vZGUubGlzdEFnZW50TW9kZUNvbnZlcnNhdGlvbihcbiAgICBvcHRpb25zLmNsaWVudCxcbiAgICBzcGFjZS5zcGFjZUlkLFxuICAgIG9wdGlvbnMuY29udmVyc2F0aW9uSWQsXG4gICAge1xuICAgICAgLi4uKG9wdGlvbnMuc2lnbmFsID8geyBjb250ZXh0OiBvcHRpb25zLnNpZ25hbCB9IDoge30pLFxuICAgIH0sXG4gICk7XG4gIHJldHVybiBtZXNzYWdlcy5mbGF0TWFwKChtZXNzYWdlKSA9PiBnZW5pZU1lc3NhZ2VUb1VpTWVzc2FnZXMobWVzc2FnZSwgc3BhY2UpKTtcbn1cblxuLyoqXG4gKiBTdHJlYW0gb25lIEdlbmllIHR1cm4gYXMgQUkgU0RLIFVJIGNodW5rcyBzaGFwZWQgbGlrZSBhbiBhZ2VudCdzXG4gKiBgYXNrX2dlbmllYCBjYWxsLiBUaGUgY29udmVyc2F0aW9uIGlkZW50aXR5IGlzIGFubm91bmNlZCB0aHJvdWdoIGEgdHJhbnNpZW50XG4gKiB7QGxpbmsgd2lyZS5HRU5JRV9DT05WRVJTQVRJT05fUEFSVF9UWVBFfSBwYXJ0IGFzIHNvb24gYXMgR2VuaWUgYXNzaWducyBpdCxcbiAqIHNvIHRoZSBicm93c2VyIGNhbiBhZG9wdCB0aGUgY29udmVyc2F0aW9uIGlkIGFzIGl0cyB0aHJlYWQgaWQuIEFnZW50IE1vZGVcbiAqIHJlY2VpdmVzIEdlbmllJ3MgbmF0aXZlIHZpc3VhbGl6YXRpb24gdG9vbDsgdmlzdWFsaXphdGlvbiBhdHRhY2htZW50cyBiZWNvbWVcbiAqIEFwcEtpdCBVSSBlbWJlZCBtYXJrZXJzIGluIHRoZSBhbnN3ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5pZUNoYXRTdHJlYW0ob3B0aW9uczoge1xuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudDtcbiAgc3BhY2U6IEdlbmllQ2hhdFNwYWNlO1xuICByZXF1ZXN0OiBHZW5pZUNoYXRSZXF1ZXN0O1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn0pOiBSZWFkYWJsZVN0cmVhbTxVSU1lc3NhZ2VDaHVuaz4ge1xuICBjb25zdCB7IGNsaWVudCwgc3BhY2UsIHJlcXVlc3QsIHNpZ25hbCB9ID0gb3B0aW9ucztcbiAgY29uc3QgdG9vbENhbGxJZCA9IGhhc2guaWQoKTtcbiAgY29uc3QgdG9vbE5hbWUgPSBhc2tHZW5pZVRvb2xJZChzcGFjZS5hbGlhcyk7XG4gIHJldHVybiBjcmVhdGVVSU1lc3NhZ2VTdHJlYW0oe1xuICAgIG9uRXJyb3I6ICgpID0+IERJUkVDVF9HRU5JRV9FUlJPUixcbiAgICBleGVjdXRlOiBhc3luYyAoeyB3cml0ZXIgfSkgPT4ge1xuICAgICAgY29uc3QgcHJvZ3Jlc3MgPSAocHJvZ3Jlc3NFdmVudDogd2lyZS5HZW5pZVdyaXRlckV2ZW50KSA9PlxuICAgICAgICB3cml0ZXIud3JpdGUoe1xuICAgICAgICAgIHR5cGU6IHdpcmUuR0VOSUVfUFJPR1JFU1NfUEFSVF9UWVBFLFxuICAgICAgICAgIGRhdGE6IHsgdG9vbENhbGxJZCwgZXZlbnQ6IHByb2dyZXNzRXZlbnQgfSxcbiAgICAgICAgfSk7XG4gICAgICB3cml0ZXIud3JpdGUoeyB0eXBlOiBcInN0YXJ0XCIgfSk7XG4gICAgICB3cml0ZXIud3JpdGUoeyB0eXBlOiBcInN0YXJ0LXN0ZXBcIiB9KTtcbiAgICAgIHdyaXRlci53cml0ZSh7XG4gICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1hdmFpbGFibGVcIixcbiAgICAgICAgdG9vbENhbGxJZCxcbiAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgIGlucHV0OiB7IHF1ZXN0aW9uOiByZXF1ZXN0LnF1ZXN0aW9uIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0YXJ0ZWQ6IFN0YXJ0ZWRFdmVudCA9IHtcbiAgICAgICAgdHlwZTogXCJzdGFydGVkXCIsXG4gICAgICAgIHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgICAgIGNvbnRlbnQ6IHJlcXVlc3QucXVlc3Rpb24sXG4gICAgICB9O1xuICAgICAgcHJvZ3Jlc3Moc3RhcnRlZCk7XG5cbiAgICAgIGxldCBhbm5vdW5jZWQ6IHdpcmUuR2VuaWVDb252ZXJzYXRpb25QYXJ0RGF0YSB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBmaW5hbE1lc3NhZ2U6IEdlbmllTWVzc2FnZSB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgY2hhdEV2ZW50IG9mIGNoYXQuZ2VuaWVFdmVudENoYXQoc3BhY2Uuc3BhY2VJZCwgcmVxdWVzdC5xdWVzdGlvbiwge1xuICAgICAgICAgIHdvcmtzcGFjZUNsaWVudDogY2xpZW50LFxuICAgICAgICAgIGFnZW50TW9kZTogdHJ1ZSxcbiAgICAgICAgICBhZ2VudE1vZGVGYWxsYmFjazogZmFsc2UsXG4gICAgICAgICAgZW5hYmxlVmlzdWFsaXphdGlvbjogdHJ1ZSxcbiAgICAgICAgICAuLi4ocmVxdWVzdC5jb252ZXJzYXRpb25JZCA/IHsgY29udmVyc2F0aW9uSWQ6IHJlcXVlc3QuY29udmVyc2F0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oc2lnbmFsID8geyBjb250ZXh0OiBzaWduYWwgfSA6IHt9KSxcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICBjb25zdCBjb252ZXJzYXRpb25JZCA9IGNoYXRFdmVudC5jb252ZXJzYXRpb25faWQgPz8gcmVxdWVzdC5jb252ZXJzYXRpb25JZDtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSWQgPSBjaGF0RXZlbnQubWVzc2FnZV9pZDtcbiAgICAgICAgICAvLyBSZS1hbm5vdW5jZSBvbmx5IHdoZW4gdGhlIGlkZW50aXR5IGdhaW5zIGluZm9ybWF0aW9uICh0aGUgbWVzc2FnZVxuICAgICAgICAgIC8vIGlkIGNvbW1vbmx5IGxhbmRzIG9uZSBzbmFwc2hvdCBhZnRlciB0aGUgY29udmVyc2F0aW9uIGlkKS5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb252ZXJzYXRpb25JZCAmJlxuICAgICAgICAgICAgKGFubm91bmNlZD8uY29udmVyc2F0aW9uSWQgIT09IGNvbnZlcnNhdGlvbklkIHx8XG4gICAgICAgICAgICAgIChtZXNzYWdlSWQgJiYgYW5ub3VuY2VkLm1lc3NhZ2VJZCAhPT0gbWVzc2FnZUlkKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGFubm91bmNlZCA9IHsgY29udmVyc2F0aW9uSWQsIC4uLihtZXNzYWdlSWQgPyB7IG1lc3NhZ2VJZCB9IDoge30pIH07XG4gICAgICAgICAgICB3cml0ZXIud3JpdGUoe1xuICAgICAgICAgICAgICB0eXBlOiB3aXJlLkdFTklFX0NPTlZFUlNBVElPTl9QQVJUX1RZUEUsXG4gICAgICAgICAgICAgIGRhdGE6IGFubm91bmNlZCxcbiAgICAgICAgICAgICAgdHJhbnNpZW50OiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjaGF0RXZlbnQudHlwZSA9PT0gXCJyZXN1bHRcIikgZmluYWxNZXNzYWdlID0gY2hhdEV2ZW50Lm1lc3NhZ2U7XG4gICAgICAgICAgZWxzZSBpZiAoY2hhdEV2ZW50LnR5cGUgIT09IFwibWVzc2FnZVwiKSBwcm9ncmVzcyhjaGF0RXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIud2FybihcInR1cm46ZXJyb3JcIiwge1xuICAgICAgICAgIHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICB3cml0ZXIud3JpdGUoe1xuICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtZXJyb3JcIixcbiAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgIGVycm9yVGV4dDogRElSRUNUX0dFTklFX0VSUk9SLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoIWZpbmFsTWVzc2FnZSkgdGhyb3cgbmV3IEVycm9yKFwiR2VuaWUgZW5kZWQgdGhlIHR1cm4gd2l0aG91dCBhIHJlc3VsdFwiKTtcblxuICAgICAgY29uc3QgZmFpbHVyZSA9IGdlbmllRmFpbHVyZShmaW5hbE1lc3NhZ2UpO1xuICAgICAgd3JpdGVyLndyaXRlKFxuICAgICAgICBmYWlsdXJlXG4gICAgICAgICAgPyB7IHR5cGU6IFwidG9vbC1vdXRwdXQtZXJyb3JcIiwgdG9vbENhbGxJZCwgZXJyb3JUZXh0OiBmYWlsdXJlIH1cbiAgICAgICAgICA6IHsgdHlwZTogXCJ0b29sLW91dHB1dC1hdmFpbGFibGVcIiwgdG9vbENhbGxJZCwgb3V0cHV0OiB7IG1lc3NhZ2U6IGZpbmFsTWVzc2FnZSB9IH0sXG4gICAgICApO1xuICAgICAgd3JpdGVyLndyaXRlKHsgdHlwZTogXCJmaW5pc2gtc3RlcFwiIH0pO1xuICAgICAgY29uc3QgYW5zd2VyID0gZ2VuaWVBbnN3ZXJUZXh0KGZpbmFsTWVzc2FnZSk7XG4gICAgICBpZiAoYW5zd2VyKSB7XG4gICAgICAgIGNvbnN0IHRleHRJZCA9IGhhc2guaWQoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlKHsgdHlwZTogXCJzdGFydC1zdGVwXCIgfSk7XG4gICAgICAgIHdyaXRlci53cml0ZSh7IHR5cGU6IFwidGV4dC1zdGFydFwiLCBpZDogdGV4dElkIH0pO1xuICAgICAgICB3cml0ZXIud3JpdGUoeyB0eXBlOiBcInRleHQtZGVsdGFcIiwgaWQ6IHRleHRJZCwgZGVsdGE6IGFuc3dlciB9KTtcbiAgICAgICAgd3JpdGVyLndyaXRlKHsgdHlwZTogXCJ0ZXh0LWVuZFwiLCBpZDogdGV4dElkIH0pO1xuICAgICAgICB3cml0ZXIud3JpdGUoeyB0eXBlOiBcImZpbmlzaC1zdGVwXCIgfSk7XG4gICAgICB9XG4gICAgICB3cml0ZXIud3JpdGUoeyB0eXBlOiBcImZpbmlzaFwiLCBmaW5pc2hSZWFzb246IGZhaWx1cmUgPyBcImVycm9yXCIgOiBcInN0b3BcIiB9KTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInR1cm46ZG9uZVwiLCB7XG4gICAgICAgIHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgICAgIGNvbnZlcnNhdGlvbklkOiBhbm5vdW5jZWQ/LmNvbnZlcnNhdGlvbklkLFxuICAgICAgICBzdGF0dXM6IGZpbmFsTWVzc2FnZS5zdGF0dXMsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqIERlbGV0ZSBvbmUgR2VuaWUgY29udmVyc2F0aW9uIG93bmVkIGJ5IHRoZSBjYWxsZXIuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlR2VuaWVUaHJlYWQoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICBzcGFjZTogR2VuaWVDaGF0U3BhY2UsXG4gIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY2xpZW50LmdlbmllLmRlbGV0ZUNvbnZlcnNhdGlvbih7XG4gICAgc3BhY2VfaWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgY29udmVyc2F0aW9uX2lkOiBjb252ZXJzYXRpb25JZCxcbiAgfSk7XG59XG5cbi8qKiBEZWxldGUgb25lIEdlbmllIG1lc3NhZ2UsIGFjY2VwdGluZyBlaXRoZXIgaXRzIGFuc3dlciBvciBxdWVzdGlvbiB0cmFuc2NyaXB0IGlkLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUdlbmllVGhyZWFkTWVzc2FnZShcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIHNwYWNlOiBHZW5pZUNoYXRTcGFjZSxcbiAgY29udmVyc2F0aW9uSWQ6IHN0cmluZyxcbiAgbWVzc2FnZUlkOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY2xpZW50LmdlbmllLmRlbGV0ZUNvbnZlcnNhdGlvbk1lc3NhZ2Uoe1xuICAgIHNwYWNlX2lkOiBzcGFjZS5zcGFjZUlkLFxuICAgIGNvbnZlcnNhdGlvbl9pZDogY29udmVyc2F0aW9uSWQsXG4gICAgbWVzc2FnZV9pZDogbWVzc2FnZUlkLmVuZHNXaXRoKFFVRVNUSU9OX0lEX1NVRkZJWClcbiAgICAgID8gbWVzc2FnZUlkLnNsaWNlKDAsIC1RVUVTVElPTl9JRF9TVUZGSVgubGVuZ3RoKVxuICAgICAgOiBtZXNzYWdlSWQsXG4gIH0pO1xufVxuIl19
|
package/lib/src/genie.d.ts
CHANGED
|
@@ -57,6 +57,8 @@ export interface GenieSpaceConfig {
|
|
|
57
57
|
}
|
|
58
58
|
/** Map of alias -> space config. Accepts either explicit objects or bare space ids. */
|
|
59
59
|
export type GenieSpacesConfig = Record<string, GenieSpaceConfig | string>;
|
|
60
|
+
/** Tool id of the `ask_genie` tool registered for one space alias. */
|
|
61
|
+
export declare function askGenieToolId(alias: string): string;
|
|
60
62
|
/**
|
|
61
63
|
* Suggested orchestration prompt for the central agent that owns
|
|
62
64
|
* the Genie tools. Compose into your agent's `instructions` to
|