managed-deepagents 0.10.0-dev.2 → 0.10.0-dev.4

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