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.
Files changed (159) hide show
  1. package/README.md +220 -21
  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/connections.d.ts.map +1 -1
  7. package/dist/channels/github/connections.js +2 -2
  8. package/dist/channels/github/connections.js.map +1 -1
  9. package/dist/channels/github/index.d.ts +2 -9
  10. package/dist/channels/github/index.d.ts.map +1 -1
  11. package/dist/channels/github/index.js +72 -140
  12. package/dist/channels/github/index.js.map +1 -1
  13. package/dist/channels/github/schema.d.ts.map +1 -1
  14. package/dist/channels/github/schema.js +1 -3
  15. package/dist/channels/github/schema.js.map +1 -1
  16. package/dist/channels/github/types.d.ts +48 -10
  17. package/dist/channels/github/types.d.ts.map +1 -1
  18. package/dist/channels/http/endpoint.d.ts +41 -0
  19. package/dist/channels/http/endpoint.d.ts.map +1 -0
  20. package/dist/channels/http/endpoint.js +132 -0
  21. package/dist/channels/http/endpoint.js.map +1 -0
  22. package/dist/channels/http/http.d.ts.map +1 -1
  23. package/dist/channels/http/http.js +233 -66
  24. package/dist/channels/http/http.js.map +1 -1
  25. package/dist/channels/http/index.d.ts +1 -1
  26. package/dist/channels/http/index.d.ts.map +1 -1
  27. package/dist/channels/http/index.js.map +1 -1
  28. package/dist/channels/http/ingress.d.ts +34 -3
  29. package/dist/channels/http/ingress.d.ts.map +1 -1
  30. package/dist/channels/http/ingress.js +40 -24
  31. package/dist/channels/http/ingress.js.map +1 -1
  32. package/dist/channels/http/provider.d.ts +99 -0
  33. package/dist/channels/http/provider.d.ts.map +1 -0
  34. package/dist/channels/http/provider.js +188 -0
  35. package/dist/channels/http/provider.js.map +1 -0
  36. package/dist/channels/http/reply.d.ts +20 -0
  37. package/dist/channels/http/reply.d.ts.map +1 -0
  38. package/dist/channels/http/reply.js +116 -0
  39. package/dist/channels/http/reply.js.map +1 -0
  40. package/dist/channels/http/studio.d.ts +17 -0
  41. package/dist/channels/http/studio.d.ts.map +1 -0
  42. package/dist/channels/http/studio.js +82 -0
  43. package/dist/channels/http/studio.js.map +1 -0
  44. package/dist/channels/http/types.d.ts +77 -6
  45. package/dist/channels/http/types.d.ts.map +1 -1
  46. package/dist/channels/linear/connections.d.ts +11 -0
  47. package/dist/channels/linear/connections.d.ts.map +1 -0
  48. package/dist/channels/linear/connections.js +14 -0
  49. package/dist/channels/linear/connections.js.map +1 -0
  50. package/dist/channels/linear/graphql.d.ts +57 -0
  51. package/dist/channels/linear/graphql.d.ts.map +1 -0
  52. package/dist/channels/linear/graphql.js +167 -0
  53. package/dist/channels/linear/graphql.js.map +1 -0
  54. package/dist/channels/linear/index.d.ts +9 -0
  55. package/dist/channels/linear/index.d.ts.map +1 -0
  56. package/dist/channels/linear/index.js +477 -0
  57. package/dist/channels/linear/index.js.map +1 -0
  58. package/dist/channels/linear/schema.d.ts +1064 -0
  59. package/dist/channels/linear/schema.d.ts.map +1 -0
  60. package/dist/channels/linear/schema.js +249 -0
  61. package/dist/channels/linear/schema.js.map +1 -0
  62. package/dist/channels/linear/types.d.ts +150 -0
  63. package/dist/channels/linear/types.d.ts.map +1 -0
  64. package/dist/channels/linear/types.js +2 -0
  65. package/dist/channels/linear/types.js.map +1 -0
  66. package/dist/channels/message-schema.d.ts +2 -0
  67. package/dist/channels/message-schema.d.ts.map +1 -1
  68. package/dist/channels/message-schema.js +4 -0
  69. package/dist/channels/message-schema.js.map +1 -1
  70. package/dist/channels/reserved-connections.d.ts +2 -2
  71. package/dist/channels/reserved-connections.d.ts.map +1 -1
  72. package/dist/channels/reserved-connections.js +26 -9
  73. package/dist/channels/reserved-connections.js.map +1 -1
  74. package/dist/channels/run-input.d.ts +17 -1
  75. package/dist/channels/run-input.d.ts.map +1 -1
  76. package/dist/channels/run-input.js +39 -5
  77. package/dist/channels/run-input.js.map +1 -1
  78. package/dist/channels/slack/index.d.ts.map +1 -1
  79. package/dist/channels/slack/index.js +2 -0
  80. package/dist/channels/slack/index.js.map +1 -1
  81. package/dist/channels/slack/message-content.d.ts +25 -0
  82. package/dist/channels/slack/message-content.d.ts.map +1 -0
  83. package/dist/channels/slack/message-content.js +237 -0
  84. package/dist/channels/slack/message-content.js.map +1 -0
  85. package/dist/channels/source-providers.js +1 -1
  86. package/dist/channels/source-providers.js.map +1 -1
  87. package/dist/channels/trigger/client.js +7 -3
  88. package/dist/channels/trigger/client.js.map +1 -1
  89. package/dist/channels/trigger/http.d.ts +3 -1
  90. package/dist/channels/trigger/http.d.ts.map +1 -1
  91. package/dist/channels/trigger/http.js +7 -4
  92. package/dist/channels/trigger/http.js.map +1 -1
  93. package/dist/channels/trigger/tracing-project.d.ts +16 -0
  94. package/dist/channels/trigger/tracing-project.d.ts.map +1 -0
  95. package/dist/channels/trigger/tracing-project.js +54 -0
  96. package/dist/channels/trigger/tracing-project.js.map +1 -0
  97. package/dist/channels/trigger/types.d.ts +12 -2
  98. package/dist/channels/trigger/types.d.ts.map +1 -1
  99. package/dist/channels/trigger/types.js.map +1 -1
  100. package/dist/connections.d.ts +30 -0
  101. package/dist/connections.d.ts.map +1 -1
  102. package/dist/connections.js +80 -7
  103. package/dist/connections.js.map +1 -1
  104. package/dist/connectors/mcp/index.d.ts.map +1 -1
  105. package/dist/connectors/mcp/index.js +52 -2
  106. package/dist/connectors/mcp/index.js.map +1 -1
  107. package/dist/connectors/mcp/langsmith-url.js +2 -2
  108. package/dist/connectors/mcp/langsmith-url.js.map +1 -1
  109. package/dist/credential-gate.d.ts.map +1 -1
  110. package/dist/credential-gate.js +24 -3
  111. package/dist/credential-gate.js.map +1 -1
  112. package/dist/index.d.ts +5 -2
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js +1 -0
  115. package/dist/index.js.map +1 -1
  116. package/dist/ingress/runs.d.ts +7 -0
  117. package/dist/ingress/runs.d.ts.map +1 -1
  118. package/dist/ingress/runs.js +34 -1
  119. package/dist/ingress/runs.js.map +1 -1
  120. package/dist/namespaces.d.ts +15 -0
  121. package/dist/namespaces.d.ts.map +1 -1
  122. package/dist/namespaces.js +2 -0
  123. package/dist/namespaces.js.map +1 -1
  124. package/dist/runtime/auth.d.ts +4 -6
  125. package/dist/runtime/auth.d.ts.map +1 -1
  126. package/dist/runtime/auth.js +165 -31
  127. package/dist/runtime/auth.js.map +1 -1
  128. package/dist/runtime/channel-icon.d.ts +22 -0
  129. package/dist/runtime/channel-icon.d.ts.map +1 -0
  130. package/dist/runtime/channel-icon.js +70 -0
  131. package/dist/runtime/channel-icon.js.map +1 -0
  132. package/dist/runtime/channel.d.ts +6 -0
  133. package/dist/runtime/channel.d.ts.map +1 -1
  134. package/dist/runtime/channel.js.map +1 -1
  135. package/dist/runtime/identity-http.d.ts +2 -0
  136. package/dist/runtime/identity-http.d.ts.map +1 -1
  137. package/dist/runtime/identity-http.js +35 -0
  138. package/dist/runtime/identity-http.js.map +1 -1
  139. package/dist/runtime/identity-runtime.d.ts +15 -0
  140. package/dist/runtime/identity-runtime.d.ts.map +1 -1
  141. package/dist/runtime/identity-runtime.js +35 -0
  142. package/dist/runtime/identity-runtime.js.map +1 -1
  143. package/dist/runtime/index.d.ts.map +1 -1
  144. package/dist/runtime/index.js +9 -4
  145. package/dist/runtime/index.js.map +1 -1
  146. package/dist/runtime/sandbox-manager.d.ts +11 -0
  147. package/dist/runtime/sandbox-manager.d.ts.map +1 -1
  148. package/dist/runtime/sandbox-manager.js +70 -5
  149. package/dist/runtime/sandbox-manager.js.map +1 -1
  150. package/dist/runtime/schedule-auth.d.ts +1 -0
  151. package/dist/runtime/schedule-auth.d.ts.map +1 -1
  152. package/dist/runtime/schedule-auth.js +68 -2
  153. package/dist/runtime/schedule-auth.js.map +1 -1
  154. package/dist/runtime/types.d.ts +5 -0
  155. package/dist/runtime/types.d.ts.map +1 -1
  156. package/dist/runtime-schedules.d.ts.map +1 -1
  157. package/dist/runtime-schedules.js +8 -12
  158. package/dist/runtime-schedules.js.map +1 -1
  159. package/package.json +7 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply.js","sourceRoot":"","sources":["../../../src/channels/http/reply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { HttpDelivery } from "./types.js";
