@dbx-tools/shared-teams 0.3.44 → 0.4.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/lib/index.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export * as activity from "./src/activity.js";
2
+ export * as card from "./src/card.js";
3
+ export { ADAPTIVE_CARD_CONTENT_TYPE, ACTIVITY_TYPES, channelAccountSchema, conversationAccountSchema, cardAttachmentSchema, activitySchema, activityRequestSchema, activityResponseSchema, toCardAttachment, cardsOf } from "./src/activity.js";
4
+ export type { ActivityType, ChannelAccount, ConversationAccount, CardAttachment, Activity, ActivityRequest, ActivityResponse } from "./src/activity.js";
5
+ export { ADAPTIVE_CARD_VERSION, ADAPTIVE_CARD_SCHEMA_URL, cardFactSchema, cardActionSchema, cardSpecSchema, adaptiveCardSchema, cardResultSchema } from "./src/card.js";
6
+ export type { CardFact, CardAction, CardSpec, AdaptiveCard, CardResult } from "./src/card.js";
package/lib/index.js ADDED
@@ -0,0 +1,8 @@
1
+ // GENERATED by projen watch - DO NOT EDIT.
2
+ // Regenerated from the exporting modules in ./src.
3
+ // Hand edits are overwritten on the next watch; this file is read-only.
4
+ export * as activity from "./src/activity.js";
5
+ export * as card from "./src/card.js";
6
+ export { ADAPTIVE_CARD_CONTENT_TYPE, ACTIVITY_TYPES, channelAccountSchema, conversationAccountSchema, cardAttachmentSchema, activitySchema, activityRequestSchema, activityResponseSchema, toCardAttachment, cardsOf } from "./src/activity.js";
7
+ export { ADAPTIVE_CARD_VERSION, ADAPTIVE_CARD_SCHEMA_URL, cardFactSchema, cardActionSchema, cardSpecSchema, adaptiveCardSchema, cardResultSchema } from "./src/card.js";
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxJQUFJLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUseUJBQXlCLEVBQUUsb0JBQW9CLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdPLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSx3QkFBd0IsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0ICogYXMgYWN0aXZpdHkgZnJvbSBcIi4vc3JjL2FjdGl2aXR5XCI7XG5leHBvcnQgKiBhcyBjYXJkIGZyb20gXCIuL3NyYy9jYXJkXCI7XG5leHBvcnQgeyBBREFQVElWRV9DQVJEX0NPTlRFTlRfVFlQRSwgQUNUSVZJVFlfVFlQRVMsIGNoYW5uZWxBY2NvdW50U2NoZW1hLCBjb252ZXJzYXRpb25BY2NvdW50U2NoZW1hLCBjYXJkQXR0YWNobWVudFNjaGVtYSwgYWN0aXZpdHlTY2hlbWEsIGFjdGl2aXR5UmVxdWVzdFNjaGVtYSwgYWN0aXZpdHlSZXNwb25zZVNjaGVtYSwgdG9DYXJkQXR0YWNobWVudCwgY2FyZHNPZiB9IGZyb20gXCIuL3NyYy9hY3Rpdml0eVwiO1xuZXhwb3J0IHR5cGUgeyBBY3Rpdml0eVR5cGUsIENoYW5uZWxBY2NvdW50LCBDb252ZXJzYXRpb25BY2NvdW50LCBDYXJkQXR0YWNobWVudCwgQWN0aXZpdHksIEFjdGl2aXR5UmVxdWVzdCwgQWN0aXZpdHlSZXNwb25zZSB9IGZyb20gXCIuL3NyYy9hY3Rpdml0eVwiO1xuZXhwb3J0IHsgQURBUFRJVkVfQ0FSRF9WRVJTSU9OLCBBREFQVElWRV9DQVJEX1NDSEVNQV9VUkwsIGNhcmRGYWN0U2NoZW1hLCBjYXJkQWN0aW9uU2NoZW1hLCBjYXJkU3BlY1NjaGVtYSwgYWRhcHRpdmVDYXJkU2NoZW1hLCBjYXJkUmVzdWx0U2NoZW1hIH0gZnJvbSBcIi4vc3JjL2NhcmRcIjtcbmV4cG9ydCB0eXBlIHsgQ2FyZEZhY3QsIENhcmRBY3Rpb24sIENhcmRTcGVjLCBBZGFwdGl2ZUNhcmQsIENhcmRSZXN1bHQgfSBmcm9tIFwiLi9zcmMvY2FyZFwiO1xuIl19
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Wire-format contract for the Teams conversation endpoint: the Bot Framework
3
+ * `Activity` a Teams-like client posts, and the activity (carrying Adaptive Card
4
+ * attachments) the agent answers with.
5
+ *
6
+ * Why this shape rather than a bespoke `{ message }` envelope: Teams does not
7
+ * speak a custom chat API. A channel delivers a bot a JSON `Activity` and reads
8
+ * back activities whose `attachments` carry
9
+ * `application/vnd.microsoft.card.adaptive` payloads. Modelling the real
10
+ * protocol here means the same endpoint that backs the in-repo preview chat is
11
+ * the one a Bot Framework channel could call - the analogue of how the Mastra
12
+ * plugin exposes MCP at a path rather than inventing a tool-call API.
13
+ *
14
+ * Only the subset the conversation endpoint actually reads or writes is
15
+ * modelled. `Activity` is a large, evolving envelope, so unknown fields are
16
+ * PRESERVED rather than stripped (see {@link activitySchema}) - a channel sends
17
+ * far more than this, and dropping it would corrupt a round-trip.
18
+ *
19
+ * @module
20
+ */
21
+ import { z } from "zod";
22
+ import { adaptiveCardSchema } from "./card.js";
23
+ /** The attachment content type Teams uses for an Adaptive Card. */
24
+ export declare const ADAPTIVE_CARD_CONTENT_TYPE = "application/vnd.microsoft.card.adaptive";
25
+ /** Bot Framework activity types this endpoint understands. */
26
+ export declare const ACTIVITY_TYPES: readonly ["message", "conversationUpdate", "typing"];
27
+ /** A Bot Framework activity type. */
28
+ export type ActivityType = (typeof ACTIVITY_TYPES)[number];
29
+ /**
30
+ * A participant in a conversation. `id` is the stable key; `name` is the
31
+ * display label a chat transcript shows.
32
+ */
33
+ export declare const channelAccountSchema: z.ZodObject<{
34
+ id: z.ZodString;
35
+ name: z.ZodOptional<z.ZodString>;
36
+ }, z.core.$strip>;
37
+ /** A conversation participant (user or bot). */
38
+ export type ChannelAccount = z.infer<typeof channelAccountSchema>;
39
+ /**
40
+ * The conversation an activity belongs to. The `id` is what maps onto a Mastra
41
+ * memory thread, so a client that keeps sending the same id gets a continuous
42
+ * conversation.
43
+ */
44
+ export declare const conversationAccountSchema: z.ZodObject<{
45
+ id: z.ZodString;
46
+ }, z.core.$strip>;
47
+ /** The conversation an activity belongs to. */
48
+ export type ConversationAccount = z.infer<typeof conversationAccountSchema>;
49
+ /**
50
+ * An Adaptive Card attachment - how a card reaches a Teams client. The card
51
+ * document lives under `content`, tagged by `contentType`.
52
+ */
53
+ export declare const cardAttachmentSchema: z.ZodObject<{
54
+ contentType: z.ZodLiteral<"application/vnd.microsoft.card.adaptive">;
55
+ content: z.ZodObject<{
56
+ type: z.ZodLiteral<"AdaptiveCard">;
57
+ $schema: z.ZodString;
58
+ version: z.ZodString;
59
+ body: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
60
+ actions: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
61
+ }, z.core.$strip>;
62
+ }, z.core.$strip>;
63
+ /** An Adaptive Card attachment on an activity. */
64
+ export type CardAttachment = z.infer<typeof cardAttachmentSchema>;
65
+ /**
66
+ * A Bot Framework activity.
67
+ *
68
+ * `.passthrough()` is deliberate: a real channel sends `channelId`,
69
+ * `serviceUrl`, `timestamp`, `replyToId`, `channelData` and more. This endpoint
70
+ * reads only what it needs, but an unknown field is part of the caller's
71
+ * envelope and is kept so a client can round-trip its own metadata.
72
+ */
73
+ export declare const activitySchema: z.ZodObject<{
74
+ type: z.ZodEnum<{
75
+ message: "message";
76
+ conversationUpdate: "conversationUpdate";
77
+ typing: "typing";
78
+ }>;
79
+ id: z.ZodOptional<z.ZodString>;
80
+ text: z.ZodOptional<z.ZodString>;
81
+ from: z.ZodOptional<z.ZodObject<{
82
+ id: z.ZodString;
83
+ name: z.ZodOptional<z.ZodString>;
84
+ }, z.core.$strip>>;
85
+ recipient: z.ZodOptional<z.ZodObject<{
86
+ id: z.ZodString;
87
+ name: z.ZodOptional<z.ZodString>;
88
+ }, z.core.$strip>>;
89
+ conversation: z.ZodOptional<z.ZodObject<{
90
+ id: z.ZodString;
91
+ }, z.core.$strip>>;
92
+ attachments: z.ZodOptional<z.ZodArray<z.ZodObject<{
93
+ contentType: z.ZodLiteral<"application/vnd.microsoft.card.adaptive">;
94
+ content: z.ZodObject<{
95
+ type: z.ZodLiteral<"AdaptiveCard">;
96
+ $schema: z.ZodString;
97
+ version: z.ZodString;
98
+ body: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
99
+ actions: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
100
+ }, z.core.$strip>;
101
+ }, z.core.$strip>>>;
102
+ timestamp: z.ZodOptional<z.ZodString>;
103
+ }, z.core.$loose>;
104
+ /** A Bot Framework activity. */
105
+ export type Activity = z.infer<typeof activitySchema>;
106
+ /**
107
+ * The request body the conversation endpoint accepts: an inbound activity plus
108
+ * optional routing hints that are NOT part of the Bot Framework envelope
109
+ * (which agent to run, which serving model to use). Keeping them as siblings of
110
+ * `activity` leaves the protocol payload untouched.
111
+ */
112
+ export declare const activityRequestSchema: z.ZodObject<{
113
+ activity: z.ZodObject<{
114
+ type: z.ZodEnum<{
115
+ message: "message";
116
+ conversationUpdate: "conversationUpdate";
117
+ typing: "typing";
118
+ }>;
119
+ id: z.ZodOptional<z.ZodString>;
120
+ text: z.ZodOptional<z.ZodString>;
121
+ from: z.ZodOptional<z.ZodObject<{
122
+ id: z.ZodString;
123
+ name: z.ZodOptional<z.ZodString>;
124
+ }, z.core.$strip>>;
125
+ recipient: z.ZodOptional<z.ZodObject<{
126
+ id: z.ZodString;
127
+ name: z.ZodOptional<z.ZodString>;
128
+ }, z.core.$strip>>;
129
+ conversation: z.ZodOptional<z.ZodObject<{
130
+ id: z.ZodString;
131
+ }, z.core.$strip>>;
132
+ attachments: z.ZodOptional<z.ZodArray<z.ZodObject<{
133
+ contentType: z.ZodLiteral<"application/vnd.microsoft.card.adaptive">;
134
+ content: z.ZodObject<{
135
+ type: z.ZodLiteral<"AdaptiveCard">;
136
+ $schema: z.ZodString;
137
+ version: z.ZodString;
138
+ body: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
139
+ actions: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
140
+ }, z.core.$strip>;
141
+ }, z.core.$strip>>>;
142
+ timestamp: z.ZodOptional<z.ZodString>;
143
+ }, z.core.$loose>;
144
+ agentId: z.ZodOptional<z.ZodString>;
145
+ model: z.ZodOptional<z.ZodString>;
146
+ }, z.core.$strip>;
147
+ /** A request to the Teams conversation endpoint. */
148
+ export type ActivityRequest = z.infer<typeof activityRequestSchema>;
149
+ /**
150
+ * The endpoint's response: the activities to append to the transcript. An array
151
+ * because one turn may answer with several activities (Teams itself allows a
152
+ * bot to send more than one reply), and because a future streaming/typing
153
+ * variant can grow into the same shape without a breaking change.
154
+ */
155
+ export declare const activityResponseSchema: z.ZodObject<{
156
+ activities: z.ZodArray<z.ZodObject<{
157
+ type: z.ZodEnum<{
158
+ message: "message";
159
+ conversationUpdate: "conversationUpdate";
160
+ typing: "typing";
161
+ }>;
162
+ id: z.ZodOptional<z.ZodString>;
163
+ text: z.ZodOptional<z.ZodString>;
164
+ from: z.ZodOptional<z.ZodObject<{
165
+ id: z.ZodString;
166
+ name: z.ZodOptional<z.ZodString>;
167
+ }, z.core.$strip>>;
168
+ recipient: z.ZodOptional<z.ZodObject<{
169
+ id: z.ZodString;
170
+ name: z.ZodOptional<z.ZodString>;
171
+ }, z.core.$strip>>;
172
+ conversation: z.ZodOptional<z.ZodObject<{
173
+ id: z.ZodString;
174
+ }, z.core.$strip>>;
175
+ attachments: z.ZodOptional<z.ZodArray<z.ZodObject<{
176
+ contentType: z.ZodLiteral<"application/vnd.microsoft.card.adaptive">;
177
+ content: z.ZodObject<{
178
+ type: z.ZodLiteral<"AdaptiveCard">;
179
+ $schema: z.ZodString;
180
+ version: z.ZodString;
181
+ body: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
182
+ actions: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
183
+ }, z.core.$strip>;
184
+ }, z.core.$strip>>>;
185
+ timestamp: z.ZodOptional<z.ZodString>;
186
+ }, z.core.$loose>>;
187
+ }, z.core.$strip>;
188
+ /** The response from the Teams conversation endpoint. */
189
+ export type ActivityResponse = z.infer<typeof activityResponseSchema>;
190
+ /**
191
+ * Wrap a compiled Adaptive Card as a Teams attachment.
192
+ *
193
+ * Browser-safe and shared so the server (building a reply) and any client
194
+ * (rendering an optimistic local activity) tag attachments identically.
195
+ */
196
+ export declare const toCardAttachment: (card: z.infer<typeof adaptiveCardSchema>) => CardAttachment;
197
+ /** Read the Adaptive Card documents carried by an activity, if any. */
198
+ export declare const cardsOf: (activity: Activity) => z.infer<typeof adaptiveCardSchema>[];
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Wire-format contract for the Teams conversation endpoint: the Bot Framework
3
+ * `Activity` a Teams-like client posts, and the activity (carrying Adaptive Card
4
+ * attachments) the agent answers with.
5
+ *
6
+ * Why this shape rather than a bespoke `{ message }` envelope: Teams does not
7
+ * speak a custom chat API. A channel delivers a bot a JSON `Activity` and reads
8
+ * back activities whose `attachments` carry
9
+ * `application/vnd.microsoft.card.adaptive` payloads. Modelling the real
10
+ * protocol here means the same endpoint that backs the in-repo preview chat is
11
+ * the one a Bot Framework channel could call - the analogue of how the Mastra
12
+ * plugin exposes MCP at a path rather than inventing a tool-call API.
13
+ *
14
+ * Only the subset the conversation endpoint actually reads or writes is
15
+ * modelled. `Activity` is a large, evolving envelope, so unknown fields are
16
+ * PRESERVED rather than stripped (see {@link activitySchema}) - a channel sends
17
+ * far more than this, and dropping it would corrupt a round-trip.
18
+ *
19
+ * @module
20
+ */
21
+ import { z } from "zod";
22
+ import { adaptiveCardSchema } from "./card.js";
23
+ /** The attachment content type Teams uses for an Adaptive Card. */
24
+ export const ADAPTIVE_CARD_CONTENT_TYPE = "application/vnd.microsoft.card.adaptive";
25
+ /** Bot Framework activity types this endpoint understands. */
26
+ export const ACTIVITY_TYPES = ["message", "conversationUpdate", "typing"];
27
+ /**
28
+ * A participant in a conversation. `id` is the stable key; `name` is the
29
+ * display label a chat transcript shows.
30
+ */
31
+ export const channelAccountSchema = z.object({
32
+ id: z.string().describe("Stable id of the user or bot."),
33
+ name: z.string().optional().describe("Display name shown in the transcript."),
34
+ });
35
+ /**
36
+ * The conversation an activity belongs to. The `id` is what maps onto a Mastra
37
+ * memory thread, so a client that keeps sending the same id gets a continuous
38
+ * conversation.
39
+ */
40
+ export const conversationAccountSchema = z.object({
41
+ id: z.string().describe("Conversation id; maps to the agent's memory thread."),
42
+ });
43
+ /**
44
+ * An Adaptive Card attachment - how a card reaches a Teams client. The card
45
+ * document lives under `content`, tagged by `contentType`.
46
+ */
47
+ export const cardAttachmentSchema = z.object({
48
+ contentType: z.literal(ADAPTIVE_CARD_CONTENT_TYPE),
49
+ content: adaptiveCardSchema.describe("The compiled Adaptive Card document."),
50
+ });
51
+ /**
52
+ * A Bot Framework activity.
53
+ *
54
+ * `.passthrough()` is deliberate: a real channel sends `channelId`,
55
+ * `serviceUrl`, `timestamp`, `replyToId`, `channelData` and more. This endpoint
56
+ * reads only what it needs, but an unknown field is part of the caller's
57
+ * envelope and is kept so a client can round-trip its own metadata.
58
+ */
59
+ export const activitySchema = z
60
+ .object({
61
+ type: z.enum(ACTIVITY_TYPES).describe("Activity type; `message` carries user text."),
62
+ id: z.string().optional().describe("Activity id, assigned by the sender."),
63
+ text: z.string().optional().describe("Message text, present on a `message` activity."),
64
+ from: channelAccountSchema.optional().describe("Who sent the activity."),
65
+ recipient: channelAccountSchema.optional().describe("Who the activity is addressed to."),
66
+ conversation: conversationAccountSchema
67
+ .optional()
68
+ .describe("Conversation the activity belongs to."),
69
+ attachments: z
70
+ .array(cardAttachmentSchema)
71
+ .optional()
72
+ .describe("Adaptive Card attachments carried by the activity."),
73
+ timestamp: z.string().optional().describe("ISO-8601 time the activity was created."),
74
+ })
75
+ .passthrough();
76
+ /**
77
+ * The request body the conversation endpoint accepts: an inbound activity plus
78
+ * optional routing hints that are NOT part of the Bot Framework envelope
79
+ * (which agent to run, which serving model to use). Keeping them as siblings of
80
+ * `activity` leaves the protocol payload untouched.
81
+ */
82
+ export const activityRequestSchema = z.object({
83
+ activity: activitySchema.describe("The inbound Bot Framework activity."),
84
+ agentId: z
85
+ .string()
86
+ .optional()
87
+ .describe("Mastra agent to answer with. Defaults to the plugin's default agent."),
88
+ model: z.string().optional().describe("Optional serving-endpoint override for this turn."),
89
+ });
90
+ /**
91
+ * The endpoint's response: the activities to append to the transcript. An array
92
+ * because one turn may answer with several activities (Teams itself allows a
93
+ * bot to send more than one reply), and because a future streaming/typing
94
+ * variant can grow into the same shape without a breaking change.
95
+ */
96
+ export const activityResponseSchema = z.object({
97
+ activities: z.array(activitySchema).describe("Activities the bot replies with."),
98
+ });
99
+ /**
100
+ * Wrap a compiled Adaptive Card as a Teams attachment.
101
+ *
102
+ * Browser-safe and shared so the server (building a reply) and any client
103
+ * (rendering an optimistic local activity) tag attachments identically.
104
+ */
105
+ export const toCardAttachment = (card) => ({
106
+ contentType: ADAPTIVE_CARD_CONTENT_TYPE,
107
+ content: card,
108
+ });
109
+ /** Read the Adaptive Card documents carried by an activity, if any. */
110
+ export const cardsOf = (activity) => (activity.attachments ?? [])
111
+ .filter((attachment) => attachment.contentType === ADAPTIVE_CARD_CONTENT_TYPE)
112
+ .map((attachment) => attachment.content);
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWN0aXZpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUU1QyxtRUFBbUU7QUFDbkUsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcseUNBQXlDLENBQUM7QUFFcEYsOERBQThEO0FBQzlELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxRQUFRLENBQVUsQ0FBQztBQUtuRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLCtCQUErQixDQUFDO0lBQ3hELElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLHVDQUF1QyxDQUFDO0NBQzlFLENBQUMsQ0FBQztBQUtIOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2hELEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLHFEQUFxRCxDQUFDO0NBQy9FLENBQUMsQ0FBQztBQUtIOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0MsV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUM7SUFDbEQsT0FBTyxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxzQ0FBc0MsQ0FBQztDQUM3RSxDQUFDLENBQUM7QUFLSDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUM7S0FDNUIsTUFBTSxDQUFDO0lBQ04sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLDZDQUE2QyxDQUFDO0lBQ3BGLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLHNDQUFzQyxDQUFDO0lBQzFFLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLGdEQUFnRCxDQUFDO0lBQ3RGLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUM7SUFDeEUsU0FBUyxFQUFFLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxtQ0FBbUMsQ0FBQztJQUN4RixZQUFZLEVBQUUseUJBQXlCO1NBQ3BDLFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FBQyx1Q0FBdUMsQ0FBQztJQUNwRCxXQUFXLEVBQUUsQ0FBQztTQUNYLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQztTQUMzQixRQUFRLEVBQUU7U0FDVixRQUFRLENBQUMsb0RBQW9ELENBQUM7SUFDakUsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMseUNBQXlDLENBQUM7Q0FDckYsQ0FBQztLQUNELFdBQVcsRUFBRSxDQUFDO0FBS2pCOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM1QyxRQUFRLEVBQUUsY0FBYyxDQUFDLFFBQVEsQ0FBQyxxQ0FBcUMsQ0FBQztJQUN4RSxPQUFPLEVBQUUsQ0FBQztTQUNQLE1BQU0sRUFBRTtTQUNSLFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FBQyxzRUFBc0UsQ0FBQztJQUNuRixLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxtREFBbUQsQ0FBQztDQUMzRixDQUFDLENBQUM7QUFLSDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDN0MsVUFBVSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLGtDQUFrQyxDQUFDO0NBQ2pGLENBQUMsQ0FBQztBQUtIOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxJQUF3QyxFQUFrQixFQUFFLENBQUMsQ0FBQztJQUM3RixXQUFXLEVBQUUsMEJBQTBCO0lBQ3ZDLE9BQU8sRUFBRSxJQUFJO0NBQ2QsQ0FBQyxDQUFDO0FBRUgsdUVBQXVFO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxDQUFDLFFBQWtCLEVBQXdDLEVBQUUsQ0FDbEYsQ0FBQyxRQUFRLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztLQUN6QixNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEtBQUssMEJBQTBCLENBQUM7S0FDN0UsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdpcmUtZm9ybWF0IGNvbnRyYWN0IGZvciB0aGUgVGVhbXMgY29udmVyc2F0aW9uIGVuZHBvaW50OiB0aGUgQm90IEZyYW1ld29ya1xuICogYEFjdGl2aXR5YCBhIFRlYW1zLWxpa2UgY2xpZW50IHBvc3RzLCBhbmQgdGhlIGFjdGl2aXR5IChjYXJyeWluZyBBZGFwdGl2ZSBDYXJkXG4gKiBhdHRhY2htZW50cykgdGhlIGFnZW50IGFuc3dlcnMgd2l0aC5cbiAqXG4gKiBXaHkgdGhpcyBzaGFwZSByYXRoZXIgdGhhbiBhIGJlc3Bva2UgYHsgbWVzc2FnZSB9YCBlbnZlbG9wZTogVGVhbXMgZG9lcyBub3RcbiAqIHNwZWFrIGEgY3VzdG9tIGNoYXQgQVBJLiBBIGNoYW5uZWwgZGVsaXZlcnMgYSBib3QgYSBKU09OIGBBY3Rpdml0eWAgYW5kIHJlYWRzXG4gKiBiYWNrIGFjdGl2aXRpZXMgd2hvc2UgYGF0dGFjaG1lbnRzYCBjYXJyeVxuICogYGFwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuY2FyZC5hZGFwdGl2ZWAgcGF5bG9hZHMuIE1vZGVsbGluZyB0aGUgcmVhbFxuICogcHJvdG9jb2wgaGVyZSBtZWFucyB0aGUgc2FtZSBlbmRwb2ludCB0aGF0IGJhY2tzIHRoZSBpbi1yZXBvIHByZXZpZXcgY2hhdCBpc1xuICogdGhlIG9uZSBhIEJvdCBGcmFtZXdvcmsgY2hhbm5lbCBjb3VsZCBjYWxsIC0gdGhlIGFuYWxvZ3VlIG9mIGhvdyB0aGUgTWFzdHJhXG4gKiBwbHVnaW4gZXhwb3NlcyBNQ1AgYXQgYSBwYXRoIHJhdGhlciB0aGFuIGludmVudGluZyBhIHRvb2wtY2FsbCBBUEkuXG4gKlxuICogT25seSB0aGUgc3Vic2V0IHRoZSBjb252ZXJzYXRpb24gZW5kcG9pbnQgYWN0dWFsbHkgcmVhZHMgb3Igd3JpdGVzIGlzXG4gKiBtb2RlbGxlZC4gYEFjdGl2aXR5YCBpcyBhIGxhcmdlLCBldm9sdmluZyBlbnZlbG9wZSwgc28gdW5rbm93biBmaWVsZHMgYXJlXG4gKiBQUkVTRVJWRUQgcmF0aGVyIHRoYW4gc3RyaXBwZWQgKHNlZSB7QGxpbmsgYWN0aXZpdHlTY2hlbWF9KSAtIGEgY2hhbm5lbCBzZW5kc1xuICogZmFyIG1vcmUgdGhhbiB0aGlzLCBhbmQgZHJvcHBpbmcgaXQgd291bGQgY29ycnVwdCBhIHJvdW5kLXRyaXAuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBhZGFwdGl2ZUNhcmRTY2hlbWEgfSBmcm9tIFwiLi9jYXJkXCI7XG5cbi8qKiBUaGUgYXR0YWNobWVudCBjb250ZW50IHR5cGUgVGVhbXMgdXNlcyBmb3IgYW4gQWRhcHRpdmUgQ2FyZC4gKi9cbmV4cG9ydCBjb25zdCBBREFQVElWRV9DQVJEX0NPTlRFTlRfVFlQRSA9IFwiYXBwbGljYXRpb24vdm5kLm1pY3Jvc29mdC5jYXJkLmFkYXB0aXZlXCI7XG5cbi8qKiBCb3QgRnJhbWV3b3JrIGFjdGl2aXR5IHR5cGVzIHRoaXMgZW5kcG9pbnQgdW5kZXJzdGFuZHMuICovXG5leHBvcnQgY29uc3QgQUNUSVZJVFlfVFlQRVMgPSBbXCJtZXNzYWdlXCIsIFwiY29udmVyc2F0aW9uVXBkYXRlXCIsIFwidHlwaW5nXCJdIGFzIGNvbnN0O1xuXG4vKiogQSBCb3QgRnJhbWV3b3JrIGFjdGl2aXR5IHR5cGUuICovXG5leHBvcnQgdHlwZSBBY3Rpdml0eVR5cGUgPSAodHlwZW9mIEFDVElWSVRZX1RZUEVTKVtudW1iZXJdO1xuXG4vKipcbiAqIEEgcGFydGljaXBhbnQgaW4gYSBjb252ZXJzYXRpb24uIGBpZGAgaXMgdGhlIHN0YWJsZSBrZXk7IGBuYW1lYCBpcyB0aGVcbiAqIGRpc3BsYXkgbGFiZWwgYSBjaGF0IHRyYW5zY3JpcHQgc2hvd3MuXG4gKi9cbmV4cG9ydCBjb25zdCBjaGFubmVsQWNjb3VudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJTdGFibGUgaWQgb2YgdGhlIHVzZXIgb3IgYm90LlwiKSxcbiAgbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRGlzcGxheSBuYW1lIHNob3duIGluIHRoZSB0cmFuc2NyaXB0LlwiKSxcbn0pO1xuXG4vKiogQSBjb252ZXJzYXRpb24gcGFydGljaXBhbnQgKHVzZXIgb3IgYm90KS4gKi9cbmV4cG9ydCB0eXBlIENoYW5uZWxBY2NvdW50ID0gei5pbmZlcjx0eXBlb2YgY2hhbm5lbEFjY291bnRTY2hlbWE+O1xuXG4vKipcbiAqIFRoZSBjb252ZXJzYXRpb24gYW4gYWN0aXZpdHkgYmVsb25ncyB0by4gVGhlIGBpZGAgaXMgd2hhdCBtYXBzIG9udG8gYSBNYXN0cmFcbiAqIG1lbW9yeSB0aHJlYWQsIHNvIGEgY2xpZW50IHRoYXQga2VlcHMgc2VuZGluZyB0aGUgc2FtZSBpZCBnZXRzIGEgY29udGludW91c1xuICogY29udmVyc2F0aW9uLlxuICovXG5leHBvcnQgY29uc3QgY29udmVyc2F0aW9uQWNjb3VudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJDb252ZXJzYXRpb24gaWQ7IG1hcHMgdG8gdGhlIGFnZW50J3MgbWVtb3J5IHRocmVhZC5cIiksXG59KTtcblxuLyoqIFRoZSBjb252ZXJzYXRpb24gYW4gYWN0aXZpdHkgYmVsb25ncyB0by4gKi9cbmV4cG9ydCB0eXBlIENvbnZlcnNhdGlvbkFjY291bnQgPSB6LmluZmVyPHR5cGVvZiBjb252ZXJzYXRpb25BY2NvdW50U2NoZW1hPjtcblxuLyoqXG4gKiBBbiBBZGFwdGl2ZSBDYXJkIGF0dGFjaG1lbnQgLSBob3cgYSBjYXJkIHJlYWNoZXMgYSBUZWFtcyBjbGllbnQuIFRoZSBjYXJkXG4gKiBkb2N1bWVudCBsaXZlcyB1bmRlciBgY29udGVudGAsIHRhZ2dlZCBieSBgY29udGVudFR5cGVgLlxuICovXG5leHBvcnQgY29uc3QgY2FyZEF0dGFjaG1lbnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGNvbnRlbnRUeXBlOiB6LmxpdGVyYWwoQURBUFRJVkVfQ0FSRF9DT05URU5UX1RZUEUpLFxuICBjb250ZW50OiBhZGFwdGl2ZUNhcmRTY2hlbWEuZGVzY3JpYmUoXCJUaGUgY29tcGlsZWQgQWRhcHRpdmUgQ2FyZCBkb2N1bWVudC5cIiksXG59KTtcblxuLyoqIEFuIEFkYXB0aXZlIENhcmQgYXR0YWNobWVudCBvbiBhbiBhY3Rpdml0eS4gKi9cbmV4cG9ydCB0eXBlIENhcmRBdHRhY2htZW50ID0gei5pbmZlcjx0eXBlb2YgY2FyZEF0dGFjaG1lbnRTY2hlbWE+O1xuXG4vKipcbiAqIEEgQm90IEZyYW1ld29yayBhY3Rpdml0eS5cbiAqXG4gKiBgLnBhc3N0aHJvdWdoKClgIGlzIGRlbGliZXJhdGU6IGEgcmVhbCBjaGFubmVsIHNlbmRzIGBjaGFubmVsSWRgLFxuICogYHNlcnZpY2VVcmxgLCBgdGltZXN0YW1wYCwgYHJlcGx5VG9JZGAsIGBjaGFubmVsRGF0YWAgYW5kIG1vcmUuIFRoaXMgZW5kcG9pbnRcbiAqIHJlYWRzIG9ubHkgd2hhdCBpdCBuZWVkcywgYnV0IGFuIHVua25vd24gZmllbGQgaXMgcGFydCBvZiB0aGUgY2FsbGVyJ3NcbiAqIGVudmVsb3BlIGFuZCBpcyBrZXB0IHNvIGEgY2xpZW50IGNhbiByb3VuZC10cmlwIGl0cyBvd24gbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBjb25zdCBhY3Rpdml0eVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdHlwZTogei5lbnVtKEFDVElWSVRZX1RZUEVTKS5kZXNjcmliZShcIkFjdGl2aXR5IHR5cGU7IGBtZXNzYWdlYCBjYXJyaWVzIHVzZXIgdGV4dC5cIiksXG4gICAgaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkFjdGl2aXR5IGlkLCBhc3NpZ25lZCBieSB0aGUgc2VuZGVyLlwiKSxcbiAgICB0ZXh0OiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJNZXNzYWdlIHRleHQsIHByZXNlbnQgb24gYSBgbWVzc2FnZWAgYWN0aXZpdHkuXCIpLFxuICAgIGZyb206IGNoYW5uZWxBY2NvdW50U2NoZW1hLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJXaG8gc2VudCB0aGUgYWN0aXZpdHkuXCIpLFxuICAgIHJlY2lwaWVudDogY2hhbm5lbEFjY291bnRTY2hlbWEub3B0aW9uYWwoKS5kZXNjcmliZShcIldobyB0aGUgYWN0aXZpdHkgaXMgYWRkcmVzc2VkIHRvLlwiKSxcbiAgICBjb252ZXJzYXRpb246IGNvbnZlcnNhdGlvbkFjY291bnRTY2hlbWFcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXCJDb252ZXJzYXRpb24gdGhlIGFjdGl2aXR5IGJlbG9uZ3MgdG8uXCIpLFxuICAgIGF0dGFjaG1lbnRzOiB6XG4gICAgICAuYXJyYXkoY2FyZEF0dGFjaG1lbnRTY2hlbWEpXG4gICAgICAub3B0aW9uYWwoKVxuICAgICAgLmRlc2NyaWJlKFwiQWRhcHRpdmUgQ2FyZCBhdHRhY2htZW50cyBjYXJyaWVkIGJ5IHRoZSBhY3Rpdml0eS5cIiksXG4gICAgdGltZXN0YW1wOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJJU08tODYwMSB0aW1lIHRoZSBhY3Rpdml0eSB3YXMgY3JlYXRlZC5cIiksXG4gIH0pXG4gIC5wYXNzdGhyb3VnaCgpO1xuXG4vKiogQSBCb3QgRnJhbWV3b3JrIGFjdGl2aXR5LiAqL1xuZXhwb3J0IHR5cGUgQWN0aXZpdHkgPSB6LmluZmVyPHR5cGVvZiBhY3Rpdml0eVNjaGVtYT47XG5cbi8qKlxuICogVGhlIHJlcXVlc3QgYm9keSB0aGUgY29udmVyc2F0aW9uIGVuZHBvaW50IGFjY2VwdHM6IGFuIGluYm91bmQgYWN0aXZpdHkgcGx1c1xuICogb3B0aW9uYWwgcm91dGluZyBoaW50cyB0aGF0IGFyZSBOT1QgcGFydCBvZiB0aGUgQm90IEZyYW1ld29yayBlbnZlbG9wZVxuICogKHdoaWNoIGFnZW50IHRvIHJ1biwgd2hpY2ggc2VydmluZyBtb2RlbCB0byB1c2UpLiBLZWVwaW5nIHRoZW0gYXMgc2libGluZ3Mgb2ZcbiAqIGBhY3Rpdml0eWAgbGVhdmVzIHRoZSBwcm90b2NvbCBwYXlsb2FkIHVudG91Y2hlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFjdGl2aXR5UmVxdWVzdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgYWN0aXZpdHk6IGFjdGl2aXR5U2NoZW1hLmRlc2NyaWJlKFwiVGhlIGluYm91bmQgQm90IEZyYW1ld29yayBhY3Rpdml0eS5cIiksXG4gIGFnZW50SWQ6IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcIk1hc3RyYSBhZ2VudCB0byBhbnN3ZXIgd2l0aC4gRGVmYXVsdHMgdG8gdGhlIHBsdWdpbidzIGRlZmF1bHQgYWdlbnQuXCIpLFxuICBtb2RlbDogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiT3B0aW9uYWwgc2VydmluZy1lbmRwb2ludCBvdmVycmlkZSBmb3IgdGhpcyB0dXJuLlwiKSxcbn0pO1xuXG4vKiogQSByZXF1ZXN0IHRvIHRoZSBUZWFtcyBjb252ZXJzYXRpb24gZW5kcG9pbnQuICovXG5leHBvcnQgdHlwZSBBY3Rpdml0eVJlcXVlc3QgPSB6LmluZmVyPHR5cGVvZiBhY3Rpdml0eVJlcXVlc3RTY2hlbWE+O1xuXG4vKipcbiAqIFRoZSBlbmRwb2ludCdzIHJlc3BvbnNlOiB0aGUgYWN0aXZpdGllcyB0byBhcHBlbmQgdG8gdGhlIHRyYW5zY3JpcHQuIEFuIGFycmF5XG4gKiBiZWNhdXNlIG9uZSB0dXJuIG1heSBhbnN3ZXIgd2l0aCBzZXZlcmFsIGFjdGl2aXRpZXMgKFRlYW1zIGl0c2VsZiBhbGxvd3MgYVxuICogYm90IHRvIHNlbmQgbW9yZSB0aGFuIG9uZSByZXBseSksIGFuZCBiZWNhdXNlIGEgZnV0dXJlIHN0cmVhbWluZy90eXBpbmdcbiAqIHZhcmlhbnQgY2FuIGdyb3cgaW50byB0aGUgc2FtZSBzaGFwZSB3aXRob3V0IGEgYnJlYWtpbmcgY2hhbmdlLlxuICovXG5leHBvcnQgY29uc3QgYWN0aXZpdHlSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgYWN0aXZpdGllczogei5hcnJheShhY3Rpdml0eVNjaGVtYSkuZGVzY3JpYmUoXCJBY3Rpdml0aWVzIHRoZSBib3QgcmVwbGllcyB3aXRoLlwiKSxcbn0pO1xuXG4vKiogVGhlIHJlc3BvbnNlIGZyb20gdGhlIFRlYW1zIGNvbnZlcnNhdGlvbiBlbmRwb2ludC4gKi9cbmV4cG9ydCB0eXBlIEFjdGl2aXR5UmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBhY3Rpdml0eVJlc3BvbnNlU2NoZW1hPjtcblxuLyoqXG4gKiBXcmFwIGEgY29tcGlsZWQgQWRhcHRpdmUgQ2FyZCBhcyBhIFRlYW1zIGF0dGFjaG1lbnQuXG4gKlxuICogQnJvd3Nlci1zYWZlIGFuZCBzaGFyZWQgc28gdGhlIHNlcnZlciAoYnVpbGRpbmcgYSByZXBseSkgYW5kIGFueSBjbGllbnRcbiAqIChyZW5kZXJpbmcgYW4gb3B0aW1pc3RpYyBsb2NhbCBhY3Rpdml0eSkgdGFnIGF0dGFjaG1lbnRzIGlkZW50aWNhbGx5LlxuICovXG5leHBvcnQgY29uc3QgdG9DYXJkQXR0YWNobWVudCA9IChjYXJkOiB6LmluZmVyPHR5cGVvZiBhZGFwdGl2ZUNhcmRTY2hlbWE+KTogQ2FyZEF0dGFjaG1lbnQgPT4gKHtcbiAgY29udGVudFR5cGU6IEFEQVBUSVZFX0NBUkRfQ09OVEVOVF9UWVBFLFxuICBjb250ZW50OiBjYXJkLFxufSk7XG5cbi8qKiBSZWFkIHRoZSBBZGFwdGl2ZSBDYXJkIGRvY3VtZW50cyBjYXJyaWVkIGJ5IGFuIGFjdGl2aXR5LCBpZiBhbnkuICovXG5leHBvcnQgY29uc3QgY2FyZHNPZiA9IChhY3Rpdml0eTogQWN0aXZpdHkpOiB6LmluZmVyPHR5cGVvZiBhZGFwdGl2ZUNhcmRTY2hlbWE+W10gPT5cbiAgKGFjdGl2aXR5LmF0dGFjaG1lbnRzID8/IFtdKVxuICAgIC5maWx0ZXIoKGF0dGFjaG1lbnQpID0+IGF0dGFjaG1lbnQuY29udGVudFR5cGUgPT09IEFEQVBUSVZFX0NBUkRfQ09OVEVOVF9UWVBFKVxuICAgIC5tYXAoKGF0dGFjaG1lbnQpID0+IGF0dGFjaG1lbnQuY29udGVudCk7XG4iXX0=
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Wire-format contract for the Teams add-on: the semantic card a model drafts
3
+ * and the Adaptive Card document that drafting compiles to. Pure (zod +
4
+ * inferred types, no Node-only imports) so the server-side card builder, the
5
+ * Mastra tool, and the React Adaptive Cards renderer all validate / type
6
+ * against one definition.
7
+ *
8
+ * The model does NOT hand-author raw Adaptive Card JSON. It describes a card in
9
+ * a small, high-level vocabulary ({@link CardSpec}) - a title, some text/fact
10
+ * blocks, and optional link actions - and the builder compiles that into a
11
+ * valid Adaptive Card 1.5 document ({@link AdaptiveCard}). Keeping the model's
12
+ * surface small avoids the two failure modes of free-form card JSON: an invalid
13
+ * schema the renderer rejects, and a card that renders but ignores Teams' host
14
+ * constraints.
15
+ *
16
+ * Array fields intentionally avoid `.min()` / `.nonempty()`: those emit
17
+ * `minItems` in the JSON schema, which some Model Serving endpoints reject
18
+ * ("array types do not support minItems") when the schema is forwarded as a
19
+ * tool definition.
20
+ *
21
+ * @module
22
+ */
23
+ import { z } from "zod";
24
+ /** The Adaptive Card schema version the builder targets. Teams supports 1.5. */
25
+ export declare const ADAPTIVE_CARD_VERSION = "1.5";
26
+ /** The Adaptive Card `$schema` URL a well-formed document declares. */
27
+ export declare const ADAPTIVE_CARD_SCHEMA_URL = "http://adaptivecards.io/schemas/adaptive-card.json";
28
+ /**
29
+ * A single labelled fact, rendered as a row in an Adaptive Card `FactSet`.
30
+ * Facts are the right shape for compact key/value detail (status, owner, due
31
+ * date) that would be noise as prose.
32
+ */
33
+ export declare const cardFactSchema: z.ZodObject<{
34
+ title: z.ZodString;
35
+ value: z.ZodString;
36
+ }, z.core.$strip>;
37
+ /** A labelled key/value fact in a {@link CardSpec}. */
38
+ export type CardFact = z.infer<typeof cardFactSchema>;
39
+ /**
40
+ * An action button rendered under the card body. Only an open-URL action is
41
+ * modelled: it is the one action that is safe to render in any host without a
42
+ * back-end wired up, and it covers the common "here is the link" case.
43
+ */
44
+ export declare const cardActionSchema: z.ZodObject<{
45
+ title: z.ZodString;
46
+ url: z.ZodString;
47
+ }, z.core.$strip>;
48
+ /** A link action button in a {@link CardSpec}. */
49
+ export type CardAction = z.infer<typeof cardActionSchema>;
50
+ /**
51
+ * The high-level card a model asks to build (the tool input). Deliberately
52
+ * small: a heading, optional supporting text, optional facts, and optional link
53
+ * buttons. The builder turns this into a full Adaptive Card document.
54
+ */
55
+ export declare const cardSpecSchema: z.ZodObject<{
56
+ title: z.ZodString;
57
+ subtitle: z.ZodOptional<z.ZodString>;
58
+ text: z.ZodOptional<z.ZodString>;
59
+ facts: z.ZodOptional<z.ZodArray<z.ZodObject<{
60
+ title: z.ZodString;
61
+ value: z.ZodString;
62
+ }, z.core.$strip>>>;
63
+ actions: z.ZodOptional<z.ZodArray<z.ZodObject<{
64
+ title: z.ZodString;
65
+ url: z.ZodString;
66
+ }, z.core.$strip>>>;
67
+ }, z.core.$strip>;
68
+ /** The validated semantic card a model asked to build. */
69
+ export type CardSpec = z.infer<typeof cardSpecSchema>;
70
+ /**
71
+ * The compiled Adaptive Card document - the JSON the `adaptivecards` renderer
72
+ * consumes. Typed loosely (`elements` / `actions` as record arrays) because the
73
+ * full Adaptive Card schema is large and host-versioned; the builder owns the
74
+ * exact element shapes and this contract only pins the envelope every consumer
75
+ * relies on (`type`, `version`, `body`).
76
+ */
77
+ export declare const adaptiveCardSchema: z.ZodObject<{
78
+ type: z.ZodLiteral<"AdaptiveCard">;
79
+ $schema: z.ZodString;
80
+ version: z.ZodString;
81
+ body: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
82
+ actions: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
83
+ }, z.core.$strip>;
84
+ /** A compiled Adaptive Card document ready to render or post to Teams. */
85
+ export type AdaptiveCard = z.infer<typeof adaptiveCardSchema>;
86
+ /**
87
+ * The result the card tool returns: the compiled Adaptive Card plus the
88
+ * `title` echoed back for a caller that wants a label without re-reading the
89
+ * document. Kept separate from {@link AdaptiveCard} so the tool output stays
90
+ * additive.
91
+ */
92
+ export declare const cardResultSchema: z.ZodObject<{
93
+ title: z.ZodString;
94
+ card: z.ZodObject<{
95
+ type: z.ZodLiteral<"AdaptiveCard">;
96
+ $schema: z.ZodString;
97
+ version: z.ZodString;
98
+ body: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
99
+ actions: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
100
+ }, z.core.$strip>;
101
+ }, z.core.$strip>;
102
+ /** The result of building a card. */
103
+ export type CardResult = z.infer<typeof cardResultSchema>;
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Wire-format contract for the Teams add-on: the semantic card a model drafts
3
+ * and the Adaptive Card document that drafting compiles to. Pure (zod +
4
+ * inferred types, no Node-only imports) so the server-side card builder, the
5
+ * Mastra tool, and the React Adaptive Cards renderer all validate / type
6
+ * against one definition.
7
+ *
8
+ * The model does NOT hand-author raw Adaptive Card JSON. It describes a card in
9
+ * a small, high-level vocabulary ({@link CardSpec}) - a title, some text/fact
10
+ * blocks, and optional link actions - and the builder compiles that into a
11
+ * valid Adaptive Card 1.5 document ({@link AdaptiveCard}). Keeping the model's
12
+ * surface small avoids the two failure modes of free-form card JSON: an invalid
13
+ * schema the renderer rejects, and a card that renders but ignores Teams' host
14
+ * constraints.
15
+ *
16
+ * Array fields intentionally avoid `.min()` / `.nonempty()`: those emit
17
+ * `minItems` in the JSON schema, which some Model Serving endpoints reject
18
+ * ("array types do not support minItems") when the schema is forwarded as a
19
+ * tool definition.
20
+ *
21
+ * @module
22
+ */
23
+ import { z } from "zod";
24
+ /** The Adaptive Card schema version the builder targets. Teams supports 1.5. */
25
+ export const ADAPTIVE_CARD_VERSION = "1.5";
26
+ /** The Adaptive Card `$schema` URL a well-formed document declares. */
27
+ export const ADAPTIVE_CARD_SCHEMA_URL = "http://adaptivecards.io/schemas/adaptive-card.json";
28
+ /**
29
+ * A single labelled fact, rendered as a row in an Adaptive Card `FactSet`.
30
+ * Facts are the right shape for compact key/value detail (status, owner, due
31
+ * date) that would be noise as prose.
32
+ */
33
+ export const cardFactSchema = z.object({
34
+ title: z.string().describe('Fact label shown on the left (e.g. "Status", "Owner").'),
35
+ value: z.string().describe('Fact value shown on the right (e.g. "Open", "alice").'),
36
+ });
37
+ /**
38
+ * An action button rendered under the card body. Only an open-URL action is
39
+ * modelled: it is the one action that is safe to render in any host without a
40
+ * back-end wired up, and it covers the common "here is the link" case.
41
+ */
42
+ export const cardActionSchema = z.object({
43
+ title: z.string().describe('Button label (e.g. "Open ticket", "View run").'),
44
+ url: z
45
+ .string()
46
+ .describe("Absolute https URL the button opens when tapped (an Action.OpenUrl target)."),
47
+ });
48
+ /**
49
+ * The high-level card a model asks to build (the tool input). Deliberately
50
+ * small: a heading, optional supporting text, optional facts, and optional link
51
+ * buttons. The builder turns this into a full Adaptive Card document.
52
+ */
53
+ export const cardSpecSchema = z.object({
54
+ title: z.string().describe("Card heading, shown bold at the top of the card."),
55
+ subtitle: z
56
+ .string()
57
+ .optional()
58
+ .describe("Optional lighter subheading under the title (e.g. a category or timestamp)."),
59
+ text: z
60
+ .string()
61
+ .optional()
62
+ .describe([
63
+ "Optional body text under the heading. A limited Markdown subset is",
64
+ "supported by the Teams host: **bold**, _italic_, links, and '-' bullet",
65
+ "lists. Do NOT use headings, tables, or fenced code blocks - use the",
66
+ "`facts` array for tabular key/value detail instead.",
67
+ ].join(" ")),
68
+ facts: z
69
+ .array(cardFactSchema)
70
+ .optional()
71
+ .describe("Optional key/value rows rendered as a FactSet (label on the left, value right)."),
72
+ actions: z
73
+ .array(cardActionSchema)
74
+ .optional()
75
+ .describe("Optional link buttons rendered under the body, each opening a URL."),
76
+ });
77
+ /**
78
+ * The compiled Adaptive Card document - the JSON the `adaptivecards` renderer
79
+ * consumes. Typed loosely (`elements` / `actions` as record arrays) because the
80
+ * full Adaptive Card schema is large and host-versioned; the builder owns the
81
+ * exact element shapes and this contract only pins the envelope every consumer
82
+ * relies on (`type`, `version`, `body`).
83
+ */
84
+ export const adaptiveCardSchema = z.object({
85
+ type: z.literal("AdaptiveCard"),
86
+ $schema: z.string(),
87
+ version: z.string(),
88
+ body: z.array(z.record(z.string(), z.unknown())),
89
+ actions: z.array(z.record(z.string(), z.unknown())).optional(),
90
+ });
91
+ /**
92
+ * The result the card tool returns: the compiled Adaptive Card plus the
93
+ * `title` echoed back for a caller that wants a label without re-reading the
94
+ * document. Kept separate from {@link AdaptiveCard} so the tool output stays
95
+ * additive.
96
+ */
97
+ export const cardResultSchema = z.object({
98
+ title: z.string().describe("The card title, echoed for convenience."),
99
+ card: adaptiveCardSchema.describe("The compiled Adaptive Card document."),
100
+ });
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLGdGQUFnRjtBQUNoRixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxLQUFLLENBQUM7QUFFM0MsdUVBQXVFO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLG9EQUFvRCxDQUFDO0FBRTdGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyx3REFBd0QsQ0FBQztJQUNwRixLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyx1REFBdUQsQ0FBQztDQUNwRixDQUFDLENBQUM7QUFLSDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN2QyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxnREFBZ0QsQ0FBQztJQUM1RSxHQUFHLEVBQUUsQ0FBQztTQUNILE1BQU0sRUFBRTtTQUNSLFFBQVEsQ0FBQyw2RUFBNkUsQ0FBQztDQUMzRixDQUFDLENBQUM7QUFLSDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDckMsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsa0RBQWtELENBQUM7SUFDOUUsUUFBUSxFQUFFLENBQUM7U0FDUixNQUFNLEVBQUU7U0FDUixRQUFRLEVBQUU7U0FDVixRQUFRLENBQUMsNkVBQTZFLENBQUM7SUFDMUYsSUFBSSxFQUFFLENBQUM7U0FDSixNQUFNLEVBQUU7U0FDUixRQUFRLEVBQUU7U0FDVixRQUFRLENBQ1A7UUFDRSxvRUFBb0U7UUFDcEUsd0VBQXdFO1FBQ3hFLHFFQUFxRTtRQUNyRSxxREFBcUQ7S0FDdEQsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQ1o7SUFDSCxLQUFLLEVBQUUsQ0FBQztTQUNMLEtBQUssQ0FBQyxjQUFjLENBQUM7U0FDckIsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLGlGQUFpRixDQUFDO0lBQzlGLE9BQU8sRUFBRSxDQUFDO1NBQ1AsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1NBQ3ZCLFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FBQyxvRUFBb0UsQ0FBQztDQUNsRixDQUFDLENBQUM7QUFLSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3pDLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztJQUMvQixPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtJQUNuQixPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtJQUNuQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNoRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtDQUMvRCxDQUFDLENBQUM7QUFLSDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDdkMsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMseUNBQXlDLENBQUM7SUFDckUsSUFBSSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxzQ0FBc0MsQ0FBQztDQUMxRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdpcmUtZm9ybWF0IGNvbnRyYWN0IGZvciB0aGUgVGVhbXMgYWRkLW9uOiB0aGUgc2VtYW50aWMgY2FyZCBhIG1vZGVsIGRyYWZ0c1xuICogYW5kIHRoZSBBZGFwdGl2ZSBDYXJkIGRvY3VtZW50IHRoYXQgZHJhZnRpbmcgY29tcGlsZXMgdG8uIFB1cmUgKHpvZCArXG4gKiBpbmZlcnJlZCB0eXBlcywgbm8gTm9kZS1vbmx5IGltcG9ydHMpIHNvIHRoZSBzZXJ2ZXItc2lkZSBjYXJkIGJ1aWxkZXIsIHRoZVxuICogTWFzdHJhIHRvb2wsIGFuZCB0aGUgUmVhY3QgQWRhcHRpdmUgQ2FyZHMgcmVuZGVyZXIgYWxsIHZhbGlkYXRlIC8gdHlwZVxuICogYWdhaW5zdCBvbmUgZGVmaW5pdGlvbi5cbiAqXG4gKiBUaGUgbW9kZWwgZG9lcyBOT1QgaGFuZC1hdXRob3IgcmF3IEFkYXB0aXZlIENhcmQgSlNPTi4gSXQgZGVzY3JpYmVzIGEgY2FyZCBpblxuICogYSBzbWFsbCwgaGlnaC1sZXZlbCB2b2NhYnVsYXJ5ICh7QGxpbmsgQ2FyZFNwZWN9KSAtIGEgdGl0bGUsIHNvbWUgdGV4dC9mYWN0XG4gKiBibG9ja3MsIGFuZCBvcHRpb25hbCBsaW5rIGFjdGlvbnMgLSBhbmQgdGhlIGJ1aWxkZXIgY29tcGlsZXMgdGhhdCBpbnRvIGFcbiAqIHZhbGlkIEFkYXB0aXZlIENhcmQgMS41IGRvY3VtZW50ICh7QGxpbmsgQWRhcHRpdmVDYXJkfSkuIEtlZXBpbmcgdGhlIG1vZGVsJ3NcbiAqIHN1cmZhY2Ugc21hbGwgYXZvaWRzIHRoZSB0d28gZmFpbHVyZSBtb2RlcyBvZiBmcmVlLWZvcm0gY2FyZCBKU09OOiBhbiBpbnZhbGlkXG4gKiBzY2hlbWEgdGhlIHJlbmRlcmVyIHJlamVjdHMsIGFuZCBhIGNhcmQgdGhhdCByZW5kZXJzIGJ1dCBpZ25vcmVzIFRlYW1zJyBob3N0XG4gKiBjb25zdHJhaW50cy5cbiAqXG4gKiBBcnJheSBmaWVsZHMgaW50ZW50aW9uYWxseSBhdm9pZCBgLm1pbigpYCAvIGAubm9uZW1wdHkoKWA6IHRob3NlIGVtaXRcbiAqIGBtaW5JdGVtc2AgaW4gdGhlIEpTT04gc2NoZW1hLCB3aGljaCBzb21lIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzIHJlamVjdFxuICogKFwiYXJyYXkgdHlwZXMgZG8gbm90IHN1cHBvcnQgbWluSXRlbXNcIikgd2hlbiB0aGUgc2NoZW1hIGlzIGZvcndhcmRlZCBhcyBhXG4gKiB0b29sIGRlZmluaXRpb24uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbi8qKiBUaGUgQWRhcHRpdmUgQ2FyZCBzY2hlbWEgdmVyc2lvbiB0aGUgYnVpbGRlciB0YXJnZXRzLiBUZWFtcyBzdXBwb3J0cyAxLjUuICovXG5leHBvcnQgY29uc3QgQURBUFRJVkVfQ0FSRF9WRVJTSU9OID0gXCIxLjVcIjtcblxuLyoqIFRoZSBBZGFwdGl2ZSBDYXJkIGAkc2NoZW1hYCBVUkwgYSB3ZWxsLWZvcm1lZCBkb2N1bWVudCBkZWNsYXJlcy4gKi9cbmV4cG9ydCBjb25zdCBBREFQVElWRV9DQVJEX1NDSEVNQV9VUkwgPSBcImh0dHA6Ly9hZGFwdGl2ZWNhcmRzLmlvL3NjaGVtYXMvYWRhcHRpdmUtY2FyZC5qc29uXCI7XG5cbi8qKlxuICogQSBzaW5nbGUgbGFiZWxsZWQgZmFjdCwgcmVuZGVyZWQgYXMgYSByb3cgaW4gYW4gQWRhcHRpdmUgQ2FyZCBgRmFjdFNldGAuXG4gKiBGYWN0cyBhcmUgdGhlIHJpZ2h0IHNoYXBlIGZvciBjb21wYWN0IGtleS92YWx1ZSBkZXRhaWwgKHN0YXR1cywgb3duZXIsIGR1ZVxuICogZGF0ZSkgdGhhdCB3b3VsZCBiZSBub2lzZSBhcyBwcm9zZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNhcmRGYWN0U2NoZW1hID0gei5vYmplY3Qoe1xuICB0aXRsZTogei5zdHJpbmcoKS5kZXNjcmliZSgnRmFjdCBsYWJlbCBzaG93biBvbiB0aGUgbGVmdCAoZS5nLiBcIlN0YXR1c1wiLCBcIk93bmVyXCIpLicpLFxuICB2YWx1ZTogei5zdHJpbmcoKS5kZXNjcmliZSgnRmFjdCB2YWx1ZSBzaG93biBvbiB0aGUgcmlnaHQgKGUuZy4gXCJPcGVuXCIsIFwiYWxpY2VcIikuJyksXG59KTtcblxuLyoqIEEgbGFiZWxsZWQga2V5L3ZhbHVlIGZhY3QgaW4gYSB7QGxpbmsgQ2FyZFNwZWN9LiAqL1xuZXhwb3J0IHR5cGUgQ2FyZEZhY3QgPSB6LmluZmVyPHR5cGVvZiBjYXJkRmFjdFNjaGVtYT47XG5cbi8qKlxuICogQW4gYWN0aW9uIGJ1dHRvbiByZW5kZXJlZCB1bmRlciB0aGUgY2FyZCBib2R5LiBPbmx5IGFuIG9wZW4tVVJMIGFjdGlvbiBpc1xuICogbW9kZWxsZWQ6IGl0IGlzIHRoZSBvbmUgYWN0aW9uIHRoYXQgaXMgc2FmZSB0byByZW5kZXIgaW4gYW55IGhvc3Qgd2l0aG91dCBhXG4gKiBiYWNrLWVuZCB3aXJlZCB1cCwgYW5kIGl0IGNvdmVycyB0aGUgY29tbW9uIFwiaGVyZSBpcyB0aGUgbGlua1wiIGNhc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBjYXJkQWN0aW9uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0aXRsZTogei5zdHJpbmcoKS5kZXNjcmliZSgnQnV0dG9uIGxhYmVsIChlLmcuIFwiT3BlbiB0aWNrZXRcIiwgXCJWaWV3IHJ1blwiKS4nKSxcbiAgdXJsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLmRlc2NyaWJlKFwiQWJzb2x1dGUgaHR0cHMgVVJMIHRoZSBidXR0b24gb3BlbnMgd2hlbiB0YXBwZWQgKGFuIEFjdGlvbi5PcGVuVXJsIHRhcmdldCkuXCIpLFxufSk7XG5cbi8qKiBBIGxpbmsgYWN0aW9uIGJ1dHRvbiBpbiBhIHtAbGluayBDYXJkU3BlY30uICovXG5leHBvcnQgdHlwZSBDYXJkQWN0aW9uID0gei5pbmZlcjx0eXBlb2YgY2FyZEFjdGlvblNjaGVtYT47XG5cbi8qKlxuICogVGhlIGhpZ2gtbGV2ZWwgY2FyZCBhIG1vZGVsIGFza3MgdG8gYnVpbGQgKHRoZSB0b29sIGlucHV0KS4gRGVsaWJlcmF0ZWx5XG4gKiBzbWFsbDogYSBoZWFkaW5nLCBvcHRpb25hbCBzdXBwb3J0aW5nIHRleHQsIG9wdGlvbmFsIGZhY3RzLCBhbmQgb3B0aW9uYWwgbGlua1xuICogYnV0dG9ucy4gVGhlIGJ1aWxkZXIgdHVybnMgdGhpcyBpbnRvIGEgZnVsbCBBZGFwdGl2ZSBDYXJkIGRvY3VtZW50LlxuICovXG5leHBvcnQgY29uc3QgY2FyZFNwZWNTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHRpdGxlOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiQ2FyZCBoZWFkaW5nLCBzaG93biBib2xkIGF0IHRoZSB0b3Agb2YgdGhlIGNhcmQuXCIpLFxuICBzdWJ0aXRsZTogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFwiT3B0aW9uYWwgbGlnaHRlciBzdWJoZWFkaW5nIHVuZGVyIHRoZSB0aXRsZSAoZS5nLiBhIGNhdGVnb3J5IG9yIHRpbWVzdGFtcCkuXCIpLFxuICB0ZXh0OiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBbXG4gICAgICAgIFwiT3B0aW9uYWwgYm9keSB0ZXh0IHVuZGVyIHRoZSBoZWFkaW5nLiBBIGxpbWl0ZWQgTWFya2Rvd24gc3Vic2V0IGlzXCIsXG4gICAgICAgIFwic3VwcG9ydGVkIGJ5IHRoZSBUZWFtcyBob3N0OiAqKmJvbGQqKiwgX2l0YWxpY18sIGxpbmtzLCBhbmQgJy0nIGJ1bGxldFwiLFxuICAgICAgICBcImxpc3RzLiBEbyBOT1QgdXNlIGhlYWRpbmdzLCB0YWJsZXMsIG9yIGZlbmNlZCBjb2RlIGJsb2NrcyAtIHVzZSB0aGVcIixcbiAgICAgICAgXCJgZmFjdHNgIGFycmF5IGZvciB0YWJ1bGFyIGtleS92YWx1ZSBkZXRhaWwgaW5zdGVhZC5cIixcbiAgICAgIF0uam9pbihcIiBcIiksXG4gICAgKSxcbiAgZmFjdHM6IHpcbiAgICAuYXJyYXkoY2FyZEZhY3RTY2hlbWEpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXCJPcHRpb25hbCBrZXkvdmFsdWUgcm93cyByZW5kZXJlZCBhcyBhIEZhY3RTZXQgKGxhYmVsIG9uIHRoZSBsZWZ0LCB2YWx1ZSByaWdodCkuXCIpLFxuICBhY3Rpb25zOiB6XG4gICAgLmFycmF5KGNhcmRBY3Rpb25TY2hlbWEpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXCJPcHRpb25hbCBsaW5rIGJ1dHRvbnMgcmVuZGVyZWQgdW5kZXIgdGhlIGJvZHksIGVhY2ggb3BlbmluZyBhIFVSTC5cIiksXG59KTtcblxuLyoqIFRoZSB2YWxpZGF0ZWQgc2VtYW50aWMgY2FyZCBhIG1vZGVsIGFza2VkIHRvIGJ1aWxkLiAqL1xuZXhwb3J0IHR5cGUgQ2FyZFNwZWMgPSB6LmluZmVyPHR5cGVvZiBjYXJkU3BlY1NjaGVtYT47XG5cbi8qKlxuICogVGhlIGNvbXBpbGVkIEFkYXB0aXZlIENhcmQgZG9jdW1lbnQgLSB0aGUgSlNPTiB0aGUgYGFkYXB0aXZlY2FyZHNgIHJlbmRlcmVyXG4gKiBjb25zdW1lcy4gVHlwZWQgbG9vc2VseSAoYGVsZW1lbnRzYCAvIGBhY3Rpb25zYCBhcyByZWNvcmQgYXJyYXlzKSBiZWNhdXNlIHRoZVxuICogZnVsbCBBZGFwdGl2ZSBDYXJkIHNjaGVtYSBpcyBsYXJnZSBhbmQgaG9zdC12ZXJzaW9uZWQ7IHRoZSBidWlsZGVyIG93bnMgdGhlXG4gKiBleGFjdCBlbGVtZW50IHNoYXBlcyBhbmQgdGhpcyBjb250cmFjdCBvbmx5IHBpbnMgdGhlIGVudmVsb3BlIGV2ZXJ5IGNvbnN1bWVyXG4gKiByZWxpZXMgb24gKGB0eXBlYCwgYHZlcnNpb25gLCBgYm9keWApLlxuICovXG5leHBvcnQgY29uc3QgYWRhcHRpdmVDYXJkU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJBZGFwdGl2ZUNhcmRcIiksXG4gICRzY2hlbWE6IHouc3RyaW5nKCksXG4gIHZlcnNpb246IHouc3RyaW5nKCksXG4gIGJvZHk6IHouYXJyYXkoei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpKSxcbiAgYWN0aW9uczogei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpLm9wdGlvbmFsKCksXG59KTtcblxuLyoqIEEgY29tcGlsZWQgQWRhcHRpdmUgQ2FyZCBkb2N1bWVudCByZWFkeSB0byByZW5kZXIgb3IgcG9zdCB0byBUZWFtcy4gKi9cbmV4cG9ydCB0eXBlIEFkYXB0aXZlQ2FyZCA9IHouaW5mZXI8dHlwZW9mIGFkYXB0aXZlQ2FyZFNjaGVtYT47XG5cbi8qKlxuICogVGhlIHJlc3VsdCB0aGUgY2FyZCB0b29sIHJldHVybnM6IHRoZSBjb21waWxlZCBBZGFwdGl2ZSBDYXJkIHBsdXMgdGhlXG4gKiBgdGl0bGVgIGVjaG9lZCBiYWNrIGZvciBhIGNhbGxlciB0aGF0IHdhbnRzIGEgbGFiZWwgd2l0aG91dCByZS1yZWFkaW5nIHRoZVxuICogZG9jdW1lbnQuIEtlcHQgc2VwYXJhdGUgZnJvbSB7QGxpbmsgQWRhcHRpdmVDYXJkfSBzbyB0aGUgdG9vbCBvdXRwdXQgc3RheXNcbiAqIGFkZGl0aXZlLlxuICovXG5leHBvcnQgY29uc3QgY2FyZFJlc3VsdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdGl0bGU6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJUaGUgY2FyZCB0aXRsZSwgZWNob2VkIGZvciBjb252ZW5pZW5jZS5cIiksXG4gIGNhcmQ6IGFkYXB0aXZlQ2FyZFNjaGVtYS5kZXNjcmliZShcIlRoZSBjb21waWxlZCBBZGFwdGl2ZSBDYXJkIGRvY3VtZW50LlwiKSxcbn0pO1xuXG4vKiogVGhlIHJlc3VsdCBvZiBidWlsZGluZyBhIGNhcmQuICovXG5leHBvcnQgdHlwZSBDYXJkUmVzdWx0ID0gei5pbmZlcjx0eXBlb2YgY2FyZFJlc3VsdFNjaGVtYT47XG4iXX0=
@@ -0,0 +1 @@
1
+ {"root":["../src/activity.ts","../src/card.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -12,23 +12,27 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "zod": "4.3.6",
15
- "@dbx-tools/shared-core": "0.3.44"
15
+ "@dbx-tools/shared-core": "0.4.0"
16
16
  },
17
- "main": "index.ts",
17
+ "main": "./lib/index.js",
18
18
  "license": "UNLICENSED",
19
19
  "publishConfig": {
20
20
  "access": "public"
21
21
  },
22
- "version": "0.3.44",
23
- "types": "index.ts",
22
+ "version": "0.4.0",
23
+ "types": "./lib/index.d.ts",
24
24
  "type": "module",
25
25
  "exports": {
26
- ".": "./index.ts",
26
+ ".": {
27
+ "types": "./lib/index.d.ts",
28
+ "default": "./lib/index.js"
29
+ },
27
30
  "./package.json": "./package.json"
28
31
  },
29
32
  "files": [
30
33
  "index.ts",
31
- "src"
34
+ "src",
35
+ "lib"
32
36
  ],
33
37
  "dbxToolsConfig": {
34
38
  "tags": [