managed-deepagents 0.10.0-dev.1 → 0.10.0-dev.10
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 +220 -21
- package/dist/agent-auth.d.ts +13 -0
- package/dist/agent-auth.d.ts.map +1 -1
- package/dist/agent-auth.js +16 -1
- package/dist/agent-auth.js.map +1 -1
- package/dist/channels/github/connections.d.ts.map +1 -1
- package/dist/channels/github/connections.js +2 -2
- package/dist/channels/github/connections.js.map +1 -1
- package/dist/channels/github/index.d.ts +2 -9
- package/dist/channels/github/index.d.ts.map +1 -1
- package/dist/channels/github/index.js +72 -140
- package/dist/channels/github/index.js.map +1 -1
- package/dist/channels/github/schema.d.ts.map +1 -1
- package/dist/channels/github/schema.js +1 -3
- package/dist/channels/github/schema.js.map +1 -1
- package/dist/channels/github/types.d.ts +48 -10
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/http/endpoint.d.ts +41 -0
- package/dist/channels/http/endpoint.d.ts.map +1 -0
- package/dist/channels/http/endpoint.js +132 -0
- package/dist/channels/http/endpoint.js.map +1 -0
- package/dist/channels/http/http.d.ts.map +1 -1
- package/dist/channels/http/http.js +233 -66
- package/dist/channels/http/http.js.map +1 -1
- package/dist/channels/http/index.d.ts +1 -1
- package/dist/channels/http/index.d.ts.map +1 -1
- package/dist/channels/http/index.js.map +1 -1
- package/dist/channels/http/ingress.d.ts +34 -3
- package/dist/channels/http/ingress.d.ts.map +1 -1
- package/dist/channels/http/ingress.js +40 -24
- package/dist/channels/http/ingress.js.map +1 -1
- package/dist/channels/http/provider.d.ts +99 -0
- package/dist/channels/http/provider.d.ts.map +1 -0
- package/dist/channels/http/provider.js +188 -0
- package/dist/channels/http/provider.js.map +1 -0
- package/dist/channels/http/reply.d.ts +20 -0
- package/dist/channels/http/reply.d.ts.map +1 -0
- package/dist/channels/http/reply.js +116 -0
- package/dist/channels/http/reply.js.map +1 -0
- package/dist/channels/http/studio.d.ts +17 -0
- package/dist/channels/http/studio.d.ts.map +1 -0
- package/dist/channels/http/studio.js +82 -0
- package/dist/channels/http/studio.js.map +1 -0
- package/dist/channels/http/types.d.ts +77 -6
- package/dist/channels/http/types.d.ts.map +1 -1
- package/dist/channels/linear/connections.d.ts +11 -0
- package/dist/channels/linear/connections.d.ts.map +1 -0
- package/dist/channels/linear/connections.js +14 -0
- package/dist/channels/linear/connections.js.map +1 -0
- package/dist/channels/linear/graphql.d.ts +57 -0
- package/dist/channels/linear/graphql.d.ts.map +1 -0
- package/dist/channels/linear/graphql.js +167 -0
- package/dist/channels/linear/graphql.js.map +1 -0
- package/dist/channels/linear/index.d.ts +9 -0
- package/dist/channels/linear/index.d.ts.map +1 -0
- package/dist/channels/linear/index.js +477 -0
- package/dist/channels/linear/index.js.map +1 -0
- package/dist/channels/linear/schema.d.ts +1064 -0
- package/dist/channels/linear/schema.d.ts.map +1 -0
- package/dist/channels/linear/schema.js +249 -0
- package/dist/channels/linear/schema.js.map +1 -0
- package/dist/channels/linear/types.d.ts +150 -0
- package/dist/channels/linear/types.d.ts.map +1 -0
- package/dist/channels/linear/types.js +2 -0
- package/dist/channels/linear/types.js.map +1 -0
- package/dist/channels/message-schema.d.ts +2 -0
- package/dist/channels/message-schema.d.ts.map +1 -1
- package/dist/channels/message-schema.js +4 -0
- package/dist/channels/message-schema.js.map +1 -1
- package/dist/channels/reserved-connections.d.ts +2 -2
- package/dist/channels/reserved-connections.d.ts.map +1 -1
- package/dist/channels/reserved-connections.js +26 -9
- package/dist/channels/reserved-connections.js.map +1 -1
- package/dist/channels/run-input.d.ts +17 -1
- package/dist/channels/run-input.d.ts.map +1 -1
- package/dist/channels/run-input.js +39 -5
- package/dist/channels/run-input.js.map +1 -1
- package/dist/channels/slack/index.d.ts.map +1 -1
- package/dist/channels/slack/index.js +2 -0
- package/dist/channels/slack/index.js.map +1 -1
- package/dist/channels/slack/message-content.d.ts +25 -0
- package/dist/channels/slack/message-content.d.ts.map +1 -0
- package/dist/channels/slack/message-content.js +237 -0
- package/dist/channels/slack/message-content.js.map +1 -0
- package/dist/channels/source-providers.js +1 -1
- package/dist/channels/source-providers.js.map +1 -1
- package/dist/channels/trigger/client.js +7 -3
- package/dist/channels/trigger/client.js.map +1 -1
- package/dist/channels/trigger/http.d.ts +3 -1
- package/dist/channels/trigger/http.d.ts.map +1 -1
- package/dist/channels/trigger/http.js +7 -4
- package/dist/channels/trigger/http.js.map +1 -1
- package/dist/channels/trigger/tracing-project.d.ts +16 -0
- package/dist/channels/trigger/tracing-project.d.ts.map +1 -0
- package/dist/channels/trigger/tracing-project.js +54 -0
- package/dist/channels/trigger/tracing-project.js.map +1 -0
- package/dist/channels/trigger/types.d.ts +12 -2
- package/dist/channels/trigger/types.d.ts.map +1 -1
- package/dist/channels/trigger/types.js.map +1 -1
- package/dist/connections.d.ts +30 -0
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +80 -7
- package/dist/connections.js.map +1 -1
- package/dist/connectors/mcp/index.d.ts.map +1 -1
- package/dist/connectors/mcp/index.js +52 -2
- package/dist/connectors/mcp/index.js.map +1 -1
- package/dist/connectors/mcp/langsmith-url.js +2 -2
- package/dist/connectors/mcp/langsmith-url.js.map +1 -1
- package/dist/credential-gate.d.ts.map +1 -1
- package/dist/credential-gate.js +24 -3
- package/dist/credential-gate.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ingress/runs.d.ts +7 -0
- package/dist/ingress/runs.d.ts.map +1 -1
- package/dist/ingress/runs.js +34 -1
- package/dist/ingress/runs.js.map +1 -1
- package/dist/namespaces.d.ts +15 -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 +4 -6
- package/dist/runtime/auth.d.ts.map +1 -1
- package/dist/runtime/auth.js +165 -31
- package/dist/runtime/auth.js.map +1 -1
- package/dist/runtime/channel-icon.d.ts +22 -0
- package/dist/runtime/channel-icon.d.ts.map +1 -0
- package/dist/runtime/channel-icon.js +70 -0
- package/dist/runtime/channel-icon.js.map +1 -0
- package/dist/runtime/channel.d.ts +6 -0
- package/dist/runtime/channel.d.ts.map +1 -1
- package/dist/runtime/channel.js.map +1 -1
- package/dist/runtime/identity-http.d.ts +2 -0
- package/dist/runtime/identity-http.d.ts.map +1 -1
- package/dist/runtime/identity-http.js +35 -0
- package/dist/runtime/identity-http.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/index.d.ts.map +1 -1
- package/dist/runtime/index.js +9 -4
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/sandbox-manager.d.ts +11 -0
- package/dist/runtime/sandbox-manager.d.ts.map +1 -1
- package/dist/runtime/sandbox-manager.js +70 -5
- package/dist/runtime/sandbox-manager.js.map +1 -1
- package/dist/runtime/schedule-auth.d.ts +1 -0
- package/dist/runtime/schedule-auth.d.ts.map +1 -1
- package/dist/runtime/schedule-auth.js +68 -2
- package/dist/runtime/schedule-auth.js.map +1 -1
- package/dist/runtime/types.d.ts +5 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime-schedules.d.ts.map +1 -1
- package/dist/runtime-schedules.js +8 -12
- package/dist/runtime-schedules.js.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/channels/linear/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,kFAAkF;AAClF,eAAO,MAAM,mBAAmB;;;;;;;iBAO9B,CAAC;AA8EH;;;GAGG;AACH,eAAO,MAAM,qBAAqB,YAChC,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,UAAU,EACV,OAAO,EACP,aAAa,CACL,CAAC;AACX;;;GAGG;AACH,eAAO,MAAM,qBAAqB,YAAI,MAAM,CAAU,CAAC;AAyCvD,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAiD/B,CAAC;AAEH,eAAO,MAAM,oBAAoB,qHAEhC,CAAC;AAuEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAtCrB,MAAM;eAAS,MAAM;eAAS,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwD3C,CAAC"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { nonblankStringSchema } from "../message-schema.js";
|
|
3
|
+
// Shared scalar constraints. Linear identifiers are UUIDs, but only their
|
|
4
|
+
// presence matters here.
|
|
5
|
+
const optionalTextSchema = z.string().nullish();
|
|
6
|
+
/** Receipt metadata only, not a complete Linear webhook payload specification. */
|
|
7
|
+
export const linearReceiptSchema = z.object({
|
|
8
|
+
deliveryId: nonblankStringSchema,
|
|
9
|
+
payload: z.looseObject({
|
|
10
|
+
type: nonblankStringSchema,
|
|
11
|
+
action: nonblankStringSchema,
|
|
12
|
+
organizationId: z.string().optional(),
|
|
13
|
+
}),
|
|
14
|
+
});
|
|
15
|
+
const teamSchema = z.looseObject({
|
|
16
|
+
id: nonblankStringSchema,
|
|
17
|
+
key: nonblankStringSchema,
|
|
18
|
+
name: z.string().optional(),
|
|
19
|
+
});
|
|
20
|
+
const actorSchema = z.looseObject({
|
|
21
|
+
id: nonblankStringSchema,
|
|
22
|
+
type: z.string().optional(),
|
|
23
|
+
name: z.string().optional(),
|
|
24
|
+
});
|
|
25
|
+
// Payload subjects. Loose objects retain unmodeled provider fields.
|
|
26
|
+
const issueSchema = z.looseObject({
|
|
27
|
+
id: nonblankStringSchema,
|
|
28
|
+
identifier: nonblankStringSchema,
|
|
29
|
+
title: z.string(),
|
|
30
|
+
description: optionalTextSchema,
|
|
31
|
+
url: z.string().optional(),
|
|
32
|
+
teamId: z.string().optional(),
|
|
33
|
+
team: teamSchema.optional(),
|
|
34
|
+
labelIds: z.array(z.string()).optional(),
|
|
35
|
+
labels: z
|
|
36
|
+
.array(z.looseObject({ id: z.string(), name: z.string() }))
|
|
37
|
+
.optional(),
|
|
38
|
+
botActor: z.unknown().optional(),
|
|
39
|
+
});
|
|
40
|
+
const commentSchema = z.looseObject({
|
|
41
|
+
id: nonblankStringSchema,
|
|
42
|
+
body: z.string(),
|
|
43
|
+
issueId: nonblankStringSchema,
|
|
44
|
+
parentId: z.string().nullish(),
|
|
45
|
+
userId: z.string().nullish(),
|
|
46
|
+
user: z
|
|
47
|
+
.looseObject({ id: z.string(), name: z.string().optional() })
|
|
48
|
+
.nullish(),
|
|
49
|
+
issue: z
|
|
50
|
+
.looseObject({
|
|
51
|
+
id: nonblankStringSchema,
|
|
52
|
+
identifier: z.string().optional(),
|
|
53
|
+
title: z.string().optional(),
|
|
54
|
+
url: z.string().optional(),
|
|
55
|
+
team: teamSchema.optional(),
|
|
56
|
+
})
|
|
57
|
+
.optional(),
|
|
58
|
+
botActor: z.unknown().optional(),
|
|
59
|
+
});
|
|
60
|
+
const sessionIssueSchema = z.looseObject({
|
|
61
|
+
id: nonblankStringSchema,
|
|
62
|
+
identifier: z.string().optional(),
|
|
63
|
+
title: z.string().optional(),
|
|
64
|
+
url: z.string().optional(),
|
|
65
|
+
description: optionalTextSchema,
|
|
66
|
+
team: teamSchema.optional(),
|
|
67
|
+
});
|
|
68
|
+
/** A Linear agent session: the app was mentioned or delegated an issue. */
|
|
69
|
+
const agentSessionSchema = z.looseObject({
|
|
70
|
+
id: nonblankStringSchema,
|
|
71
|
+
status: z.string().optional(),
|
|
72
|
+
url: z.string().optional(),
|
|
73
|
+
issueId: z.string().nullish(),
|
|
74
|
+
issue: sessionIssueSchema.nullish(),
|
|
75
|
+
// The comment that started the session, when a mention did.
|
|
76
|
+
commentId: z.string().nullish(),
|
|
77
|
+
comment: z
|
|
78
|
+
.looseObject({ id: nonblankStringSchema, body: z.string().optional() })
|
|
79
|
+
.nullish(),
|
|
80
|
+
creatorId: z.string().nullish(),
|
|
81
|
+
creator: z
|
|
82
|
+
.looseObject({ id: nonblankStringSchema, name: z.string().optional() })
|
|
83
|
+
.nullish(),
|
|
84
|
+
});
|
|
85
|
+
/**
|
|
86
|
+
* The activity content types Linear documents; one it adds later reads as
|
|
87
|
+
* `unknown`. A user's reply is a `prompt`.
|
|
88
|
+
*/
|
|
89
|
+
export const LINEAR_ACTIVITY_TYPES = [
|
|
90
|
+
"prompt",
|
|
91
|
+
"thought",
|
|
92
|
+
"action",
|
|
93
|
+
"response",
|
|
94
|
+
"error",
|
|
95
|
+
"elicitation",
|
|
96
|
+
];
|
|
97
|
+
/**
|
|
98
|
+
* The signals Linear documents on a user's activity; one it adds later reads
|
|
99
|
+
* as `unknown`. `stop` asks the agent to stop.
|
|
100
|
+
*/
|
|
101
|
+
export const LINEAR_PROMPT_SIGNALS = ["stop"];
|
|
102
|
+
/** What a user said in a session: a reply, or a signal such as `stop`. */
|
|
103
|
+
const agentActivitySchema = z.looseObject({
|
|
104
|
+
content: z.looseObject({
|
|
105
|
+
type: z.enum([...LINEAR_ACTIVITY_TYPES, "unknown"]).catch("unknown"),
|
|
106
|
+
body: z.string().optional(),
|
|
107
|
+
}),
|
|
108
|
+
signal: z
|
|
109
|
+
.enum([...LINEAR_PROMPT_SIGNALS, "unknown"])
|
|
110
|
+
.catch("unknown")
|
|
111
|
+
.nullish(),
|
|
112
|
+
signalMetadata: z.unknown().optional(),
|
|
113
|
+
sourceCommentId: z.string().nullish(),
|
|
114
|
+
userId: z.string().nullish(),
|
|
115
|
+
user: z
|
|
116
|
+
.looseObject({ id: nonblankStringSchema, name: z.string().optional() })
|
|
117
|
+
.nullish(),
|
|
118
|
+
});
|
|
119
|
+
// Common delivery context.
|
|
120
|
+
const envelopeSchema = z.looseObject({
|
|
121
|
+
organizationId: nonblankStringSchema,
|
|
122
|
+
webhookId: z.string().optional(),
|
|
123
|
+
webhookTimestamp: z.number(),
|
|
124
|
+
createdAt: z.string().optional(),
|
|
125
|
+
url: z.string().optional(),
|
|
126
|
+
actor: actorSchema.optional(),
|
|
127
|
+
});
|
|
128
|
+
function dispatchEventSchema(key, payloadSchema) {
|
|
129
|
+
return z.object({
|
|
130
|
+
key: z.literal(key),
|
|
131
|
+
deliveryId: nonblankStringSchema,
|
|
132
|
+
payload: payloadSchema,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/** Each supported event key requires its exact type, action and subject. */
|
|
136
|
+
export const linearDispatchSchema = z.discriminatedUnion("key", [
|
|
137
|
+
dispatchEventSchema("Issue.create", envelopeSchema.extend({
|
|
138
|
+
type: z.literal("Issue"),
|
|
139
|
+
action: z.literal("create"),
|
|
140
|
+
data: issueSchema,
|
|
141
|
+
})),
|
|
142
|
+
dispatchEventSchema("Issue.update", envelopeSchema.extend({
|
|
143
|
+
type: z.literal("Issue"),
|
|
144
|
+
action: z.literal("update"),
|
|
145
|
+
data: issueSchema,
|
|
146
|
+
// The changed fields' previous values.
|
|
147
|
+
updatedFrom: z.record(z.string(), z.unknown()).optional(),
|
|
148
|
+
})),
|
|
149
|
+
dispatchEventSchema("Comment.create", envelopeSchema.extend({
|
|
150
|
+
type: z.literal("Comment"),
|
|
151
|
+
action: z.literal("create"),
|
|
152
|
+
data: commentSchema,
|
|
153
|
+
})),
|
|
154
|
+
dispatchEventSchema("AgentSessionEvent.created", envelopeSchema.extend({
|
|
155
|
+
type: z.literal("AgentSessionEvent"),
|
|
156
|
+
action: z.literal("created"),
|
|
157
|
+
appUserId: z.string().optional(),
|
|
158
|
+
agentSession: agentSessionSchema,
|
|
159
|
+
// Linear's ready-made prompt: the issue, the thread and who asked.
|
|
160
|
+
promptContext: z.string().nullish(),
|
|
161
|
+
guidance: z.unknown().optional(),
|
|
162
|
+
})),
|
|
163
|
+
dispatchEventSchema("AgentSessionEvent.prompted", envelopeSchema.extend({
|
|
164
|
+
type: z.literal("AgentSessionEvent"),
|
|
165
|
+
action: z.literal("prompted"),
|
|
166
|
+
appUserId: z.string().optional(),
|
|
167
|
+
agentSession: agentSessionSchema,
|
|
168
|
+
agentActivity: agentActivitySchema,
|
|
169
|
+
})),
|
|
170
|
+
]);
|
|
171
|
+
export const SUPPORTED_EVENT_KEYS = linearDispatchSchema.options.map((option) => option.shape.key.value);
|
|
172
|
+
/** The issue an event is about, wherever its payload keeps it. */
|
|
173
|
+
function eventIssue(event) {
|
|
174
|
+
if (event.payload.type === "AgentSessionEvent") {
|
|
175
|
+
const session = event.payload.agentSession;
|
|
176
|
+
const id = session.issue?.id ?? session.issueId;
|
|
177
|
+
// Linear opens sessions on issues; one without could not be answered.
|
|
178
|
+
if (!id)
|
|
179
|
+
throw new TypeError("Linear agent session has no issue");
|
|
180
|
+
return { id, ...(session.issue?.team && { team: session.issue.team }) };
|
|
181
|
+
}
|
|
182
|
+
if (event.payload.type === "Comment") {
|
|
183
|
+
const { data } = event.payload;
|
|
184
|
+
return {
|
|
185
|
+
id: data.issueId,
|
|
186
|
+
...(data.issue?.team && { team: data.issue.team }),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
const { data } = event.payload;
|
|
190
|
+
return { id: data.id, ...(data.team && { team: data.team }) };
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Who acted: the webhook's actor, or for a session the user who started it or
|
|
194
|
+
* replied in it.
|
|
195
|
+
*/
|
|
196
|
+
function eventActor(event) {
|
|
197
|
+
const payload = event.payload;
|
|
198
|
+
const person = payload.type !== "AgentSessionEvent"
|
|
199
|
+
? payload.actor
|
|
200
|
+
: payload.action === "prompted"
|
|
201
|
+
? (payload.agentActivity.user ??
|
|
202
|
+
(payload.agentActivity.userId
|
|
203
|
+
? { id: payload.agentActivity.userId }
|
|
204
|
+
: undefined))
|
|
205
|
+
: (payload.agentSession.creator ??
|
|
206
|
+
(payload.agentSession.creatorId
|
|
207
|
+
? { id: payload.agentSession.creatorId }
|
|
208
|
+
: undefined));
|
|
209
|
+
if (!person)
|
|
210
|
+
return undefined;
|
|
211
|
+
const { type, name } = person;
|
|
212
|
+
return {
|
|
213
|
+
id: person.id,
|
|
214
|
+
...(typeof type === "string" && { type }),
|
|
215
|
+
...(typeof name === "string" && { name }),
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/** Routing metadata every event exposes next to its payload. */
|
|
219
|
+
function routing(event) {
|
|
220
|
+
const issue = eventIssue(event);
|
|
221
|
+
const actor = eventActor(event);
|
|
222
|
+
return {
|
|
223
|
+
organizationId: event.payload.organizationId,
|
|
224
|
+
issueId: issue.id,
|
|
225
|
+
...(issue.team && {
|
|
226
|
+
team: { id: issue.team.id, key: issue.team.key },
|
|
227
|
+
}),
|
|
228
|
+
...(actor && { actor }),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
// Expose common routing metadata while preserving the original payload.
|
|
232
|
+
export const linearEventSchema = linearDispatchSchema.transform((event) => {
|
|
233
|
+
if (event.key === "AgentSessionEvent.created" ||
|
|
234
|
+
event.key === "AgentSessionEvent.prompted")
|
|
235
|
+
return {
|
|
236
|
+
...event,
|
|
237
|
+
type: event.payload.type,
|
|
238
|
+
action: event.payload.action,
|
|
239
|
+
...routing(event),
|
|
240
|
+
sessionId: event.payload.agentSession.id,
|
|
241
|
+
};
|
|
242
|
+
return {
|
|
243
|
+
...event,
|
|
244
|
+
type: event.payload.type,
|
|
245
|
+
action: event.payload.action,
|
|
246
|
+
...routing(event),
|
|
247
|
+
};
|
|
248
|
+
});
|
|
249
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/channels/linear/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { MultitaskStrategy } from "../../ingress/runs.js";
|
|
3
|
+
import type { linearEventSchema } from "./schema.js";
|
|
4
|
+
import type { ChannelRunResult } from "../run-input.js";
|
|
5
|
+
import type { EventSettled } from "../http/provider.js";
|
|
6
|
+
import type { EventEndpoint } from "../http/endpoint.js";
|
|
7
|
+
/** Handwritten schema subsets; unmodeled provider fields remain unknown. */
|
|
8
|
+
type EventUnion = z.output<typeof linearEventSchema>;
|
|
9
|
+
export type LinearEventKey = EventUnion["key"];
|
|
10
|
+
export type LinearEvent<K extends LinearEventKey = LinearEventKey> = Extract<EventUnion, {
|
|
11
|
+
key: K;
|
|
12
|
+
}>;
|
|
13
|
+
export type LinearPayloadFor<K extends LinearEventKey> = LinearEvent<K>["payload"];
|
|
14
|
+
/**
|
|
15
|
+
* The conversation's thread an event belongs to. A handler runs before any
|
|
16
|
+
* run exists, so this is not a run's runtime.
|
|
17
|
+
*/
|
|
18
|
+
export interface LinearChannelThread {
|
|
19
|
+
/**
|
|
20
|
+
* The conversation's thread, the issue's or an agent session's, which the
|
|
21
|
+
* run the handler starts runs on. Useful for run context that names the
|
|
22
|
+
* thread, such as a token a backend signs for it.
|
|
23
|
+
*/
|
|
24
|
+
id: string;
|
|
25
|
+
channel: {
|
|
26
|
+
name: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* What an event handler returns: a run's input, as `agent.invoke` takes it —
|
|
31
|
+
* a string, a message such as `new HumanMessage(...)`, state such as
|
|
32
|
+
* `{ messages: [...] }`, or `[input, { context, metadata }]`. `null` or `undefined`
|
|
33
|
+
* starts nothing.
|
|
34
|
+
*/
|
|
35
|
+
export type LinearEventResult = ChannelRunResult | null | undefined | void;
|
|
36
|
+
export type LinearEventCallback<K extends LinearEventKey> = (event: LinearEvent<K>, thread: LinearChannelThread) => LinearEventResult | Promise<LinearEventResult>;
|
|
37
|
+
/** The Linear app `mda deploy` sets up: how it looks, and what it may do. */
|
|
38
|
+
export interface LinearAppOptions {
|
|
39
|
+
/**
|
|
40
|
+
* The app's name, shown where people mention it and in its comments: 2–80
|
|
41
|
+
* characters, without "Linear" or a URL. Defaults to the agent's name.
|
|
42
|
+
*
|
|
43
|
+
* Applies only when deploy creates the app. Linear has no API to change an
|
|
44
|
+
* app, so changing it later does nothing: rename an existing app on its
|
|
45
|
+
* settings page in Linear. Deploy reminds you when it keeps an existing app.
|
|
46
|
+
*/
|
|
47
|
+
name?: string;
|
|
48
|
+
/**
|
|
49
|
+
* What the app does, shown when a workspace admin installs it: up to 1,000
|
|
50
|
+
* characters. Like `name`, it applies only when deploy creates the app;
|
|
51
|
+
* change an existing app's description on its settings page in Linear.
|
|
52
|
+
*/
|
|
53
|
+
description?: string;
|
|
54
|
+
/**
|
|
55
|
+
* The app's icon: a PNG or JPEG image, as a path relative to `channels/`
|
|
56
|
+
* like the Slack channel's `icon`, such as `assets/icon.png`. At least
|
|
57
|
+
* 256×256 pixels and at most 1 MB. The deployment serves it at
|
|
58
|
+
* `/channels/{name}/icon`, and deploy points the new app's icon there.
|
|
59
|
+
* Like `name`, it applies only when deploy creates the app.
|
|
60
|
+
*/
|
|
61
|
+
icon?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Keys of the teams (as in `ENG-123`) the channel is limited to: events
|
|
64
|
+
* about other teams' issues start nothing. Defaults to every team the app
|
|
65
|
+
* can see. The app's token still reaches every team it was granted, so
|
|
66
|
+
* limit its team access in Linear too.
|
|
67
|
+
*/
|
|
68
|
+
teams?: string[];
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Options for `channels.linear(...)`: the app's scope and event handlers that
|
|
72
|
+
* start runs. Each issue is one conversation, and each agent session on it
|
|
73
|
+
* another.
|
|
74
|
+
*/
|
|
75
|
+
export interface LinearChannelOptions {
|
|
76
|
+
/** The Linear app `mda deploy` sets up: its name, description, icon and teams. */
|
|
77
|
+
app?: LinearAppOptions;
|
|
78
|
+
/**
|
|
79
|
+
* What an event that starts a run does while its conversation already
|
|
80
|
+
* runs: `enqueue` (the default) waits for the run and starts after it,
|
|
81
|
+
* `interrupt` cancels the run, keeping its progress, and starts at once,
|
|
82
|
+
* `rollback` cancels it and discards its progress, and `reject` starts
|
|
83
|
+
* nothing.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```ts
|
|
87
|
+
* // A newer comment replaces the work on an older one.
|
|
88
|
+
* channels.linear({ multitaskStrategy: "interrupt", onEvent })
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
multitaskStrategy?: MultitaskStrategy;
|
|
92
|
+
/**
|
|
93
|
+
* Event handlers that start runs. Return a prompt (string, message, or
|
|
94
|
+
* state), or nothing to skip. The run's final reply is posted as a comment
|
|
95
|
+
* on the issue, under the comment that started it.
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```ts
|
|
99
|
+
* { "Issue.create": (e) => `Triage ${e.payload.data.identifier}` }
|
|
100
|
+
* ```
|
|
101
|
+
*
|
|
102
|
+
* In agent sessions the reply goes to the session instead.
|
|
103
|
+
*
|
|
104
|
+
* A handler may also be an endpoint, a URL or a `Request` carrying headers,
|
|
105
|
+
* to have a service of yours decide: MDA POSTs it the event and its thread,
|
|
106
|
+
* and starts the run it answers with. See the README's "Asking your service
|
|
107
|
+
* what to start".
|
|
108
|
+
*/
|
|
109
|
+
onEvent?: {
|
|
110
|
+
[K in LinearEventKey]?: LinearEventCallback<K> | EventEndpoint;
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Answer Linear agent sessions, which open when someone mentions the app or
|
|
114
|
+
* delegates an issue to it. Defaults to `true`. Without a handler, a new
|
|
115
|
+
* session runs with Linear's prompt for it (`promptContext`), and a reply
|
|
116
|
+
* in the session continues the conversation. The run's progress and reply
|
|
117
|
+
* show in the session, and Stop cancels the run. A run that stops on
|
|
118
|
+
* interrupts answers with a link to its thread in LangSmith Studio, where
|
|
119
|
+
* they are resumed.
|
|
120
|
+
*
|
|
121
|
+
* @experimental Sessions use Linear's Agents API, a Developer Preview, so
|
|
122
|
+
* they may change as Linear changes it.
|
|
123
|
+
*/
|
|
124
|
+
sessions?: boolean;
|
|
125
|
+
/**
|
|
126
|
+
* Ignore changes made by other apps and integrations (a delivery whose
|
|
127
|
+
* actor isn't a person, or the creation of an issue or comment with a
|
|
128
|
+
* `botActor`), so automations don't trigger each other. Defaults to `true`.
|
|
129
|
+
* The app's own changes are always ignored.
|
|
130
|
+
*/
|
|
131
|
+
ignoreBots?: boolean;
|
|
132
|
+
/**
|
|
133
|
+
* How a delivery of a handled event ended, once: the run it started
|
|
134
|
+
* completed, stopped on interrupts, was cancelled, replaced, or failed, or
|
|
135
|
+
* why it started none, such as `declined` when its handler returned
|
|
136
|
+
* nothing; a Stop is `stopped`. Called after the channel's own activities,
|
|
137
|
+
* such as the session's elicitation or "Stopped.", in the background;
|
|
138
|
+
* failures are logged. See `channels.http`'s `onSettled` for its limits.
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* ```ts
|
|
142
|
+
* onSettled: async (event, thread, outcome) => {
|
|
143
|
+
* if ("runId" in outcome) await reportRun(thread.id, outcome);
|
|
144
|
+
* }
|
|
145
|
+
* ```
|
|
146
|
+
*/
|
|
147
|
+
onSettled?: EventSettled<LinearEvent, LinearChannelThread>;
|
|
148
|
+
}
|
|
149
|
+
export {};
|
|
150
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/channels/linear/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,4EAA4E;AAC5E,KAAK,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAC;AACrD,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;AAC/C,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI,OAAO,CAC1E,UAAU,EACV;IAAE,GAAG,EAAE,CAAC,CAAA;CAAE,CACX,CAAC;AACF,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,cAAc,IACnD,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAE5B;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3B;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;AAE3E,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,cAAc,IAAI,CAC1D,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EACrB,MAAM,EAAE,mBAAmB,KACxB,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEpD,6EAA6E;AAC7E,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,kFAAkF;IAClF,GAAG,CAAC,EAAE,gBAAgB,CAAC;IACvB;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,EAAE;SACP,CAAC,IAAI,cAAc,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,aAAa;KAC/D,CAAC;IACF;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,EAAE,YAAY,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;CAC5D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/channels/linear/types.ts"],"names":[],"mappings":""}
|
|
@@ -4,6 +4,8 @@ import type { MessageContent } from "@langchain/core/messages";
|
|
|
4
4
|
import type { JsonValue } from "./types.js";
|
|
5
5
|
/** Accept only finite, acyclic plain JSON, including frozen values. */
|
|
6
6
|
export declare function isJsonValue(value: unknown, ancestors?: Set<object>): value is JsonValue;
|
|
7
|
+
/** A string with something other than whitespace in it. */
|
|
8
|
+
export declare const nonblankStringSchema: z.ZodString;
|
|
7
9
|
export declare const jsonValueSchema: z.ZodCustom<JsonValue, JsonValue>;
|
|
8
10
|
export declare const channelContentMessageSchema: z.ZodObject<{
|
|
9
11
|
type: z.ZodLiteral<"content">;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-schema.d.ts","sourceRoot":"","sources":["../../src/channels/message-schema.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,uEAAuE;AACvE,wBAAgB,WAAW,CACzB,KAAK,EAAE,OAAO,EACd,SAAS,cAAoB,GAC5B,KAAK,IAAI,SAAS,CAiBpB;AAED,eAAO,MAAM,eAAe,mCAG3B,CAAC;AAeF,eAAO,MAAM,2BAA2B;;;kBAE7B,CAAC;AACZ,eAAO,MAAM,0BAA0B;;;kBAE5B,CAAC;AACZ,eAAO,MAAM,oBAAoB;;;;;;4BAG/B,CAAC"}
|
|
1
|
+
{"version":3,"file":"message-schema.d.ts","sourceRoot":"","sources":["../../src/channels/message-schema.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,uEAAuE;AACvE,wBAAgB,WAAW,CACzB,KAAK,EAAE,OAAO,EACd,SAAS,cAAoB,GAC5B,KAAK,IAAI,SAAS,CAiBpB;AAED,2DAA2D;AAC3D,eAAO,MAAM,oBAAoB,aAEY,CAAC;AAE9C,eAAO,MAAM,eAAe,mCAG3B,CAAC;AAeF,eAAO,MAAM,2BAA2B;;;kBAE7B,CAAC;AACZ,eAAO,MAAM,0BAA0B;;;kBAE5B,CAAC;AACZ,eAAO,MAAM,oBAAoB;;;;;;4BAG/B,CAAC"}
|
|
@@ -17,6 +17,10 @@ export function isJsonValue(value, ancestors = new Set()) {
|
|
|
17
17
|
ancestors.delete(value);
|
|
18
18
|
return valid;
|
|
19
19
|
}
|
|
20
|
+
/** A string with something other than whitespace in it. */
|
|
21
|
+
export const nonblankStringSchema = z
|
|
22
|
+
.string()
|
|
23
|
+
.refine((value) => value.trim().length > 0);
|
|
20
24
|
export const jsonValueSchema = z.custom(isJsonValue, "must be finite acyclic JSON");
|
|
21
25
|
const contentSchema = z.custom((value) => typeof value === "string" ||
|
|
22
26
|
(Array.isArray(value) &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-schema.js","sourceRoot":"","sources":["../../src/channels/message-schema.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,uEAAuE;AACvE,MAAM,UAAU,WAAW,CACzB,KAAc,EACd,SAAS,GAAG,IAAI,GAAG,EAAU;IAE7B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ;QAC3E,OAAO,IAAI,CAAC;IACd,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS;QACjD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,IAAI;QAErC,OAAO,KAAK,CAAC;IACf,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CACvE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CACvC,CAAC;IACF,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CACrC,WAAW,EACX,6BAA6B,CAC9B,CAAC;AACF,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAC5B,CAAC,KAAK,EAAE,EAAE,CACR,OAAO,KAAK,KAAK,QAAQ;IACzB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACnB,KAAK,CAAC,KAAK,CACT,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,KAAK,IAAI;YACd,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACrB,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAC9B,WAAW,CAAC,KAAK,CAAC,CACrB,CAAC,EACN,iDAAiD,CAClD,CAAC;AACF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC;KACzC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;KAC9D,MAAM,EAAE,CAAC;AACZ,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC;KACxC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;KAC9D,MAAM,EAAE,CAAC;AACZ,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC/D,2BAA2B;IAC3B,0BAA0B;CAC3B,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"message-schema.js","sourceRoot":"","sources":["../../src/channels/message-schema.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,uEAAuE;AACvE,MAAM,UAAU,WAAW,CACzB,KAAc,EACd,SAAS,GAAG,IAAI,GAAG,EAAU;IAE7B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ;QAC3E,OAAO,IAAI,CAAC;IACd,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS;QACjD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,IAAI;QAErC,OAAO,KAAK,CAAC;IACf,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CACvE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CACvC,CAAC;IACF,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC;KAClC,MAAM,EAAE;KACR,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAE9C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CACrC,WAAW,EACX,6BAA6B,CAC9B,CAAC;AACF,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAC5B,CAAC,KAAK,EAAE,EAAE,CACR,OAAO,KAAK,KAAK,QAAQ;IACzB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACnB,KAAK,CAAC,KAAK,CACT,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,KAAK,IAAI;YACd,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACrB,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAC9B,WAAW,CAAC,KAAK,CAAC,CACrB,CAAC,EACN,iDAAiD,CAClD,CAAC;AACF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC;KACzC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;KAC9D,MAAM,EAAE,CAAC;AACZ,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC;KACxC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;KAC9D,MAAM,EAAE,CAAC;AACZ,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC/D,2BAA2B;IAC3B,0BAA0B;CAC3B,CAAC,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Why a channel's reserved agent connection cannot be read as a user
|
|
3
|
-
* connection, or undefined for any other slug. Reading
|
|
4
|
-
*
|
|
3
|
+
* connection, or undefined for any other slug. Reading an app's token as the
|
|
4
|
+
* person running the agent is not supported yet.
|
|
5
5
|
*/
|
|
6
6
|
export declare function reservedUserConnectionError(slug: string): string | undefined;
|
|
7
7
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reserved-connections.d.ts","sourceRoot":"","sources":["../../src/channels/reserved-connections.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reserved-connections.d.ts","sourceRoot":"","sources":["../../src/channels/reserved-connections.ts"],"names":[],"mappings":"AAuCA;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAS5E;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GAAG,SAAS,GAC/B,MAAM,CAGR"}
|
|
@@ -1,28 +1,45 @@
|
|
|
1
1
|
import { GITHUB_TOKEN_SLUG, githubAppConnectionSlug, } from "./github/connections.js";
|
|
2
|
+
import { LINEAR_TOKEN_SLUG, linearAppConnectionSlug, } from "./linear/connections.js";
|
|
2
3
|
// First-party channels' reserved agent connection names, listed here so
|
|
3
4
|
// resolution does not depend on adapter modules being loaded.
|
|
4
5
|
const builtinReservedConnections = new Map([
|
|
5
|
-
[
|
|
6
|
+
[
|
|
7
|
+
GITHUB_TOKEN_SLUG,
|
|
8
|
+
{
|
|
9
|
+
resolve: githubAppConnectionSlug,
|
|
10
|
+
token: "the GitHub App's installation token",
|
|
11
|
+
actsAs: "act on GitHub as the App",
|
|
12
|
+
},
|
|
13
|
+
],
|
|
14
|
+
[
|
|
15
|
+
LINEAR_TOKEN_SLUG,
|
|
16
|
+
{
|
|
17
|
+
resolve: linearAppConnectionSlug,
|
|
18
|
+
token: "the Linear app's token",
|
|
19
|
+
actsAs: "act in Linear as the app",
|
|
20
|
+
},
|
|
21
|
+
],
|
|
6
22
|
]);
|
|
7
23
|
/**
|
|
8
24
|
* Why a channel's reserved agent connection cannot be read as a user
|
|
9
|
-
* connection, or undefined for any other slug. Reading
|
|
10
|
-
*
|
|
25
|
+
* connection, or undefined for any other slug. Reading an app's token as the
|
|
26
|
+
* person running the agent is not supported yet.
|
|
11
27
|
*/
|
|
12
28
|
export function reservedUserConnectionError(slug) {
|
|
13
|
-
|
|
29
|
+
const reserved = builtinReservedConnections.get(slug);
|
|
30
|
+
if (!reserved)
|
|
14
31
|
return undefined;
|
|
15
32
|
const name = JSON.stringify(slug);
|
|
16
|
-
return (`${name} is not supported as a user connection yet: it is
|
|
17
|
-
`
|
|
18
|
-
|
|
33
|
+
return (`${name} is not supported as a user connection yet: it is ${reserved.token}, ` +
|
|
34
|
+
`an agent connection. Use connections.get(${name}, { type: "agent" }) to ` +
|
|
35
|
+
`${reserved.actsAs}.`);
|
|
19
36
|
}
|
|
20
37
|
/**
|
|
21
38
|
* The connection that actually holds a channel's reserved agent connection;
|
|
22
39
|
* other slugs pass through unchanged.
|
|
23
40
|
*/
|
|
24
41
|
export function reservedAgentConnectionSlug(slug, deploymentId) {
|
|
25
|
-
const
|
|
26
|
-
return
|
|
42
|
+
const reserved = builtinReservedConnections.get(slug);
|
|
43
|
+
return reserved && deploymentId ? reserved.resolve(deploymentId) : slug;
|
|
27
44
|
}
|
|
28
45
|
//# sourceMappingURL=reserved-connections.js.map
|
|
@@ -1 +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,
|
|
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;AACjC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AAEjC,wEAAwE;AACxE,8DAA8D;AAC9D,MAAM,0BAA0B,GAAG,IAAI,GAAG,CASxC;IACA;QACE,iBAAiB;QACjB;YACE,OAAO,EAAE,uBAAuB;YAChC,KAAK,EAAE,qCAAqC;YAC5C,MAAM,EAAE,0BAA0B;SACnC;KACF;IACD;QACE,iBAAiB;QACjB;YACE,OAAO,EAAE,uBAAuB;YAChC,KAAK,EAAE,wBAAwB;YAC/B,MAAM,EAAE,0BAA0B;SACnC;KACF;CACF,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAAY;IACtD,MAAM,QAAQ,GAAG,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,CACL,GAAG,IAAI,qDAAqD,QAAQ,CAAC,KAAK,IAAI;QAC9E,4CAA4C,IAAI,0BAA0B;QAC1E,GAAG,QAAQ,CAAC,MAAM,GAAG,CACtB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,IAAY,EACZ,YAAgC;IAEhC,MAAM,QAAQ,GAAG,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtD,OAAO,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1E,CAAC"}
|
|
@@ -16,7 +16,21 @@ export interface ChannelStateInput {
|
|
|
16
16
|
/** A user message's text, a message, or state to start a run with. */
|
|
17
17
|
export type ChannelRunInput = string | BaseMessage | ChannelStateInput;
|
|
18
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"
|
|
19
|
+
export type ChannelRunOptions = Pick<LangGraphRunnableConfig<Record<string, unknown>>, "context"> & {
|
|
20
|
+
/**
|
|
21
|
+
* Metadata for the run, such as where it came from, to find it by in
|
|
22
|
+
* LangSmith. Keys are letters, digits, `_`, `.` or `-` and start with a
|
|
23
|
+
* letter; `mda_` and `langgraph_` keys are reserved. MDA's own keys win.
|
|
24
|
+
*/
|
|
25
|
+
metadata?: Record<string, unknown>;
|
|
26
|
+
/**
|
|
27
|
+
* A URL the Agent Server POSTs the finished run to (its status, metadata,
|
|
28
|
+
* values and any error), as LangGraph's `runs.create({ webhook })` does:
|
|
29
|
+
* from the server, so it reaches you even if the deployment restarts.
|
|
30
|
+
* http(s), without credentials in it.
|
|
31
|
+
*/
|
|
32
|
+
webhook?: string;
|
|
33
|
+
};
|
|
20
34
|
/**
|
|
21
35
|
* What a channel handler may return to start a run: the input, or the input
|
|
22
36
|
* with run options, as `agent.invoke(input, options)` takes them.
|
|
@@ -29,6 +43,8 @@ export interface NormalizedRunInput {
|
|
|
29
43
|
/** Other state keys. */
|
|
30
44
|
state: JsonObject;
|
|
31
45
|
context?: JsonObject;
|
|
46
|
+
metadata?: JsonObject;
|
|
47
|
+
webhook?: string;
|
|
32
48
|
}
|
|
33
49
|
/**
|
|
34
50
|
* Normalize what a handler returned. `null` and `undefined` start nothing;
|
|
@@ -1 +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;
|
|
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,GAAG;IACF;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,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;IACrB,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AASD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,GACb,kBAAkB,GAAG,SAAS,CAsBhC"}
|
|
@@ -27,16 +27,50 @@ export function normalizeRunInput(value) {
|
|
|
27
27
|
return normalized;
|
|
28
28
|
if (!isPlainObject(options))
|
|
29
29
|
throw new TypeError("run options must be an object");
|
|
30
|
-
const { context, ...rest } = options;
|
|
30
|
+
const { context, metadata, webhook, ...rest } = options;
|
|
31
31
|
if (Object.keys(rest).length)
|
|
32
|
-
throw new TypeError(`unsupported run option ${Object.keys(rest).join(", ")}; use context`);
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
throw new TypeError(`unsupported run option ${Object.keys(rest).join(", ")}; use context, metadata or webhook`);
|
|
33
|
+
return {
|
|
34
|
+
...normalized,
|
|
35
|
+
...(context !== undefined && { context: runContext(context) }),
|
|
36
|
+
...(metadata !== undefined && { metadata: runMetadata(metadata) }),
|
|
37
|
+
...(webhook !== undefined && { webhook: runWebhook(webhook) }),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function runWebhook(webhook) {
|
|
41
|
+
let url;
|
|
42
|
+
try {
|
|
43
|
+
url = typeof webhook === "string" ? new URL(webhook) : undefined;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
url = undefined;
|
|
47
|
+
}
|
|
48
|
+
if (!url ||
|
|
49
|
+
(url.protocol !== "https:" && url.protocol !== "http:") ||
|
|
50
|
+
url.username ||
|
|
51
|
+
url.password)
|
|
52
|
+
throw new TypeError("run webhook must be an http(s) URL, without credentials in it");
|
|
53
|
+
return url.href;
|
|
54
|
+
}
|
|
55
|
+
function runContext(context) {
|
|
35
56
|
if (!isPlainObject(context) || !isJsonValue(context))
|
|
36
57
|
throw new TypeError("run context must be a JSON object");
|
|
37
58
|
if ("channel" in context)
|
|
38
59
|
throw new TypeError("context.channel is reserved for managed ingress");
|
|
39
|
-
return
|
|
60
|
+
return context;
|
|
61
|
+
}
|
|
62
|
+
/** The metadata keys a handler may set. */
|
|
63
|
+
const METADATA_KEY = /^[A-Za-z][A-Za-z0-9_.-]{0,63}$/;
|
|
64
|
+
/** Keys MDA and the Agent Server set, and object internals. */
|
|
65
|
+
const RESERVED_METADATA_KEY = /^(mda_|langgraph_)|^(constructor|prototype)$/i;
|
|
66
|
+
function runMetadata(metadata) {
|
|
67
|
+
if (!isPlainObject(metadata) || !isJsonValue(metadata))
|
|
68
|
+
throw new TypeError("run metadata must be a JSON object");
|
|
69
|
+
for (const key of Object.keys(metadata)) {
|
|
70
|
+
if (!METADATA_KEY.test(key) || RESERVED_METADATA_KEY.test(key))
|
|
71
|
+
throw new TypeError("run metadata keys are letters, digits, _, . or -, start with a letter, and don't start with mda_ or langgraph_");
|
|
72
|
+
}
|
|
73
|
+
return metadata;
|
|
40
74
|
}
|
|
41
75
|
function normalizeInput(input) {
|
|
42
76
|
if (typeof input === "string") {
|