2
+ /**
3
+ * The thread in the deployment's Studio, or the deployment's page when the
4
+ * deployment's name or the thread's assistant is unknown. The LangSmith UI is
5
+ * the one `mda deploy` recorded for the deployment's environment
6
+ * (`MDA_LANGSMITH_URL`); without it there is nothing to link to.
7
+ */
8
+ export declare function studioUrl(run: HttpDelivery | undefined, env?: NodeJS.ProcessEnv): string | undefined;
9
+ /**
10
+ * What a channel tells the conversation when its thread waits on a decision,
11
+ * with a link to the thread in Studio, where the decision is made: the run
12
+ * the delivery started stopped on interrupts (`interrupted`), or the message
13
+ * found the thread waiting (`waiting`). `again` says how to continue once it
14
+ * is made, such as "comment again".
15
+ */
16
+ export declare function interruptedNotice(outcome: "interrupted" | "waiting", delivery: HttpDelivery, again: string): string;
17
+ //# sourceMappingURL=studio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio.d.ts","sourceRoot":"","sources":["../../../src/channels/http/studio.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAS/C;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,YAAY,GAAG,SAAS,EAC7B,GAAG,oBAAc,GAChB,MAAM,GAAG,SAAS,CAsBpB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,aAAa,GAAG,SAAS,EAClC,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,MAAM,GACZ,MAAM,CAMR"}
@@ -0,0 +1,82 @@
1
+ /** Links from channel notices into the deployment's LangSmith Studio. */
2
+ import { v5 as uuidv5 } from "uuid";
3
+ import { DEPLOYMENT_ID_ENV } from "../../connections.js";
4
+ import { managedDeploymentName } from "../../runtime/sandbox-manager.js";
5
+ const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
6
+ const DEPLOYMENT_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
7
+ const GRAPH_ID_PATTERN = /^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/;
8
+ /** The namespace the Agent Server derives a graph's default assistant from. */
9
+ const GRAPH_NAMESPACE = "6ba7b821-9dad-11d1-80b4-00c04fd430c8";
10
+ /**
11
+ * The thread in the deployment's Studio, or the deployment's page when the
12
+ * deployment's name or the thread's assistant is unknown. The LangSmith UI is
13
+ * the one `mda deploy` recorded for the deployment's environment
14
+ * (`MDA_LANGSMITH_URL`); without it there is nothing to link to.
15
+ */
16
+ export function studioUrl(run, env = process.env) {
17
+ const threadId = run?.threadId;
18
+ const thread = threadId && UUID_PATTERN.test(threadId) ? threadId : undefined;
19
+ const workspace = env.LANGSMITH_TENANT_ID?.trim() ?? "";
20
+ const deployment = env[DEPLOYMENT_ID_ENV]?.trim() ?? "";
21
+ if (!UUID_PATTERN.test(workspace) || !UUID_PATTERN.test(deployment))
22
+ return undefined;
23
+ const origin = parseHttpUrl(env.MDA_LANGSMITH_URL)?.origin;
24
+ if (!origin)
25
+ return undefined;
26
+ const name = managedDeploymentName(env);
27
+ const assistantId = assistantUuid(run?.assistantId);
28
+ if (!name || !DEPLOYMENT_NAME_PATTERN.test(name) || !thread || !assistantId)
29
+ return `${origin}/o/${workspace}/host/deployments/${deployment}`;
30
+ const query = new URLSearchParams({
31
+ organizationId: workspace,
32
+ render: "interact",
33
+ hostProjectId: deployment,
34
+ assistantId,
35
+ mode: "chat",
36
+ threadId: thread,
37
+ });
38
+ return `${origin}/o/${workspace}/a/${encodeURIComponent(name)}/studio/thread?${query}`;
39
+ }
40
+ /**
41
+ * What a channel tells the conversation when its thread waits on a decision,
42
+ * with a link to the thread in Studio, where the decision is made: the run
43
+ * the delivery started stopped on interrupts (`interrupted`), or the message
44
+ * found the thread waiting (`waiting`). `again` says how to continue once it
45
+ * is made, such as "comment again".
46
+ */
47
+ export function interruptedNotice(outcome, delivery, again) {
48
+ const url = studioUrl(delivery);
49
+ const studio = url ? `[LangSmith Studio](${url})` : "LangSmith Studio";
50
+ return outcome === "interrupted"
51
+ ? `I need a decision before I continue. Review the pending step in ${studio}.`
52
+ : `I'm waiting for a decision on an earlier step in this conversation, so I haven't read this yet. Review the pending step in ${studio}, then ${again}.`;
53
+ }
54
+ /**
55
+ * Studio opens an assistant by its ID. Channels start runs by graph ID, whose
56
+ * default assistant the Agent Server derives from it.
57
+ */
58
+ function assistantUuid(assistant) {
59
+ if (!assistant)
60
+ return undefined;
61
+ if (UUID_PATTERN.test(assistant))
62
+ return assistant;
63
+ return GRAPH_ID_PATTERN.test(assistant)
64
+ ? uuidv5(assistant, GRAPH_NAMESPACE)
65
+ : undefined;
66
+ }
67
+ function parseHttpUrl(value) {
68
+ if (!value?.trim())
69
+ return undefined;
70
+ try {
71
+ const url = new URL(value.trim());
72
+ return (url.protocol === "https:" || url.protocol === "http:") &&
73
+ !url.username &&
74
+ !url.password
75
+ ? url
76
+ : undefined;
77
+ }
78
+ catch {
79
+ return undefined;
80
+ }
81
+ }
82
+ //# sourceMappingURL=studio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio.js","sourceRoot":"","sources":["../../../src/channels/http/studio.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,13 @@ export interface HttpChannelInboundMessage {
19
19
  */
