@arbium/enterprise-agent-connect 0.1.1 → 0.1.2-dev.cba5f68
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -12
- package/dist/connectors/dell-techdirect/index.d.ts +8 -0
- package/dist/connectors/dell-techdirect/tools.d.ts +2 -0
- package/dist/connectors/dell-techdirect/vendor.d.ts +6 -0
- package/dist/connectors/dynamics-365/connector.json +228 -0
- package/dist/connectors/dynamics-365/index.d.ts +8 -0
- package/dist/connectors/dynamics-365/index.js +10 -0
- package/dist/connectors/dynamics-365/index.js.map +1 -0
- package/dist/connectors/dynamics-365/tools.d.ts +35 -0
- package/dist/connectors/dynamics-365/tools.js +806 -0
- package/dist/connectors/dynamics-365/tools.js.map +1 -0
- package/dist/connectors/dynamics-365/vendor.d.ts +9 -0
- package/dist/connectors/dynamics-365/vendor.js +110 -0
- package/dist/connectors/dynamics-365/vendor.js.map +1 -0
- package/dist/connectors/entra/index.d.ts +2 -0
- package/dist/connectors/entra/tools.d.ts +14 -0
- package/dist/connectors/fedex/index.d.ts +8 -0
- package/dist/connectors/fedex/tools.d.ts +3 -0
- package/dist/connectors/fedex/vendor.d.ts +7 -0
- package/dist/connectors/gong/connector.json +127 -0
- package/dist/connectors/gong/index.d.ts +8 -0
- package/dist/connectors/gong/index.js +7 -0
- package/dist/connectors/gong/index.js.map +1 -0
- package/dist/connectors/gong/tools.d.ts +8 -0
- package/dist/connectors/gong/tools.js +424 -0
- package/dist/connectors/gong/tools.js.map +1 -0
- package/dist/connectors/gong/vendor.d.ts +4 -0
- package/dist/connectors/gong/vendor.js +89 -0
- package/dist/connectors/gong/vendor.js.map +1 -0
- package/dist/connectors/http/index.d.ts +34 -0
- package/dist/connectors/http/index.js +154 -64
- package/dist/connectors/http/index.js.map +1 -1
- package/dist/connectors/intune/index.d.ts +2 -0
- package/dist/connectors/intune/tools.d.ts +12 -0
- package/dist/connectors/jamf/connector.json +182 -0
- package/dist/connectors/jamf/index.d.ts +8 -0
- package/dist/connectors/jamf/index.js +7 -0
- package/dist/connectors/jamf/index.js.map +1 -0
- package/dist/connectors/jamf/tools.d.ts +7 -0
- package/dist/connectors/jamf/tools.js +659 -0
- package/dist/connectors/jamf/tools.js.map +1 -0
- package/dist/connectors/jamf/vendor.d.ts +5 -0
- package/dist/connectors/jamf/vendor.js +70 -0
- package/dist/connectors/jamf/vendor.js.map +1 -0
- package/dist/connectors/jira/connector.json +144 -1
- package/dist/connectors/jira/index.d.ts +8 -0
- package/dist/connectors/jira/jql.d.ts +4 -0
- package/dist/connectors/jira/tools.d.ts +3 -0
- package/dist/connectors/jira/vendor.d.ts +3 -0
- package/dist/connectors/jira/vendor.js +8 -2
- package/dist/connectors/jira/vendor.js.map +1 -1
- package/dist/connectors/microsoft/client.d.ts +66 -0
- package/dist/connectors/microsoft/client.js +26 -8
- package/dist/connectors/microsoft/client.js.map +1 -1
- package/dist/connectors/netsuite/connector.json +317 -0
- package/dist/connectors/netsuite/index.d.ts +8 -0
- package/dist/connectors/netsuite/index.js +7 -0
- package/dist/connectors/netsuite/index.js.map +1 -0
- package/dist/connectors/netsuite/tools.d.ts +24 -0
- package/dist/connectors/netsuite/tools.js +447 -0
- package/dist/connectors/netsuite/tools.js.map +1 -0
- package/dist/connectors/netsuite/vendor.d.ts +26 -0
- package/dist/connectors/netsuite/vendor.js +247 -0
- package/dist/connectors/netsuite/vendor.js.map +1 -0
- package/dist/connectors/odata/index.d.ts +33 -0
- package/dist/connectors/odata/index.js +460 -0
- package/dist/connectors/odata/index.js.map +1 -0
- package/dist/connectors/okta/connector.json +194 -0
- package/dist/connectors/okta/index.d.ts +8 -0
- package/dist/connectors/okta/index.js +7 -0
- package/dist/connectors/okta/index.js.map +1 -0
- package/dist/connectors/okta/tools.d.ts +6 -0
- package/dist/connectors/okta/tools.js +429 -0
- package/dist/connectors/okta/tools.js.map +1 -0
- package/dist/connectors/okta/vendor.d.ts +14 -0
- package/dist/connectors/okta/vendor.js +204 -0
- package/dist/connectors/okta/vendor.js.map +1 -0
- package/dist/connectors/outlook-calendar/index.d.ts +2 -0
- package/dist/connectors/outlook-calendar/tools.d.ts +65 -0
- package/dist/connectors/outlook-mail/index.d.ts +2 -0
- package/dist/connectors/outlook-mail/tools.d.ts +8 -0
- package/dist/connectors/salesforce/index.d.ts +8 -0
- package/dist/connectors/salesforce/soql.d.ts +3 -0
- package/dist/connectors/salesforce/tools.d.ts +9 -0
- package/dist/connectors/salesforce/vendor.d.ts +3 -0
- package/dist/connectors/salesforce/vendor.js +9 -3
- package/dist/connectors/salesforce/vendor.js.map +1 -1
- package/dist/connectors/sap-s4hana/connector.json +264 -0
- package/dist/connectors/sap-s4hana/index.d.ts +8 -0
- package/dist/connectors/sap-s4hana/index.js +7 -0
- package/dist/connectors/sap-s4hana/index.js.map +1 -0
- package/dist/connectors/sap-s4hana/tools.d.ts +4 -0
- package/dist/connectors/sap-s4hana/tools.js +761 -0
- package/dist/connectors/sap-s4hana/tools.js.map +1 -0
- package/dist/connectors/sap-s4hana/vendor.d.ts +5 -0
- package/dist/connectors/sap-s4hana/vendor.js +176 -0
- package/dist/connectors/sap-s4hana/vendor.js.map +1 -0
- package/dist/connectors/servicenow/connector.json +228 -0
- package/dist/connectors/servicenow/index.d.ts +8 -0
- package/dist/connectors/servicenow/index.js +7 -0
- package/dist/connectors/servicenow/index.js.map +1 -0
- package/dist/connectors/servicenow/tools.d.ts +4 -0
- package/dist/connectors/servicenow/tools.js +884 -0
- package/dist/connectors/servicenow/tools.js.map +1 -0
- package/dist/connectors/servicenow/vendor.d.ts +3 -0
- package/dist/connectors/servicenow/vendor.js +106 -0
- package/dist/connectors/servicenow/vendor.js.map +1 -0
- package/dist/connectors/sharepoint-files/excel.d.ts +16 -0
- package/dist/connectors/sharepoint-files/index.d.ts +8 -0
- package/dist/connectors/sharepoint-files/index.js.map +1 -1
- package/dist/connectors/sharepoint-files/tools.d.ts +52 -0
- package/dist/connectors/sharepoint-files/vendor.d.ts +11 -0
- package/dist/connectors/slack/connector.json +148 -0
- package/dist/connectors/slack/index.d.ts +8 -0
- package/dist/connectors/slack/index.js +7 -0
- package/dist/connectors/slack/index.js.map +1 -0
- package/dist/connectors/slack/tools.d.ts +3 -0
- package/dist/connectors/slack/tools.js +355 -0
- package/dist/connectors/slack/tools.js.map +1 -0
- package/dist/connectors/slack/vendor.d.ts +17 -0
- package/dist/connectors/slack/vendor.js +189 -0
- package/dist/connectors/slack/vendor.js.map +1 -0
- package/dist/connectors/soap/index.d.ts +16 -0
- package/dist/connectors/soap/index.js +248 -0
- package/dist/connectors/soap/index.js.map +1 -0
- package/dist/connectors/soap/xml.d.ts +12 -0
- package/dist/connectors/soap/xml.js +126 -0
- package/dist/connectors/soap/xml.js.map +1 -0
- package/dist/connectors/sql/engines.d.ts +58 -0
- package/dist/connectors/sql/engines.js +292 -0
- package/dist/connectors/sql/engines.js.map +1 -0
- package/dist/connectors/sql/index.d.ts +16 -0
- package/dist/connectors/sql/index.js +214 -0
- package/dist/connectors/sql/index.js.map +1 -0
- package/dist/connectors/teams/index.d.ts +2 -0
- package/dist/connectors/teams/tools.d.ts +7 -0
- package/dist/connectors/teams/tools.js +3 -2
- package/dist/connectors/teams/tools.js.map +1 -1
- package/dist/connectors/workday/connector.json +188 -0
- package/dist/connectors/workday/index.d.ts +8 -0
- package/dist/connectors/workday/index.js +7 -0
- package/dist/connectors/workday/index.js.map +1 -0
- package/dist/connectors/workday/tools.d.ts +33 -0
- package/dist/connectors/workday/tools.js +410 -0
- package/dist/connectors/workday/tools.js.map +1 -0
- package/dist/connectors/workday/vendor.d.ts +18 -0
- package/dist/connectors/workday/vendor.js +199 -0
- package/dist/connectors/workday/vendor.js.map +1 -0
- package/dist/packages/connector-kit/src/branding.d.ts +57 -0
- package/dist/packages/connector-kit/src/certificate.d.ts +19 -0
- package/dist/packages/connector-kit/src/common.d.ts +36 -0
- package/dist/packages/connector-kit/src/common.js +4 -1
- package/dist/packages/connector-kit/src/common.js.map +1 -1
- package/dist/packages/connector-kit/src/connector.d.ts +1356 -0
- package/dist/packages/connector-kit/src/connector.js +632 -53
- package/dist/packages/connector-kit/src/connector.js.map +1 -1
- package/dist/packages/connector-kit/src/fetch.d.ts +6 -0
- package/dist/packages/connector-kit/src/fetch.js +44 -0
- package/dist/packages/connector-kit/src/fetch.js.map +1 -0
- package/dist/packages/connector-kit/src/index.d.ts +5 -0
- package/dist/packages/connector-kit/src/index.js +6 -0
- package/dist/packages/connector-kit/src/index.js.map +1 -0
- package/dist/packages/connector-kit/src/oauth.d.ts +15 -0
- package/dist/packages/connector-kit/src/oauth.js +25 -6
- package/dist/packages/connector-kit/src/oauth.js.map +1 -1
- package/dist/packages/connector-kit/src/types.d.ts +87 -0
- package/dist/packages/connector-kit/src/types.js.map +1 -1
- package/dist/packages/server/migrations/0007_app_events.sql +110 -0
- package/dist/packages/server/migrations/rollback/to-legacy.sql +3 -0
- package/dist/packages/server/src/api.d.ts +3730 -0
- package/dist/packages/server/src/api.js +137 -1
- package/dist/packages/server/src/api.js.map +1 -1
- package/dist/packages/server/src/app.d.ts +23 -0
- package/dist/packages/server/src/app.js +24 -1
- package/dist/packages/server/src/app.js.map +1 -1
- package/dist/packages/server/src/builtin.d.ts +5 -0
- package/dist/packages/server/src/builtin.js +18 -0
- package/dist/packages/server/src/builtin.js.map +1 -1
- package/dist/packages/server/src/consent.d.ts +27 -0
- package/dist/packages/server/src/events/admin.d.ts +156 -0
- package/dist/packages/server/src/events/admin.js +255 -0
- package/dist/packages/server/src/events/admin.js.map +1 -0
- package/dist/packages/server/src/events/deliver.d.ts +43 -0
- package/dist/packages/server/src/events/deliver.js +129 -0
- package/dist/packages/server/src/events/deliver.js.map +1 -0
- package/dist/packages/server/src/events/runtime.d.ts +28 -0
- package/dist/packages/server/src/events/runtime.js +397 -0
- package/dist/packages/server/src/events/runtime.js.map +1 -0
- package/dist/packages/server/src/events/store.d.ts +172 -0
- package/dist/packages/server/src/events/store.js +275 -0
- package/dist/packages/server/src/events/store.js.map +1 -0
- package/dist/packages/server/src/index.d.ts +40 -0
- package/dist/packages/server/src/index.js +68 -11
- package/dist/packages/server/src/index.js.map +1 -1
- package/dist/packages/server/src/migrate.d.ts +11 -0
- package/dist/packages/server/src/openapi.d.ts +4 -0
- package/dist/packages/server/src/openapi.js +2 -2
- package/dist/packages/server/src/openapi.js.map +1 -1
- package/dist/packages/server/src/queue.d.ts +10 -0
- package/dist/packages/server/src/queue.js +45 -0
- package/dist/packages/server/src/queue.js.map +1 -0
- package/dist/packages/server/src/secrets.d.ts +19 -0
- package/dist/packages/server/src/server.d.ts +1 -0
- package/dist/packages/server/src/server.js +14 -1
- package/dist/packages/server/src/server.js.map +1 -1
- package/dist/packages/server/src/service.d.ts +767 -0
- package/dist/packages/server/src/service.js +19 -3
- package/dist/packages/server/src/service.js.map +1 -1
- package/dist/packages/server/src/store.d.ts +157 -0
- package/dist/packages/server/src/store.js +4 -0
- package/dist/packages/server/src/store.js.map +1 -1
- package/dist/packages/server/src/teams/activity.d.ts +123 -0
- package/dist/packages/server/src/teams/activity.js +6 -5
- package/dist/packages/server/src/teams/activity.js.map +1 -1
- package/dist/packages/server/src/teams/admin.d.ts +335 -0
- package/dist/packages/server/src/teams/admin.js +1 -1
- package/dist/packages/server/src/teams/admin.js.map +1 -1
- package/dist/packages/server/src/teams/approval.d.ts +57 -0
- package/dist/packages/server/src/teams/bot.d.ts +25 -0
- package/dist/packages/server/src/teams/claude.d.ts +46 -0
- package/dist/packages/server/src/teams/jwt.d.ts +17 -0
- package/dist/packages/server/src/teams/package.d.ts +79 -0
- package/dist/packages/server/src/teams/provision.d.ts +84 -0
- package/dist/packages/server/src/teams/runner.d.ts +80 -0
- package/dist/packages/server/src/teams/runner.js +50 -6
- package/dist/packages/server/src/teams/runner.js.map +1 -1
- package/dist/packages/server/src/teams/runtime.d.ts +91 -0
- package/dist/packages/server/src/teams/runtime.js +25 -47
- package/dist/packages/server/src/teams/runtime.js.map +1 -1
- package/dist/packages/server/src/teams/store.d.ts +233 -0
- package/package.json +28 -2
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type Fetch, type VendorResponse } from "../../../connector-kit/src/types.js";
|
|
2
|
+
export declare const BOT_CONNECTOR_SCOPE = "https://api.botframework.com/.default";
|
|
3
|
+
export type BotCredential = {
|
|
4
|
+
botAppId: string;
|
|
5
|
+
tenantId: string;
|
|
6
|
+
certificate: string;
|
|
7
|
+
privateKey: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function validServiceUrl(url: unknown): url is string;
|
|
10
|
+
export declare function botClient(fetchImpl?: Fetch, sleep?: (ms: number) => Promise<unknown>): {
|
|
11
|
+
/** Signs in once, without caching: proves a bot's app id and certificate, and that the
|
|
12
|
+
* app has no organization-wide Microsoft Graph permissions (a bot reads only where it was
|
|
13
|
+
* added, by resource-specific consent). */
|
|
14
|
+
prove(bot: BotCredential): Promise<void>;
|
|
15
|
+
/** A Bot Connector call at a conversation's service address, retried on Microsoft's
|
|
16
|
+
* throttling answers. */
|
|
17
|
+
connector(bot: BotCredential, serviceUrl: string, request: {
|
|
18
|
+
method: "GET" | "POST" | "PUT";
|
|
19
|
+
path: string;
|
|
20
|
+
body?: unknown;
|
|
21
|
+
}): Promise<VendorResponse>;
|
|
22
|
+
/** A Graph read with the bot's own token. */
|
|
23
|
+
graph(bot: BotCredential, path: string): Promise<VendorResponse>;
|
|
24
|
+
};
|
|
25
|
+
export type BotClient = ReturnType<typeof botClient>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export type SessionState = {
|
|
2
|
+
status: "rescheduling" | "running" | "idle" | "terminated";
|
|
3
|
+
costCents: number | null;
|
|
4
|
+
atBudget: boolean;
|
|
5
|
+
};
|
|
6
|
+
export type Claude = {
|
|
7
|
+
listAgents(): Promise<{
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
}[]>;
|
|
11
|
+
agent(id: string): Promise<{
|
|
12
|
+
mcpUrls: string[];
|
|
13
|
+
} | null>;
|
|
14
|
+
environmentExists(id: string): Promise<boolean>;
|
|
15
|
+
vault(id: string): Promise<{
|
|
16
|
+
allUrls: string[];
|
|
17
|
+
bearerUrls: string[];
|
|
18
|
+
} | null>;
|
|
19
|
+
createSession(input: {
|
|
20
|
+
agentId: string;
|
|
21
|
+
environmentId: string;
|
|
22
|
+
vaultIds: string[];
|
|
23
|
+
budgetCents: number;
|
|
24
|
+
metadata: Record<string, string>;
|
|
25
|
+
text: string;
|
|
26
|
+
}): Promise<string>;
|
|
27
|
+
sendMessage(sessionId: string, text: string, budgetCents: number): Promise<void>;
|
|
28
|
+
session(sessionId: string): Promise<SessionState | null>;
|
|
29
|
+
interrupt(sessionId: string): Promise<void>;
|
|
30
|
+
};
|
|
31
|
+
export type ClaudeFactory = (apiKey: string) => Claude;
|
|
32
|
+
/** The MCP address that takes only this agent's key (the shared /mcp takes any agent's). */
|
|
33
|
+
export declare const agentMcpUrl: (base: string, agentId: string) => string;
|
|
34
|
+
/** Whether a URL is this agent's own MCP address, another address of this service that takes
|
|
35
|
+
* an agent key (the shared /mcp, another agent's, or any with a query or fragment), or not
|
|
36
|
+
* this service's. Parsed, so a default port, dot segments and case do not hide one. */
|
|
37
|
+
export declare function serviceAddress(base: string, agentId: string): (url: string) => "own" | "other" | null;
|
|
38
|
+
/** A trigger's Claude agent answers Teams only through this agent's own MCP address, and its
|
|
39
|
+
* vaults hold this agent's key and no other address of this service: otherwise whoever the
|
|
40
|
+
* trigger admits would act under another key's grants. Checked when the trigger is saved and
|
|
41
|
+
* again before each answer, since both can be edited in Claude's console afterwards. */
|
|
42
|
+
export declare function verifyTrigger(claude: Claude, base: string, agentId: string, trigger: {
|
|
43
|
+
managedAgentId: string;
|
|
44
|
+
vaultIds: string[];
|
|
45
|
+
}): Promise<void>;
|
|
46
|
+
export declare const claudeClient: ClaudeFactory;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Fetch } from "../../../connector-kit/src/types.js";
|
|
2
|
+
export declare const BOT_ISSUER = "https://api.botframework.com";
|
|
3
|
+
export declare class Unauthorized extends Error {
|
|
4
|
+
}
|
|
5
|
+
export declare function botFrameworkAuth(fetchImpl?: Fetch, now?: () => number): {
|
|
6
|
+
token: (authorization: string | null, appId: string) => Promise<(activity: {
|
|
7
|
+
serviceUrl: string;
|
|
8
|
+
channelId: string;
|
|
9
|
+
}) => void>;
|
|
10
|
+
/** Both checks at once: the token, then the activity it came with. */
|
|
11
|
+
verify(authorization: string | null, expect: {
|
|
12
|
+
appId: string;
|
|
13
|
+
serviceUrl: string;
|
|
14
|
+
channelId: string;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
};
|
|
17
|
+
export type BotAuth = ReturnType<typeof botFrameworkAuth>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export declare const MANIFEST_VERSION = "1.24";
|
|
2
|
+
export declare const RSC_PERMISSIONS: string[];
|
|
3
|
+
export type PackageInput = {
|
|
4
|
+
displayName: string;
|
|
5
|
+
teamsAppId: string;
|
|
6
|
+
botAppId: string;
|
|
7
|
+
manifestVersion: number;
|
|
8
|
+
publicUrl: string;
|
|
9
|
+
};
|
|
10
|
+
export declare function manifest(input: PackageInput): {
|
|
11
|
+
$schema: string;
|
|
12
|
+
manifestVersion: string;
|
|
13
|
+
version: string;
|
|
14
|
+
id: string;
|
|
15
|
+
developer: {
|
|
16
|
+
name: string;
|
|
17
|
+
websiteUrl: string;
|
|
18
|
+
privacyUrl: string;
|
|
19
|
+
termsOfUseUrl: string;
|
|
20
|
+
};
|
|
21
|
+
name: {
|
|
22
|
+
short: string;
|
|
23
|
+
full: string;
|
|
24
|
+
};
|
|
25
|
+
description: {
|
|
26
|
+
short: string;
|
|
27
|
+
full: string;
|
|
28
|
+
};
|
|
29
|
+
icons: {
|
|
30
|
+
color: string;
|
|
31
|
+
outline: string;
|
|
32
|
+
};
|
|
33
|
+
accentColor: string;
|
|
34
|
+
bots: {
|
|
35
|
+
botId: string;
|
|
36
|
+
scopes: string[];
|
|
37
|
+
isNotificationOnly: boolean;
|
|
38
|
+
supportsFiles: boolean;
|
|
39
|
+
}[];
|
|
40
|
+
webApplicationInfo: {
|
|
41
|
+
id: string;
|
|
42
|
+
resource: string;
|
|
43
|
+
};
|
|
44
|
+
authorization: {
|
|
45
|
+
permissions: {
|
|
46
|
+
resourceSpecific: {
|
|
47
|
+
name: string;
|
|
48
|
+
type: string;
|
|
49
|
+
}[];
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
export declare function packageZip(input: PackageInput): Buffer;
|
|
54
|
+
/** Up to two characters: the first letters of the first two words, else "AI". */
|
|
55
|
+
export declare function initials(name: string): string;
|
|
56
|
+
/** 192×192, the initials in white on the agent's color. */
|
|
57
|
+
export declare function colorIcon(name: string): Buffer;
|
|
58
|
+
/** 32×32, only white and transparent pixels, as Teams requires. */
|
|
59
|
+
export declare function outlineIcon(name: string): Buffer;
|
|
60
|
+
/** One PowerShell script that creates the agent's bot in the customer's tenant: app
|
|
61
|
+
* registration with the service's certificate, Azure Bot with the Teams channel, and the
|
|
62
|
+
* Teams app in the organization's catalog. The admin pastes the printed application ID back. */
|
|
63
|
+
export declare function setupScript(input: {
|
|
64
|
+
/** The bot's row id: its app registration's unique name, as Add to Teams names it. */
|
|
65
|
+
botId: string;
|
|
66
|
+
displayName: string;
|
|
67
|
+
teamsAppId: string;
|
|
68
|
+
tenantId: string;
|
|
69
|
+
certificate: string;
|
|
70
|
+
publicUrl: string;
|
|
71
|
+
}): string;
|
|
72
|
+
/** What removes the bot from the customer's tenant again. `catalogOnly`: the service already
|
|
73
|
+
* deleted the rest, so only the Teams app (which needs a signed-in administrator) is left. */
|
|
74
|
+
export declare function removalScript(input: {
|
|
75
|
+
botId: string;
|
|
76
|
+
botAppId: string | null;
|
|
77
|
+
teamsAppId: string;
|
|
78
|
+
catalogOnly?: boolean;
|
|
79
|
+
}): string;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { ConnectError, type Fetch, type VendorRequest, type VendorResponse } from "../../../connector-kit/src/types.js";
|
|
2
|
+
export declare const ARM = "https://management.azure.com";
|
|
3
|
+
export declare const CATALOG_SCOPE = "https://graph.microsoft.com/AppCatalog.ReadWrite.All";
|
|
4
|
+
/** The live checks the Teams page's set-up-once steps name (`live` in connectors/teams.json). */
|
|
5
|
+
export declare const LIVE_CHECKS: readonly ["azure-target", "azure-role"];
|
|
6
|
+
export type Call = (request: VendorRequest, origin?: string) => Promise<VendorResponse>;
|
|
7
|
+
export type StepState = {
|
|
8
|
+
id: "app" | "principal" | "azureBot" | "channel" | "signIn";
|
|
9
|
+
label: string;
|
|
10
|
+
state: "done" | "failed" | "waiting" | "todo";
|
|
11
|
+
message?: string;
|
|
12
|
+
};
|
|
13
|
+
export type AzureTarget = {
|
|
14
|
+
subscriptionId: string;
|
|
15
|
+
resourceGroup: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function azureTarget(config: Record<string, string>): AzureTarget | null;
|
|
18
|
+
export declare const azureBotName: (botAppId: string) => string;
|
|
19
|
+
/** A Graph refusal in plain words. A missing permission names it. */
|
|
20
|
+
export declare function graphFailure(res: VendorResponse, what: string, permission: string): ConnectError;
|
|
21
|
+
/** An Azure Resource Manager refusal in plain words. */
|
|
22
|
+
export declare function armFailure(res: VendorResponse, target: AzureTarget, what: string, onRoleStep?: boolean): ConnectError;
|
|
23
|
+
export type ProvisionInput = {
|
|
24
|
+
call: Call;
|
|
25
|
+
bot: {
|
|
26
|
+
id: string;
|
|
27
|
+
displayName: string;
|
|
28
|
+
tenantId: string;
|
|
29
|
+
certificate: string;
|
|
30
|
+
};
|
|
31
|
+
config: Record<string, string>;
|
|
32
|
+
save: (config: Record<string, string>) => Promise<void>;
|
|
33
|
+
target: AzureTarget;
|
|
34
|
+
publicUrl: string;
|
|
35
|
+
prove: (botAppId: string) => Promise<void>;
|
|
36
|
+
sleep: (ms: number) => Promise<void>;
|
|
37
|
+
waits?: number[];
|
|
38
|
+
};
|
|
39
|
+
/** Makes the bot in the tenant, each part only if missing, so running it again finishes what
|
|
40
|
+
* an earlier try left. Steps after a failed one are left to do. */
|
|
41
|
+
export declare function provisionBot(input: ProvisionInput): Promise<{
|
|
42
|
+
steps: StepState[];
|
|
43
|
+
botAppId: string | null;
|
|
44
|
+
}>;
|
|
45
|
+
/** Removes what provisioning made: the Azure Bot and the app registration (which also ends
|
|
46
|
+
* its service principal). Each failure is returned in plain words, never dropped. The app
|
|
47
|
+
* registration is kept while its Azure Bot is: the removal script deletes a bot only when its
|
|
48
|
+
* app still carries the bot's unique name. */
|
|
49
|
+
export declare function deprovisionBot(call: Call, config: Record<string, string>): Promise<string[]>;
|
|
50
|
+
export type LiveCheck = {
|
|
51
|
+
state: "done" | "failing" | "todo";
|
|
52
|
+
message: string;
|
|
53
|
+
};
|
|
54
|
+
export declare function setupChecks(call: Call, config: Record<string, string>): Promise<Record<(typeof LIVE_CHECKS)[number], LiveCheck>>;
|
|
55
|
+
/** The id token's claims must be this connection's app, tenant and sign-in, by someone of the
|
|
56
|
+
* organization (a guest names another home in `idp`). */
|
|
57
|
+
export declare function checkSignIn(claims: Record<string, unknown>, expect: {
|
|
58
|
+
clientId: string;
|
|
59
|
+
tenantId: string;
|
|
60
|
+
nonce: string;
|
|
61
|
+
}, now?: number): void;
|
|
62
|
+
/** Publishes the package, or a new version of it, under the manifest id `externalId`. Finds the
|
|
63
|
+
* catalog app first, so publishing twice changes nothing. */
|
|
64
|
+
export declare function publishPackage(input: {
|
|
65
|
+
token: string;
|
|
66
|
+
externalId: string;
|
|
67
|
+
version: string;
|
|
68
|
+
zip: Buffer;
|
|
69
|
+
}, fetchImpl?: Fetch): Promise<{
|
|
70
|
+
catalogAppId: string;
|
|
71
|
+
changed: boolean;
|
|
72
|
+
}>;
|
|
73
|
+
export type InstallKind = "team" | "chat" | "person";
|
|
74
|
+
/** Adds the published app there, consenting to the package's resource-specific permissions
|
|
75
|
+
* (Microsoft requires exactly the package's list). Already there counts as added. */
|
|
76
|
+
export declare function installBot(call: Call, catalogAppId: string, kind: InstallKind, id: string): Promise<"added" | "already">;
|
|
77
|
+
/** Chat ids from a pasted Teams link or the id itself. */
|
|
78
|
+
export declare function chatIdFrom(raw: string): string | null;
|
|
79
|
+
/** Teams or people matching what the admin typed, for the picker. */
|
|
80
|
+
export declare function searchTargets(call: Call, kind: "team" | "person", rawQuery: string): Promise<{
|
|
81
|
+
id: string;
|
|
82
|
+
name: string;
|
|
83
|
+
detail: string | null;
|
|
84
|
+
}[]>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type CredentialKey } from "../secrets.js";
|
|
3
|
+
import { type Fetch } from "../../../connector-kit/src/types.js";
|
|
4
|
+
import { type ClaudeFactory, type SessionState } from "./claude.js";
|
|
5
|
+
import type { RunRow, TeamsStore, TriggerRow } from "./store.js";
|
|
6
|
+
export declare const CLAUDE_RUNNER = "claude-managed-agents";
|
|
7
|
+
export type RunnerContext = {
|
|
8
|
+
teams: Pick<TeamsStore, "claudeKey">;
|
|
9
|
+
key: CredentialKey;
|
|
10
|
+
publicUrl: string | null;
|
|
11
|
+
};
|
|
12
|
+
export type RunnerTrigger = Pick<TriggerRow, "agentId" | "runner" | "settings" | "managedAgentId" | "environmentId" | "vaultIds">;
|
|
13
|
+
export type RunInput = {
|
|
14
|
+
org: string;
|
|
15
|
+
agentId: string;
|
|
16
|
+
runId: string;
|
|
17
|
+
botId: string;
|
|
18
|
+
requestedBy: string;
|
|
19
|
+
text: string;
|
|
20
|
+
replyToken: string;
|
|
21
|
+
budgetCents: number;
|
|
22
|
+
trigger: TriggerRow;
|
|
23
|
+
secret: string | null;
|
|
24
|
+
};
|
|
25
|
+
export type EventRunInput = {
|
|
26
|
+
org: string;
|
|
27
|
+
agentId: string;
|
|
28
|
+
runId: string;
|
|
29
|
+
text: string;
|
|
30
|
+
budgetCents: number;
|
|
31
|
+
trigger: RunnerTrigger;
|
|
32
|
+
secret: string | null;
|
|
33
|
+
event: {
|
|
34
|
+
app: string;
|
|
35
|
+
type: string;
|
|
36
|
+
deliveryId: string;
|
|
37
|
+
data: Record<string, unknown>;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
export type RunnerRun = Pick<RunRow, "sessionId" | "replyCount"> & {
|
|
41
|
+
awaitsReply?: boolean;
|
|
42
|
+
};
|
|
43
|
+
export type RunCounts = {
|
|
44
|
+
active: number;
|
|
45
|
+
lastHour: number;
|
|
46
|
+
spentToday: number;
|
|
47
|
+
};
|
|
48
|
+
export type Caps = Pick<TriggerRow, "budgetCents" | "maxRunsPerHour" | "maxCentsPerDay" | "maxConcurrent">;
|
|
49
|
+
/** The cap one more run would pass, or null: runs in the last hour, spending in 24 hours
|
|
50
|
+
* (what was spent plus every live run's budget), runs at once. */
|
|
51
|
+
export declare function capReached(counts: RunCounts, caps: Caps): "hour" | "day" | "concurrent" | null;
|
|
52
|
+
export interface TriggerRunner {
|
|
53
|
+
id: string;
|
|
54
|
+
settings: z.ZodType<Record<string, unknown>>;
|
|
55
|
+
unready(org: string): Promise<string | null>;
|
|
56
|
+
verify(trigger: RunnerTrigger, org: string, secret: string | null, when: "save" | "answer"): Promise<void>;
|
|
57
|
+
start(input: RunInput): Promise<string>;
|
|
58
|
+
startEvent?(input: EventRunInput): Promise<string>;
|
|
59
|
+
continue(sessionId: string, input: RunInput): Promise<void>;
|
|
60
|
+
state(run: RunnerRun, org: string): Promise<SessionState | {
|
|
61
|
+
gone: string;
|
|
62
|
+
}>;
|
|
63
|
+
stop(sessionId: string, org: string): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
export type RunnerFactory = (ctx: RunnerContext) => TriggerRunner;
|
|
66
|
+
export declare const triggerAad: (org: string, agentId: string) => string;
|
|
67
|
+
/** The trigger's signing secret, opened, or null when it has none. */
|
|
68
|
+
export declare function openTriggerSecret(key: CredentialKey, org: string, trigger: TriggerRow): string | null;
|
|
69
|
+
/** Claude Managed Agents with the organization's own Claude key (providers row anthropic). Its
|
|
70
|
+
* settings are the trigger's managedAgentId, environmentId and vaultIds. */
|
|
71
|
+
export declare const claudeManagedAgents: (claude?: ClaudeFactory) => RunnerFactory;
|
|
72
|
+
export declare const SIGNATURE_HEADER = "x-agent-connect-signature";
|
|
73
|
+
/** `t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<body>">`; receivers reject an old `t`. */
|
|
74
|
+
export declare function signature(secret: string, body: string, t?: number): string;
|
|
75
|
+
/** A signed POST of the message and its context to the trigger's `url`, for any agent
|
|
76
|
+
* framework. The receiver answers through MCP teams_reply with the reply token and this
|
|
77
|
+
* agent's own key, as a Claude agent does. It reports no cost; the trigger's caps still
|
|
78
|
+
* apply. A run is answered once a reply arrives, and stopped after the turn timeout. An app
|
|
79
|
+
* event is posted as `type: "event"` with its data and needs no reply: 2xx answers it. */
|
|
80
|
+
export declare const signedWebhook: (fetchImpl?: Fetch) => RunnerFactory;
|
|
@@ -5,10 +5,21 @@ import { credentialAad } from "../secrets.js";
|
|
|
5
5
|
import { InvalidInput } from "../service.js";
|
|
6
6
|
import { ConnectError } from "../../../connector-kit/src/types.js";
|
|
7
7
|
import { agentMcpUrl, claudeClient, verifyTrigger, } from "./claude.js";
|
|
8
|
-
// What answers a Teams message once the core decided it should be answered
|
|
9
|
-
//
|
|
10
|
-
// runtime.ts whatever the runner).
|
|
8
|
+
// What answers a Teams message, or an app's event, once the core decided it should be answered
|
|
9
|
+
// (who may ask, reply mode, the caps, the reply token and teams_reply stay in teams/runtime.ts;
|
|
10
|
+
// matching, limits and caps for events in events/runtime.ts, whatever the runner).
|
|
11
11
|
export const CLAUDE_RUNNER = "claude-managed-agents";
|
|
12
|
+
/** The cap one more run would pass, or null: runs in the last hour, spending in 24 hours
|
|
13
|
+
* (what was spent plus every live run's budget), runs at once. */
|
|
14
|
+
export function capReached(counts, caps) {
|
|
15
|
+
if (counts.lastHour >= caps.maxRunsPerHour)
|
|
16
|
+
return "hour";
|
|
17
|
+
if (counts.spentToday + caps.budgetCents * (counts.active + 1) > caps.maxCentsPerDay)
|
|
18
|
+
return "day";
|
|
19
|
+
if (counts.active >= caps.maxConcurrent)
|
|
20
|
+
return "concurrent";
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
12
23
|
export const triggerAad = (org, agentId) => credentialAad(org, `teams-trigger:${agentId}`);
|
|
13
24
|
/** The trigger's signing secret, opened, or null when it has none. */
|
|
14
25
|
export function openTriggerSecret(key, org, trigger) {
|
|
@@ -67,6 +78,22 @@ export const claudeManagedAgents = (claude = claudeClient) => (ctx) => {
|
|
|
67
78
|
text: input.text,
|
|
68
79
|
});
|
|
69
80
|
},
|
|
81
|
+
async startEvent(input) {
|
|
82
|
+
return (await need(input.org)).createSession({
|
|
83
|
+
agentId: input.trigger.managedAgentId,
|
|
84
|
+
environmentId: input.trigger.environmentId,
|
|
85
|
+
vaultIds: input.trigger.vaultIds,
|
|
86
|
+
budgetCents: input.budgetCents,
|
|
87
|
+
metadata: {
|
|
88
|
+
source: `${brand().resourcePrefix}-events`,
|
|
89
|
+
agent: input.agentId,
|
|
90
|
+
run: input.runId,
|
|
91
|
+
app: input.event.app,
|
|
92
|
+
event: input.event.type,
|
|
93
|
+
},
|
|
94
|
+
text: input.text,
|
|
95
|
+
});
|
|
96
|
+
},
|
|
70
97
|
async continue(sessionId, input) {
|
|
71
98
|
await (await need(input.org)).sendMessage(sessionId, input.text, input.budgetCents);
|
|
72
99
|
},
|
|
@@ -90,7 +117,8 @@ export function signature(secret, body, t = Math.floor(Date.now() / 1000)) {
|
|
|
90
117
|
/** A signed POST of the message and its context to the trigger's `url`, for any agent
|
|
91
118
|
* framework. The receiver answers through MCP teams_reply with the reply token and this
|
|
92
119
|
* agent's own key, as a Claude agent does. It reports no cost; the trigger's caps still
|
|
93
|
-
* apply. A run is answered once a reply arrives, and stopped after the turn timeout.
|
|
120
|
+
* apply. A run is answered once a reply arrives, and stopped after the turn timeout. An app
|
|
121
|
+
* event is posted as `type: "event"` with its data and needs no reply: 2xx answers it. */
|
|
94
122
|
export const signedWebhook = (fetchImpl = fetch) => (ctx) => {
|
|
95
123
|
async function post(trigger, secret, payload) {
|
|
96
124
|
if (!secret)
|
|
@@ -109,6 +137,7 @@ export const signedWebhook = (fetchImpl = fetch) => (ctx) => {
|
|
|
109
137
|
if (!res.ok)
|
|
110
138
|
throw new ConnectError(`The webhook answered ${res.status}`);
|
|
111
139
|
}
|
|
140
|
+
const mcpUrl = (agentId) => ctx.publicUrl ? agentMcpUrl(ctx.publicUrl, agentId) : null;
|
|
112
141
|
const message = (input) => ({
|
|
113
142
|
type: "message",
|
|
114
143
|
run: input.runId,
|
|
@@ -117,7 +146,7 @@ export const signedWebhook = (fetchImpl = fetch) => (ctx) => {
|
|
|
117
146
|
requestedBy: input.requestedBy,
|
|
118
147
|
text: input.text,
|
|
119
148
|
replyToken: input.replyToken,
|
|
120
|
-
mcpUrl:
|
|
149
|
+
mcpUrl: mcpUrl(input.agentId),
|
|
121
150
|
});
|
|
122
151
|
return {
|
|
123
152
|
id: "webhook",
|
|
@@ -131,11 +160,26 @@ export const signedWebhook = (fetchImpl = fetch) => (ctx) => {
|
|
|
131
160
|
await post(input.trigger, input.secret, message(input));
|
|
132
161
|
return `webhook:${input.runId}`;
|
|
133
162
|
},
|
|
163
|
+
async startEvent(input) {
|
|
164
|
+
await post(input.trigger, input.secret, {
|
|
165
|
+
type: "event",
|
|
166
|
+
run: input.runId,
|
|
167
|
+
agent: input.agentId,
|
|
168
|
+
app: input.event.app,
|
|
169
|
+
event: input.event.type,
|
|
170
|
+
deliveryId: input.event.deliveryId,
|
|
171
|
+
data: input.event.data,
|
|
172
|
+
text: input.text,
|
|
173
|
+
mcpUrl: mcpUrl(input.agentId),
|
|
174
|
+
});
|
|
175
|
+
return `webhook:${input.runId}`;
|
|
176
|
+
},
|
|
134
177
|
async continue(_sessionId, input) {
|
|
135
178
|
await post(input.trigger, input.secret, message(input));
|
|
136
179
|
},
|
|
137
180
|
async state(run) {
|
|
138
|
-
|
|
181
|
+
const answered = run.awaitsReply === false || run.replyCount > 0;
|
|
182
|
+
return { status: answered ? "idle" : "running", costCents: 0, atBudget: false };
|
|
139
183
|
},
|
|
140
184
|
async stop() { },
|
|
141
185
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../../packages/server/src/teams/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAsB,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAc,MAAM,qCAAqC,CAAC;AAC/E,OAAO,EACL,WAAW,EACX,YAAY,EACZ,aAAa,GAGd,MAAM,aAAa,CAAC;AAGrB,+FAA+F;AAC/F,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../../packages/server/src/teams/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { type Connector } from "../../../connector-kit/src/connector.js";
|
|
2
|
+
import { type CredentialKey } from "../secrets.js";
|
|
3
|
+
import type { Store } from "../store.js";
|
|
4
|
+
import { type VendorResponse } from "../../../connector-kit/src/types.js";
|
|
5
|
+
import { type ThreadMessage } from "./activity.js";
|
|
6
|
+
import { type ApprovalFact, type ApprovalRow } from "./approval.js";
|
|
7
|
+
import { type BotClient, type BotCredential } from "./bot.js";
|
|
8
|
+
import { type TriggerRunner } from "./runner.js";
|
|
9
|
+
import { type BotAuth } from "./jwt.js";
|
|
10
|
+
import type { BotRow, ConversationRow, RunRow, TeamsStore } from "./store.js";
|
|
11
|
+
/** The body as text, or null once it passes `max` bytes (read no further). */
|
|
12
|
+
export declare function readCapped(req: Request, max?: number): Promise<string | null>;
|
|
13
|
+
/** The body as sent (a signature covers these bytes), or null once it passes `max`. */
|
|
14
|
+
export declare function readCappedBytes(req: Request, max: number): Promise<Buffer | null>;
|
|
15
|
+
export declare const botAad: (org: string, botId: string) => string;
|
|
16
|
+
/** The bot's sign-in: its app id, tenant, certificate and private key. */
|
|
17
|
+
export declare function botCredential(key: CredentialKey, bot: BotRow): BotCredential;
|
|
18
|
+
export type TeamsRuntimeDeps = {
|
|
19
|
+
store: Store;
|
|
20
|
+
teams: TeamsStore;
|
|
21
|
+
key: CredentialKey;
|
|
22
|
+
auth: BotAuth;
|
|
23
|
+
bots: BotClient;
|
|
24
|
+
runners: Map<string, TriggerRunner>;
|
|
25
|
+
connector: Connector | null;
|
|
26
|
+
publicUrl: string | null;
|
|
27
|
+
};
|
|
28
|
+
export declare function createTeamsRuntime(deps: TeamsRuntimeDeps): {
|
|
29
|
+
inbound: (botAppId: string, req: Request) => Promise<Response>;
|
|
30
|
+
kick: () => void;
|
|
31
|
+
watch: () => Promise<void>;
|
|
32
|
+
/** Drains the queue now and then (events from a worker that stopped) and watches sessions
|
|
33
|
+
* every few seconds. */
|
|
34
|
+
start(): void;
|
|
35
|
+
/** Stops claiming events and waits for the one in hand, so a rollout neither strands it
|
|
36
|
+
* in 'processing' nor answers it twice. */
|
|
37
|
+
stop(): Promise<void>;
|
|
38
|
+
/** What an agent's Teams tools reach: only its own bot. */
|
|
39
|
+
access(bot: BotRow): TeamsAccess;
|
|
40
|
+
/** Settles the queue (tests). */
|
|
41
|
+
idle: () => Promise<void>;
|
|
42
|
+
};
|
|
43
|
+
export type TeamsRuntime = ReturnType<typeof createTeamsRuntime>;
|
|
44
|
+
export type GraphMessage = {
|
|
45
|
+
id?: string;
|
|
46
|
+
createdDateTime?: string;
|
|
47
|
+
messageType?: string;
|
|
48
|
+
from?: {
|
|
49
|
+
user?: {
|
|
50
|
+
displayName?: string;
|
|
51
|
+
id?: string;
|
|
52
|
+
userIdentityType?: string;
|
|
53
|
+
};
|
|
54
|
+
application?: {
|
|
55
|
+
displayName?: string;
|
|
56
|
+
id?: string;
|
|
57
|
+
};
|
|
58
|
+
} | null;
|
|
59
|
+
body?: {
|
|
60
|
+
content?: string;
|
|
61
|
+
contentType?: string;
|
|
62
|
+
};
|
|
63
|
+
replyToId?: string | null;
|
|
64
|
+
};
|
|
65
|
+
export declare function simplify(list: GraphMessage[]): ThreadMessage[];
|
|
66
|
+
export type TeamsAccess = {
|
|
67
|
+
places(): Promise<ConversationRow[]>;
|
|
68
|
+
graph(path: string): Promise<VendorResponse>;
|
|
69
|
+
listChannels(team: ConversationRow): Promise<VendorResponse>;
|
|
70
|
+
post(serviceUrl: string, conversation: string, text: string, replyTo?: string): Promise<VendorResponse>;
|
|
71
|
+
newThread(team: ConversationRow, channelId: string, text: string): Promise<VendorResponse>;
|
|
72
|
+
postCard(serviceUrl: string, conversation: string, card: Record<string, unknown>): Promise<VendorResponse>;
|
|
73
|
+
newThreadCard(team: ConversationRow, channelId: string, card: Record<string, unknown>): Promise<VendorResponse>;
|
|
74
|
+
createApproval(input: {
|
|
75
|
+
tokenHash: string;
|
|
76
|
+
conversationId: string;
|
|
77
|
+
serviceUrl: string;
|
|
78
|
+
approverAadId: string;
|
|
79
|
+
approverName: string;
|
|
80
|
+
title: string;
|
|
81
|
+
body: string;
|
|
82
|
+
facts: ApprovalFact[];
|
|
83
|
+
days: number;
|
|
84
|
+
}): Promise<ApprovalRow>;
|
|
85
|
+
approvalPosted(id: string, threadId: string, activityId: string): Promise<void>;
|
|
86
|
+
discardApproval(id: string): Promise<void>;
|
|
87
|
+
approval(tokenHash: string): Promise<ApprovalRow | null>;
|
|
88
|
+
runForReply(tokenHash: string): Promise<RunRow | null>;
|
|
89
|
+
claimReply(runId: string): Promise<boolean>;
|
|
90
|
+
releaseReply(runId: string): Promise<void>;
|
|
91
|
+
};
|