managed-deepagents 0.6.2-dev.3 → 0.6.2-dev.30
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 +13 -3
- package/dist/agent-auth.d.ts +104 -0
- package/dist/agent-auth.d.ts.map +1 -0
- package/dist/agent-auth.js +224 -0
- package/dist/agent-auth.js.map +1 -0
- package/dist/channels/manifest.d.ts +2 -0
- package/dist/channels/manifest.d.ts.map +1 -1
- package/dist/channels/registry-types.d.ts +1 -1
- package/dist/channels/schedule-delivery.d.ts +2 -0
- package/dist/channels/schedule-delivery.d.ts.map +1 -1
- package/dist/channels/schedule-delivery.js +40 -4
- package/dist/channels/schedule-delivery.js.map +1 -1
- package/dist/channels/slack/http.d.ts +1 -1
- package/dist/channels/trigger/client.d.ts +1 -0
- package/dist/channels/trigger/client.d.ts.map +1 -1
- package/dist/channels/trigger/client.js +19 -8
- package/dist/channels/trigger/client.js.map +1 -1
- package/dist/channels/trigger/types.d.ts +1 -1
- package/dist/channels/trigger/types.d.ts.map +1 -1
- package/dist/connectors/mcp/index.d.ts +29 -89
- package/dist/connectors/mcp/index.d.ts.map +1 -1
- package/dist/connectors/mcp/index.js +242 -50
- package/dist/connectors/mcp/index.js.map +1 -1
- package/dist/connectors/mcp/schema.d.ts +12 -0
- package/dist/connectors/mcp/schema.d.ts.map +1 -0
- package/dist/connectors/mcp/schema.js +55 -0
- package/dist/connectors/mcp/schema.js.map +1 -0
- package/dist/connectors/mcp/types.d.ts +62 -0
- package/dist/connectors/mcp/types.d.ts.map +1 -0
- package/dist/connectors/mcp/types.js +2 -0
- package/dist/connectors/mcp/types.js.map +1 -0
- package/dist/connectors/tool-selection.d.ts +9 -18
- package/dist/connectors/tool-selection.d.ts.map +1 -1
- package/dist/connectors/tool-selection.js +32 -58
- package/dist/connectors/tool-selection.js.map +1 -1
- package/dist/credential-gate.d.ts +39 -0
- package/dist/credential-gate.d.ts.map +1 -0
- package/dist/credential-gate.js +209 -0
- package/dist/credential-gate.js.map +1 -0
- package/dist/credentials.d.ts +95 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +288 -0
- package/dist/credentials.js.map +1 -0
- package/dist/identity/index.d.ts +1 -1
- package/dist/identity/index.d.ts.map +1 -1
- package/dist/identity/index.js.map +1 -1
- package/dist/identity/types.d.ts +79 -5
- package/dist/identity/types.d.ts.map +1 -1
- package/dist/index.d.ts +11 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/runtime/auth.d.ts +31 -4
- package/dist/runtime/auth.d.ts.map +1 -1
- package/dist/runtime/auth.js +58 -3
- package/dist/runtime/auth.js.map +1 -1
- package/dist/runtime/channel.d.ts +1 -1
- package/dist/runtime/connector.d.ts +1 -1
- package/dist/runtime/cors.d.ts +8 -6
- package/dist/runtime/cors.d.ts.map +1 -1
- package/dist/runtime/cors.js +18 -19
- package/dist/runtime/cors.js.map +1 -1
- package/dist/runtime/http.d.ts +1 -1
- package/dist/runtime/http.d.ts.map +1 -1
- package/dist/runtime/http.js.map +1 -1
- package/dist/runtime/identity-http.d.ts.map +1 -1
- package/dist/runtime/identity-http.js +22 -13
- package/dist/runtime/identity-http.js.map +1 -1
- package/dist/runtime/identity-runtime.d.ts +65 -5
- package/dist/runtime/identity-runtime.d.ts.map +1 -1
- package/dist/runtime/identity-runtime.js +148 -0
- package/dist/runtime/identity-runtime.js.map +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +12 -7
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/managed-middleware.d.ts +2 -2
- package/dist/runtime/managed-middleware.js +6 -6
- package/dist/runtime/managed-tools.d.ts +19 -15
- package/dist/runtime/managed-tools.d.ts.map +1 -1
- package/dist/runtime/managed-tools.js +14 -13
- package/dist/runtime/managed-tools.js.map +1 -1
- package/dist/runtime/types.d.ts +2 -2
- package/package.json +8 -8
- package/dist/connectors/mcp/load.d.ts +0 -12
- package/dist/connectors/mcp/load.d.ts.map +0 -1
- package/dist/connectors/mcp/load.js +0 -122
- package/dist/connectors/mcp/load.js.map +0 -1
package/README.md
CHANGED
|
@@ -245,11 +245,12 @@ used only to reconcile the registry and never enters the build or snapshot.
|
|
|
245
245
|
|
|
246
246
|
Add `connectors/mcp.ts` to attach MCP servers. The file must export a named
|
|
247
247
|
`connector`. By default, MDA exposes every tool loaded from each declared
|
|
248
|
-
server.
|
|
249
|
-
|
|
248
|
+
server. In `mda dev`, an agent-owned credential reads from
|
|
249
|
+
`MDA_DEV_<SLUG>` with the slug uppercased and hyphens changed to underscores.
|
|
250
|
+
Hosted deployments retain their deployment-owned Agent Auth secret:
|
|
250
251
|
|
|
251
252
|
```ts
|
|
252
|
-
import { connectors } from "managed-deepagents";
|
|
253
|
+
import { connectors, credentials } from "managed-deepagents";
|
|
253
254
|
|
|
254
255
|
export const connector = connectors.mcp({
|
|
255
256
|
mcpServers: {
|
|
@@ -257,11 +258,20 @@ export const connector = connectors.mcp({
|
|
|
257
258
|
transport: "http",
|
|
258
259
|
url: "https://docs.langchain.com/mcp",
|
|
259
260
|
includeTools: ["search", "fetch"],
|
|
261
|
+
credential: credentials.get("docs-token", { type: "agent" }),
|
|
260
262
|
},
|
|
261
263
|
},
|
|
262
264
|
});
|
|
263
265
|
```
|
|
264
266
|
|
|
267
|
+
For this example, set `MDA_DEV_DOCS_TOKEN`.
|
|
268
|
+
|
|
269
|
+
A user-owned credential — `credentials.get(slug, { type: "user" })` — is an OAuth
|
|
270
|
+
grant held per caller, so the pre-run credential gate mints it against the
|
|
271
|
+
deployment and interrupts the run to collect a missing grant. `mda dev` has no
|
|
272
|
+
deployment to hold a grant, so a user-owned credential fails there with an
|
|
273
|
+
actionable error; deploy the agent to exercise one.
|
|
274
|
+
|
|
265
275
|
Use `includeTools` or `excludeTools` inside a server config to select a subset.
|
|
266
276
|
Tool names are raw MCP tool names before the managed `{server}__` prefix is
|
|
267
277
|
applied, so `includeTools: ["search"]` on server `langchainDocs` exposes
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Auth client used by `credentials.get` and the pre-run credential gate.
|
|
3
|
+
*
|
|
4
|
+
* Talks to the shipped Agent Auth APIs (credentials + oauth-authorization-sessions),
|
|
5
|
+
* not the aspirational `credentials/mint` endpoint.
|
|
6
|
+
*/
|
|
7
|
+
export declare const AGENT_AUTH_TIMEOUT_MS = 10000;
|
|
8
|
+
export declare const AGENT_AUTH_PROVIDER_PAGE_SIZE = 100;
|
|
9
|
+
export declare const AGENT_AUTH_MAX_PROVIDER_PAGES = 20;
|
|
10
|
+
export interface AgentAuthHttpConfig {
|
|
11
|
+
apiKey?: string;
|
|
12
|
+
workspaceId?: string;
|
|
13
|
+
}
|
|
14
|
+
/** Query string that addresses one credential by its natural key. */
|
|
15
|
+
export declare function agentAuthCredentialQuery(options: {
|
|
16
|
+
ownerType: string;
|
|
17
|
+
ownerId: string;
|
|
18
|
+
kind: string;
|
|
19
|
+
slug: string;
|
|
20
|
+
}): string;
|
|
21
|
+
export declare function agentAuthHeaders(config: AgentAuthHttpConfig): Record<string, string>;
|
|
22
|
+
/** One Agent Auth HTTP call: no redirects, bounded timeout, JSON body. */
|
|
23
|
+
export declare function requestAgentAuthJson(options: {
|
|
24
|
+
url: string;
|
|
25
|
+
init?: Omit<RequestInit, "headers" | "signal">;
|
|
26
|
+
config: AgentAuthHttpConfig;
|
|
27
|
+
timeoutMs: number;
|
|
28
|
+
fetchImpl: typeof fetch;
|
|
29
|
+
}): Promise<{
|
|
30
|
+
ok: boolean;
|
|
31
|
+
status: number;
|
|
32
|
+
body: Record<string, unknown>;
|
|
33
|
+
}>;
|
|
34
|
+
export interface AgentAuthContext {
|
|
35
|
+
baseUrl: string;
|
|
36
|
+
/** Deployment id, passed to oauth-authorization-sessions as `agent_id`. */
|
|
37
|
+
agentId: string;
|
|
38
|
+
/** Authenticated caller, used as `owner_id` for user credentials. */
|
|
39
|
+
principalId: string;
|
|
40
|
+
apiKey?: string;
|
|
41
|
+
workspaceId?: string;
|
|
42
|
+
}
|
|
43
|
+
/** One credential slug the caller has not granted, with its connect URL. */
|
|
44
|
+
export interface PendingAuthorization {
|
|
45
|
+
slug: string;
|
|
46
|
+
connectUrl: string;
|
|
47
|
+
authId: string;
|
|
48
|
+
}
|
|
49
|
+
export declare class CredentialAuthorizationRequiredError extends Error {
|
|
50
|
+
readonly slugs: readonly string[];
|
|
51
|
+
readonly name = "CredentialAuthorizationRequiredError";
|
|
52
|
+
constructor(slugs: readonly string[]);
|
|
53
|
+
}
|
|
54
|
+
export declare class AgentAuthUnknownProviderError extends Error {
|
|
55
|
+
readonly slug: string;
|
|
56
|
+
readonly name = "AgentAuthUnknownProviderError";
|
|
57
|
+
constructor(slug: string);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Agent Auth could not answer. Callers pass a fixed message: a response body
|
|
61
|
+
* can quote secret material, so it never reaches this error.
|
|
62
|
+
*/
|
|
63
|
+
export declare class CredentialStoreError extends Error {
|
|
64
|
+
readonly status?: number | undefined;
|
|
65
|
+
readonly name = "CredentialStoreError";
|
|
66
|
+
constructor(message: string, status?: number | undefined);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Bound Agent Auth HTTP client. One instance per caller/run; headers, origin,
|
|
70
|
+
* and the request timeout stay on the instance rather than each call site.
|
|
71
|
+
*/
|
|
72
|
+
export declare class AgentAuth {
|
|
73
|
+
#private;
|
|
74
|
+
readonly context: AgentAuthContext;
|
|
75
|
+
constructor(context: AgentAuthContext, fetchImpl?: typeof fetch, timeoutMs?: number);
|
|
76
|
+
/**
|
|
77
|
+
* Read the caller's OAuth access token for a slug without starting a session.
|
|
78
|
+
*
|
|
79
|
+
* Reads never mint, so a caller can be probed repeatedly — on every replay of
|
|
80
|
+
* an interrupted node, for instance — without leaving authorization sessions
|
|
81
|
+
* behind.
|
|
82
|
+
*
|
|
83
|
+
* @returns The access token, or `undefined` when the caller must connect.
|
|
84
|
+
*/
|
|
85
|
+
readUserAccessToken(slug: string): Promise<string | undefined>;
|
|
86
|
+
/**
|
|
87
|
+
* Start an OAuth authorization session for a slug the caller has not granted.
|
|
88
|
+
*
|
|
89
|
+
* @returns The pending session, including the user-facing connect URL.
|
|
90
|
+
*/
|
|
91
|
+
startAuthorizationSession(slug: string): Promise<PendingAuthorization>;
|
|
92
|
+
/** oauth-providers has no slug filter, so the match is made across pages. */
|
|
93
|
+
resolveOAuthProviderId(slug: string): Promise<string>;
|
|
94
|
+
/** The credential key is `credential_id`, never `id`. */
|
|
95
|
+
findCredentialId(options: {
|
|
96
|
+
ownerType: string;
|
|
97
|
+
ownerId: string;
|
|
98
|
+
kind: string;
|
|
99
|
+
slug: string;
|
|
100
|
+
}): Promise<string | undefined>;
|
|
101
|
+
/** @returns The secret, or `undefined` when Agent Auth has no value (404). */
|
|
102
|
+
readSecret(credentialId: string): Promise<string | undefined>;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=agent-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-auth.d.ts","sourceRoot":"","sources":["../src/agent-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Auth client used by `credentials.get` and the pre-run credential gate.
|
|
3
|
+
*
|
|
4
|
+
* Talks to the shipped Agent Auth APIs (credentials + oauth-authorization-sessions),
|
|
5
|
+
* not the aspirational `credentials/mint` endpoint.
|
|
6
|
+
*/
|
|
7
|
+
import { fetchWithTimeout } from "./runtime/http.js";
|
|
8
|
+
export const AGENT_AUTH_TIMEOUT_MS = 10_000;
|
|
9
|
+
export const AGENT_AUTH_PROVIDER_PAGE_SIZE = 100;
|
|
10
|
+
export const AGENT_AUTH_MAX_PROVIDER_PAGES = 20;
|
|
11
|
+
/** Query string that addresses one credential by its natural key. */
|
|
12
|
+
export function agentAuthCredentialQuery(options) {
|
|
13
|
+
return new URLSearchParams({
|
|
14
|
+
owner_type: options.ownerType,
|
|
15
|
+
owner_id: options.ownerId,
|
|
16
|
+
kind: options.kind,
|
|
17
|
+
slug: options.slug,
|
|
18
|
+
}).toString();
|
|
19
|
+
}
|
|
20
|
+
export function agentAuthHeaders(config) {
|
|
21
|
+
const headers = {
|
|
22
|
+
accept: "application/json",
|
|
23
|
+
"content-type": "application/json",
|
|
24
|
+
"x-langsmith-product": "mda",
|
|
25
|
+
};
|
|
26
|
+
const apiKey = config.apiKey?.trim();
|
|
27
|
+
if (apiKey) {
|
|
28
|
+
headers["x-api-key"] = apiKey;
|
|
29
|
+
}
|
|
30
|
+
const workspaceId = config.workspaceId?.trim();
|
|
31
|
+
if (workspaceId) {
|
|
32
|
+
headers["x-tenant-id"] = workspaceId;
|
|
33
|
+
}
|
|
34
|
+
return headers;
|
|
35
|
+
}
|
|
36
|
+
/** One Agent Auth HTTP call: no redirects, bounded timeout, JSON body. */
|
|
37
|
+
export async function requestAgentAuthJson(options) {
|
|
38
|
+
const response = await fetchWithTimeout(options.url, {
|
|
39
|
+
...options.init,
|
|
40
|
+
redirect: "error",
|
|
41
|
+
headers: agentAuthHeaders(options.config),
|
|
42
|
+
}, options.timeoutMs, options.fetchImpl);
|
|
43
|
+
const decoded = await response.json().catch(() => ({}));
|
|
44
|
+
return {
|
|
45
|
+
ok: response.ok,
|
|
46
|
+
status: response.status,
|
|
47
|
+
body: decoded && typeof decoded === "object"
|
|
48
|
+
? decoded
|
|
49
|
+
: {},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export class CredentialAuthorizationRequiredError extends Error {
|
|
53
|
+
slugs;
|
|
54
|
+
name = "CredentialAuthorizationRequiredError";
|
|
55
|
+
constructor(slugs) {
|
|
56
|
+
super(`the caller has not connected: ${slugs.join(", ")}. ` +
|
|
57
|
+
"Declare the credential on a connector so the pre-run gate can request it.");
|
|
58
|
+
this.slugs = slugs;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export class AgentAuthUnknownProviderError extends Error {
|
|
62
|
+
slug;
|
|
63
|
+
name = "AgentAuthUnknownProviderError";
|
|
64
|
+
constructor(slug) {
|
|
65
|
+
super(`Agent Auth has no OAuth provider registered for slug "${slug}". ` +
|
|
66
|
+
"Register the provider or fix the credential slug.");
|
|
67
|
+
this.slug = slug;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Agent Auth could not answer. Callers pass a fixed message: a response body
|
|
72
|
+
* can quote secret material, so it never reaches this error.
|
|
73
|
+
*/
|
|
74
|
+
export class CredentialStoreError extends Error {
|
|
75
|
+
status;
|
|
76
|
+
name = "CredentialStoreError";
|
|
77
|
+
constructor(message, status) {
|
|
78
|
+
super(status === undefined ? message : `${message} (status ${status})`);
|
|
79
|
+
this.status = status;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Bound Agent Auth HTTP client. One instance per caller/run; headers, origin,
|
|
84
|
+
* and the request timeout stay on the instance rather than each call site.
|
|
85
|
+
*/
|
|
86
|
+
export class AgentAuth {
|
|
87
|
+
context;
|
|
88
|
+
#fetchImpl;
|
|
89
|
+
#timeoutMs;
|
|
90
|
+
constructor(context, fetchImpl = fetch, timeoutMs = AGENT_AUTH_TIMEOUT_MS) {
|
|
91
|
+
this.context = context;
|
|
92
|
+
this.#fetchImpl = fetchImpl;
|
|
93
|
+
this.#timeoutMs = timeoutMs;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Read the caller's OAuth access token for a slug without starting a session.
|
|
97
|
+
*
|
|
98
|
+
* Reads never mint, so a caller can be probed repeatedly — on every replay of
|
|
99
|
+
* an interrupted node, for instance — without leaving authorization sessions
|
|
100
|
+
* behind.
|
|
101
|
+
*
|
|
102
|
+
* @returns The access token, or `undefined` when the caller must connect.
|
|
103
|
+
*/
|
|
104
|
+
async readUserAccessToken(slug) {
|
|
105
|
+
const credentialId = await this.findCredentialId({
|
|
106
|
+
ownerType: "user",
|
|
107
|
+
ownerId: this.context.principalId,
|
|
108
|
+
kind: "oauth2",
|
|
109
|
+
slug,
|
|
110
|
+
});
|
|
111
|
+
if (!credentialId)
|
|
112
|
+
return undefined;
|
|
113
|
+
return await this.#fetchAccessToken(credentialId);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Start an OAuth authorization session for a slug the caller has not granted.
|
|
117
|
+
*
|
|
118
|
+
* @returns The pending session, including the user-facing connect URL.
|
|
119
|
+
*/
|
|
120
|
+
async startAuthorizationSession(slug) {
|
|
121
|
+
const providerId = await this.resolveOAuthProviderId(slug);
|
|
122
|
+
const { ok, status, body } = await this.#request("/v1/agent-auth/oauth-authorization-sessions", {
|
|
123
|
+
method: "POST",
|
|
124
|
+
body: JSON.stringify({
|
|
125
|
+
provider_id: providerId,
|
|
126
|
+
principal_id: this.context.principalId,
|
|
127
|
+
agent_id: this.context.agentId,
|
|
128
|
+
}),
|
|
129
|
+
});
|
|
130
|
+
if (!ok) {
|
|
131
|
+
throw new CredentialStoreError("Agent Auth create oauth-authorization-session failed", status);
|
|
132
|
+
}
|
|
133
|
+
const authId = String(body.id ?? "");
|
|
134
|
+
const connectUrl = String(body.verification_url ?? "");
|
|
135
|
+
if (!authId || !connectUrl) {
|
|
136
|
+
throw new CredentialStoreError("Agent Auth oauth-authorization-session missing id or verification_url");
|
|
137
|
+
}
|
|
138
|
+
return { slug, connectUrl, authId };
|
|
139
|
+
}
|
|
140
|
+
/** oauth-providers has no slug filter, so the match is made across pages. */
|
|
141
|
+
async resolveOAuthProviderId(slug) {
|
|
142
|
+
let cursor;
|
|
143
|
+
for (let page = 0; page < AGENT_AUTH_MAX_PROVIDER_PAGES; page += 1) {
|
|
144
|
+
const params = new URLSearchParams({
|
|
145
|
+
page_size: String(AGENT_AUTH_PROVIDER_PAGE_SIZE),
|
|
146
|
+
});
|
|
147
|
+
if (cursor)
|
|
148
|
+
params.set("cursor", cursor);
|
|
149
|
+
const { ok, status, body } = await this.#request(`/v1/agent-auth/oauth-providers?${params.toString()}`, { method: "GET" });
|
|
150
|
+
if (!ok) {
|
|
151
|
+
throw new CredentialStoreError("Agent Auth list oauth-providers failed", status);
|
|
152
|
+
}
|
|
153
|
+
const items = Array.isArray(body.items) ? body.items : [];
|
|
154
|
+
const match = items.find((item) => !!item &&
|
|
155
|
+
typeof item === "object" &&
|
|
156
|
+
String(item.slug) === slug);
|
|
157
|
+
if (match?.id) {
|
|
158
|
+
return String(match.id);
|
|
159
|
+
}
|
|
160
|
+
const next = body.next_cursor;
|
|
161
|
+
if (typeof next !== "string" || !next || next === cursor) {
|
|
162
|
+
throw new AgentAuthUnknownProviderError(slug);
|
|
163
|
+
}
|
|
164
|
+
cursor = next;
|
|
165
|
+
}
|
|
166
|
+
throw new CredentialStoreError("Agent Auth oauth-provider list returned too many pages");
|
|
167
|
+
}
|
|
168
|
+
/** The credential key is `credential_id`, never `id`. */
|
|
169
|
+
async findCredentialId(options) {
|
|
170
|
+
const { ok, status, body } = await this.#request(`/v1/agent-auth/credentials?${agentAuthCredentialQuery(options)}`, { method: "GET" });
|
|
171
|
+
if (!ok) {
|
|
172
|
+
throw new CredentialStoreError("Agent Auth list credentials failed", status);
|
|
173
|
+
}
|
|
174
|
+
const [row] = Array.isArray(body.items) ? body.items : [];
|
|
175
|
+
const id = row?.credential_id;
|
|
176
|
+
return typeof id === "string" ? id : undefined;
|
|
177
|
+
}
|
|
178
|
+
/** @returns The secret, or `undefined` when Agent Auth has no value (404). */
|
|
179
|
+
async readSecret(credentialId) {
|
|
180
|
+
const { ok, status, body } = await this.#request(`/v1/agent-auth/credentials/${encodeURIComponent(credentialId)}/secret`, { method: "GET" });
|
|
181
|
+
if (status === 404) {
|
|
182
|
+
return undefined;
|
|
183
|
+
}
|
|
184
|
+
if (!ok) {
|
|
185
|
+
throw new CredentialStoreError("Agent Auth get secret failed", status);
|
|
186
|
+
}
|
|
187
|
+
const secret = body.secret;
|
|
188
|
+
return typeof secret === "string" && secret.length > 0 ? secret : undefined;
|
|
189
|
+
}
|
|
190
|
+
async #fetchAccessToken(credentialId) {
|
|
191
|
+
const { ok, status, body } = await this.#request(`/v1/agent-auth/credentials/${encodeURIComponent(credentialId)}/oauth2`, { method: "GET" });
|
|
192
|
+
if (isAuthorizationRequired(status, body)) {
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
if (!ok) {
|
|
196
|
+
throw new CredentialStoreError("Agent Auth get oauth2 failed", status);
|
|
197
|
+
}
|
|
198
|
+
const oauth2 = body.oauth2 && typeof body.oauth2 === "object"
|
|
199
|
+
? body.oauth2
|
|
200
|
+
: body;
|
|
201
|
+
const token = oauth2.access_token;
|
|
202
|
+
return typeof token === "string" && token ? token : undefined;
|
|
203
|
+
}
|
|
204
|
+
async #request(path, init = {}) {
|
|
205
|
+
return await requestAgentAuthJson({
|
|
206
|
+
url: `${this.context.baseUrl}${path}`,
|
|
207
|
+
init,
|
|
208
|
+
config: this.context,
|
|
209
|
+
timeoutMs: this.#timeoutMs,
|
|
210
|
+
fetchImpl: this.#fetchImpl,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/** Agent Auth answers 409 when a stored grant has lapsed and needs re-auth. */
|
|
215
|
+
function isAuthorizationRequired(status, body) {
|
|
216
|
+
if (status !== 409) {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
const detail = String(body.detail ?? body.title ?? body.error ?? "").toLowerCase();
|
|
220
|
+
return (body.error === "authorization_required" ||
|
|
221
|
+
detail.includes("authorization is required") ||
|
|
222
|
+
detail.includes("oauth authorization"));
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=agent-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-auth.js","sourceRoot":"","sources":["../src/agent-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,8 @@ export interface ChannelManifest {
|
|
|
31
31
|
requiredPermissions: readonly string[];
|
|
32
32
|
/** Env vars deploy must ensure when this channel is present. */
|
|
33
33
|
requiredEnv: readonly string[];
|
|
34
|
+
/** User-owned credential slugs that must name registered OAuth providers. */
|
|
35
|
+
userCredentials?: readonly string[];
|
|
34
36
|
/** Opaque-to-core provider config (Slack filters/conversation, …). */
|
|
35
37
|
providerConfig: JsonObject;
|
|
36
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/channels/manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,2EAA2E;AAC3E,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IACtC,iEAAiE;IACjE,SAAS,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,gEAAgE;IAChE,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,sEAAsE;IACtE,cAAc,EAAE,UAAU,CAAC;CAC5B"}
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/channels/manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,2EAA2E;AAC3E,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IACtC,iEAAiE;IACjE,SAAS,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,gEAAgE;IAChE,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,6EAA6E;IAC7E,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,sEAAsE;IACtE,cAAc,EAAE,UAAU,CAAC;CAC5B"}
|
|
@@ -16,7 +16,7 @@ export interface ChannelHttpContext {
|
|
|
16
16
|
definition?: unknown;
|
|
17
17
|
/**
|
|
18
18
|
* Pre-read raw body when the HTTP framework may have consumed `request`
|
|
19
|
-
* (
|
|
19
|
+
* (the managed mount caps Events bodies at 1 MiB).
|
|
20
20
|
*/
|
|
21
21
|
rawBody?: string | Uint8Array;
|
|
22
22
|
}
|
|
@@ -48,6 +48,8 @@ export interface DeliverScheduleResultInput {
|
|
|
48
48
|
threadId?: string;
|
|
49
49
|
}) => Promise<unknown>;
|
|
50
50
|
}
|
|
51
|
+
/** Return the deployment ID supplied by the managed runtime. */
|
|
52
|
+
export declare function getDeploymentId(env?: NodeJS.ProcessEnv): string | undefined;
|
|
51
53
|
/**
|
|
52
54
|
* Post schedule result text to the configured channel. Soft-fails (logs) on
|
|
53
55
|
* missing token / provider errors so cron runs are not marked failed.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule-delivery.d.ts","sourceRoot":"","sources":["../../src/channels/schedule-delivery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"schedule-delivery.d.ts","sourceRoot":"","sources":["../../src/channels/schedule-delivery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAO1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,uEAAuE;AACvE,wBAAgB,2BAA2B,CACzC,MAAM,CAAC,EAAE,MAAM;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,GAC3E,IAAI,CAEN;AAED,uDAAuD;AACvD,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EACE;QAAE,IAAI,EAAE,uBAAuB,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,GACzD;QAAE,IAAI,EAAE,iBAAiB,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAChD,2BAA2B,GAAG,SAAS,CAoDzC;AAED,kEAAkE;AAClE,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,2BAA2B,CAAC,IAAI,CAAC,GACpC,cAAc,CAKhB;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,2BAA2B,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;QACb,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACxB;AAED,gEAAgE;AAChE,wBAAgB,eAAe,CAC7B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,SAAS,CAMpB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC,CAoF1C;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAChD,OAAO,CAcT;AAmBD;;;;;;;;;GASG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,CAAC,EAAE;IACzD,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,OAAO,qBAAqB,CAAC;CACzC,GAAG,iBAAiB,CAyBpB"}
|
|
@@ -9,11 +9,14 @@
|
|
|
9
9
|
* `configurable.mda_schedule.name`. Ordinary HTTP invokes cannot forge that
|
|
10
10
|
* pair (and `mda_schedule` is a reserved configurable key).
|
|
11
11
|
*/
|
|
12
|
+
import { randomUUID } from "node:crypto";
|
|
12
13
|
import { getConfig } from "@langchain/langgraph";
|
|
13
14
|
import { configurableFromRuntime, resolveAmbientConfigurable, } from "../runtime/identity-runtime.js";
|
|
15
|
+
import { logger } from "../runtime/log.js";
|
|
14
16
|
import { extractAssistantText } from "./assistant-text.js";
|
|
15
17
|
import { SLACK_BOT_TOKEN_ENV } from "./binding.js";
|
|
16
18
|
import { createSlackWebApiTransport } from "./slack/transport.js";
|
|
19
|
+
import { createTriggerClient } from "./trigger/client.js";
|
|
17
20
|
let scheduleMetadataForTests;
|
|
18
21
|
/** Override LangGraph run metadata resolution. @internal Test-only. */
|
|
19
22
|
export function setScheduleMetadataForTests(loader) {
|
|
@@ -81,6 +84,12 @@ export function addressFromDeliverTo(to) {
|
|
|
81
84
|
}
|
|
82
85
|
return { conversationId: to.conversationId };
|
|
83
86
|
}
|
|
87
|
+
/** Return the deployment ID supplied by the managed runtime. */
|
|
88
|
+
export function getDeploymentId(env = process.env) {
|
|
89
|
+
return (env.LANGSMITH_HOST_PROJECT_ID?.trim() ||
|
|
90
|
+
env.LANGGRAPH_CLOUD_ID?.trim() ||
|
|
91
|
+
undefined);
|
|
92
|
+
}
|
|
84
93
|
/**
|
|
85
94
|
* Post schedule result text to the configured channel. Soft-fails (logs) on
|
|
86
95
|
* missing token / provider errors so cron runs are not marked failed.
|
|
@@ -92,7 +101,7 @@ export async function deliverScheduleResult(input) {
|
|
|
92
101
|
}
|
|
93
102
|
// Phase 1: Slack only (channel id is file-derived name, typically "slack").
|
|
94
103
|
if (input.deliverTo.channel !== "slack") {
|
|
95
|
-
|
|
104
|
+
logger.error(`schedule deliverTo channel "${logger.logIdentifier(input.deliverTo.channel)}" is not supported yet`);
|
|
96
105
|
return "failed";
|
|
97
106
|
}
|
|
98
107
|
const address = addressFromDeliverTo(input.deliverTo.to);
|
|
@@ -106,13 +115,40 @@ export async function deliverScheduleResult(input) {
|
|
|
106
115
|
return "posted";
|
|
107
116
|
}
|
|
108
117
|
catch (error) {
|
|
109
|
-
|
|
118
|
+
logger.error(`schedule Slack delivery failed (${logger.safeErrorLabel(error)})`);
|
|
119
|
+
return "failed";
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const deploymentId = getDeploymentId();
|
|
123
|
+
let triggerClient;
|
|
124
|
+
try {
|
|
125
|
+
triggerClient = createTriggerClient();
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
triggerClient = undefined;
|
|
129
|
+
}
|
|
130
|
+
if (triggerClient && deploymentId) {
|
|
131
|
+
const action = {
|
|
132
|
+
type: "post",
|
|
133
|
+
action_id: randomUUID(),
|
|
134
|
+
address: {
|
|
135
|
+
conversation_id: address.conversationId,
|
|
136
|
+
...(address.threadId ? { thread_id: address.threadId } : {}),
|
|
137
|
+
},
|
|
138
|
+
message: { text },
|
|
139
|
+
};
|
|
140
|
+
try {
|
|
141
|
+
await triggerClient.postDeploymentAction(deploymentId, input.deliverTo.channel, action);
|
|
142
|
+
return "posted";
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
logger.error(`schedule Trigger channel delivery failed (${logger.safeErrorLabel(error)})`);
|
|
110
146
|
return "failed";
|
|
111
147
|
}
|
|
112
148
|
}
|
|
113
149
|
const botToken = input.botToken ?? process.env[SLACK_BOT_TOKEN_ENV] ?? "";
|
|
114
150
|
if (!botToken.trim()) {
|
|
115
|
-
|
|
151
|
+
logger.error("schedule deliverTo requires Trigger channel configuration or SLACK_BOT_TOKEN; skipping auto-post");
|
|
116
152
|
return "failed";
|
|
117
153
|
}
|
|
118
154
|
try {
|
|
@@ -125,7 +161,7 @@ export async function deliverScheduleResult(input) {
|
|
|
125
161
|
return "posted";
|
|
126
162
|
}
|
|
127
163
|
catch (error) {
|
|
128
|
-
|
|
164
|
+
logger.error(`schedule Slack delivery failed (${logger.safeErrorLabel(error)})`);
|
|
129
165
|
return "failed";
|
|
130
166
|
}
|
|
131
167
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule-delivery.js","sourceRoot":"","sources":["../../src/channels/schedule-delivery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EACL,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"schedule-delivery.js","sourceRoot":"","sources":["../../src/channels/schedule-delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,7 +33,7 @@ export interface SlackChannelHttpConfig {
|
|
|
33
33
|
assistantId?: string;
|
|
34
34
|
/**
|
|
35
35
|
* Pre-read raw body. Prefer this when the HTTP framework may have already
|
|
36
|
-
* consumed `request` (the
|
|
36
|
+
* consumed `request` (the managed mount caps Events bodies at 1 MiB).
|
|
37
37
|
*/
|
|
38
38
|
rawBody?: string | Uint8Array;
|
|
39
39
|
/** Override identity link store (tests). */
|
|
@@ -23,6 +23,7 @@ export declare class TriggerClient implements TriggerClientLike {
|
|
|
23
23
|
#private;
|
|
24
24
|
constructor(options?: TriggerClientOptions);
|
|
25
25
|
postAction(channelId: string, body: TriggerChannelActionRequest): Promise<TriggerChannelActionResponse>;
|
|
26
|
+
postDeploymentAction(deploymentId: string, channelName: string, body: TriggerChannelActionRequest): Promise<TriggerChannelActionResponse>;
|
|
26
27
|
postRuntimeEvent(channelId: string, body: TriggerChannelRuntimeEventRequest): Promise<TriggerChannelRuntimeEventResponse>;
|
|
27
28
|
}
|
|
28
29
|
export declare function createTriggerClient(options?: TriggerClientOptions): TriggerClient | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/channels/trigger/client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,2BAA2B,EAC3B,4BAA4B,EAC5B,iCAAiC,EACjC,kCAAkC,EACnC,MAAM,YAAY,CAAC;AAGpB,eAAO,MAAM,oCAAoC,qCACb,CAAC;AACrC,eAAO,MAAM,uBAAuB,QAA2B,CAAC;AAEhE,KAAK,sBAAsB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,2BAA2B,GAChC,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACzC,gBAAgB,CACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,iCAAiC,GACtC,OAAO,CAAC,kCAAkC,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,kEAAkE;AAClE,qBAAa,kBAAmB,SAAQ,KAAK;IAEzC,QAAQ,CAAC,SAAS,EAAE,sBAAsB;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IAF1B,YACW,SAAS,EAAE,sBAAsB,EACjC,MAAM,CAAC,EAAE,MAAM,YAAA,EAQzB;CACF;AAED,4EAA4E;AAC5E,qBAAa,aAAc,YAAW,iBAAiB;;IAOrD,YAAY,OAAO,GAAE,oBAAyB,EAW7C;IAEK,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,2BAA2B,GAChC,OAAO,CAAC,4BAA4B,CAAC,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/channels/trigger/client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,2BAA2B,EAC3B,4BAA4B,EAC5B,iCAAiC,EACjC,kCAAkC,EACnC,MAAM,YAAY,CAAC;AAGpB,eAAO,MAAM,oCAAoC,qCACb,CAAC;AACrC,eAAO,MAAM,uBAAuB,QAA2B,CAAC;AAEhE,KAAK,sBAAsB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,2BAA2B,GAChC,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACzC,gBAAgB,CACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,iCAAiC,GACtC,OAAO,CAAC,kCAAkC,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,kEAAkE;AAClE,qBAAa,kBAAmB,SAAQ,KAAK;IAEzC,QAAQ,CAAC,SAAS,EAAE,sBAAsB;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IAF1B,YACW,SAAS,EAAE,sBAAsB,EACjC,MAAM,CAAC,EAAE,MAAM,YAAA,EAQzB;CACF;AAED,4EAA4E;AAC5E,qBAAa,aAAc,YAAW,iBAAiB;;IAOrD,YAAY,OAAO,GAAE,oBAAyB,EAW7C;IAEK,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,2BAA2B,GAChC,OAAO,CAAC,4BAA4B,CAAC,CAOvC;IAEK,oBAAoB,CACxB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,2BAA2B,GAChC,OAAO,CAAC,4BAA4B,CAAC,CAWvC;IAEK,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,iCAAiC,GACtC,OAAO,CAAC,kCAAkC,CAAC,CAU7C;CAoCF;AAED,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,oBAAyB,GACjC,aAAa,GAAG,SAAS,CAM3B"}
|
|
@@ -33,23 +33,28 @@ export class TriggerClient {
|
|
|
33
33
|
this.#timeoutMs = options.timeoutMs ?? TRIGGER_HTTP_TIMEOUT_MS;
|
|
34
34
|
}
|
|
35
35
|
async postAction(channelId, body) {
|
|
36
|
-
const response = await this.#post("actions", channelId
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
const response = await this.#post("actions", `${this.#apiBase}/channels/${encodeURIComponent(channelId)}/actions`, body);
|
|
37
|
+
return parseActionResponse(response);
|
|
38
|
+
}
|
|
39
|
+
async postDeploymentAction(deploymentId, channelName, body) {
|
|
40
|
+
const query = new URLSearchParams({
|
|
41
|
+
deployment_id: deploymentId,
|
|
42
|
+
channel_name: channelName,
|
|
43
|
+
});
|
|
44
|
+
const response = await this.#post("actions", `${this.#apiBase}/channels/actions?${query.toString()}`, body);
|
|
45
|
+
return parseActionResponse(response);
|
|
41
46
|
}
|
|
42
47
|
async postRuntimeEvent(channelId, body) {
|
|
43
|
-
const response = await this.#post("events", channelId
|
|
48
|
+
const response = await this.#post("events", `${this.#apiBase}/channels/${encodeURIComponent(channelId)}/events`, body);
|
|
44
49
|
if (!isRecord(response) || typeof response.status !== "string") {
|
|
45
50
|
throw new TriggerClientError("events");
|
|
46
51
|
}
|
|
47
52
|
return { status: response.status };
|
|
48
53
|
}
|
|
49
|
-
async #post(operation,
|
|
54
|
+
async #post(operation, url, body) {
|
|
50
55
|
let response;
|
|
51
56
|
try {
|
|
52
|
-
response = await fetchWithTimeout(
|
|
57
|
+
response = await fetchWithTimeout(url, {
|
|
53
58
|
method: "POST",
|
|
54
59
|
redirect: "error",
|
|
55
60
|
headers: {
|
|
@@ -115,4 +120,10 @@ function isRecord(value) {
|
|
|
115
120
|
function nonblank(value) {
|
|
116
121
|
return typeof value === "string" && value.trim().length > 0;
|
|
117
122
|
}
|
|
123
|
+
function parseActionResponse(response) {
|
|
124
|
+
if (!isRecord(response) || !nonblank(response.id)) {
|
|
125
|
+
throw new TriggerClientError("actions");
|
|
126
|
+
}
|
|
127
|
+
return { id: response.id };
|
|
128
|
+
}
|
|
118
129
|
//# sourceMappingURL=client.js.map
|