20
20
  deliveryKey?: string;
21
21
  }
22
+ /** The thread a `cancel` result stops, and who to tell. */
23
+ export interface HttpChannelCancelMessage {
24
+ userId: string;
25
+ threadId: string;
26
+ /** Where to report the stop. */
27
+ target: JsonValue;
28
+ }
22
29
  export type HttpChannelParseResult = {
23
30
  type: "message";
24
31
  message: HttpChannelInboundMessage;
@@ -28,6 +35,15 @@ export type HttpChannelParseResult = {
28
35
  } | {
29
36
  type: "ignore";
30
37
  response?: Response;
38
+ } | {
39
+ /**
40
+ * Stop the work on the message's thread: MDA cancels its queued and
41
+ * running runs, keeping their progress, then calls `onSettled`.
42
+ */
43
+ type: "cancel";
44
+ message: HttpChannelCancelMessage;
45
+ rawEvent?: JsonValue;
46
+ response?: Response;
31
47
  };
32
48
  /** MDA adds the verified reply target to the validated message. */
33
49
  export type HttpChannelPostInput = ChannelMessage & {
@@ -55,6 +71,10 @@ export interface HttpChannelAdapter {
55
71
  /** Decode the verified request body in the provider's format. */
56
72
  parse(context: HttpChannelRequest): HttpChannelParseResult | Promise<HttpChannelParseResult>;
57
73
  post?(input: HttpChannelPostInput): Promise<HttpPostedMessage>;
74
+ /**
75
+ * The run a message started failed: tell the sender instead of the default
76
+ * apology `post` sends. Called before `onSettled`.
77
+ */
58
78
  onError?(error: unknown, target: JsonValue): Promise<void>;
59
79
  /**
60
80
  * What a message without `content` starts a run with, asked only once the
@@ -63,19 +83,70 @@ export interface HttpChannelAdapter {
63
83
  */
64
84
  input?(message: HttpChannelInboundMessage, rawEvent: JsonValue | undefined): ChannelRunResult | null | undefined | Promise<ChannelRunResult | null | undefined>;
65
85
  /**
66
- * The message's thread waits on a decision, so MDA started no run; tell the
67
- * sender where to make it. Failures are logged.
86
+ * A verified message reached its thread, before MDA starts or queues
87
+ * anything for it. For providers that expect a prompt acknowledgement.
88
+ * Each message that gets it also gets one `onSettled`. Runs in the
89
+ * background; failures are logged.
68
90
  */
69
- onPaused?(target: JsonValue, run: HttpChannelRunInfo): Promise<void>;
91
+ onReceived?(target: JsonValue, delivery: HttpDelivery): Promise<void>;
92
+ /**
93
+ * How a message or a cancel ended, once: the run it started completed,
94
+ * stopped on interrupts, was cancelled, replaced, or failed, or why it
95
+ * started none. See {@link HttpDeliveryOutcome}. Runs in the background;
96
+ * failures are logged.
97
+ *
98
+ * It runs in the process that took the delivery, so a restart while a run
99
+ * is in flight loses it; a run Studio resumes has no delivery, so it gets
100
+ * none.
101
+ */
102
+ onSettled?(target: JsonValue, delivery: HttpSettledDelivery): Promise<void>;
70
103
  }
71
- /** The thread a notice is about, for links into LangSmith Studio. */
72
- export interface HttpChannelRunInfo {
104
+ /** A delivery's thread, for notices and links into LangSmith Studio. */
105
+ export interface HttpDelivery {
73
106
  threadId: string;
74
107
  /** The assistant that runs on the thread, when known. */
75
108
  assistantId?: string;
76
- /** The provider event of the delivery the notice is about, when parsed. */
109
+ /** The provider event `parse` returned, if any. */
77
110
  rawEvent?: JsonValue;
78
111
  }
112
+ /** A delivery and how it ended; see {@link HttpChannelAdapter.onSettled}. */
113
+ export type HttpSettledDelivery = HttpDelivery & {
114
+ outcome: HttpDeliveryOutcome;
115
+ };
116
+ /**
117
+ * How a delivery ended. A message that started a run carries its `runId`:
118
+ *
119
+ * - `completed`: the run finished.
120
+ * - `interrupted`: it stopped on interrupts, so the thread waits on a
121
+ * decision, made in Studio.
122
+ * - `cancelled`: a cancel, or a newer message's `interrupt`, ended it.
123
+ * - `replaced`: a newer message's `rollback` deleted it.
124
+ * - `failed`: it failed, after `onError`. Without a `runId`, MDA couldn't
125
+ * start one.
126
+ * - `unknown`: MDA lost track of it; it may have answered.
127
+ *
128
+ * A message that started no run:
129
+ *
130
+ * - `waiting`: the thread waits on a decision.
131
+ * - `rejected`: the thread was busy and `multitaskStrategy` is `reject`.
132
+ * - `declined`: `input` returned nothing.
133
+ * - `dropped`: a cancel stopped the thread while the message waited for it.
134
+ * - `duplicate`: the thread already ran this `deliveryKey`.
135
+ *
136
+ * A cancel is `stopped`, with how many of the thread's runs were active.
137
+ */
138
+ export type HttpDeliveryOutcome = {
139
+ type: "completed" | "interrupted" | "cancelled" | "replaced" | "unknown";
140
+ runId: string;
141
+ } | {
142
+ type: "failed";
143
+ runId?: string;
144
+ } | {
145
+ type: "waiting" | "rejected" | "declined" | "dropped" | "duplicate";
146
+ } | {
147
+ type: "stopped";
148
+ cancelled: number;
149
+ };
79
150
  export interface HttpChannelRequest {
80
151
  request: Request;
81
152
  rawBody: Uint8Array;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/channels/http/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,MAAM,EAAE,SAAS,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,sBAAsB,GAC9B;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,yBAAyB,CAAC;IACnC,kEAAkE;IAClE,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAC;AAE5C,mEAAmE;AACnE,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG;IAClD,MAAM,EAAE,SAAS,CAAC;IAClB,gFAAgF;IAChF,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3C;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChE,iEAAiE;IACjE,KAAK,CACH,OAAO,EAAE,kBAAkB,GAC1B,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC5D,IAAI,CAAC,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/D,OAAO,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D;;;;OAIG;IACH,KAAK,CAAC,CACJ,OAAO,EAAE,yBAAyB,EAClC,QAAQ,EAAE,SAAS,GAAG,SAAS,GAE7B,gBAAgB,GAChB,IAAI,GACJ,SAAS,GACT,OAAO,CAAC,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACjD;;;OAGG;IACH,QAAQ,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AAED,qEAAqE;AACrE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,UAAU,CAAC;CACrB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/channels/http/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Reserved agent connection for the deployment's Linear app: reading it
3
+ * returns the app's access token, which Agent Auth renews.
4
+ */
5
+ export declare const LINEAR_TOKEN_SLUG = "mda/linear-token";
6
+ /**
7
+ * The deployment's Linear app connection, or one of the app values stored
8
+ * beside it (`webhook-secret`) when `suffix` is given.
9
+ */
10
+ export declare function linearAppConnectionSlug(deploymentId: string, suffix?: string): string;
11
+ //# sourceMappingURL=connections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connections.d.ts","sourceRoot":"","sources":["../../../src/channels/linear/connections.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,iBAAiB,qBAAqB,CAAC;AAEpD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAER"}
@@ -0,0 +1,14 @@
1
+ import { appConnectionSlug } from "../http/provider.js";
2
+ /**
3
+ * Reserved agent connection for the deployment's Linear app: reading it
4
+ * returns the app's access token, which Agent Auth renews.
5
+ */
6
+ export const LINEAR_TOKEN_SLUG = "mda/linear-token";
7
+ /**
8
+ * The deployment's Linear app connection, or one of the app values stored
9
+ * beside it (`webhook-secret`) when `suffix` is given.
10
+ */
11
+ export function linearAppConnectionSlug(deploymentId, suffix) {
12
+ return appConnectionSlug("linear", deploymentId, suffix);
13
+ }
14
+ //# sourceMappingURL=connections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connections.js","sourceRoot":"","sources":["../../../src/channels/linear/connections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAAoB,EACpB,MAAe;IAEf,OAAO,iBAAiB,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { z } from "zod";
2
+ /** Linear refused a request for exceeding its rate limit. */
3
+ export declare class LinearRateLimitError extends Error {
4
+ constructor();
5
+ }
6
+ /** Forget the cached app token; for tests. */
7
+ export declare function resetLinearToken(): void;
8
+ /**
9
+ * Run a GraphQL operation as the app. `query` is a constant; everything that
10
+ * varies goes in `variables`. A rejected token is read again once. Returns
11
+ * the response's `data`, checked against `schema`.
12
+ */
13
+ export declare function linearRequest<T>(query: string, variables: Record<string, unknown>, schema: z.ZodType<T>): Promise<T>;
14
+ /** The Linear user the app acts as. */
15
+ export type LinearAppUser = {
16
+ id: string;
17
+ displayName: string;
18
+ };
19
+ export declare function linearAppUser(): Promise<LinearAppUser>;
20
+ /** Forget the cached app user; for tests. */
21
+ export declare function resetLinearAppUser(): void;
22
+ /**
23
+ * Comment on an issue as the app, threaded under `parentId` when given.
24
+ * Returns the comment's id and URL.
25
+ */
26
+ export declare function createLinearComment(input: {
27
+ issueId: string;
28
+ body: string;
29
+ parentId?: string;
30
+ }): Promise<{
31
+ id: string;
32
+ url?: string;
33
+ }>;
34
+ /** Whether a comment belongs to an agent session's thread. */
35
+ export declare function commentInAgentSession(commentId: string): Promise<boolean>;
36
+ /** What the app says in an agent session. */
37
+ export type LinearActivityContent = {
38
+ type: "thought" | "response" | "error" | "elicitation";
39
+ body: string;
40
+ };
41
+ /**
42
+ * Post an activity to an agent session as the app. An `ephemeral` thought is
43
+ * replaced by the next activity.
44
+ */
45
+ export declare function createLinearActivity(input: {
46
+ agentSessionId: string;
47
+ content: LinearActivityContent;
48
+ ephemeral?: boolean;
49
+ }): Promise<{
50
+ id: string;
51
+ }>;
52
+ /** Link an agent session to a page about it, such as its Studio thread. */
53
+ export declare function addLinearSessionUrl(agentSessionId: string, link: {
54
+ label: string;
55
+ url: string;
56
+ }): Promise<void>;
57
+ //# sourceMappingURL=graphql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../../src/channels/linear/graphql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiCxB,6DAA6D;AAC7D,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,cAGC;CACF;AAQD,8CAA8C;AAC9C,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAWD;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CA4BZ;AAoBD,uCAAuC;AACvC,MAAM,MAAM,aAAa,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAahE,wBAAgB,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,CAEtD;AAED,6CAA6C;AAC7C,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAYD;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAKxC;AAWD,8DAA8D;AAC9D,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED,6CAA6C;AAC7C,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,aAAa,CAAC;IACvD,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAYF;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE;IAChD,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAS1B;AASD,2EAA2E;AAC3E,wBAAsB,mBAAmB,CACvC,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACnC,OAAO,CAAC,IAAI,CAAC,CAMf"}
@@ -0,0 +1,167 @@
1
+ import { z } from "zod";
2
+ import { connections } from "../../connections.js";
3
+ import { CachedRead } from "../http/provider.js";
4
+ import { nonblankStringSchema } from "../message-schema.js";
5
+ import { LINEAR_TOKEN_SLUG } from "./connections.js";
6
+ const LINEAR_GRAPHQL_URL = "https://api.linear.app/graphql";
7
+ const LINEAR_API_TIMEOUT_MS = 10_000;
8
+ /** The largest Linear response body read. */
9
+ const LINEAR_RESPONSE_MAX_CHARS = 1_000_000;
10
+ /** How long the app token read from Agent Auth is reused. */
11
+ const TOKEN_TTL_MS = 5 * 60_000;
12
+ /**
13
+ * How long the app's user is reused. It changes only when the app is
14
+ * installed anew, which a long-lived process should notice too.
15
+ */
16
+ const APP_USER_TTL_MS = 60 * 60_000;
17
+ /**
18
+ * Where GraphQL requests go: Linear's API, or under `mda dev`
19
+ * (`MDA_LOCAL_DEV=1`) the stand-in `MDA_LINEAR_API_URL` names, so local
20
+ * tests never reach Linear. A deployment always uses Linear's API.
21
+ */
22
+ function graphqlUrl(env = process.env) {
23
+ const override = env.MDA_LINEAR_API_URL?.trim();
24
+ if (env.MDA_LOCAL_DEV !== "1" || !override)
25
+ return LINEAR_GRAPHQL_URL;
26
+ const url = new URL(override);
27
+ if (url.protocol !== "http:" && url.protocol !== "https:")
28
+ throw new TypeError("MDA_LINEAR_API_URL must be an http(s) URL");
29
+ return url.toString();
30
+ }
31
+ /** Linear refused a request for exceeding its rate limit. */
32
+ export class LinearRateLimitError extends Error {
33
+ constructor() {
34
+ super("Linear rate limit exceeded");
35
+ this.name = "LinearRateLimitError";
36
+ }
37
+ }
38
+ /** The app's access token, read from Agent Auth at most every few minutes. */
39
+ const appToken = new CachedRead(() => connections.resolveDeploymentSecret(LINEAR_TOKEN_SLUG), () => TOKEN_TTL_MS);
40
+ /** Forget the cached app token; for tests. */
41
+ export function resetLinearToken() {
42
+ appToken.reset();
43
+ }
44
+ function errorCodes(body) {
45
+ return (body.errors ?? []).flatMap((error) => typeof error.extensions?.code === "string" ? [error.extensions.code] : []);
46
+ }
47
+ /**
48
+ * Run a GraphQL operation as the app. `query` is a constant; everything that
49
+ * varies goes in `variables`. A rejected token is read again once. Returns
50
+ * the response's `data`, checked against `schema`.
51
+ */
52
+ export async function linearRequest(query, variables, schema) {
53
+ const send = async () => fetch(graphqlUrl(), {
54
+ method: "POST",
55
+ headers: {
56
+ Authorization: `Bearer ${await appToken.get()}`,
57
+ "Content-Type": "application/json",
58
+ },
59
+ body: JSON.stringify({ query, variables }),
60
+ signal: AbortSignal.timeout(LINEAR_API_TIMEOUT_MS),
61
+ });
62
+ let response = await send();
63
+ let body = await readBody(response);
64
+ if (response.status === 401 ||
65
+ errorCodes(body).includes("AUTHENTICATION_ERROR")) {
66
+ appToken.reset();
67
+ response = await send();
68
+ body = await readBody(response);
69
+ }
70
+ if (errorCodes(body).includes("RATELIMITED"))
71
+ throw new LinearRateLimitError();
72
+ if (!response.ok || body.errors?.length || body.data === undefined)
73
+ throw new Error(`Linear refused the request (HTTP ${response.status})`);
74
+ const data = schema.safeParse(body.data);
75
+ if (!data.success)
76
+ throw new Error("Linear answered in an unexpected shape");
77
+ return data.data;
78
+ }
79
+ async function readBody(response) {
80
+ const text = await response.text();
81
+ if (text.length > LINEAR_RESPONSE_MAX_CHARS)
82
+ return {};
83
+ try {
84
+ const parsed = JSON.parse(text);
85
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed)
86
+ ? parsed
87
+ : {};
88
+ }
89
+ catch {
90
+ return {};
91
+ }
92
+ }
93
+ const VIEWER_QUERY = "query MdaLinearViewer { viewer { id displayName } }";
94
+ const viewerSchema = z.object({
95
+ viewer: z.object({ id: nonblankStringSchema, displayName: z.string() }),
96
+ });
97
+ /**
98
+ * The Linear user the app acts as, read at most hourly: its own comments and
99
+ * changes are ignored, and a comment mentioning its `displayName` starts an
100
+ * agent session.
101
+ */
102
+ const appUser = new CachedRead(async () => (await linearRequest(VIEWER_QUERY, {}, viewerSchema)).viewer, () => APP_USER_TTL_MS);
103
+ export function linearAppUser() {
104
+ return appUser.get();
105
+ }
106
+ /** Forget the cached app user; for tests. */
107
+ export function resetLinearAppUser() {
108
+ appUser.reset();
109
+ }
110
+ const COMMENT_CREATE_MUTATION = `mutation MdaLinearCommentCreate($input: CommentCreateInput!) {
111
+ commentCreate(input: $input) { success comment { id url } }
112
+ }`;
113
+ const commentCreateSchema = z.object({
114
+ commentCreate: z.object({
115
+ success: z.literal(true),
116
+ comment: z.object({ id: nonblankStringSchema, url: z.string().nullish() }),
117
+ }),
118
+ });
119
+ /**
120
+ * Comment on an issue as the app, threaded under `parentId` when given.
121
+ * Returns the comment's id and URL.
122
+ */
123
+ export async function createLinearComment(input) {
124
+ const { comment } = (await linearRequest(COMMENT_CREATE_MUTATION, { input }, commentCreateSchema)).commentCreate;
125
+ return { id: comment.id, ...(comment.url && { url: comment.url }) };
126
+ }
127
+ const COMMENT_SESSION_QUERY = `query MdaLinearCommentSession($id: String!) {
128
+ comment(id: $id) { agentSession { id } }
129
+ }`;
130
+ const commentSessionSchema = z.object({
131
+ comment: z
132
+ .object({ agentSession: z.object({ id: nonblankStringSchema }).nullable() })
133
+ .nullable(),
134
+ });
135
+ /** Whether a comment belongs to an agent session's thread. */
136
+ export async function commentInAgentSession(commentId) {
137
+ const { comment } = await linearRequest(COMMENT_SESSION_QUERY, { id: commentId }, commentSessionSchema);
138
+ return Boolean(comment?.agentSession);
139
+ }
140
+ const ACTIVITY_CREATE_MUTATION = `mutation MdaLinearActivityCreate($input: AgentActivityCreateInput!) {
141
+ agentActivityCreate(input: $input) { success agentActivity { id } }
142
+ }`;
143
+ const activityCreateSchema = z.object({
144
+ agentActivityCreate: z.object({
145
+ success: z.literal(true),
146
+ agentActivity: z.object({ id: nonblankStringSchema }),
147
+ }),
148
+ });
149
+ /**
150
+ * Post an activity to an agent session as the app. An `ephemeral` thought is
151
+ * replaced by the next activity.
152
+ */
153
+ export async function createLinearActivity(input) {
154
+ const { agentActivity } = (await linearRequest(ACTIVITY_CREATE_MUTATION, { input }, activityCreateSchema)).agentActivityCreate;
155
+ return { id: agentActivity.id };
156
+ }
157
+ const SESSION_UPDATE_MUTATION = `mutation MdaLinearSessionUpdate($id: String!, $input: AgentSessionUpdateInput!) {
158
+ agentSessionUpdate(id: $id, input: $input) { success }
159
+ }`;
160
+ const sessionUpdateSchema = z.object({
161
+ agentSessionUpdate: z.object({ success: z.literal(true) }),
162
+ });
163
+ /** Link an agent session to a page about it, such as its Studio thread. */
164
+ export async function addLinearSessionUrl(agentSessionId, link) {
165
+ await linearRequest(SESSION_UPDATE_MUTATION, { id: agentSessionId, input: { addedExternalUrls: [link] } }, sessionUpdateSchema);
166
+ }
167
+ //# sourceMappingURL=graphql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../../src/channels/linear/graphql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type HttpChannel } from "../http/index.js";
2
+ import type { LinearChannelOptions } from "./types.js";
3
+ export type { LinearAppOptions, LinearChannelOptions, LinearChannelThread, LinearEvent, LinearEventCallback, LinearEventKey, LinearEventResult, LinearPayloadFor, } from "./types.js";
4
+ export { LinearRateLimitError } from "./graphql.js";
5
+ /** Adapt verified Linear webhooks into HTTP channel messages or skips. */
6
+ export declare function linearChannel(options?: LinearChannelOptions): HttpChannel;
7
+ /** Forget the cached webhook secret; for tests. */
8
+ export declare function resetLinearWebhookSecret(): void;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/channels/linear/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,WAAW,EAOjB,MAAM,kBAAkB,CAAC;AAkC1B,OAAO,KAAK,EAEV,oBAAoB,EAKrB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AA2BpD,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,WAAW,CA+D7E;AA+CD,mDAAmD;AACnD,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C"}