managed-deepagents 0.10.0-dev.16 → 0.10.0-dev.18
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 +809 -71
- package/dist/channels/actor.d.ts +43 -0
- package/dist/channels/actor.d.ts.map +1 -0
- package/dist/channels/actor.js +2 -0
- package/dist/channels/actor.js.map +1 -0
- package/dist/channels/assistant-text.d.ts +29 -0
- package/dist/channels/assistant-text.d.ts.map +1 -1
- package/dist/channels/assistant-text.js +72 -1
- package/dist/channels/assistant-text.js.map +1 -1
- package/dist/channels/binding.d.ts +20 -1
- package/dist/channels/binding.d.ts.map +1 -1
- package/dist/channels/binding.js +39 -10
- package/dist/channels/binding.js.map +1 -1
- package/dist/channels/delivery.d.ts +21 -0
- package/dist/channels/delivery.d.ts.map +1 -0
- package/dist/channels/delivery.js +196 -0
- package/dist/channels/delivery.js.map +1 -0
- 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 +1 -8
- package/dist/channels/github/index.d.ts.map +1 -1
- package/dist/channels/github/index.js +46 -139
- package/dist/channels/github/index.js.map +1 -1
- package/dist/channels/github/mentions.d.ts +12 -0
- package/dist/channels/github/mentions.d.ts.map +1 -0
- package/dist/channels/github/mentions.js +185 -0
- package/dist/channels/github/mentions.js.map +1 -0
- package/dist/channels/github/schema.d.ts +271 -0
- package/dist/channels/github/schema.d.ts.map +1 -1
- package/dist/channels/github/schema.js +34 -3
- package/dist/channels/github/schema.js.map +1 -1
- package/dist/channels/github/types.d.ts +57 -4
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/http/endpoint.d.ts +95 -0
- package/dist/channels/http/endpoint.d.ts.map +1 -0
- package/dist/channels/http/endpoint.js +276 -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 +322 -86
- 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 +10 -16
- package/dist/channels/http/index.js.map +1 -1
- package/dist/channels/http/ingress.d.ts +40 -5
- package/dist/channels/http/ingress.d.ts.map +1 -1
- package/dist/channels/http/ingress.js +63 -40
- package/dist/channels/http/ingress.js.map +1 -1
- package/dist/channels/http/provider.d.ts +119 -0
- package/dist/channels/http/provider.d.ts.map +1 -0
- package/dist/channels/http/provider.js +227 -0
- package/dist/channels/http/provider.js.map +1 -0
- package/dist/channels/http/studio.d.ts +24 -0
- package/dist/channels/http/studio.d.ts.map +1 -0
- package/dist/channels/http/studio.js +95 -0
- package/dist/channels/http/studio.js.map +1 -0
- package/dist/channels/http/types.d.ts +107 -7
- 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 +489 -0
- package/dist/channels/linear/index.js.map +1 -0
- package/dist/channels/linear/schema.d.ts +1050 -0
- package/dist/channels/linear/schema.d.ts.map +1 -0
- package/dist/channels/linear/schema.js +255 -0
- package/dist/channels/linear/schema.js.map +1 -0
- package/dist/channels/linear/types.d.ts +162 -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/messaging-registry.d.ts +16 -0
- package/dist/channels/messaging-registry.d.ts.map +1 -1
- package/dist/channels/messaging-registry.js +29 -0
- package/dist/channels/messaging-registry.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 +36 -9
- package/dist/channels/reserved-connections.js.map +1 -1
- package/dist/channels/run-input.d.ts +35 -2
- package/dist/channels/run-input.d.ts.map +1 -1
- package/dist/channels/run-input.js +74 -14
- package/dist/channels/run-input.js.map +1 -1
- package/dist/channels/runtime.d.ts +1 -1
- package/dist/channels/runtime.d.ts.map +1 -1
- package/dist/channels/runtime.js +1 -1
- package/dist/channels/runtime.js.map +1 -1
- package/dist/channels/schedule-delivery.d.ts +1 -1
- package/dist/channels/schedule-delivery.d.ts.map +1 -1
- package/dist/channels/schedule-delivery.js +9 -20
- package/dist/channels/schedule-delivery.js.map +1 -1
- package/dist/channels/slack/api.d.ts +2 -0
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +6 -0
- package/dist/channels/slack/api.js.map +1 -1
- package/dist/channels/slack/connections.d.ts +6 -0
- package/dist/channels/slack/connections.d.ts.map +1 -0
- package/dist/channels/slack/connections.js +6 -0
- package/dist/channels/slack/connections.js.map +1 -0
- package/dist/channels/slack/events.d.ts +272 -0
- package/dist/channels/slack/events.d.ts.map +1 -0
- package/dist/channels/slack/events.js +235 -0
- package/dist/channels/slack/events.js.map +1 -0
- package/dist/channels/slack/files.d.ts.map +1 -1
- package/dist/channels/slack/files.js +2 -3
- package/dist/channels/slack/files.js.map +1 -1
- package/dist/channels/slack/index.d.ts +76 -2
- package/dist/channels/slack/index.d.ts.map +1 -1
- package/dist/channels/slack/index.js +177 -6
- package/dist/channels/slack/index.js.map +1 -1
- package/dist/channels/slack/message-content.d.ts.map +1 -1
- package/dist/channels/slack/message-content.js +23 -28
- package/dist/channels/slack/message-content.js.map +1 -1
- package/dist/channels/slack/status.d.ts +76 -0
- package/dist/channels/slack/status.d.ts.map +1 -0
- package/dist/channels/slack/status.js +427 -0
- package/dist/channels/slack/status.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.d.ts.map +1 -1
- package/dist/channels/trigger/client.js +4 -9
- package/dist/channels/trigger/client.js.map +1 -1
- package/dist/channels/trigger/http.d.ts +114 -3
- package/dist/channels/trigger/http.d.ts.map +1 -1
- package/dist/channels/trigger/http.js +310 -71
- package/dist/channels/trigger/http.js.map +1 -1
- package/dist/channels/trigger/ingress.d.ts +38 -1
- package/dist/channels/trigger/ingress.d.ts.map +1 -1
- package/dist/channels/trigger/ingress.js +47 -1
- package/dist/channels/trigger/ingress.js.map +1 -1
- package/dist/channels/trigger/types.d.ts +82 -3
- package/dist/channels/trigger/types.d.ts.map +1 -1
- package/dist/channels/trigger/types.js +36 -0
- package/dist/channels/trigger/types.js.map +1 -1
- package/dist/channels/types.d.ts +19 -3
- package/dist/channels/types.d.ts.map +1 -1
- package/dist/channels/types.js +2 -0
- package/dist/channels/types.js.map +1 -1
- package/dist/connections.d.ts +5 -0
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +14 -1
- package/dist/connections.js.map +1 -1
- package/dist/index.d.ts +13 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/ingress/runs.d.ts +32 -1
- package/dist/ingress/runs.d.ts.map +1 -1
- package/dist/ingress/runs.js +85 -5
- package/dist/ingress/runs.js.map +1 -1
- package/dist/managed-composition.d.ts.map +1 -1
- package/dist/managed-composition.js +8 -13
- package/dist/managed-composition.js.map +1 -1
- package/dist/namespaces.d.ts +15 -21
- package/dist/namespaces.d.ts.map +1 -1
- package/dist/namespaces.js +2 -29
- package/dist/namespaces.js.map +1 -1
- package/dist/runtime/auth.d.ts +1 -2
- package/dist/runtime/auth.d.ts.map +1 -1
- package/dist/runtime/auth.js +94 -48
- 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 +4 -9
- package/dist/runtime/identity-runtime.d.ts.map +1 -1
- package/dist/runtime/identity-runtime.js +12 -25
- package/dist/runtime/identity-runtime.js.map +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +32 -21
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/managed-thread.d.ts +60 -0
- package/dist/runtime/managed-thread.d.ts.map +1 -0
- package/dist/runtime/managed-thread.js +76 -0
- package/dist/runtime/managed-thread.js.map +1 -0
- package/dist/runtime/managed-tools.d.ts +10 -2
- package/dist/runtime/managed-tools.d.ts.map +1 -1
- package/dist/runtime/managed-tools.js +10 -8
- package/dist/runtime/managed-tools.js.map +1 -1
- package/dist/runtime/memory/policy.d.ts.map +1 -1
- package/dist/runtime/memory/policy.js +1 -3
- package/dist/runtime/memory/policy.js.map +1 -1
- package/dist/runtime/run-input.d.ts +10 -0
- package/dist/runtime/run-input.d.ts.map +1 -1
- package/dist/runtime/run-input.js +48 -2
- package/dist/runtime/run-input.js.map +1 -1
- package/dist/runtime/sandbox-manager.d.ts.map +1 -1
- package/dist/runtime/sandbox-manager.js +1 -1
- package/dist/runtime/sandbox-manager.js.map +1 -1
- package/dist/runtime/schedule-auth.d.ts +17 -0
- package/dist/runtime/schedule-auth.d.ts.map +1 -1
- package/dist/runtime/schedule-auth.js +39 -1
- package/dist/runtime/schedule-auth.js.map +1 -1
- package/dist/runtime/thread-record.d.ts +81 -0
- package/dist/runtime/thread-record.d.ts.map +1 -0
- package/dist/runtime/thread-record.js +205 -0
- package/dist/runtime/thread-record.js.map +1 -0
- package/dist/runtime/types.d.ts +5 -1
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime-schedules.d.ts +13 -0
- package/dist/runtime-schedules.d.ts.map +1 -1
- package/dist/runtime-schedules.js +83 -20
- package/dist/runtime-schedules.js.map +1 -1
- package/dist/sandbox.d.ts +0 -6
- package/dist/sandbox.d.ts.map +1 -1
- package/dist/sandbox.js +3 -7
- package/dist/sandbox.js.map +1 -1
- package/dist/schedule-channel.d.ts +5 -2
- package/dist/schedule-channel.d.ts.map +1 -1
- package/dist/schedule-channel.js +13 -12
- package/dist/schedule-channel.js.map +1 -1
- package/dist/values.d.ts +15 -0
- package/dist/values.d.ts.map +1 -0
- package/dist/values.js +31 -0
- package/dist/values.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { channelThreadId, httpChannel, } from "../http/index.js";
|
|
3
|
+
import { channelName, checkEventKeys, definedFields, eventSnapshot, handledEventKeys, readDeploymentSecret, resetDeploymentSecrets, resolveEndpoints, runEventHandler, eventThread, finishEvents, verifyHmacSha256, } from "../http/provider.js";
|
|
4
|
+
import { isEndpointCallback } from "../http/endpoint.js";
|
|
5
|
+
import { interruptedNotice, pendingDecision, studioUrl, } from "../http/studio.js";
|
|
6
|
+
import { withPausedNotice } from "../messaging-registry.js";
|
|
7
|
+
import { requireTextContent } from "../runtime.js";
|
|
8
|
+
import { logger } from "../../runtime/log.js";
|
|
9
|
+
import { validateChannelIconPath } from "../../runtime/channel-icon.js";
|
|
10
|
+
import { linearAppConnectionSlug } from "./connections.js";
|
|
11
|
+
import { addLinearSessionUrl, commentInAgentSession, createLinearActivity, createLinearComment, linearAppUser, } from "./graphql.js";
|
|
12
|
+
import { LINEAR_ENDPOINT_EVENT_FIELDS, SUPPORTED_EVENT_KEYS, linearEventSchema, linearReceiptSchema, } from "./schema.js";
|
|
13
|
+
import { isRecord, nonblankString } from "../../values.js";
|
|
14
|
+
export { LinearRateLimitError } from "./graphql.js";
|
|
15
|
+
const EVENT_KEYS = new Set(SUPPORTED_EVENT_KEYS);
|
|
16
|
+
const SESSION_KEYS = new Set([
|
|
17
|
+
"AgentSessionEvent.created",
|
|
18
|
+
"AgentSessionEvent.prompted",
|
|
19
|
+
]);
|
|
20
|
+
const APP_OPTION_KEYS = new Set([
|
|
21
|
+
"name",
|
|
22
|
+
"description",
|
|
23
|
+
"icon",
|
|
24
|
+
"teams",
|
|
25
|
+
]);
|
|
26
|
+
/** Whether a delivery's `type.action` is an event key the channel supports. */
|
|
27
|
+
function isLinearEventKey(key) {
|
|
28
|
+
return EVENT_KEYS.has(key);
|
|
29
|
+
}
|
|
30
|
+
/** The part of a delivery's body the replay check reads. */
|
|
31
|
+
const timestampSchema = z.looseObject({ webhookTimestamp: z.number() });
|
|
32
|
+
/** Adapt verified Linear webhooks into HTTP channel messages or skips. */
|
|
33
|
+
export function linearChannel(options = {}) {
|
|
34
|
+
const handlers = resolveEndpoints("Linear", options.onEvent, LINEAR_ENDPOINT_EVENT_FIELDS);
|
|
35
|
+
checkEventKeys("Linear", handlers, EVENT_KEYS);
|
|
36
|
+
// A misspelled option would silently widen what starts runs.
|
|
37
|
+
const unknown = Object.keys(options.app ?? {}).filter((key) => !APP_OPTION_KEYS.has(key));
|
|
38
|
+
if (unknown.length)
|
|
39
|
+
throw new TypeError(`unknown Linear app option ${unknown.join(", ")}; use ${[...APP_OPTION_KEYS].join(", ")}`);
|
|
40
|
+
if (options.app)
|
|
41
|
+
validateAppDisplay(options.app);
|
|
42
|
+
const teams = options.app?.teams?.map((team) => team.trim().toLowerCase());
|
|
43
|
+
if (teams?.length === 0 || teams?.some((team) => !team))
|
|
44
|
+
throw new TypeError("Linear app.teams must list team keys; omit it to allow every team");
|
|
45
|
+
const filters = {
|
|
46
|
+
teams,
|
|
47
|
+
ignoreBots: options.ignoreBots ?? true,
|
|
48
|
+
sessions: options.sessions ?? true,
|
|
49
|
+
};
|
|
50
|
+
const channel = httpChannel({
|
|
51
|
+
provider: "linear",
|
|
52
|
+
...(options.multitaskStrategy && {
|
|
53
|
+
multitaskStrategy: options.multitaskStrategy,
|
|
54
|
+
}),
|
|
55
|
+
...(options.reply && { reply: options.reply }),
|
|
56
|
+
providerConfig: {
|
|
57
|
+
// Deploy subscribes the app's webhook to the handled events.
|
|
58
|
+
events: handledEvents(handlers, filters.sessions),
|
|
59
|
+
...(options.app && {
|
|
60
|
+
app: definedFields({
|
|
61
|
+
name: options.app.name?.trim(),
|
|
62
|
+
description: options.app.description?.trim(),
|
|
63
|
+
icon: options.app.icon &&
|
|
64
|
+
validateChannelIconPath(options.app.icon, "Linear app.icon"),
|
|
65
|
+
teams: options.app.teams && [...options.app.teams],
|
|
66
|
+
}),
|
|
67
|
+
}),
|
|
68
|
+
},
|
|
69
|
+
verify: verifyLinearRequest,
|
|
70
|
+
parse: (context) => parseLinearRequest(context, handlers, channelName(channel), filters),
|
|
71
|
+
input: (message, rawEvent) => handlerInput(handlers, rawEvent, {
|
|
72
|
+
id: message.threadId,
|
|
73
|
+
channel: { name: channelName(channel) },
|
|
74
|
+
}),
|
|
75
|
+
post: postReply,
|
|
76
|
+
onReceived: acknowledgeSession,
|
|
77
|
+
onError: reportError,
|
|
78
|
+
onFinish: finishEvents(notifyFinished, options.onFinish, linearEvent, (delivery) => eventThread(delivery, channelName(channel))),
|
|
79
|
+
});
|
|
80
|
+
// A run that stops on interrupts says so itself (../delivery.ts).
|
|
81
|
+
withPausedNotice(channel, notifyInterrupted);
|
|
82
|
+
// Served at /channels/{name}/icon; deploy points the app's icon at it.
|
|
83
|
+
const icon = options.app?.icon;
|
|
84
|
+
return icon === undefined
|
|
85
|
+
? channel
|
|
86
|
+
: Object.assign(channel, {
|
|
87
|
+
icon: validateChannelIconPath(icon, "Linear app.icon"),
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/** The events deploy subscribes the app's webhook to. */
|
|
91
|
+
function handledEvents(handlers, sessions) {
|
|
92
|
+
return [
|
|
93
|
+
...new Set([
|
|
94
|
+
...handledEventKeys(handlers),
|
|
95
|
+
...(sessions ? SESSION_KEYS : []),
|
|
96
|
+
]),
|
|
97
|
+
].sort();
|
|
98
|
+
}
|
|
99
|
+
/** Check how the app looks against Linear's rules, before deploy sends it. */
|
|
100
|
+
function validateAppDisplay({ name, description, icon }) {
|
|
101
|
+
if (name !== undefined) {
|
|
102
|
+
const trimmed = name.trim();
|
|
103
|
+
if (trimmed.length < 2 ||
|
|
104
|
+
trimmed.length > 80 ||
|
|
105
|
+
/linear|https?:\/\//i.test(trimmed))
|
|
106
|
+
throw new TypeError('Linear app.name must be 2-80 characters, without "Linear" or a URL');
|
|
107
|
+
}
|
|
108
|
+
if (description !== undefined &&
|
|
109
|
+
(!description.trim() || description.trim().length > 1000))
|
|
110
|
+
throw new TypeError("Linear app.description must be 1-1000 characters");
|
|
111
|
+
if (icon !== undefined)
|
|
112
|
+
validateChannelIconPath(icon, "Linear app.icon");
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* The app's webhook signing secret: `LINEAR_WEBHOOK_SECRET` when set,
|
|
116
|
+
* otherwise the agent secret stored at
|
|
117
|
+
* `mda/linear-app/{deployment}/webhook-secret`. Only a missing connection
|
|
118
|
+
* reads as `undefined`; credential store failures propagate.
|
|
119
|
+
*/
|
|
120
|
+
function linearWebhookSecret() {
|
|
121
|
+
return readDeploymentSecret("LINEAR_WEBHOOK_SECRET", (deploymentId) => linearAppConnectionSlug(deploymentId, "webhook-secret"), "Linear webhook secret");
|
|
122
|
+
}
|
|
123
|
+
/** Forget the cached webhook secret; for tests. */
|
|
124
|
+
export function resetLinearWebhookSecret() {
|
|
125
|
+
resetDeploymentSecrets();
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* How far a delivery's `webhookTimestamp` may be from now. Linear recommends
|
|
129
|
+
* rejecting older payloads, so a captured delivery can't be replayed.
|
|
130
|
+
*/
|
|
131
|
+
const WEBHOOK_TOLERANCE_MS = 60_000;
|
|
132
|
+
async function verifyLinearRequest({ request, rawBody, }) {
|
|
133
|
+
// Reject unsigned deliveries before reading the secret from Agent Auth.
|
|
134
|
+
const signature = request.headers.get("linear-signature") ?? "";
|
|
135
|
+
if (!/^[0-9a-f]{64}$/i.test(signature))
|
|
136
|
+
return false;
|
|
137
|
+
const secret = await linearWebhookSecret();
|
|
138
|
+
if (!secret)
|
|
139
|
+
return false;
|
|
140
|
+
if (!verifyHmacSha256(secret, rawBody, signature))
|
|
141
|
+
return false;
|
|
142
|
+
return isFresh(rawBody);
|
|
143
|
+
}
|
|
144
|
+
/** Whether a signed delivery was sent within the replay window. */
|
|
145
|
+
function isFresh(rawBody) {
|
|
146
|
+
let body;
|
|
147
|
+
try {
|
|
148
|
+
body = JSON.parse(new TextDecoder().decode(rawBody));
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Signed, but not JSON: no timestamp to trust, so the delivery is refused.
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
const parsed = timestampSchema.safeParse(body);
|
|
155
|
+
return (parsed.success &&
|
|
156
|
+
Math.abs(Date.now() - parsed.data.webhookTimestamp) <= WEBHOOK_TOLERANCE_MS);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Whether another app or an integration made the change. The delivery's actor
|
|
160
|
+
* says who acted. An issue's or comment's `botActor` is the bot that created
|
|
161
|
+
* it, so it names the actor only when the event is its creation.
|
|
162
|
+
*/
|
|
163
|
+
function byBot(event) {
|
|
164
|
+
if (event.actor?.type !== undefined &&
|
|
165
|
+
event.actor.type.toLowerCase() !== "user")
|
|
166
|
+
return true;
|
|
167
|
+
if (event.key === "Issue.update")
|
|
168
|
+
return false;
|
|
169
|
+
const { botActor } = event.payload.data;
|
|
170
|
+
return botActor !== undefined && botActor !== null;
|
|
171
|
+
}
|
|
172
|
+
async function parseLinearRequest({ request }, handlers, channelName, filters) {
|
|
173
|
+
const receipt = linearReceiptSchema.parse({
|
|
174
|
+
deliveryId: request.headers.get("linear-delivery"),
|
|
175
|
+
payload: await request.json(),
|
|
176
|
+
});
|
|
177
|
+
const { deliveryId, payload } = receipt;
|
|
178
|
+
const key = `${payload.type}.${payload.action}`;
|
|
179
|
+
logger.info(`linear receipt ${JSON.stringify({
|
|
180
|
+
event: logger.logIdentifier(key),
|
|
181
|
+
deliveryId: logger.logIdentifier(deliveryId),
|
|
182
|
+
})}`);
|
|
183
|
+
// Linear expects a 200 for every delivery it should not retry.
|
|
184
|
+
const response = Response.json({ status: "received" }, { status: 200 });
|
|
185
|
+
if (key === "OAuthApp.revoked") {
|
|
186
|
+
logger.warn("Linear app access was revoked; reinstall it with mda deploy");
|
|
187
|
+
return { type: "ignore", response };
|
|
188
|
+
}
|
|
189
|
+
// Events nothing handles stop here, before run creation. Sessions have a
|
|
190
|
+
// default handler while they are on.
|
|
191
|
+
const handled = isLinearEventKey(key) &&
|
|
192
|
+
((filters.sessions && SESSION_KEYS.has(key)) ||
|
|
193
|
+
(Object.hasOwn(handlers, key) && handlers[key] !== undefined));
|
|
194
|
+
if (!handled)
|
|
195
|
+
return { type: "ignore", response };
|
|
196
|
+
const event = linearEventSchema.parse({ key, deliveryId, payload });
|
|
197
|
+
// Issues of teams the channel is not limited to start nothing.
|
|
198
|
+
if (filters.teams &&
|
|
199
|
+
!(event.team && filters.teams.includes(event.team.key.toLowerCase()))) {
|
|
200
|
+
logger.info(`linear event ignored: ${event.team ? "its team is not in app.teams" : "it names no team"} ${JSON.stringify({
|
|
201
|
+
event: logger.logIdentifier(key),
|
|
202
|
+
deliveryId: logger.logIdentifier(deliveryId),
|
|
203
|
+
})}`);
|
|
204
|
+
return { type: "ignore", response };
|
|
205
|
+
}
|
|
206
|
+
if (!("sessionId" in event) && (await ignored(event, filters)))
|
|
207
|
+
return { type: "ignore", response };
|
|
208
|
+
// Preserve the original event even if a callback modifies its argument.
|
|
209
|
+
const snapshot = eventSnapshot(event, "Linear");
|
|
210
|
+
// One thread per agent session, so a Stop ends only its own session's
|
|
211
|
+
// work. Other events share one thread per issue, so the agent keeps the
|
|
212
|
+
// conversation.
|
|
213
|
+
const conversation = `${event.organizationId}/${event.issueId}`;
|
|
214
|
+
const message = {
|
|
215
|
+
threadId: channelThreadId(channelName, "sessionId" in event
|
|
216
|
+
? `${conversation}/session/${event.sessionId}`
|
|
217
|
+
: conversation),
|
|
218
|
+
userId: "mda:channel",
|
|
219
|
+
target: linearTarget(event),
|
|
220
|
+
deliveryKey: deliveryId,
|
|
221
|
+
// An endpoint may take longer to answer than Linear waits.
|
|
222
|
+
...(isEndpointCallback(handlers[key]) && { background: true }),
|
|
223
|
+
};
|
|
224
|
+
// Stop in a session cancels the session's run.
|
|
225
|
+
if (isStop(event))
|
|
226
|
+
return {
|
|
227
|
+
type: "cancel",
|
|
228
|
+
message: {
|
|
229
|
+
userId: message.userId,
|
|
230
|
+
threadId: message.threadId,
|
|
231
|
+
target: message.target,
|
|
232
|
+
},
|
|
233
|
+
rawEvent: snapshot,
|
|
234
|
+
response,
|
|
235
|
+
};
|
|
236
|
+
// What the run starts with, or how the event answers an interrupt, is
|
|
237
|
+
// decided once MDA knows whether the thread waits on one.
|
|
238
|
+
return { type: "message", message, rawEvent: snapshot, response };
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Whether a webhook event starts nothing: another app's change, the app's own
|
|
242
|
+
* activity, or a comment an agent session already delivers.
|
|
243
|
+
*/
|
|
244
|
+
async function ignored(event, filters) {
|
|
245
|
+
if (filters.ignoreBots && byBot(event))
|
|
246
|
+
return true;
|
|
247
|
+
// Linear reports the app's comments as its user's, not as a bot's.
|
|
248
|
+
const appUser = await linearAppUser();
|
|
249
|
+
if (event.actor?.id === appUser.id)
|
|
250
|
+
return true;
|
|
251
|
+
if (event.key !== "Comment.create")
|
|
252
|
+
return false;
|
|
253
|
+
const comment = event.payload.data;
|
|
254
|
+
if ((comment.user?.id ?? comment.userId) === appUser.id)
|
|
255
|
+
return true;
|
|
256
|
+
if (!filters.sessions)
|
|
257
|
+
return false;
|
|
258
|
+
const delivered = await sessionComment(comment, appUser);
|
|
259
|
+
if (delivered)
|
|
260
|
+
logger.info(`linear comment left to its agent session: ${delivered} ${JSON.stringify({
|
|
261
|
+
event: logger.logIdentifier(event.key),
|
|
262
|
+
deliveryId: logger.logIdentifier(event.deliveryId),
|
|
263
|
+
})}`);
|
|
264
|
+
return delivered !== undefined;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Why a comment is part of an agent session, which delivers it as a session
|
|
268
|
+
* event too: one that mentions the app opens a session, and a reply in a
|
|
269
|
+
* session's thread prompts it. Only a reply without a mention asks Linear.
|
|
270
|
+
*/
|
|
271
|
+
async function sessionComment(comment, appUser) {
|
|
272
|
+
if (mentionsApp(comment.body, appUser.displayName))
|
|
273
|
+
return "it mentions the app, which opens a session";
|
|
274
|
+
if (comment.parentId && (await commentInAgentSession(comment.parentId)))
|
|
275
|
+
return "it replies in a session's thread";
|
|
276
|
+
return undefined;
|
|
277
|
+
}
|
|
278
|
+
function mentionsApp(body, displayName) {
|
|
279
|
+
if (!displayName)
|
|
280
|
+
return false;
|
|
281
|
+
const name = displayName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
282
|
+
return new RegExp(`(^|[^\\w@])@${name}(?![\\w-])`, "i").test(body);
|
|
283
|
+
}
|
|
284
|
+
/** Where replies go: the issue, and the comment thread or session that asked. */
|
|
285
|
+
function linearTarget(event) {
|
|
286
|
+
const target = {
|
|
287
|
+
organizationId: event.organizationId,
|
|
288
|
+
issueId: event.issueId,
|
|
289
|
+
};
|
|
290
|
+
if ("sessionId" in event) {
|
|
291
|
+
const identifier = event.payload.agentSession.issue?.identifier;
|
|
292
|
+
return {
|
|
293
|
+
...target,
|
|
294
|
+
...(identifier && { identifier }),
|
|
295
|
+
sessionId: event.sessionId,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
if (event.key === "Comment.create") {
|
|
299
|
+
const { data } = event.payload;
|
|
300
|
+
return {
|
|
301
|
+
...target,
|
|
302
|
+
...(data.issue?.identifier && { identifier: data.issue.identifier }),
|
|
303
|
+
// Replies go into the comment's thread; Linear threads one level deep.
|
|
304
|
+
commentId: data.parentId ?? data.id,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
return { ...target, identifier: event.payload.data.identifier };
|
|
308
|
+
}
|
|
309
|
+
const ERROR_MESSAGE = "Something went wrong while working on this.";
|
|
310
|
+
/** What the event's handler starts a run with; `undefined` when it skips or fails. */
|
|
311
|
+
async function handlerInput(handlers, rawEvent, thread) {
|
|
312
|
+
const event = linearEvent(rawEvent);
|
|
313
|
+
if (!event)
|
|
314
|
+
return undefined;
|
|
315
|
+
const outcome = Object.hasOwn(handlers, event.key) && handlers[event.key] !== undefined
|
|
316
|
+
? await runEventHandler("Linear", event, () => handlers[event.key]?.(event, thread))
|
|
317
|
+
: sessionInput(event);
|
|
318
|
+
if (outcome.type === "input")
|
|
319
|
+
return outcome.input;
|
|
320
|
+
// A session that gets no run would wait for an answer that never comes,
|
|
321
|
+
// whether it just opened or this is a follow-up in it. A handler that threw
|
|
322
|
+
// failed; one that returned nothing declined.
|
|
323
|
+
if ("sessionId" in event)
|
|
324
|
+
await say(event.sessionId, outcome.type === "failed"
|
|
325
|
+
? { type: "error", body: ERROR_MESSAGE }
|
|
326
|
+
: { type: "response", body: "I'm not set up to work on this request." });
|
|
327
|
+
return undefined;
|
|
328
|
+
}
|
|
329
|
+
/** What a session event starts a run with when no handler decides. */
|
|
330
|
+
function sessionInput(event) {
|
|
331
|
+
let input;
|
|
332
|
+
if (event.key === "AgentSessionEvent.created") {
|
|
333
|
+
const { promptContext, agentSession } = event.payload;
|
|
334
|
+
input =
|
|
335
|
+
promptContext?.trim() ||
|
|
336
|
+
agentSession.comment?.body?.trim() ||
|
|
337
|
+
agentSession.issue?.title?.trim() ||
|
|
338
|
+
undefined;
|
|
339
|
+
}
|
|
340
|
+
else if (event.key === "AgentSessionEvent.prompted")
|
|
341
|
+
input = event.payload.agentActivity.content.body?.trim() || undefined;
|
|
342
|
+
return input ? { type: "input", input } : { type: "skipped" };
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* The parsed event a delivery carries, checked against the schema again: the
|
|
346
|
+
* HTTP layer hands over a copy, which handlers may change.
|
|
347
|
+
*/
|
|
348
|
+
function linearEvent(rawEvent) {
|
|
349
|
+
// The schema reads `key`, `deliveryId` and `payload`, and derives the rest.
|
|
350
|
+
const parsed = linearEventSchema.safeParse(rawEvent);
|
|
351
|
+
return parsed.success ? parsed.data : undefined;
|
|
352
|
+
}
|
|
353
|
+
/** Say something in a session; a failure is logged, never thrown. */
|
|
354
|
+
async function say(sessionId, content, extra = {}) {
|
|
355
|
+
try {
|
|
356
|
+
await createLinearActivity({
|
|
357
|
+
agentSessionId: sessionId,
|
|
358
|
+
content,
|
|
359
|
+
...extra,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
logger.error(`linear session activity failed (${logger.safeErrorLabel(error)})`);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Post the agent's reply: as the session's response when a session asked,
|
|
368
|
+
* otherwise as a comment in the thread of the comment that started the run.
|
|
369
|
+
* A post that starts a new thread, such as a scheduled one, comments on the
|
|
370
|
+
* issue itself.
|
|
371
|
+
*/
|
|
372
|
+
async function postReply(input) {
|
|
373
|
+
const { target, newThread, ...message } = input;
|
|
374
|
+
if (!isLinearTarget(target))
|
|
375
|
+
throw new TypeError("invalid Linear target");
|
|
376
|
+
const body = requireTextContent(message);
|
|
377
|
+
if (target.sessionId && !newThread)
|
|
378
|
+
return createLinearActivity({
|
|
379
|
+
agentSessionId: target.sessionId,
|
|
380
|
+
content: { type: "response", body },
|
|
381
|
+
});
|
|
382
|
+
return createLinearComment({
|
|
383
|
+
issueId: target.issueId,
|
|
384
|
+
body,
|
|
385
|
+
...(target.commentId && !newThread && { parentId: target.commentId }),
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Linear marks a session unresponsive without an activity within seconds, even
|
|
390
|
+
* while the run waits behind another one: acknowledge it at once, and link a
|
|
391
|
+
* new session to its thread in Studio.
|
|
392
|
+
*/
|
|
393
|
+
async function acknowledgeSession(target, delivery) {
|
|
394
|
+
if (!isLinearTarget(target) || !target.sessionId)
|
|
395
|
+
return;
|
|
396
|
+
await say(target.sessionId, { type: "thought", body: "Working on it." }, {
|
|
397
|
+
ephemeral: true,
|
|
398
|
+
});
|
|
399
|
+
const url = studioUrl(delivery);
|
|
400
|
+
if (!url ||
|
|
401
|
+
linearEvent(delivery.rawEvent)?.key !== "AgentSessionEvent.created")
|
|
402
|
+
return;
|
|
403
|
+
try {
|
|
404
|
+
await addLinearSessionUrl(target.sessionId, {
|
|
405
|
+
label: "LangSmith Studio",
|
|
406
|
+
url,
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
catch (error) {
|
|
410
|
+
logger.error(`linear session link failed (${logger.safeErrorLabel(error)})`);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* What the conversation hears once a delivery is done, besides the run's own
|
|
415
|
+
* answer, its own paused notice and `reportError`: that a new message found
|
|
416
|
+
* the thread waiting on a decision, or, after Stop, the final word Linear
|
|
417
|
+
* waits for.
|
|
418
|
+
*/
|
|
419
|
+
async function notifyFinished(target, delivery) {
|
|
420
|
+
if (delivery.type === "skipped" && delivery.reason === "cancel")
|
|
421
|
+
return confirmStopped(target);
|
|
422
|
+
// A session would keep "working" on a run that never started. One Linear
|
|
423
|
+
// retries (`retry`) may still start, so it hears nothing yet.
|
|
424
|
+
if (delivery.type === "failed" && delivery.reason === "start")
|
|
425
|
+
return reportError(undefined, target);
|
|
426
|
+
if (pendingDecision(delivery) === "waiting")
|
|
427
|
+
await notifyInterrupted(target, delivery, "waiting");
|
|
428
|
+
}
|
|
429
|
+
/** A Stop pressed in a session; it cancels the session's run. */
|
|
430
|
+
function isStop(event) {
|
|
431
|
+
return (event?.key === "AgentSessionEvent.prompted" &&
|
|
432
|
+
event.payload.agentActivity.signal === "stop");
|
|
433
|
+
}
|
|
434
|
+
/** After Stop, Linear waits for a final word from the agent. */
|
|
435
|
+
async function confirmStopped(target) {
|
|
436
|
+
if (!isLinearTarget(target) || !target.sessionId)
|
|
437
|
+
return;
|
|
438
|
+
await say(target.sessionId, { type: "response", body: "Stopped." });
|
|
439
|
+
}
|
|
440
|
+
/** Tell the session or the issue that the run failed. */
|
|
441
|
+
async function reportError(_error, target) {
|
|
442
|
+
if (!isLinearTarget(target))
|
|
443
|
+
return;
|
|
444
|
+
if (target.sessionId) {
|
|
445
|
+
await createLinearActivity({
|
|
446
|
+
agentSessionId: target.sessionId,
|
|
447
|
+
content: { type: "error", body: ERROR_MESSAGE },
|
|
448
|
+
});
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
await createLinearComment({
|
|
452
|
+
issueId: target.issueId,
|
|
453
|
+
body: ERROR_MESSAGE,
|
|
454
|
+
...(target.commentId && { parentId: target.commentId }),
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* The conversation waits on a decision, made in LangSmith Studio: say so with
|
|
459
|
+
* a link. In a session it asks for input, so the session waits rather than
|
|
460
|
+
* ends: once the decision is made, the resumed run's answer is the session's
|
|
461
|
+
* response. Otherwise it is a comment.
|
|
462
|
+
*/
|
|
463
|
+
async function notifyInterrupted(target, delivery, outcome) {
|
|
464
|
+
if (!isLinearTarget(target))
|
|
465
|
+
return;
|
|
466
|
+
const body = interruptedNotice(outcome, delivery, "ask again");
|
|
467
|
+
if (target.sessionId) {
|
|
468
|
+
await createLinearActivity({
|
|
469
|
+
agentSessionId: target.sessionId,
|
|
470
|
+
content: { type: "elicitation", body },
|
|
471
|
+
});
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
await createLinearComment({
|
|
475
|
+
issueId: target.issueId,
|
|
476
|
+
body,
|
|
477
|
+
...(target.commentId && { parentId: target.commentId }),
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
function isLinearTarget(value) {
|
|
481
|
+
if (!isRecord(value))
|
|
482
|
+
return false;
|
|
483
|
+
const { organizationId, issueId, identifier, commentId, sessionId } = value;
|
|
484
|
+
const nonblank = (field) => nonblankString(field) !== undefined;
|
|
485
|
+
return (nonblank(organizationId) &&
|
|
486
|
+
nonblank(issueId) &&
|
|
487
|
+
[identifier, commentId, sessionId].every((field) => field === undefined || nonblank(field)));
|
|
488
|
+
}
|
|
489
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/channels/linear/index.ts"],"names":[],"mappings":"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"}
|