@assemblyline-agents/teams 0.1.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/LICENSE +21 -0
- package/README.md +19 -0
- package/dist/auth.d.ts +28 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +171 -0
- package/dist/auth.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +320 -0
- package/dist/index.js.map +1 -0
- package/dist/tools.d.ts +13 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +116 -0
- package/dist/tools.js.map +1 -0
- package/dist/util.d.ts +19 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +112 -0
- package/dist/util.js.map +1 -0
- package/package.json +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 OpenEve contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# @assemblyline-agents/teams
|
|
2
|
+
|
|
3
|
+
Official Assembly Line Microsoft Teams channel and Bot Framework connection plugin.
|
|
4
|
+
|
|
5
|
+
It exports `defineTeamsChannel(options)`, which receives Bot Framework activities from Microsoft Teams and delivers agent replies back through the Bot Framework connector (handling Azure AD auth), plus `defineTeamsConnection` for Bot Framework API access and channel tools for richer interactions.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npm install @assemblyline-agents/teams
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Part of Assembly Line
|
|
14
|
+
|
|
15
|
+
This package is part of [Assembly Line](https://github.com/jasonbadeaux/openeve), a vendor-neutral, filesystem-first framework for durable AI agents. See the developer documentation in [docs/developers/](https://github.com/jasonbadeaux/openeve/tree/main/docs/developers) for setup, agent authoring, and deployment guides.
|
|
16
|
+
|
|
17
|
+
## License
|
|
18
|
+
|
|
19
|
+
MIT
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { JsonObject } from "@assemblyline-agents/core";
|
|
2
|
+
import { type ChannelContext, type ChannelHttpRequest } from "@assemblyline-agents/runtime";
|
|
3
|
+
import { type TeamsDestination } from "./util.js";
|
|
4
|
+
export declare function verifyTeamsAuthorization(request: ChannelHttpRequest, env: Record<string, string | undefined>, fetchImpl?: typeof fetch, activity?: {
|
|
5
|
+
serviceUrl?: string;
|
|
6
|
+
channelId?: string;
|
|
7
|
+
}): Promise<{
|
|
8
|
+
ok: true;
|
|
9
|
+
} | {
|
|
10
|
+
ok: false;
|
|
11
|
+
status: number;
|
|
12
|
+
error: string;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function createTeamsBotToken(ctx: Pick<ChannelContext, "env" | "fetch">): Promise<string>;
|
|
15
|
+
export declare function sendTeamsActivity(ctx: Pick<ChannelContext, "env" | "fetch">, destination: TeamsDestination, activity: JsonObject): Promise<JsonObject>;
|
|
16
|
+
export declare function validateTeamsTenant(ctx: ChannelContext, tenantId: string | undefined): {
|
|
17
|
+
ok: true;
|
|
18
|
+
} | {
|
|
19
|
+
ok: false;
|
|
20
|
+
error: string;
|
|
21
|
+
};
|
|
22
|
+
export declare function validateTeamsServiceUrl(ctx: ChannelContext, serviceUrl: string): {
|
|
23
|
+
ok: true;
|
|
24
|
+
} | {
|
|
25
|
+
ok: false;
|
|
26
|
+
error: string;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAmB,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAC7G,OAAO,EAAiD,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEjG,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,kBAAkB,EAC3B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,SAAS,GAAE,OAAO,KAAa,EAC/B,QAAQ,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAEtE;AAsCD,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBrG;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,OAAO,CAAC,EAC1C,WAAW,EAAE,gBAAgB,EAC7B,QAAQ,EAAE,UAAU,GACnB,OAAO,CAAC,UAAU,CAAC,CAmBrB;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAKlI;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAM5H"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { createPublicKey, verify as verifySignature } from "node:crypto";
|
|
2
|
+
import { fetchWithPolicy } from "@assemblyline-agents/runtime";
|
|
3
|
+
import { parseJson, recordValue, safeJson, stringValue } from "./util.js";
|
|
4
|
+
export function verifyTeamsAuthorization(request, env, fetchImpl = fetch, activity = {}) {
|
|
5
|
+
return verifyTeamsAuthorizationInternal(request, env, fetchImpl, activity);
|
|
6
|
+
}
|
|
7
|
+
async function verifyTeamsAuthorizationInternal(request, env, fetchImpl, activity) {
|
|
8
|
+
const header = request.headers.authorization;
|
|
9
|
+
if (!header?.startsWith("Bearer "))
|
|
10
|
+
return { ok: false, status: 401, error: "missing_teams_authorization" };
|
|
11
|
+
const token = header.slice("Bearer ".length);
|
|
12
|
+
const parsed = decodeJwt(token);
|
|
13
|
+
if (!parsed)
|
|
14
|
+
return { ok: false, status: 401, error: "invalid_teams_authorization" };
|
|
15
|
+
const { jwtHeader, claims, signingInput, signature } = parsed;
|
|
16
|
+
if (jwtHeader.alg !== "RS256")
|
|
17
|
+
return { ok: false, status: 401, error: "invalid_teams_algorithm" };
|
|
18
|
+
if (claims.iss !== "https://api.botframework.com")
|
|
19
|
+
return { ok: false, status: 401, error: "invalid_teams_issuer" };
|
|
20
|
+
const appId = env.MICROSOFT_APP_ID;
|
|
21
|
+
if (!appId || claims.aud !== appId) {
|
|
22
|
+
return { ok: false, status: 401, error: "invalid_teams_audience" };
|
|
23
|
+
}
|
|
24
|
+
const now = Math.floor(Date.now() / 1000);
|
|
25
|
+
if (typeof claims.exp !== "number" || claims.exp < now - 300)
|
|
26
|
+
return { ok: false, status: 401, error: "expired_teams_authorization" };
|
|
27
|
+
if (typeof claims.nbf === "number" && claims.nbf > now + 300)
|
|
28
|
+
return { ok: false, status: 401, error: "early_teams_authorization" };
|
|
29
|
+
const claimedServiceUrl = stringValue(claims.serviceurl) ?? stringValue(claims.serviceUrl);
|
|
30
|
+
if (claimedServiceUrl && activity.serviceUrl && claimedServiceUrl !== activity.serviceUrl) {
|
|
31
|
+
return { ok: false, status: 401, error: "invalid_teams_service_url" };
|
|
32
|
+
}
|
|
33
|
+
const key = await teamsSigningKey(fetchImpl, env.OPENEVE_TEAMS_OPENID_METADATA_URL, stringValue(jwtHeader.kid) ?? stringValue(jwtHeader.x5t));
|
|
34
|
+
if (!key)
|
|
35
|
+
return { ok: false, status: 401, error: "unknown_teams_signing_key" };
|
|
36
|
+
if (activity.channelId && Array.isArray(key.endorsements) && key.endorsements.length > 0 && !key.endorsements.includes(activity.channelId)) {
|
|
37
|
+
return { ok: false, status: 403, error: "invalid_teams_channel_endorsement" };
|
|
38
|
+
}
|
|
39
|
+
if (!verifyJwtSignature(key, signingInput, signature)) {
|
|
40
|
+
return { ok: false, status: 401, error: "invalid_teams_signature" };
|
|
41
|
+
}
|
|
42
|
+
return { ok: true };
|
|
43
|
+
}
|
|
44
|
+
export async function createTeamsBotToken(ctx) {
|
|
45
|
+
const appId = ctx.env.MICROSOFT_APP_ID;
|
|
46
|
+
const password = ctx.env.MICROSOFT_APP_PASSWORD;
|
|
47
|
+
if (!appId || !password)
|
|
48
|
+
throw new Error("Teams delivery requires MICROSOFT_APP_ID and MICROSOFT_APP_PASSWORD.");
|
|
49
|
+
const body = new URLSearchParams({
|
|
50
|
+
grant_type: "client_credentials",
|
|
51
|
+
client_id: appId,
|
|
52
|
+
client_secret: password,
|
|
53
|
+
scope: "https://api.botframework.com/.default"
|
|
54
|
+
});
|
|
55
|
+
const response = await fetchWithPolicy(ctx.fetch, "https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token", {
|
|
56
|
+
method: "POST",
|
|
57
|
+
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
58
|
+
body
|
|
59
|
+
});
|
|
60
|
+
const parsed = await parseJson(response);
|
|
61
|
+
if (!response.ok)
|
|
62
|
+
throw new Error(`Teams token request failed: ${response.status} ${JSON.stringify(parsed)}`);
|
|
63
|
+
const token = stringValue(recordValue(parsed)?.access_token);
|
|
64
|
+
if (!token)
|
|
65
|
+
throw new Error("Teams token response did not include access_token.");
|
|
66
|
+
return token;
|
|
67
|
+
}
|
|
68
|
+
export async function sendTeamsActivity(ctx, destination, activity) {
|
|
69
|
+
if (!destination.serviceUrl || !destination.conversationId)
|
|
70
|
+
throw new Error("Teams delivery requires serviceUrl and conversationId.");
|
|
71
|
+
const token = await createTeamsBotToken(ctx);
|
|
72
|
+
const base = `${destination.serviceUrl.replace(/\/$/, "")}/v3/conversations/${encodeURIComponent(destination.conversationId)}`;
|
|
73
|
+
const replyTo = stringValue(activity.replyToActivityId) ?? destination.activityId;
|
|
74
|
+
const url = replyTo && activity.type === "message"
|
|
75
|
+
? `${base}/activities/${encodeURIComponent(replyTo)}`
|
|
76
|
+
: `${base}/activities`;
|
|
77
|
+
const response = await fetchWithPolicy(ctx.fetch, url, {
|
|
78
|
+
method: "POST",
|
|
79
|
+
headers: {
|
|
80
|
+
authorization: `Bearer ${token}`,
|
|
81
|
+
"content-type": "application/json"
|
|
82
|
+
},
|
|
83
|
+
body: JSON.stringify(activity)
|
|
84
|
+
});
|
|
85
|
+
const parsed = await parseJson(response);
|
|
86
|
+
if (!response.ok)
|
|
87
|
+
throw new Error(`Teams delivery failed: ${response.status} ${JSON.stringify(parsed)}`);
|
|
88
|
+
return safeJson(parsed);
|
|
89
|
+
}
|
|
90
|
+
export function validateTeamsTenant(ctx, tenantId) {
|
|
91
|
+
const allowed = configuredList(recordValue(ctx.channel.metadata?.teams)?.allowedTenants, ctx.env.OPENEVE_TEAMS_ALLOWED_TENANTS);
|
|
92
|
+
if (allowed.length === 0)
|
|
93
|
+
return { ok: true };
|
|
94
|
+
if (tenantId && allowed.includes(tenantId))
|
|
95
|
+
return { ok: true };
|
|
96
|
+
return { ok: false, error: "teams_tenant_not_allowed" };
|
|
97
|
+
}
|
|
98
|
+
export function validateTeamsServiceUrl(ctx, serviceUrl) {
|
|
99
|
+
const allowed = configuredList(recordValue(ctx.channel.metadata?.teams)?.allowedServiceUrls, ctx.env.OPENEVE_TEAMS_ALLOWED_SERVICE_URLS);
|
|
100
|
+
if (allowed.length === 0)
|
|
101
|
+
return { ok: true };
|
|
102
|
+
return allowed.some((prefix) => serviceUrl.startsWith(prefix))
|
|
103
|
+
? { ok: true }
|
|
104
|
+
: { ok: false, error: "teams_service_url_not_allowed" };
|
|
105
|
+
}
|
|
106
|
+
function configuredList(value, envValue) {
|
|
107
|
+
const fromMetadata = Array.isArray(value) ? value.flatMap((item) => typeof item === "string" && item.trim() ? [item.trim()] : []) : [];
|
|
108
|
+
const fromEnv = envValue?.split(",").map((item) => item.trim()).filter(Boolean) ?? [];
|
|
109
|
+
return [...fromMetadata, ...fromEnv];
|
|
110
|
+
}
|
|
111
|
+
const BOT_FRAMEWORK_OPENID_METADATA_URL = "https://login.botframework.com/v1/.well-known/openidconfiguration";
|
|
112
|
+
const teamsKeyCache = new Map();
|
|
113
|
+
function decodeJwt(token) {
|
|
114
|
+
const [encodedHeader, encodedPayload, encodedSignature] = token.split(".");
|
|
115
|
+
if (!encodedHeader || !encodedPayload || !encodedSignature)
|
|
116
|
+
return undefined;
|
|
117
|
+
try {
|
|
118
|
+
const jwtHeader = recordValue(JSON.parse(Buffer.from(encodedHeader, "base64url").toString("utf8")));
|
|
119
|
+
const claims = recordValue(JSON.parse(Buffer.from(encodedPayload, "base64url").toString("utf8")));
|
|
120
|
+
if (!jwtHeader || !claims)
|
|
121
|
+
return undefined;
|
|
122
|
+
return {
|
|
123
|
+
jwtHeader,
|
|
124
|
+
claims,
|
|
125
|
+
signingInput: `${encodedHeader}.${encodedPayload}`,
|
|
126
|
+
signature: Buffer.from(encodedSignature, "base64url")
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async function teamsSigningKey(fetchImpl, metadataUrl, keyId) {
|
|
134
|
+
if (!keyId)
|
|
135
|
+
return undefined;
|
|
136
|
+
const url = metadataUrl ?? BOT_FRAMEWORK_OPENID_METADATA_URL;
|
|
137
|
+
const now = Date.now();
|
|
138
|
+
const cached = teamsKeyCache.get(url);
|
|
139
|
+
if (cached && cached.expiresAt > now)
|
|
140
|
+
return findSigningKey(cached.keys, keyId);
|
|
141
|
+
const metadataResponse = await fetchWithPolicy(fetchImpl, url);
|
|
142
|
+
const metadata = recordValue(await parseJson(metadataResponse));
|
|
143
|
+
if (!metadataResponse.ok || !metadata)
|
|
144
|
+
throw new Error(`Teams OpenID metadata request failed: ${metadataResponse.status}`);
|
|
145
|
+
const jwksUri = stringValue(metadata.jwks_uri);
|
|
146
|
+
if (!jwksUri)
|
|
147
|
+
throw new Error("Teams OpenID metadata did not include jwks_uri.");
|
|
148
|
+
const keysResponse = await fetchWithPolicy(fetchImpl, jwksUri);
|
|
149
|
+
const keysJson = recordValue(await parseJson(keysResponse));
|
|
150
|
+
if (!keysResponse.ok || !keysJson)
|
|
151
|
+
throw new Error(`Teams OpenID keys request failed: ${keysResponse.status}`);
|
|
152
|
+
const keys = Array.isArray(keysJson.keys) ? keysJson.keys.flatMap((key) => {
|
|
153
|
+
const record = recordValue(key);
|
|
154
|
+
return record ? [record] : [];
|
|
155
|
+
}) : [];
|
|
156
|
+
teamsKeyCache.set(url, { expiresAt: now + 24 * 60 * 60 * 1000, keys });
|
|
157
|
+
return findSigningKey(keys, keyId);
|
|
158
|
+
}
|
|
159
|
+
function findSigningKey(keys, keyId) {
|
|
160
|
+
return keys.find((key) => key.kid === keyId || key.x5t === keyId);
|
|
161
|
+
}
|
|
162
|
+
function verifyJwtSignature(key, signingInput, signature) {
|
|
163
|
+
try {
|
|
164
|
+
const publicKey = createPublicKey({ key: key, format: "jwk" });
|
|
165
|
+
return verifySignature("RSA-SHA256", Buffer.from(signingInput), publicKey, signature);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type ChannelDefinition, type ConnectionDefinition, type JsonObject } from "@assemblyline-agents/core";
|
|
2
|
+
import { type ChannelAttachmentRequest, type ChannelContext, type ChannelDelivery, type ChannelHttpRequest, type ChannelHttpResult, type ChannelTurn, type ChannelTurnLifecycle } from "@assemblyline-agents/runtime";
|
|
3
|
+
export { verifyTeamsAuthorization } from "./auth.js";
|
|
4
|
+
export { defineTeamsAdaptiveCardTool, defineTeamsAttachmentTool, defineTeamsSuggestedActionsTool, teamsContextFromToolContext, teamsDestinationFromToolContext, type TeamsToolOptions } from "./tools.js";
|
|
5
|
+
export type { TeamsDestination } from "./util.js";
|
|
6
|
+
export declare const TEAMS_REQUIRED_ENV: readonly ["MICROSOFT_APP_ID", "MICROSOFT_APP_PASSWORD"];
|
|
7
|
+
/** Production ingress-auth requirement (any-of groups): Bot Framework JWT validation credentials. */
|
|
8
|
+
export declare const TEAMS_INGRESS_SECRET_ENV: string[][];
|
|
9
|
+
export interface TeamsChannelOptions {
|
|
10
|
+
route?: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
methods?: string[];
|
|
13
|
+
connection?: string;
|
|
14
|
+
allowedTenants?: string[];
|
|
15
|
+
allowedServiceUrls?: string[];
|
|
16
|
+
stripMentions?: boolean;
|
|
17
|
+
typing?: boolean;
|
|
18
|
+
metadata?: JsonObject;
|
|
19
|
+
}
|
|
20
|
+
export interface TeamsConnectionOptions {
|
|
21
|
+
description?: string;
|
|
22
|
+
required?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare function defineTeamsChannel(options?: TeamsChannelOptions): ChannelDefinition;
|
|
25
|
+
/**
|
|
26
|
+
* Resolve a Teams turn attachment into a download request: Bot Framework
|
|
27
|
+
* content URLs (botframework.com/skype.com or the activity's own serviceUrl
|
|
28
|
+
* origin) fetched with a client-credentials bot token. The runtime only calls
|
|
29
|
+
* this for turns this Teams channel produced.
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveAttachment(attachment: JsonObject, ctx: ChannelContext): Promise<ChannelAttachmentRequest | undefined>;
|
|
32
|
+
export declare function defineTeamsConnection(options?: TeamsConnectionOptions): ConnectionDefinition;
|
|
33
|
+
export declare function normalizeHttp(request: ChannelHttpRequest, ctx: ChannelContext): Promise<ChannelHttpResult>;
|
|
34
|
+
export declare function startTurn(turn: ChannelTurn, ctx: ChannelContext): ChannelTurnLifecycle;
|
|
35
|
+
export declare function augmentContext(turn: ChannelTurn, ctx: ChannelContext): Promise<{
|
|
36
|
+
recentHistory?: string[];
|
|
37
|
+
channelContext?: JsonObject;
|
|
38
|
+
} | void>;
|
|
39
|
+
export declare function send(delivery: ChannelDelivery, ctx: ChannelContext): Promise<JsonObject>;
|
|
40
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,KAAK,UAAU,EAAkB,MAAM,2BAA2B,CAAC;AACzK,OAAO,EAAqD,KAAK,wBAAwB,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,WAAW,EAAE,KAAK,oBAAoB,EAA+C,MAAM,8BAA8B,CAAC;AAItT,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,+BAA+B,EAAE,2BAA2B,EAAE,+BAA+B,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC1M,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD,eAAO,MAAM,kBAAkB,yDAA0D,CAAC;AAC1F,qGAAqG;AACrG,eAAO,MAAM,wBAAwB,EAAE,MAAM,EAAE,EAAqD,CAAC;AAErG,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAQD,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,iBAAiB,CA2BvF;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAYlI;AAiBD,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,oBAAoB,CAUhG;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAyEhH;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,cAAc,GAAG,oBAAoB,CAuBtF;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC;IAAE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,UAAU,CAAA;CAAE,GAAG,IAAI,CAAC,CAqC3E;AAED,wBAAsB,IAAI,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAK9F"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { adapter, defineChannel, defineConnection } from "@assemblyline-agents/core";
|
|
2
|
+
import { attachmentRemoteUrl, attachmentTrustedForProvider } from "@assemblyline-agents/runtime";
|
|
3
|
+
import { createTeamsBotToken, sendTeamsActivity, validateTeamsServiceUrl, validateTeamsTenant, verifyTeamsAuthorization } from "./auth.js";
|
|
4
|
+
import { adaptiveCardAttachment, compactJsonObject, recordValue, safeJson, sanitizeTeamsText, stringValue, teamsAttachments, teamsDestinationFromDelivery, teamsDestinationFromTurn, truncate } from "./util.js";
|
|
5
|
+
export { verifyTeamsAuthorization } from "./auth.js";
|
|
6
|
+
export { defineTeamsAdaptiveCardTool, defineTeamsAttachmentTool, defineTeamsSuggestedActionsTool, teamsContextFromToolContext, teamsDestinationFromToolContext } from "./tools.js";
|
|
7
|
+
export const TEAMS_REQUIRED_ENV = ["MICROSOFT_APP_ID", "MICROSOFT_APP_PASSWORD"];
|
|
8
|
+
/** Production ingress-auth requirement (any-of groups): Bot Framework JWT validation credentials. */
|
|
9
|
+
export const TEAMS_INGRESS_SECRET_ENV = [["MICROSOFT_APP_ID", "MICROSOFT_APP_PASSWORD"]];
|
|
10
|
+
const TEAMS_TYPING_REFRESH_MS = 4_000;
|
|
11
|
+
const TEAMS_RECENT_HISTORY_LIMIT = 20;
|
|
12
|
+
const TEAMS_RECENT_ACTIVITY_HOURS = 24;
|
|
13
|
+
const TEAMS_RECENT_ACTIVITY_LIMIT = 3;
|
|
14
|
+
const TEAMS_SUMMARY_MAX_CHARS = 240;
|
|
15
|
+
export function defineTeamsChannel(options = {}) {
|
|
16
|
+
const definition = {
|
|
17
|
+
description: options.description ?? "Receive Microsoft Teams bot activities and deliver replies through Bot Framework conversations.",
|
|
18
|
+
transport: "http",
|
|
19
|
+
route: options.route ?? "/teams/messages",
|
|
20
|
+
methods: options.methods ?? ["POST"],
|
|
21
|
+
metadata: {
|
|
22
|
+
provider: "microsoft-teams",
|
|
23
|
+
teams: compactJsonObject({
|
|
24
|
+
allowedTenants: options.allowedTenants,
|
|
25
|
+
allowedServiceUrls: options.allowedServiceUrls,
|
|
26
|
+
stripMentions: options.stripMentions,
|
|
27
|
+
typing: options.typing
|
|
28
|
+
}),
|
|
29
|
+
...(options.metadata ?? {})
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
if (options.connection)
|
|
33
|
+
definition.connection = options.connection;
|
|
34
|
+
definition.ingress = { requiredSecretEnv: TEAMS_INGRESS_SECRET_ENV };
|
|
35
|
+
return Object.assign(defineChannel(definition), {
|
|
36
|
+
normalizeHttp,
|
|
37
|
+
startTurn,
|
|
38
|
+
augmentContext,
|
|
39
|
+
send,
|
|
40
|
+
resolveAttachment,
|
|
41
|
+
ingressAuth: { requiredSecretEnv: TEAMS_INGRESS_SECRET_ENV }
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Resolve a Teams turn attachment into a download request: Bot Framework
|
|
46
|
+
* content URLs (botframework.com/skype.com or the activity's own serviceUrl
|
|
47
|
+
* origin) fetched with a client-credentials bot token. The runtime only calls
|
|
48
|
+
* this for turns this Teams channel produced.
|
|
49
|
+
*/
|
|
50
|
+
export async function resolveAttachment(attachment, ctx) {
|
|
51
|
+
const url = attachmentRemoteUrl(attachment);
|
|
52
|
+
if (!url || !attachmentTrustedForProvider(attachment, "microsoft-teams"))
|
|
53
|
+
return undefined;
|
|
54
|
+
if (!isTeamsAttachmentUrl(attachment, url))
|
|
55
|
+
throw new Error("Teams attachment download URL host is not allowed.");
|
|
56
|
+
const headers = {};
|
|
57
|
+
if (ctx.env.MICROSOFT_APP_ID && ctx.env.MICROSOFT_APP_PASSWORD) {
|
|
58
|
+
headers.authorization = `Bearer ${await createTeamsBotToken(ctx)}`;
|
|
59
|
+
}
|
|
60
|
+
const request = { url, headers };
|
|
61
|
+
const filename = stringValue(attachment.filename) ?? stringValue(attachment.name);
|
|
62
|
+
if (filename)
|
|
63
|
+
request.filename = filename;
|
|
64
|
+
return request;
|
|
65
|
+
}
|
|
66
|
+
function isTeamsAttachmentUrl(attachment, url) {
|
|
67
|
+
const remote = recordValue(attachment.remote) ?? recordValue(attachment.download);
|
|
68
|
+
const serviceUrl = stringValue(remote?.serviceUrl) ?? stringValue(attachment.serviceUrl);
|
|
69
|
+
try {
|
|
70
|
+
const target = new URL(url);
|
|
71
|
+
if (target.protocol !== "https:")
|
|
72
|
+
return false;
|
|
73
|
+
if (target.hostname.endsWith(".botframework.com"))
|
|
74
|
+
return true;
|
|
75
|
+
if (target.hostname.endsWith(".skype.com"))
|
|
76
|
+
return true;
|
|
77
|
+
if (!serviceUrl)
|
|
78
|
+
return false;
|
|
79
|
+
return target.origin === new URL(serviceUrl).origin;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export function defineTeamsConnection(options = {}) {
|
|
86
|
+
return defineConnection({
|
|
87
|
+
description: options.description ?? "Microsoft Bot Framework connection for Teams message delivery.",
|
|
88
|
+
provider: "microsoft-teams",
|
|
89
|
+
binding: adapter("microsoft-bot"),
|
|
90
|
+
scopes: ["botframework"],
|
|
91
|
+
capabilities: ["messages:send", "messages:receive"],
|
|
92
|
+
subject: "workspace",
|
|
93
|
+
required: options.required ?? false
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
export async function normalizeHttp(request, ctx) {
|
|
97
|
+
const activity = request.body;
|
|
98
|
+
const activityIdentity = {};
|
|
99
|
+
const authServiceUrl = stringValue(activity.serviceUrl);
|
|
100
|
+
const authChannelId = stringValue(activity.channelId);
|
|
101
|
+
if (authServiceUrl)
|
|
102
|
+
activityIdentity.serviceUrl = authServiceUrl;
|
|
103
|
+
if (authChannelId)
|
|
104
|
+
activityIdentity.channelId = authChannelId;
|
|
105
|
+
const verification = await verifyTeamsAuthorization(request, ctx.env, ctx.fetch, activityIdentity);
|
|
106
|
+
if (!verification.ok)
|
|
107
|
+
return { kind: "response", status: verification.status, body: { ok: false, error: verification.error } };
|
|
108
|
+
const type = stringValue(activity.type);
|
|
109
|
+
if (type !== "message" && type !== "invoke") {
|
|
110
|
+
return { kind: "ignored", status: 200, body: { ok: true, ignored: true, reason: "unsupported_activity", type: type ?? null } };
|
|
111
|
+
}
|
|
112
|
+
const id = stringValue(activity.id);
|
|
113
|
+
const conversation = recordValue(activity.conversation);
|
|
114
|
+
const from = recordValue(activity.from);
|
|
115
|
+
const channelData = recordValue(activity.channelData);
|
|
116
|
+
const team = recordValue(channelData?.team);
|
|
117
|
+
const channel = recordValue(channelData?.channel);
|
|
118
|
+
const tenant = recordValue(channelData?.tenant);
|
|
119
|
+
const serviceUrl = stringValue(activity.serviceUrl);
|
|
120
|
+
const providerConversationId = stringValue(conversation?.id);
|
|
121
|
+
const userId = stringValue(from?.id);
|
|
122
|
+
if (!id || !serviceUrl || !providerConversationId) {
|
|
123
|
+
return { kind: "response", status: 400, body: { ok: false, error: "missing_teams_activity_identity" } };
|
|
124
|
+
}
|
|
125
|
+
const tenantId = stringValue(tenant?.id);
|
|
126
|
+
const tenantCheck = validateTeamsTenant(ctx, tenantId);
|
|
127
|
+
if (!tenantCheck.ok)
|
|
128
|
+
return { kind: "response", status: 403, body: { ok: false, error: tenantCheck.error } };
|
|
129
|
+
const serviceUrlCheck = validateTeamsServiceUrl(ctx, serviceUrl);
|
|
130
|
+
if (!serviceUrlCheck.ok)
|
|
131
|
+
return { kind: "response", status: 403, body: { ok: false, error: serviceUrlCheck.error } };
|
|
132
|
+
const text = teamsActivityText(activity, ctx);
|
|
133
|
+
const attachments = teamsAttachments(activity);
|
|
134
|
+
const conversationId = `teams:${providerConversationId}`;
|
|
135
|
+
const turn = {
|
|
136
|
+
eventId: id,
|
|
137
|
+
channel: ctx.channel.name,
|
|
138
|
+
conversationId,
|
|
139
|
+
message: text || "Teams message",
|
|
140
|
+
attachments,
|
|
141
|
+
delivery: compactJsonObject({
|
|
142
|
+
provider: "microsoft-teams",
|
|
143
|
+
serviceUrl,
|
|
144
|
+
conversationId: providerConversationId,
|
|
145
|
+
activityId: id,
|
|
146
|
+
replyToActivity: true
|
|
147
|
+
}),
|
|
148
|
+
metadata: {
|
|
149
|
+
provider: "microsoft-teams",
|
|
150
|
+
teams: compactJsonObject({
|
|
151
|
+
type,
|
|
152
|
+
name: stringValue(activity.name),
|
|
153
|
+
activityId: id,
|
|
154
|
+
serviceUrl,
|
|
155
|
+
conversationId: providerConversationId,
|
|
156
|
+
userId,
|
|
157
|
+
tenantId,
|
|
158
|
+
teamId: stringValue(team?.id),
|
|
159
|
+
channelId: stringValue(channel?.id),
|
|
160
|
+
raw: safeJson(activity)
|
|
161
|
+
})
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
if (userId)
|
|
165
|
+
turn.userId = userId;
|
|
166
|
+
return {
|
|
167
|
+
kind: "accepted",
|
|
168
|
+
status: 202,
|
|
169
|
+
body: { ok: true, accepted: true, provider: "microsoft-teams" },
|
|
170
|
+
idempotencyKey: id,
|
|
171
|
+
idempotencyScope: `channel:${ctx.channel.name}:teams`,
|
|
172
|
+
turn
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
export function startTurn(turn, ctx) {
|
|
176
|
+
if (!teamsTypingEnabled(ctx))
|
|
177
|
+
return {};
|
|
178
|
+
const destination = teamsDestinationFromTurn(turn);
|
|
179
|
+
if (!destination.serviceUrl || !destination.conversationId)
|
|
180
|
+
return {};
|
|
181
|
+
let stopped = false;
|
|
182
|
+
const controller = new AbortController();
|
|
183
|
+
const sendTyping = () => sendTeamsActivity(ctx, destination, { type: "typing" }).catch(() => undefined);
|
|
184
|
+
void sendTyping();
|
|
185
|
+
const loop = (async () => {
|
|
186
|
+
while (!controller.signal.aborted) {
|
|
187
|
+
await sleep(TEAMS_TYPING_REFRESH_MS, controller.signal).catch(() => undefined);
|
|
188
|
+
if (!controller.signal.aborted)
|
|
189
|
+
await sendTyping();
|
|
190
|
+
}
|
|
191
|
+
})();
|
|
192
|
+
return {
|
|
193
|
+
async stop() {
|
|
194
|
+
if (stopped)
|
|
195
|
+
return { provider: "microsoft-teams", typing: "already-stopped" };
|
|
196
|
+
stopped = true;
|
|
197
|
+
controller.abort();
|
|
198
|
+
await loop.catch(() => undefined);
|
|
199
|
+
return { provider: "microsoft-teams", typing: "stopped" };
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
export async function augmentContext(turn, ctx) {
|
|
204
|
+
const recentHistory = (await ctx.state.listRecentMessages(turn.conversationId, TEAMS_RECENT_HISTORY_LIMIT)).map(messageHistoryLine);
|
|
205
|
+
const since = new Date(Date.now() - TEAMS_RECENT_ACTIVITY_HOURS * 60 * 60 * 1000).toISOString();
|
|
206
|
+
const relatedConversations = turn.userId && ctx.state.listRecentConversationsBySubject
|
|
207
|
+
? await ctx.state.listRecentConversationsBySubject({
|
|
208
|
+
channel: turn.channel,
|
|
209
|
+
subject: turn.userId,
|
|
210
|
+
since,
|
|
211
|
+
limit: TEAMS_RECENT_ACTIVITY_LIMIT,
|
|
212
|
+
excludeId: turn.conversationId
|
|
213
|
+
})
|
|
214
|
+
: [];
|
|
215
|
+
const related = await Promise.all(relatedConversations.map((conversation) => summarizeConversation(ctx, conversation)));
|
|
216
|
+
const teams = recordValue(turn.metadata?.teams);
|
|
217
|
+
return {
|
|
218
|
+
recentHistory,
|
|
219
|
+
channelContext: compactJsonObject({
|
|
220
|
+
provider: "microsoft-teams",
|
|
221
|
+
tenantId: stringValue(teams?.tenantId),
|
|
222
|
+
teamId: stringValue(teams?.teamId),
|
|
223
|
+
channelId: stringValue(teams?.channelId),
|
|
224
|
+
conversationId: stringValue(teams?.conversationId),
|
|
225
|
+
activityId: stringValue(teams?.activityId),
|
|
226
|
+
currentConversation: {
|
|
227
|
+
id: turn.conversationId,
|
|
228
|
+
userId: turn.userId ?? null,
|
|
229
|
+
eventId: turn.eventId
|
|
230
|
+
},
|
|
231
|
+
relatedConversations: related,
|
|
232
|
+
contextPolicy: {
|
|
233
|
+
source: "openeve_state",
|
|
234
|
+
maxRelatedConversations: TEAMS_RECENT_ACTIVITY_LIMIT,
|
|
235
|
+
maxAgeHours: TEAMS_RECENT_ACTIVITY_HOURS,
|
|
236
|
+
note: "Related Teams context is bounded to this user's recent OpenEve conversations and contains summaries, not tenant-wide Teams history."
|
|
237
|
+
}
|
|
238
|
+
})
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
export async function send(delivery, ctx) {
|
|
242
|
+
const destination = teamsDestinationFromDelivery(delivery);
|
|
243
|
+
const activity = teamsDeliveryActivity(delivery);
|
|
244
|
+
const parsed = await sendTeamsActivity(ctx, destination, activity);
|
|
245
|
+
return { provider: "microsoft-teams", activity: safeJson(parsed) };
|
|
246
|
+
}
|
|
247
|
+
function teamsDeliveryActivity(delivery) {
|
|
248
|
+
const payloadActivity = recordValue(delivery.payload.activity);
|
|
249
|
+
if (payloadActivity)
|
|
250
|
+
return payloadActivity;
|
|
251
|
+
const attachments = teamsDeliveryAttachments(delivery.payload);
|
|
252
|
+
return compactJsonObject({
|
|
253
|
+
type: "message",
|
|
254
|
+
text: delivery.response,
|
|
255
|
+
attachments: attachments.length > 0 ? attachments : undefined,
|
|
256
|
+
suggestedActions: recordValue(delivery.payload.suggestedActions) ?? recordValue(delivery.payload.suggested_actions)
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
function teamsDeliveryAttachments(payload) {
|
|
260
|
+
const attachments = Array.isArray(payload.attachments) ? payload.attachments.filter(recordValue) : [];
|
|
261
|
+
const card = recordValue(payload.card) ?? recordValue(payload.adaptiveCard);
|
|
262
|
+
if (card)
|
|
263
|
+
attachments.unshift(adaptiveCardAttachment(card));
|
|
264
|
+
return attachments;
|
|
265
|
+
}
|
|
266
|
+
function teamsActivityText(activity, ctx) {
|
|
267
|
+
if (stringValue(activity.type) === "invoke") {
|
|
268
|
+
const value = recordValue(activity.value);
|
|
269
|
+
const action = recordValue(value?.action);
|
|
270
|
+
const title = stringValue(action?.title) ?? stringValue(activity.name) ?? "Teams action";
|
|
271
|
+
const data = recordValue(action?.data) ?? recordValue(value?.data) ?? value;
|
|
272
|
+
return [title, data ? JSON.stringify(safeJson(data)) : ""].filter(Boolean).join("\n\n");
|
|
273
|
+
}
|
|
274
|
+
const text = stringValue(activity.text) ?? "";
|
|
275
|
+
return teamsShouldStripMentions(ctx) ? sanitizeTeamsText(text) : text.trim();
|
|
276
|
+
}
|
|
277
|
+
function teamsShouldStripMentions(ctx) {
|
|
278
|
+
const configured = recordValue(ctx.channel.metadata?.teams)?.stripMentions;
|
|
279
|
+
return typeof configured === "boolean" ? configured : true;
|
|
280
|
+
}
|
|
281
|
+
function teamsTypingEnabled(ctx) {
|
|
282
|
+
const configured = recordValue(ctx.channel.metadata?.teams)?.typing;
|
|
283
|
+
return typeof configured === "boolean" ? configured : true;
|
|
284
|
+
}
|
|
285
|
+
async function summarizeConversation(ctx, conversation) {
|
|
286
|
+
const messages = await ctx.state.listRecentMessages(conversation.id, 8);
|
|
287
|
+
const latestUser = latestText(messages, "user");
|
|
288
|
+
const latestAssistant = latestText(messages, "assistant");
|
|
289
|
+
const teams = recordValue(conversation.metadata.teams);
|
|
290
|
+
return compactJsonObject({
|
|
291
|
+
conversationId: conversation.id,
|
|
292
|
+
updatedAt: conversation.updatedAt,
|
|
293
|
+
tenantId: stringValue(teams?.tenantId),
|
|
294
|
+
teamId: stringValue(teams?.teamId),
|
|
295
|
+
channelId: stringValue(teams?.channelId),
|
|
296
|
+
latestUser,
|
|
297
|
+
latestAssistant
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
function latestText(messages, role) {
|
|
301
|
+
const message = [...messages].reverse().find((candidate) => candidate.role === role);
|
|
302
|
+
const text = typeof message?.content.text === "string" ? message.content.text : undefined;
|
|
303
|
+
return text ? truncate(text, TEAMS_SUMMARY_MAX_CHARS) : undefined;
|
|
304
|
+
}
|
|
305
|
+
function messageHistoryLine(message) {
|
|
306
|
+
const text = typeof message.content.text === "string" ? message.content.text : JSON.stringify(message.content);
|
|
307
|
+
return `${message.role}: ${text}`;
|
|
308
|
+
}
|
|
309
|
+
function sleep(ms, signal) {
|
|
310
|
+
return new Promise((resolve) => {
|
|
311
|
+
const timeout = setTimeout(resolve, ms);
|
|
312
|
+
if (signal) {
|
|
313
|
+
signal.addEventListener("abort", () => {
|
|
314
|
+
clearTimeout(timeout);
|
|
315
|
+
resolve();
|
|
316
|
+
}, { once: true });
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAsF,MAAM,2BAA2B,CAAC;AACzK,OAAO,EAAE,mBAAmB,EAAE,4BAA4B,EAAuN,MAAM,8BAA8B,CAAC;AACtT,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAC3I,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEjN,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,+BAA+B,EAAE,2BAA2B,EAAE,+BAA+B,EAAyB,MAAM,YAAY,CAAC;AAG1M,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,kBAAkB,EAAE,wBAAwB,CAAU,CAAC;AAC1F,qGAAqG;AACrG,MAAM,CAAC,MAAM,wBAAwB,GAAe,CAAC,CAAC,kBAAkB,EAAE,wBAAwB,CAAC,CAAC,CAAC;AAmBrG,MAAM,uBAAuB,GAAG,KAAK,CAAC;AACtC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AACtC,MAAM,2BAA2B,GAAG,EAAE,CAAC;AACvC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AACtC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,MAAM,UAAU,kBAAkB,CAAC,UAA+B,EAAE;IAClE,MAAM,UAAU,GAAsB;QACpC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,iGAAiG;QACrI,SAAS,EAAE,MAAM;QACjB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,iBAAiB;QACzC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC;QACpC,QAAQ,EAAE;YACR,QAAQ,EAAE,iBAAiB;YAC3B,KAAK,EAAE,iBAAiB,CAAC;gBACvB,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;gBAC9C,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC;YACF,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;SAC5B;KACF,CAAC;IACF,IAAI,OAAO,CAAC,UAAU;QAAE,UAAU,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACnE,UAAU,CAAC,OAAO,GAAG,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,CAAC;IACrE,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE;QAC9C,aAAa;QACb,SAAS;QACT,cAAc;QACd,IAAI;QACJ,iBAAiB;QACjB,WAAW,EAAE,EAAE,iBAAiB,EAAE,wBAAwB,EAAE;KAC7D,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAsB,EAAE,GAAmB;IACjF,MAAM,GAAG,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,IAAI,CAAC,4BAA4B,CAAC,UAAU,EAAE,iBAAiB,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3F,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAClH,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,IAAI,GAAG,CAAC,GAAG,CAAC,gBAAgB,IAAI,GAAG,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC;QAC/D,OAAO,CAAC,aAAa,GAAG,UAAU,MAAM,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;IACrE,CAAC;IACD,MAAM,OAAO,GAA6B,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IAC3D,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAClF,IAAI,QAAQ;QAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAsB,EAAE,GAAW;IAC/D,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClF,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACzF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC/C,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/D,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;YAAE,OAAO,IAAI,CAAC;QACxD,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9B,OAAO,MAAM,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAkC,EAAE;IACxE,OAAO,gBAAgB,CAAC;QACtB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,gEAAgE;QACpG,QAAQ,EAAE,iBAAiB;QAC3B,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC;QACjC,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,YAAY,EAAE,CAAC,eAAe,EAAE,kBAAkB,CAAC;QACnD,OAAO,EAAE,WAAW;QACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,KAAK;KACpC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA2B,EAAE,GAAmB;IAClF,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAC9B,MAAM,gBAAgB,GAAgD,EAAE,CAAC;IACzE,MAAM,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACtD,IAAI,cAAc;QAAE,gBAAgB,CAAC,UAAU,GAAG,cAAc,CAAC;IACjE,IAAI,aAAa;QAAE,gBAAgB,CAAC,SAAS,GAAG,aAAa,CAAC;IAC9D,MAAM,YAAY,GAAG,MAAM,wBAAwB,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACnG,IAAI,CAAC,YAAY,CAAC,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC;IAE/H,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;IACjI,CAAC;IACD,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,sBAAsB,GAAG,WAAW,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAClD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iCAAiC,EAAE,EAAE,CAAC;IAC1G,CAAC;IACD,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACvD,IAAI,CAAC,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC;IAC7G,MAAM,eAAe,GAAG,uBAAuB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACjE,IAAI,CAAC,eAAe,CAAC,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC;IACrH,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,SAAS,sBAAsB,EAAE,CAAC;IACzD,MAAM,IAAI,GAAgB;QACxB,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI;QACzB,cAAc;QACd,OAAO,EAAE,IAAI,IAAI,eAAe;QAChC,WAAW;QACX,QAAQ,EAAE,iBAAiB,CAAC;YAC1B,QAAQ,EAAE,iBAAiB;YAC3B,UAAU;YACV,cAAc,EAAE,sBAAsB;YACtC,UAAU,EAAE,EAAE;YACd,eAAe,EAAE,IAAI;SACtB,CAAC;QACF,QAAQ,EAAE;YACR,QAAQ,EAAE,iBAAiB;YAC3B,KAAK,EAAE,iBAAiB,CAAC;gBACvB,IAAI;gBACJ,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAChC,UAAU,EAAE,EAAE;gBACd,UAAU;gBACV,cAAc,EAAE,sBAAsB;gBACtC,MAAM;gBACN,QAAQ;gBACR,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC7B,SAAS,EAAE,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;gBACnC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC;aACxB,CAAC;SACH;KACF,CAAC;IACF,IAAI,MAAM;QAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACjC,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE;QAC/D,cAAc,EAAE,EAAE;QAClB,gBAAgB,EAAE,WAAW,GAAG,CAAC,OAAO,CAAC,IAAI,QAAQ;QACrD,IAAI;KACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAiB,EAAE,GAAmB;IAC9D,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,WAAW,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACnD,IAAI,CAAC,WAAW,CAAC,UAAU,IAAI,CAAC,WAAW,CAAC,cAAc;QAAE,OAAO,EAAE,CAAC;IACtE,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACxG,KAAK,UAAU,EAAE,CAAC;IAClB,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE;QACvB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,KAAK,CAAC,uBAAuB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC/E,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,UAAU,EAAE,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IACL,OAAO;QACL,KAAK,CAAC,IAAI;YACR,IAAI,OAAO;gBAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;YAC/E,OAAO,GAAG,IAAI,CAAC;YACf,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAClC,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC5D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAiB,EACjB,GAAmB;IAEnB,MAAM,aAAa,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACpI,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,2BAA2B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAChG,MAAM,oBAAoB,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,gCAAgC;QACpF,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,gCAAgC,CAAC;YAC/C,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,MAAM;YACpB,KAAK;YACL,KAAK,EAAE,2BAA2B;YAClC,SAAS,EAAE,IAAI,CAAC,cAAc;SAC/B,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,qBAAqB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IACxH,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO;QACL,aAAa;QACb,cAAc,EAAE,iBAAiB,CAAC;YAChC,QAAQ,EAAE,iBAAiB;YAC3B,QAAQ,EAAE,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC;YACtC,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC;YAClC,SAAS,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC;YACxC,cAAc,EAAE,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC;YAClD,UAAU,EAAE,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC;YAC1C,mBAAmB,EAAE;gBACnB,EAAE,EAAE,IAAI,CAAC,cAAc;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;gBAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB;YACD,oBAAoB,EAAE,OAAO;YAC7B,aAAa,EAAE;gBACb,MAAM,EAAE,eAAe;gBACvB,uBAAuB,EAAE,2BAA2B;gBACpD,WAAW,EAAE,2BAA2B;gBACxC,IAAI,EAAE,qIAAqI;aAC5I;SACF,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,QAAyB,EAAE,GAAmB;IACvE,MAAM,WAAW,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACnE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAc,EAAE,CAAC;AAClF,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAyB;IACtD,MAAM,eAAe,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/D,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC;IAC5C,MAAM,WAAW,GAAG,wBAAwB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/D,OAAO,iBAAiB,CAAC;QACvB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,QAAQ,CAAC,QAAQ;QACvB,WAAW,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;QAC7D,gBAAgB,EAAE,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC;KACpH,CAAC,CAAC;AACL,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAmB;IACnD,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtG,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5E,IAAI,IAAI;QAAE,WAAW,CAAC,OAAO,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5D,OAAO,WAA2B,CAAC;AACrC,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAoB,EAAE,GAAmB;IAClE,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC;QACzF,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC;QAC5E,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC9C,OAAO,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AAC/E,CAAC;AAED,SAAS,wBAAwB,CAAC,GAAmB;IACnD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,aAAa,CAAC;IAC3E,OAAO,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAmB;IAC7C,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IACpE,OAAO,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,GAAmB,EAAE,YAAgC;IACxF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACxE,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,eAAe,GAAG,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvD,OAAO,iBAAiB,CAAC;QACvB,cAAc,EAAE,YAAY,CAAC,EAAE;QAC/B,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,QAAQ,EAAE,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC;QACtC,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC;QAClC,SAAS,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC;QACxC,UAAU;QACV,eAAe;KAChB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,QAAyB,EAAE,IAA2B;IACxE,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,OAAO,OAAO,EAAE,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1F,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAsB;IAChD,MAAM,IAAI,GAAG,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/G,OAAO,GAAG,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,KAAK,CAAC,EAAU,EAAE,MAAoB;IAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBACpC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,OAAO,EAAE,CAAC;YACZ,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/tools.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ApprovalPolicy, type ToolDefinition, type ToolExecutionContext } from "@assemblyline-agents/core";
|
|
2
|
+
import type { ChannelContext } from "@assemblyline-agents/runtime";
|
|
3
|
+
import { type TeamsDestination } from "./util.js";
|
|
4
|
+
export interface TeamsToolOptions {
|
|
5
|
+
description?: string;
|
|
6
|
+
needsApproval?: boolean | ApprovalPolicy;
|
|
7
|
+
}
|
|
8
|
+
export declare function teamsDestinationFromToolContext(ctx: ToolExecutionContext): TeamsDestination;
|
|
9
|
+
export declare function teamsContextFromToolContext(ctx: ToolExecutionContext): Pick<ChannelContext, "env" | "fetch">;
|
|
10
|
+
export declare function defineTeamsAdaptiveCardTool(options?: TeamsToolOptions): ToolDefinition;
|
|
11
|
+
export declare function defineTeamsSuggestedActionsTool(options?: TeamsToolOptions): ToolDefinition;
|
|
12
|
+
export declare function defineTeamsAttachmentTool(options?: TeamsToolOptions): ToolDefinition;
|
|
13
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,cAAc,EAAmB,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAC7I,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,8BAA8B,CAAC;AAEhF,OAAO,EAAuE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEvH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC;CAC1C;AAED,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,oBAAoB,GAAG,gBAAgB,CAI3F;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,oBAAoB,GAAG,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,OAAO,CAAC,CAI5G;AAED,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,gBAAqB,GAAG,cAAc,CAsB1F;AAED,wBAAgB,+BAA+B,CAAC,OAAO,GAAE,gBAAqB,GAAG,cAAc,CAwC9F;AAED,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,gBAAqB,GAAG,cAAc,CA4BxF"}
|
package/dist/tools.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { defineTool } from "@assemblyline-agents/core";
|
|
2
|
+
import { sendTeamsActivity } from "./auth.js";
|
|
3
|
+
import { adaptiveCardAttachment, compactJsonObject, teamsDestinationFromTurn } from "./util.js";
|
|
4
|
+
export function teamsDestinationFromToolContext(ctx) {
|
|
5
|
+
const turn = ctx.channel?.turn;
|
|
6
|
+
if (!turn)
|
|
7
|
+
throw new Error("Teams tools require a Teams channel turn in context.");
|
|
8
|
+
return teamsDestinationFromTurn(turn);
|
|
9
|
+
}
|
|
10
|
+
export function teamsContextFromToolContext(ctx) {
|
|
11
|
+
const channel = ctx.channel;
|
|
12
|
+
if (!channel)
|
|
13
|
+
throw new Error("Teams tools require a channel-scoped run.");
|
|
14
|
+
return { env: channel.env, fetch: channel.fetch ?? fetch };
|
|
15
|
+
}
|
|
16
|
+
export function defineTeamsAdaptiveCardTool(options = {}) {
|
|
17
|
+
return withToolDefaults(defineTool({
|
|
18
|
+
description: "Send a Microsoft Teams Adaptive Card in the current conversation.",
|
|
19
|
+
sideEffect: "external",
|
|
20
|
+
inputSchema: {
|
|
21
|
+
type: "object",
|
|
22
|
+
additionalProperties: false,
|
|
23
|
+
properties: {
|
|
24
|
+
card: { type: "object", description: "Adaptive Card JSON content." },
|
|
25
|
+
text: { type: "string", description: "Fallback text." }
|
|
26
|
+
},
|
|
27
|
+
required: ["card"]
|
|
28
|
+
},
|
|
29
|
+
async execute(input, ctx) {
|
|
30
|
+
const request = input;
|
|
31
|
+
return sendTeamsActivity(teamsContextFromToolContext(ctx), teamsDestinationFromToolContext(ctx), {
|
|
32
|
+
type: "message",
|
|
33
|
+
text: request.text ?? "",
|
|
34
|
+
attachments: [adaptiveCardAttachment(request.card)]
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}), options);
|
|
38
|
+
}
|
|
39
|
+
export function defineTeamsSuggestedActionsTool(options = {}) {
|
|
40
|
+
return withToolDefaults(defineTool({
|
|
41
|
+
description: "Send Microsoft Teams suggested action buttons in the current conversation.",
|
|
42
|
+
sideEffect: "external",
|
|
43
|
+
inputSchema: {
|
|
44
|
+
type: "object",
|
|
45
|
+
additionalProperties: false,
|
|
46
|
+
properties: {
|
|
47
|
+
text: { type: "string" },
|
|
48
|
+
actions: {
|
|
49
|
+
type: "array",
|
|
50
|
+
items: {
|
|
51
|
+
type: "object",
|
|
52
|
+
additionalProperties: false,
|
|
53
|
+
properties: {
|
|
54
|
+
title: { type: "string" },
|
|
55
|
+
value: { type: "string" },
|
|
56
|
+
type: { type: "string" }
|
|
57
|
+
},
|
|
58
|
+
required: ["title", "value"]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
required: ["text", "actions"]
|
|
63
|
+
},
|
|
64
|
+
async execute(input, ctx) {
|
|
65
|
+
const request = input;
|
|
66
|
+
return sendTeamsActivity(teamsContextFromToolContext(ctx), teamsDestinationFromToolContext(ctx), {
|
|
67
|
+
type: "message",
|
|
68
|
+
text: request.text,
|
|
69
|
+
suggestedActions: {
|
|
70
|
+
actions: request.actions.map((action) => ({
|
|
71
|
+
type: action.type ?? "imBack",
|
|
72
|
+
title: action.title,
|
|
73
|
+
value: action.value
|
|
74
|
+
}))
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}), options);
|
|
79
|
+
}
|
|
80
|
+
export function defineTeamsAttachmentTool(options = {}) {
|
|
81
|
+
return withToolDefaults(defineTool({
|
|
82
|
+
description: "Send a Teams attachment activity in the current conversation.",
|
|
83
|
+
sideEffect: "external",
|
|
84
|
+
inputSchema: {
|
|
85
|
+
type: "object",
|
|
86
|
+
additionalProperties: false,
|
|
87
|
+
properties: {
|
|
88
|
+
contentType: { type: "string" },
|
|
89
|
+
contentUrl: { type: "string" },
|
|
90
|
+
name: { type: "string" },
|
|
91
|
+
text: { type: "string" }
|
|
92
|
+
},
|
|
93
|
+
required: ["contentType", "contentUrl"]
|
|
94
|
+
},
|
|
95
|
+
async execute(input, ctx) {
|
|
96
|
+
const request = input;
|
|
97
|
+
return sendTeamsActivity(teamsContextFromToolContext(ctx), teamsDestinationFromToolContext(ctx), {
|
|
98
|
+
type: "message",
|
|
99
|
+
text: request.text ?? "",
|
|
100
|
+
attachments: [compactJsonObject({
|
|
101
|
+
contentType: request.contentType,
|
|
102
|
+
contentUrl: request.contentUrl,
|
|
103
|
+
name: request.name
|
|
104
|
+
})]
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}), options);
|
|
108
|
+
}
|
|
109
|
+
function withToolDefaults(definition, options) {
|
|
110
|
+
if (options.description)
|
|
111
|
+
definition.description = options.description;
|
|
112
|
+
if (options.needsApproval !== undefined)
|
|
113
|
+
definition.needsApproval = options.needsApproval;
|
|
114
|
+
return definition;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAwF,MAAM,2BAA2B,CAAC;AAE7I,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,wBAAwB,EAAyB,MAAM,WAAW,CAAC;AAOvH,MAAM,UAAU,+BAA+B,CAAC,GAAyB;IACvE,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,IAA0C,CAAC;IACrE,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACnF,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,GAAyB;IACnE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC3E,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,UAA4B,EAAE;IACxE,OAAO,gBAAgB,CAAC,UAAU,CAAC;QACjC,WAAW,EAAE,mEAAmE;QAChF,UAAU,EAAE,UAAU;QACtB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,KAAK;YAC3B,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;gBACpE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE;aACxD;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;YACtB,MAAM,OAAO,GAAG,KAA4C,CAAC;YAC7D,OAAO,iBAAiB,CAAC,2BAA2B,CAAC,GAAG,CAAC,EAAE,+BAA+B,CAAC,GAAG,CAAC,EAAE;gBAC/F,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;gBACxB,WAAW,EAAE,CAAC,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aACpD,CAAC,CAAC;QACL,CAAC;KACF,CAAC,EAAE,OAAO,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,UAA4B,EAAE;IAC5E,OAAO,gBAAgB,CAAC,UAAU,CAAC;QACjC,WAAW,EAAE,4EAA4E;QACzF,UAAU,EAAE,UAAU;QACtB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,KAAK;YAC3B,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACxB,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,oBAAoB,EAAE,KAAK;wBAC3B,UAAU,EAAE;4BACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACzB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACzB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;yBACzB;wBACD,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;qBAC7B;iBACF;aACF;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;SAC9B;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;YACtB,MAAM,OAAO,GAAG,KAA0F,CAAC;YAC3G,OAAO,iBAAiB,CAAC,2BAA2B,CAAC,GAAG,CAAC,EAAE,+BAA+B,CAAC,GAAG,CAAC,EAAE;gBAC/F,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,gBAAgB,EAAE;oBAChB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;wBACxC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ;wBAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;qBACpB,CAAC,CAAC;iBACJ;aACF,CAAC,CAAC;QACL,CAAC;KACF,CAAC,EAAE,OAAO,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,UAA4B,EAAE;IACtE,OAAO,gBAAgB,CAAC,UAAU,CAAC;QACjC,WAAW,EAAE,+DAA+D;QAC5E,UAAU,EAAE,UAAU;QACtB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,KAAK;YAC3B,UAAU,EAAE;gBACV,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC/B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC9B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACxB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACzB;YACD,QAAQ,EAAE,CAAC,aAAa,EAAE,YAAY,CAAC;SACxC;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;YACtB,MAAM,OAAO,GAAG,KAAkF,CAAC;YACnG,OAAO,iBAAiB,CAAC,2BAA2B,CAAC,GAAG,CAAC,EAAE,+BAA+B,CAAC,GAAG,CAAC,EAAE;gBAC/F,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;gBACxB,WAAW,EAAE,CAAC,iBAAiB,CAAC;wBAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;wBAChC,UAAU,EAAE,OAAO,CAAC,UAAU;wBAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;qBACnB,CAAC,CAAC;aACJ,CAAC,CAAC;QACL,CAAC;KACF,CAAC,EAAE,OAAO,CAAC,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAwD,EAAE,OAAyB;IAC3G,IAAI,OAAO,CAAC,WAAW;QAAE,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACtE,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS;QAAE,UAAU,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAC1F,OAAO,UAA4B,CAAC;AACtC,CAAC"}
|
package/dist/util.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { JsonObject, JsonValue } from "@assemblyline-agents/core";
|
|
2
|
+
import type { ChannelDelivery, ChannelTurn } from "@assemblyline-agents/runtime";
|
|
3
|
+
export interface TeamsDestination {
|
|
4
|
+
serviceUrl?: string;
|
|
5
|
+
conversationId?: string;
|
|
6
|
+
activityId?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function teamsDestinationFromDelivery(delivery: ChannelDelivery): TeamsDestination;
|
|
9
|
+
export declare function teamsDestinationFromTurn(turn: ChannelTurn): TeamsDestination;
|
|
10
|
+
export declare function adaptiveCardAttachment(card: JsonObject): JsonObject;
|
|
11
|
+
export declare function sanitizeTeamsText(value: string): string;
|
|
12
|
+
export declare function teamsAttachments(activity: JsonObject): JsonObject[];
|
|
13
|
+
export declare function truncate(value: string, maxChars: number): string;
|
|
14
|
+
export declare function stringValue(value: unknown): string | undefined;
|
|
15
|
+
export declare function recordValue(value: unknown): JsonObject | undefined;
|
|
16
|
+
export declare function compactJsonObject(input: Record<string, unknown>): JsonObject;
|
|
17
|
+
export declare function safeJson(value: unknown): JsonValue;
|
|
18
|
+
export declare function parseJson(response: Response): Promise<unknown>;
|
|
19
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEjF,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,eAAe,GAAG,gBAAgB,CAExF;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,WAAW,GAAG,gBAAgB,CAE5E;AAaD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAKnE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,EAAE,CA4BnE;AASD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAE9D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAElE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAM5E;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CASlD;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAQpE"}
|
package/dist/util.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
export function teamsDestinationFromDelivery(delivery) {
|
|
2
|
+
return teamsDestinationFromRecord(recordValue(delivery.turn?.delivery) ?? recordValue(delivery.payload.delivery));
|
|
3
|
+
}
|
|
4
|
+
export function teamsDestinationFromTurn(turn) {
|
|
5
|
+
return teamsDestinationFromRecord(recordValue(turn.delivery));
|
|
6
|
+
}
|
|
7
|
+
function teamsDestinationFromRecord(target) {
|
|
8
|
+
const destination = {};
|
|
9
|
+
const serviceUrl = stringValue(target?.serviceUrl);
|
|
10
|
+
const conversationId = stringValue(target?.conversationId);
|
|
11
|
+
const activityId = stringValue(target?.activityId);
|
|
12
|
+
if (serviceUrl)
|
|
13
|
+
destination.serviceUrl = serviceUrl;
|
|
14
|
+
if (conversationId)
|
|
15
|
+
destination.conversationId = conversationId;
|
|
16
|
+
if (activityId)
|
|
17
|
+
destination.activityId = activityId;
|
|
18
|
+
return destination;
|
|
19
|
+
}
|
|
20
|
+
export function adaptiveCardAttachment(card) {
|
|
21
|
+
return {
|
|
22
|
+
contentType: "application/vnd.microsoft.card.adaptive",
|
|
23
|
+
content: card
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function sanitizeTeamsText(value) {
|
|
27
|
+
return value.replace(/<at>.*?<\/at>/giu, "").replace(/<[^>]+>/gu, "").trim();
|
|
28
|
+
}
|
|
29
|
+
export function teamsAttachments(activity) {
|
|
30
|
+
const values = Array.isArray(activity.attachments) ? activity.attachments : [];
|
|
31
|
+
return values.flatMap((value, index) => {
|
|
32
|
+
const record = recordValue(value);
|
|
33
|
+
if (!record)
|
|
34
|
+
return [];
|
|
35
|
+
const contentType = stringValue(record.contentType) || stringValue(record.content_type) || "application/octet-stream";
|
|
36
|
+
const name = stringValue(record.name) || stringValue(record.filename) || `teams-attachment-${index + 1}`;
|
|
37
|
+
const contentUrl = stringValue(record.contentUrl) || stringValue(record.content_url);
|
|
38
|
+
const attachment = compactJsonObject({
|
|
39
|
+
provider: "microsoft-teams",
|
|
40
|
+
id: stringValue(record.id) || `${stringValue(activity.id)}:${index + 1}`,
|
|
41
|
+
kind: teamsAttachmentKind(contentType),
|
|
42
|
+
name,
|
|
43
|
+
filename: name,
|
|
44
|
+
contentType,
|
|
45
|
+
mimeType: contentType,
|
|
46
|
+
contentUrl,
|
|
47
|
+
size: typeof record.size === "number" ? record.size : undefined
|
|
48
|
+
});
|
|
49
|
+
if (contentUrl)
|
|
50
|
+
attachment.remote = compactJsonObject({
|
|
51
|
+
provider: "microsoft-teams",
|
|
52
|
+
auth: "teams",
|
|
53
|
+
trusted: true,
|
|
54
|
+
url: contentUrl,
|
|
55
|
+
serviceUrl: stringValue(activity.serviceUrl)
|
|
56
|
+
});
|
|
57
|
+
return [attachment];
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function teamsAttachmentKind(contentType) {
|
|
61
|
+
if (contentType.startsWith("image/"))
|
|
62
|
+
return "image";
|
|
63
|
+
if (contentType.startsWith("audio/"))
|
|
64
|
+
return "audio";
|
|
65
|
+
if (contentType.startsWith("video/"))
|
|
66
|
+
return "video";
|
|
67
|
+
return "file";
|
|
68
|
+
}
|
|
69
|
+
export function truncate(value, maxChars) {
|
|
70
|
+
if (value.length <= maxChars)
|
|
71
|
+
return value;
|
|
72
|
+
return `${value.slice(0, Math.max(0, maxChars - 1))}...`;
|
|
73
|
+
}
|
|
74
|
+
export function stringValue(value) {
|
|
75
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
76
|
+
}
|
|
77
|
+
export function recordValue(value) {
|
|
78
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value)) ? value : undefined;
|
|
79
|
+
}
|
|
80
|
+
export function compactJsonObject(input) {
|
|
81
|
+
const out = {};
|
|
82
|
+
for (const [key, value] of Object.entries(input)) {
|
|
83
|
+
if (value !== undefined)
|
|
84
|
+
out[key] = safeJson(value);
|
|
85
|
+
}
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
export function safeJson(value) {
|
|
89
|
+
if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean")
|
|
90
|
+
return value;
|
|
91
|
+
if (Array.isArray(value))
|
|
92
|
+
return value.map(safeJson);
|
|
93
|
+
if (value && typeof value === "object") {
|
|
94
|
+
const out = {};
|
|
95
|
+
for (const [key, child] of Object.entries(value))
|
|
96
|
+
out[key] = safeJson(child);
|
|
97
|
+
return out;
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
export async function parseJson(response) {
|
|
102
|
+
const text = await response.text();
|
|
103
|
+
if (!text)
|
|
104
|
+
return {};
|
|
105
|
+
try {
|
|
106
|
+
return JSON.parse(text);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return { text };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@assemblyline-agents/teams",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": {
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"default": "./dist/index.js"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@assemblyline-agents/runtime": "0.1.0",
|
|
13
|
+
"@assemblyline-agents/core": "0.1.0"
|
|
14
|
+
},
|
|
15
|
+
"description": "Official OpenEve Microsoft Teams channel and Bot Framework connection plugin.",
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=22.19.0"
|
|
21
|
+
},
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "git+https://github.com/jasonbadeaux/openeve.git",
|
|
26
|
+
"directory": "packages/teams"
|
|
27
|
+
},
|
|
28
|
+
"bugs": {
|
|
29
|
+
"url": "https://github.com/jasonbadeaux/openeve/issues"
|
|
30
|
+
},
|
|
31
|
+
"homepage": "https://github.com/jasonbadeaux/openeve#readme",
|
|
32
|
+
"author": "OpenEve contributors",
|
|
33
|
+
"keywords": [
|
|
34
|
+
"openeve",
|
|
35
|
+
"ai",
|
|
36
|
+
"agents",
|
|
37
|
+
"microsoft-teams",
|
|
38
|
+
"channel",
|
|
39
|
+
"bot-framework",
|
|
40
|
+
"plugin"
|
|
41
|
+
],
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsc -p tsconfig.json",
|
|
47
|
+
"check": "tsc -p tsconfig.json --noEmit"
|
|
48
|
+
}
|
|
49
|
+
}
|