managed-deepagents 0.9.3-dev.4 → 0.10.0-dev.2
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 +161 -3
- package/dist/agent-auth.d.ts +1 -1
- package/dist/agent-auth.d.ts.map +1 -1
- package/dist/agent-auth.js +36 -12
- package/dist/agent-auth.js.map +1 -1
- package/dist/channels/github/connections.d.ts +11 -0
- package/dist/channels/github/connections.d.ts.map +1 -0
- package/dist/channels/github/connections.js +14 -0
- package/dist/channels/github/connections.js.map +1 -0
- package/dist/channels/github/index.d.ts +15 -0
- package/dist/channels/github/index.d.ts.map +1 -0
- package/dist/channels/github/index.js +336 -0
- package/dist/channels/github/index.js.map +1 -0
- package/dist/channels/github/schema.d.ts +3894 -0
- package/dist/channels/github/schema.d.ts.map +1 -0
- package/dist/channels/github/schema.js +190 -0
- package/dist/channels/github/schema.js.map +1 -0
- package/dist/channels/github/types.d.ts +100 -0
- package/dist/channels/github/types.d.ts.map +1 -0
- package/dist/channels/github/types.js +2 -0
- package/dist/channels/github/types.js.map +1 -0
- package/dist/channels/http/http.d.ts.map +1 -1
- package/dist/channels/http/http.js +100 -15
- package/dist/channels/http/http.js.map +1 -1
- package/dist/channels/http/index.d.ts +2 -1
- package/dist/channels/http/index.d.ts.map +1 -1
- package/dist/channels/http/index.js +11 -1
- package/dist/channels/http/index.js.map +1 -1
- package/dist/channels/http/ingress.d.ts +27 -2
- package/dist/channels/http/ingress.d.ts.map +1 -1
- package/dist/channels/http/ingress.js +106 -13
- package/dist/channels/http/ingress.js.map +1 -1
- package/dist/channels/http/threads.d.ts +7 -0
- package/dist/channels/http/threads.d.ts.map +1 -0
- package/dist/channels/http/threads.js +10 -0
- package/dist/channels/http/threads.js.map +1 -0
- package/dist/channels/http/types.d.ts +42 -1
- package/dist/channels/http/types.d.ts.map +1 -1
- package/dist/channels/reserved-connections.d.ts +12 -0
- package/dist/channels/reserved-connections.d.ts.map +1 -0
- package/dist/channels/reserved-connections.js +28 -0
- package/dist/channels/reserved-connections.js.map +1 -0
- package/dist/channels/run-input.d.ts +38 -0
- package/dist/channels/run-input.d.ts.map +1 -0
- package/dist/channels/run-input.js +95 -0
- package/dist/channels/run-input.js.map +1 -0
- package/dist/channels/trigger/ingress.d.ts.map +1 -1
- package/dist/channels/trigger/ingress.js +1 -19
- package/dist/channels/trigger/ingress.js.map +1 -1
- package/dist/connections.d.ts +14 -0
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +54 -7
- package/dist/connections.js.map +1 -1
- package/dist/credential-gate.d.ts +2 -0
- package/dist/credential-gate.d.ts.map +1 -1
- package/dist/credential-gate.js +26 -4
- package/dist/credential-gate.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/ingress/runs.d.ts +43 -1
- package/dist/ingress/runs.d.ts.map +1 -1
- package/dist/ingress/runs.js +95 -2
- package/dist/ingress/runs.js.map +1 -1
- package/dist/namespaces.d.ts +6 -0
- package/dist/namespaces.d.ts.map +1 -1
- package/dist/namespaces.js +2 -0
- package/dist/namespaces.js.map +1 -1
- package/dist/runtime/auth.d.ts +2 -1
- package/dist/runtime/auth.d.ts.map +1 -1
- package/dist/runtime/auth.js +94 -6
- package/dist/runtime/auth.js.map +1 -1
- package/dist/runtime/identity-runtime.d.ts +15 -0
- package/dist/runtime/identity-runtime.d.ts.map +1 -1
- package/dist/runtime/identity-runtime.js +35 -0
- package/dist/runtime/identity-runtime.js.map +1 -1
- package/dist/runtime/sandbox-manager.d.ts +1 -1
- package/dist/runtime/sandbox-manager.d.ts.map +1 -1
- package/dist/runtime/sandbox-manager.js +3 -3
- package/dist/runtime/sandbox-manager.js.map +1 -1
- package/dist/runtime/schedule-auth.d.ts +0 -1
- package/dist/runtime/schedule-auth.d.ts.map +1 -1
- package/dist/runtime/schedule-auth.js +0 -41
- package/dist/runtime/schedule-auth.js.map +1 -1
- package/dist/runtime-schedules.d.ts.map +1 -1
- package/dist/runtime-schedules.js +12 -8
- package/dist/runtime-schedules.js.map +1 -1
- package/package.json +7 -7
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import type { MultitaskStrategy } from "../../ingress/runs.js";
|
|
1
2
|
import { type MessageContent } from "@langchain/core/messages";
|
|
2
3
|
import type { ChannelBinding } from "../binding.js";
|
|
3
4
|
import { type StartedIngressRun } from "../../ingress/runs.js";
|
|
5
|
+
import type { NormalizedRunInput } from "../run-input.js";
|
|
4
6
|
interface HttpIngressSource {
|
|
5
7
|
userId: string;
|
|
6
8
|
sourceThreadKey: string;
|
|
@@ -10,10 +12,33 @@ interface HttpIngressSource {
|
|
|
10
12
|
interface StartHttpIngressInput extends HttpIngressSource {
|
|
11
13
|
threadId: string;
|
|
12
14
|
assistantId: string;
|
|
13
|
-
|
|
15
|
+
/** What a new run starts with. */
|
|
16
|
+
input?: MessageContent;
|
|
17
|
+
/** What a new run starts with when there is no `input`, asked only then. */
|
|
18
|
+
prepare?: () => Promise<NormalizedRunInput | undefined>;
|
|
14
19
|
context?: Record<string, unknown>;
|
|
20
|
+
/** The provider's delivery ID; a thread runs each delivery once. */
|
|
21
|
+
deliveryKey?: string;
|
|
22
|
+
/**
|
|
23
|
+
* What a new turn does while the thread runs: wait for the run
|
|
24
|
+
* (`enqueue`, the default), cancel it (`interrupt` keeps its progress,
|
|
25
|
+
* `rollback` discards it), or start nothing (`reject`).
|
|
26
|
+
*/
|
|
27
|
+
multitaskStrategy?: MultitaskStrategy;
|
|
15
28
|
}
|
|
16
|
-
|
|
29
|
+
/** A started run, or why the thread took none: `ignored` when there is nothing to start. */
|
|
30
|
+
export type HttpIngressStart = StartedIngressRun | {
|
|
31
|
+
skipped: "paused";
|
|
32
|
+
/** The paused thread's assistant, for links into LangSmith Studio. */
|
|
33
|
+
assistantId?: string;
|
|
34
|
+
} | {
|
|
35
|
+
skipped: "duplicate" | "busy" | "rejected" | "ignored";
|
|
36
|
+
};
|
|
37
|
+
/** Wait until the thread's queued and running runs have finished. */
|
|
38
|
+
export declare function waitForHttpIngressThread(input: HttpIngressSource & {
|
|
39
|
+
threadId: string;
|
|
40
|
+
}): Promise<void>;
|
|
41
|
+
export declare function startHttpIngressAgent(input: StartHttpIngressInput): Promise<HttpIngressStart>;
|
|
17
42
|
export declare function observeHttpIngressAgent(input: HttpIngressSource & StartedIngressRun): Promise<StartedIngressRun & {
|
|
18
43
|
replyContent: MessageContent | null;
|
|
19
44
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingress.d.ts","sourceRoot":"","sources":["../../../src/channels/http/ingress.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"ingress.d.ts","sourceRoot":"","sources":["../../../src/channels/http/ingress.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAC;AAMlC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAKpD,OAAO,EAQL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAS1D,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,cAAc,CAAC;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;CAC7C;AAED,UAAU,qBAAsB,SAAQ,iBAAiB;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,4FAA4F;AAC5F,MAAM,MAAM,gBAAgB,GACxB,iBAAiB,GACjB;IACE,OAAO,EAAE,QAAQ,CAAC;IAClB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACD;IAAE,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;CAAE,CAAC;AAE/D,qEAAqE;AACrE,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,iBAAiB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC9C,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAsE3B;AA8CD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,GAC3C,OAAO,CAAC,iBAAiB,GAAG;IAAE,YAAY,EAAE,cAAc,GAAG,IAAI,CAAA;CAAE,CAAC,CA8CtE"}
|
|
@@ -2,11 +2,21 @@
|
|
|
2
2
|
import { INTERRUPT } from "@langchain/langgraph";
|
|
3
3
|
import { HumanMessage, } from "@langchain/core/messages";
|
|
4
4
|
import { extractAssistantContent } from "../assistant-text.js";
|
|
5
|
+
import { logger } from "../../runtime/log.js";
|
|
5
6
|
import { buildIngressRunContext } from "../../ingress/index.js";
|
|
6
7
|
import { ChannelError } from "../errors.js";
|
|
7
8
|
import { validateMessage } from "../runtime.js";
|
|
8
9
|
import { createIngressLoopbackClient, hasLoopbackCredential, } from "../../ingress/loopback.js";
|
|
9
|
-
import { startIngressRun, observeIngressRun, } from "../../ingress/runs.js";
|
|
10
|
+
import { DELIVERY_KEY_METADATA, ingressThreadState, lookupStatus, startIngressRun, waitForIdleThread, observeIngressRun, recordThreadDelivery, } from "../../ingress/runs.js";
|
|
11
|
+
/** Wait until the thread's queued and running runs have finished. */
|
|
12
|
+
export async function waitForHttpIngressThread(input) {
|
|
13
|
+
const client = createIngressLoopbackClient({
|
|
14
|
+
userId: input.userId,
|
|
15
|
+
sourceThreadKey: input.sourceThreadKey,
|
|
16
|
+
sourceProvider: input.sourceProvider ?? input.binding.provider,
|
|
17
|
+
});
|
|
18
|
+
await waitForIdleThread(client, input.threadId);
|
|
19
|
+
}
|
|
10
20
|
export async function startHttpIngressAgent(input) {
|
|
11
21
|
if (!hasLoopbackCredential()) {
|
|
12
22
|
throw new ChannelError("channel_run_failed", "managed loopback authentication is not configured");
|
|
@@ -16,14 +26,89 @@ export async function startHttpIngressAgent(input) {
|
|
|
16
26
|
sourceThreadKey: input.sourceThreadKey,
|
|
17
27
|
sourceProvider: input.sourceProvider ?? input.binding.provider,
|
|
18
28
|
});
|
|
19
|
-
const
|
|
20
|
-
|
|
29
|
+
const { state, assistantId } = await ingressThreadState(client, input.threadId, input.deliveryKey);
|
|
30
|
+
const metadata = input.deliveryKey !== undefined && {
|
|
31
|
+
metadata: { [DELIVERY_KEY_METADATA]: input.deliveryKey },
|
|
32
|
+
};
|
|
33
|
+
// A new turn would abandon the decision the thread waits on.
|
|
34
|
+
if (state === "paused")
|
|
35
|
+
return {
|
|
36
|
+
skipped: "paused",
|
|
37
|
+
...(assistantId !== undefined && { assistantId }),
|
|
38
|
+
};
|
|
39
|
+
const strategy = input.multitaskStrategy ?? "enqueue";
|
|
40
|
+
// `interrupt` and `rollback` start now and cancel the active run.
|
|
41
|
+
const cancelsActiveRun = strategy === "interrupt" || strategy === "rollback";
|
|
42
|
+
if (state === "busy" && strategy === "reject")
|
|
43
|
+
return { skipped: "rejected" };
|
|
44
|
+
if (state !== "ready" && !(state === "busy" && cancelsActiveRun))
|
|
45
|
+
return { skipped: state };
|
|
46
|
+
const prepared = input.input !== undefined
|
|
47
|
+
? contentRunInput(input.input)
|
|
48
|
+
: await input.prepare?.();
|
|
49
|
+
if (!prepared)
|
|
50
|
+
return { skipped: "ignored" };
|
|
51
|
+
let started;
|
|
52
|
+
try {
|
|
53
|
+
started = await startIngressRun(client, {
|
|
54
|
+
threadId: input.threadId,
|
|
55
|
+
assistantId: input.assistantId,
|
|
56
|
+
...metadata,
|
|
57
|
+
multitaskStrategy: strategy,
|
|
58
|
+
messages: prepared.messages,
|
|
59
|
+
...(Object.keys(prepared.state).length && { state: prepared.state }),
|
|
60
|
+
...buildIngressRunContext({
|
|
61
|
+
// The binding already holds a message's content; prepared input
|
|
62
|
+
// replaces it.
|
|
63
|
+
binding: input.input !== undefined
|
|
64
|
+
? input.binding
|
|
65
|
+
: {
|
|
66
|
+
...input.binding,
|
|
67
|
+
event: {
|
|
68
|
+
type: "message",
|
|
69
|
+
messages: prepared.messages,
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
context: prepared.context ?? input.context,
|
|
73
|
+
}),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
// A run started meanwhile: `reject` leaves the thread to it.
|
|
78
|
+
if (strategy === "reject" && lookupStatus(error) === 409)
|
|
79
|
+
return { skipped: "rejected" };
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
await recordRollbackDelivery(client, input);
|
|
83
|
+
return started;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Under `rollback`, record the delivery on its thread: a later message
|
|
87
|
+
* deletes this run with its delivery key, but the thread keeps the key, so a
|
|
88
|
+
* redelivery stays a duplicate.
|
|
89
|
+
*/
|
|
90
|
+
async function recordRollbackDelivery(client, input) {
|
|
91
|
+
if (input.multitaskStrategy !== "rollback" || input.deliveryKey === undefined)
|
|
92
|
+
return;
|
|
93
|
+
try {
|
|
94
|
+
await recordThreadDelivery(client, input.threadId, input.deliveryKey);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
// The run started; only a redelivery after its rollback would repeat it.
|
|
98
|
+
logger.warn(`channel delivery was not recorded on its thread ${JSON.stringify({
|
|
99
|
+
threadId: input.threadId,
|
|
100
|
+
status: lookupStatus(error),
|
|
101
|
+
})}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** A message's content as run input. */
|
|
105
|
+
function contentRunInput(content) {
|
|
106
|
+
const message = typeof content === "string"
|
|
107
|
+
? new HumanMessage(content)
|
|
21
108
|
: new HumanMessage({
|
|
22
|
-
contentBlocks:
|
|
109
|
+
contentBlocks: content,
|
|
23
110
|
});
|
|
24
|
-
return
|
|
25
|
-
threadId: input.threadId,
|
|
26
|
-
assistantId: input.assistantId,
|
|
111
|
+
return {
|
|
27
112
|
messages: [
|
|
28
113
|
{
|
|
29
114
|
role: "human",
|
|
@@ -31,11 +116,8 @@ export async function startHttpIngressAgent(input) {
|
|
|
31
116
|
response_metadata: message.response_metadata,
|
|
32
117
|
},
|
|
33
118
|
],
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
context: input.context,
|
|
37
|
-
}),
|
|
38
|
-
});
|
|
119
|
+
state: {},
|
|
120
|
+
};
|
|
39
121
|
}
|
|
40
122
|
export async function observeHttpIngressAgent(input) {
|
|
41
123
|
const client = createIngressLoopbackClient({
|
|
@@ -43,7 +125,18 @@ export async function observeHttpIngressAgent(input) {
|
|
|
43
125
|
sourceThreadKey: input.sourceThreadKey,
|
|
44
126
|
sourceProvider: input.sourceProvider ?? input.binding.provider,
|
|
45
127
|
});
|
|
46
|
-
|
|
128
|
+
let observed;
|
|
129
|
+
try {
|
|
130
|
+
observed = await observeIngressRun(client, input);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
// `rollback` deletes the run a newer message replaced; it has no reply.
|
|
134
|
+
if (lookupStatus(error) !== 404)
|
|
135
|
+
throw error;
|
|
136
|
+
logger.info(`channel run was replaced ${JSON.stringify({ threadId: input.threadId })}`);
|
|
137
|
+
return { replyContent: null, threadId: input.threadId, runId: input.runId };
|
|
138
|
+
}
|
|
139
|
+
const { values, status } = observed;
|
|
47
140
|
if (status === "interrupted") {
|
|
48
141
|
return { replyContent: null, threadId: input.threadId, runId: input.runId };
|
|
49
142
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingress.js","sourceRoot":"","sources":["../../../src/channels/http/ingress.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"ingress.js","sourceRoot":"","sources":["../../../src/channels/http/ingress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The thread for one provider conversation, such as an issue or a chat: the
|
|
3
|
+
* same channel and key always give the same UUID, so each message continues
|
|
4
|
+
* the conversation. The Python runtime derives the same IDs.
|
|
5
|
+
*/
|
|
6
|
+
export declare function channelThreadId(channelName: string, key: string): string;
|
|
7
|
+
//# sourceMappingURL=threads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../src/channels/http/threads.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKxE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { v5 as uuidv5 } from "uuid";
|
|
2
|
+
/**
|
|
3
|
+
* The thread for one provider conversation, such as an issue or a chat: the
|
|
4
|
+
* same channel and key always give the same UUID, so each message continues
|
|
5
|
+
* the conversation. The Python runtime derives the same IDs.
|
|
6
|
+
*/
|
|
7
|
+
export function channelThreadId(channelName, key) {
|
|
8
|
+
return uuidv5(`mda-thread:v1:${JSON.stringify([channelName, key])}`, uuidv5.URL);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=threads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads.js","sourceRoot":"","sources":["../../../src/channels/http/threads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpC;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB,EAAE,GAAW;IAC9D,OAAO,MAAM,CACX,iBAAiB,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,EAAE,EACrD,MAAM,CAAC,GAAG,CACX,CAAC;AACJ,CAAC"}
|
|
@@ -1,11 +1,23 @@
|
|
|
1
|
+
import type { MultitaskStrategy } from "../../ingress/runs.js";
|
|
1
2
|
import type { MessageContent } from "@langchain/core/messages";
|
|
2
3
|
import type { ChannelMessage, JsonValue } from "../types.js";
|
|
4
|
+
import type { ChannelRunResult } from "../run-input.js";
|
|
3
5
|
export interface HttpChannelInboundMessage {
|
|
4
6
|
userId: string;
|
|
7
|
+
/** See {@link channelThreadId} for one thread per provider conversation. */
|
|
5
8
|
threadId: string;
|
|
6
9
|
/** Provider destination, independent of the LangGraph thread UUID. */
|
|
7
10
|
target: JsonValue;
|
|
8
|
-
|
|
11
|
+
/**
|
|
12
|
+
* What a new run starts with. Without it, the adapter's `input` supplies it
|
|
13
|
+
* once MDA knows the thread takes a new turn.
|
|
14
|
+
*/
|
|
15
|
+
content?: MessageContent;
|
|
16
|
+
/**
|
|
17
|
+
* The provider's ID for this delivery. A thread runs each delivery once, so
|
|
18
|
+
* a redelivered event starts nothing.
|
|
19
|
+
*/
|
|
20
|
+
deliveryKey?: string;
|
|
9
21
|
}
|
|
10
22
|
export type HttpChannelParseResult = {
|
|
11
23
|
type: "message";
|
|
@@ -29,11 +41,40 @@ export interface HttpPostedMessage {
|
|
|
29
41
|
}
|
|
30
42
|
export interface HttpChannelAdapter {
|
|
31
43
|
provider: string;
|
|
44
|
+
providerConfig?: Record<string, JsonValue>;
|
|
45
|
+
/**
|
|
46
|
+
* What a message that starts a turn does while its thread already runs:
|
|
47
|
+
* `enqueue` (the default) waits for the run and starts after it,
|
|
48
|
+
* `interrupt` cancels the run, keeping its progress, and starts at once,
|
|
49
|
+
* `rollback` cancels it and discards its progress, and `reject` starts
|
|
50
|
+
* nothing. Messages to a thread that waits on an interrupt start nothing
|
|
51
|
+
* either way.
|
|
52
|
+
*/
|
|
53
|
+
multitaskStrategy?: MultitaskStrategy;
|
|
32
54
|
verify(context: HttpChannelRequest): boolean | Promise<boolean>;
|
|
33
55
|
/** Decode the verified request body in the provider's format. */
|
|
34
56
|
parse(context: HttpChannelRequest): HttpChannelParseResult | Promise<HttpChannelParseResult>;
|
|
35
57
|
post?(input: HttpChannelPostInput): Promise<HttpPostedMessage>;
|
|
36
58
|
onError?(error: unknown, target: JsonValue): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* What a message without `content` starts a run with, asked only once the
|
|
61
|
+
* thread takes a new turn, never while it waits on an interrupt. `null` or
|
|
62
|
+
* `undefined` starts nothing.
|
|
63
|
+
*/
|
|
64
|
+
input?(message: HttpChannelInboundMessage, rawEvent: JsonValue | undefined): ChannelRunResult | null | undefined | Promise<ChannelRunResult | null | undefined>;
|
|
65
|
+
/**
|
|
66
|
+
* The message's thread waits on a decision, so MDA started no run; tell the
|
|
67
|
+
* sender where to make it. Failures are logged.
|
|
68
|
+
*/
|
|
69
|
+
onPaused?(target: JsonValue, run: HttpChannelRunInfo): Promise<void>;
|
|
70
|
+
}
|
|
71
|
+
/** The thread a notice is about, for links into LangSmith Studio. */
|
|
72
|
+
export interface HttpChannelRunInfo {
|
|
73
|
+
threadId: string;
|
|
74
|
+
/** The assistant that runs on the thread, when known. */
|
|
75
|
+
assistantId?: string;
|
|
76
|
+
/** The provider event of the delivery the notice is about, when parsed. */
|
|
77
|
+
rawEvent?: JsonValue;
|
|
37
78
|
}
|
|
38
79
|
export interface HttpChannelRequest {
|
|
39
80
|
request: Request;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/channels/http/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/channels/http/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,MAAM,EAAE,SAAS,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,sBAAsB,GAC9B;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,yBAAyB,CAAC;IACnC,kEAAkE;IAClE,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAC;AAE5C,mEAAmE;AACnE,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG;IAClD,MAAM,EAAE,SAAS,CAAC;IAClB,gFAAgF;IAChF,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3C;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChE,iEAAiE;IACjE,KAAK,CACH,OAAO,EAAE,kBAAkB,GAC1B,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC5D,IAAI,CAAC,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/D,OAAO,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D;;;;OAIG;IACH,KAAK,CAAC,CACJ,OAAO,EAAE,yBAAyB,EAClC,QAAQ,EAAE,SAAS,GAAG,SAAS,GAE7B,gBAAgB,GAChB,IAAI,GACJ,SAAS,GACT,OAAO,CAAC,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACjD;;;OAGG;IACH,QAAQ,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AAED,qEAAqE;AACrE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,UAAU,CAAC;CACrB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Why a channel's reserved agent connection cannot be read as a user
|
|
3
|
+
* connection, or undefined for any other slug. Reading the GitHub App's token
|
|
4
|
+
* as the person running the agent is not supported yet.
|
|
5
|
+
*/
|
|
6
|
+
export declare function reservedUserConnectionError(slug: string): string | undefined;
|
|
7
|
+
/**
|
|
8
|
+
* The connection that actually holds a channel's reserved agent connection;
|
|
9
|
+
* other slugs pass through unchanged.
|
|
10
|
+
*/
|
|
11
|
+
export declare function reservedAgentConnectionSlug(slug: string, deploymentId: string | undefined): string;
|
|
12
|
+
//# sourceMappingURL=reserved-connections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reserved-connections.d.ts","sourceRoot":"","sources":["../../src/channels/reserved-connections.ts"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQ5E;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GAAG,SAAS,GAC/B,MAAM,CAGR"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { GITHUB_TOKEN_SLUG, githubAppConnectionSlug, } from "./github/connections.js";
|
|
2
|
+
// First-party channels' reserved agent connection names, listed here so
|
|
3
|
+
// resolution does not depend on adapter modules being loaded.
|
|
4
|
+
const builtinReservedConnections = new Map([
|
|
5
|
+
[GITHUB_TOKEN_SLUG, (deploymentId) => githubAppConnectionSlug(deploymentId)],
|
|
6
|
+
]);
|
|
7
|
+
/**
|
|
8
|
+
* Why a channel's reserved agent connection cannot be read as a user
|
|
9
|
+
* connection, or undefined for any other slug. Reading the GitHub App's token
|
|
10
|
+
* as the person running the agent is not supported yet.
|
|
11
|
+
*/
|
|
12
|
+
export function reservedUserConnectionError(slug) {
|
|
13
|
+
if (!builtinReservedConnections.has(slug))
|
|
14
|
+
return undefined;
|
|
15
|
+
const name = JSON.stringify(slug);
|
|
16
|
+
return (`${name} is not supported as a user connection yet: it is the GitHub App's ` +
|
|
17
|
+
`installation token, an agent connection. Use connections.get(${name}, ` +
|
|
18
|
+
`{ type: "agent" }) to act on GitHub as the App.`);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The connection that actually holds a channel's reserved agent connection;
|
|
22
|
+
* other slugs pass through unchanged.
|
|
23
|
+
*/
|
|
24
|
+
export function reservedAgentConnectionSlug(slug, deploymentId) {
|
|
25
|
+
const resolve = builtinReservedConnections.get(slug);
|
|
26
|
+
return resolve && deploymentId ? resolve(deploymentId) : slug;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=reserved-connections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reserved-connections.js","sourceRoot":"","sources":["../../src/channels/reserved-connections.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AAEjC,wEAAwE;AACxE,8DAA8D;AAC9D,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAGxC;IACA,CAAC,iBAAiB,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC;CAC7E,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAAY;IACtD,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,CACL,GAAG,IAAI,qEAAqE;QAC5E,gEAAgE,IAAI,IAAI;QACxE,iDAAiD,CAClD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,IAAY,EACZ,YAAgC;IAEhC,MAAM,OAAO,GAAG,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrD,OAAO,OAAO,IAAI,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a channel handler starts a run with, in the shapes `agent.invoke`
|
|
3
|
+
* takes, normalized to the JSON the Agent Server accepts.
|
|
4
|
+
*/
|
|
5
|
+
import { type BaseMessage, type BaseMessageLike } from "@langchain/core/messages";
|
|
6
|
+
import type { LangGraphRunnableConfig } from "@langchain/langgraph";
|
|
7
|
+
import type { JsonObject } from "./manifest.js";
|
|
8
|
+
/**
|
|
9
|
+
* State to start a run with, as `agent.invoke` takes it: `messages` plus any
|
|
10
|
+
* other keys of the agent's state.
|
|
11
|
+
*/
|
|
12
|
+
export interface ChannelStateInput {
|
|
13
|
+
messages?: BaseMessageLike[];
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
/** A user message's text, a message, or state to start a run with. */
|
|
17
|
+
export type ChannelRunInput = string | BaseMessage | ChannelStateInput;
|
|
18
|
+
/** Run options a handler may set with its input, as `agent.invoke` takes them. */
|
|
19
|
+
export type ChannelRunOptions = Pick<LangGraphRunnableConfig<Record<string, unknown>>, "context">;
|
|
20
|
+
/**
|
|
21
|
+
* What a channel handler may return to start a run: the input, or the input
|
|
22
|
+
* with run options, as `agent.invoke(input, options)` takes them.
|
|
23
|
+
*/
|
|
24
|
+
export type ChannelRunResult = ChannelRunInput | readonly [ChannelRunInput, ChannelRunOptions];
|
|
25
|
+
/** A handler's result as the Agent Server takes it. */
|
|
26
|
+
export interface NormalizedRunInput {
|
|
27
|
+
/** Messages as JSON, each with a `role`. */
|
|
28
|
+
messages: JsonObject[];
|
|
29
|
+
/** Other state keys. */
|
|
30
|
+
state: JsonObject;
|
|
31
|
+
context?: JsonObject;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Normalize what a handler returned. `null` and `undefined` start nothing;
|
|
35
|
+
* anything else that is not valid input throws a `TypeError`.
|
|
36
|
+
*/
|
|
37
|
+
export declare function normalizeRunInput(value: unknown): NormalizedRunInput | undefined;
|
|
38
|
+
//# sourceMappingURL=run-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-input.d.ts","sourceRoot":"","sources":["../../src/channels/run-input.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,eAAe,EAErB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,sEAAsE;AACtE,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,WAAW,GAAG,iBAAiB,CAAC;AAEvE,kFAAkF;AAClF,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAClC,uBAAuB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAChD,SAAS,CACV,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GACxB,eAAe,GACf,SAAS,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;AAElD,uDAAuD;AACvD,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,wBAAwB;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AASD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,GACb,kBAAkB,GAAG,SAAS,CAsBhC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a channel handler starts a run with, in the shapes `agent.invoke`
|
|
3
|
+
* takes, normalized to the JSON the Agent Server accepts.
|
|
4
|
+
*/
|
|
5
|
+
import { HumanMessage, coerceMessageLikeToMessage, isBaseMessage, } from "@langchain/core/messages";
|
|
6
|
+
import { isJsonValue } from "./message-schema.js";
|
|
7
|
+
const MESSAGE_ROLES = new Set([
|
|
8
|
+
"human",
|
|
9
|
+
"ai",
|
|
10
|
+
"system",
|
|
11
|
+
"tool",
|
|
12
|
+
]);
|
|
13
|
+
/**
|
|
14
|
+
* Normalize what a handler returned. `null` and `undefined` start nothing;
|
|
15
|
+
* anything else that is not valid input throws a `TypeError`.
|
|
16
|
+
*/
|
|
17
|
+
export function normalizeRunInput(value) {
|
|
18
|
+
if (value === null || value === undefined)
|
|
19
|
+
return undefined;
|
|
20
|
+
const [input, options] = Array.isArray(value)
|
|
21
|
+
? value
|
|
22
|
+
: [value, undefined];
|
|
23
|
+
if (Array.isArray(value) && value.length !== 2 && value.length !== 1)
|
|
24
|
+
throw new TypeError("run input must be [input, options]");
|
|
25
|
+
const normalized = normalizeInput(input);
|
|
26
|
+
if (options === undefined)
|
|
27
|
+
return normalized;
|
|
28
|
+
if (!isPlainObject(options))
|
|
29
|
+
throw new TypeError("run options must be an object");
|
|
30
|
+
const { context, ...rest } = options;
|
|
31
|
+
if (Object.keys(rest).length)
|
|
32
|
+
throw new TypeError(`unsupported run option ${Object.keys(rest).join(", ")}; use context`);
|
|
33
|
+
if (context === undefined)
|
|
34
|
+
return normalized;
|
|
35
|
+
if (!isPlainObject(context) || !isJsonValue(context))
|
|
36
|
+
throw new TypeError("run context must be a JSON object");
|
|
37
|
+
if ("channel" in context)
|
|
38
|
+
throw new TypeError("context.channel is reserved for managed ingress");
|
|
39
|
+
return { ...normalized, context: context };
|
|
40
|
+
}
|
|
41
|
+
function normalizeInput(input) {
|
|
42
|
+
if (typeof input === "string") {
|
|
43
|
+
if (!input.trim())
|
|
44
|
+
throw new TypeError("run input must not be blank");
|
|
45
|
+
return { messages: [messageJson(new HumanMessage(input))], state: {} };
|
|
46
|
+
}
|
|
47
|
+
if (isBaseMessage(input))
|
|
48
|
+
return { messages: [messageJson(input)], state: {} };
|
|
49
|
+
if (!isPlainObject(input))
|
|
50
|
+
throw new TypeError("run input must be a string, a message, or an object of state");
|
|
51
|
+
const { messages, ...state } = input;
|
|
52
|
+
if (messages !== undefined && !Array.isArray(messages))
|
|
53
|
+
throw new TypeError("run input messages must be an array");
|
|
54
|
+
if (!isJsonValue(state))
|
|
55
|
+
throw new TypeError("run input state must be JSON");
|
|
56
|
+
const normalized = (messages ?? []).map(messageLike);
|
|
57
|
+
if (!normalized.length && !Object.keys(state).length)
|
|
58
|
+
throw new TypeError("run input must not be empty");
|
|
59
|
+
return { messages: normalized, state: state };
|
|
60
|
+
}
|
|
61
|
+
function messageLike(message) {
|
|
62
|
+
if (typeof message === "string" && !message.trim())
|
|
63
|
+
throw new TypeError("a message must not be blank");
|
|
64
|
+
try {
|
|
65
|
+
return messageJson(coerceMessageLikeToMessage(message));
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (error instanceof TypeError)
|
|
69
|
+
throw error;
|
|
70
|
+
throw new TypeError("a message must be a string, a message, or JSON");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* A message as the JSON the Agent Server turns back into a message: its
|
|
75
|
+
* `toDict()` fields with a `role`. `toDict()` puts content built from
|
|
76
|
+
* `contentBlocks` under `content_blocks`, which the server does not read, so
|
|
77
|
+
* the message's `content` is sent instead.
|
|
78
|
+
*/
|
|
79
|
+
function messageJson(message) {
|
|
80
|
+
const role = message.getType();
|
|
81
|
+
if (!MESSAGE_ROLES.has(role))
|
|
82
|
+
throw new TypeError(`unsupported message type ${role}`);
|
|
83
|
+
const { content_blocks: _blocks, ...fields } = message.toDict().data;
|
|
84
|
+
const json = { ...fields, role, content: message.content };
|
|
85
|
+
if (!isJsonValue(json))
|
|
86
|
+
throw new TypeError("a message must be JSON");
|
|
87
|
+
return json;
|
|
88
|
+
}
|
|
89
|
+
function isPlainObject(value) {
|
|
90
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
91
|
+
return false;
|
|
92
|
+
const prototype = Object.getPrototypeOf(value);
|
|
93
|
+
return prototype === Object.prototype || prototype === null;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=run-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-input.js","sourceRoot":"","sources":["../../src/channels/run-input.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingress.d.ts","sourceRoot":"","sources":["../../../src/channels/trigger/ingress.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,
|
|
1
|
+
{"version":3,"file":"ingress.d.ts","sourceRoot":"","sources":["../../../src/channels/trigger/ingress.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AASvD,0CAA0C;AAC1C,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;AAE7E,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAEzC;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA2B9B;AAED,6DAA6D;AAC7D,wBAAsB,iBAAiB,CAAC,KAAK,EAAE;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACpC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAU7B;AAED,yEAAyE;AACzE,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAU7B;AAED,iEAAiE;AACjE,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAc9B"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { Client } from "@langchain/langgraph-sdk";
|
|
3
3
|
import { buildIngressRunContext } from "../../ingress/index.js";
|
|
4
4
|
import { resolveLoopbackApiUrl } from "../../identity/loopback.js";
|
|
5
|
-
import { startIngressRun, resumeIngressRun, observeIngressRun, } from "../../ingress/runs.js";
|
|
5
|
+
import { startIngressRun, resumeIngressRun, observeIngressRun, lookupStatus, } from "../../ingress/runs.js";
|
|
6
6
|
import { ChannelError } from "../errors.js";
|
|
7
7
|
import { USER_HEADER, LANGCHAIN_API_KEY_ENV, AGENT_AUTH_PRINCIPAL_HEADER, SOURCE_PROVIDER_HEADER, SOURCE_THREAD_HEADER, } from "../../runtime/auth.js";
|
|
8
8
|
/**
|
|
@@ -39,24 +39,6 @@ export async function ingressThreadInterrupts(input) {
|
|
|
39
39
|
}
|
|
40
40
|
return pending;
|
|
41
41
|
}
|
|
42
|
-
/**
|
|
43
|
-
* HTTP status behind a failed loopback read.
|
|
44
|
-
*
|
|
45
|
-
* `AsyncCaller.fetch` rejects with the raw `Response`, so the status is usually
|
|
46
|
-
* on the thrown value itself; wrapped clients expose it under `response`.
|
|
47
|
-
*/
|
|
48
|
-
function lookupStatus(error) {
|
|
49
|
-
if (typeof error !== "object" || error === null)
|
|
50
|
-
return undefined;
|
|
51
|
-
const direct = error.status;
|
|
52
|
-
if (typeof direct === "number")
|
|
53
|
-
return direct;
|
|
54
|
-
const response = error.response;
|
|
55
|
-
if (typeof response !== "object" || response === null)
|
|
56
|
-
return undefined;
|
|
57
|
-
const nested = response.status;
|
|
58
|
-
return typeof nested === "number" ? nested : undefined;
|
|
59
|
-
}
|
|
60
42
|
/** Create a Trigger-addressed thread and enqueue its run. */
|
|
61
43
|
export async function startIngressAgent(input) {
|
|
62
44
|
const client = createTriggerIngressLoopbackClient({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingress.js","sourceRoot":"","sources":["../../../src/channels/trigger/ingress.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAIlD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"ingress.js","sourceRoot":"","sources":["../../../src/channels/trigger/ingress.ts"],"names":[],"mappings":"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"}
|
package/dist/connections.d.ts
CHANGED
|
@@ -55,6 +55,8 @@ export interface AgentAuthConfig {
|
|
|
55
55
|
workspaceId?: string;
|
|
56
56
|
localDevPrincipalId?: string;
|
|
57
57
|
}
|
|
58
|
+
/** Env var holding the deployment id, which is the agent owner's `owner_id`. */
|
|
59
|
+
export declare const DEPLOYMENT_ID_ENV = "LANGSMITH_HOST_PROJECT_ID";
|
|
58
60
|
export declare class AgentAuthConnectionStore {
|
|
59
61
|
private readonly env;
|
|
60
62
|
private readonly fetchImpl;
|
|
@@ -79,6 +81,18 @@ export declare function resolveOwnerId(owner: ConnectionOwner, identity: Runtime
|
|
|
79
81
|
* Agent Auth env is configured; does not require `LANGSMITH_HOST_PROJECT_ID`.
|
|
80
82
|
*/
|
|
81
83
|
export declare function resolveAgentAuthContext(identity: RuntimeIdentity | undefined, env?: NodeJS.ProcessEnv, fetchImpl?: typeof fetch, timeoutMs?: number): Promise<AgentAuthContext>;
|
|
84
|
+
/**
|
|
85
|
+
* Why a run on a channel's conversation gets no user connections, even when a
|
|
86
|
+
* person resumes it from Studio: the conversation holds content from outside
|
|
87
|
+
* the workspace, which must not steer a person's grants.
|
|
88
|
+
*/
|
|
89
|
+
export declare const CHANNEL_THREAD_USER_CONNECTION_ERROR: string;
|
|
90
|
+
/**
|
|
91
|
+
* The channel a run started by a channel event runs as, e.g. `github`. Such a
|
|
92
|
+
* run runs as the channel, not as the person who sent the event, so there is
|
|
93
|
+
* no one to own a user grant.
|
|
94
|
+
*/
|
|
95
|
+
export declare function channelProvider(identity: RuntimeIdentity | undefined): string | undefined;
|
|
82
96
|
/**
|
|
83
97
|
* Map a runtime identity to the Agent Auth principal used for user grants.
|
|
84
98
|
*
|