@dahrk/linear 0.1.0 → 0.1.1

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 (62) hide show
  1. package/README.md +24 -12
  2. package/dist/comments.d.ts +36 -0
  3. package/dist/comments.d.ts.map +1 -0
  4. package/dist/comments.js +104 -0
  5. package/dist/comments.js.map +1 -0
  6. package/dist/documents.d.ts +1 -15
  7. package/dist/documents.d.ts.map +1 -1
  8. package/dist/documents.js +37 -27
  9. package/dist/documents.js.map +1 -1
  10. package/dist/format-action.d.ts +25 -0
  11. package/dist/format-action.d.ts.map +1 -0
  12. package/dist/format-action.js +250 -0
  13. package/dist/format-action.js.map +1 -0
  14. package/dist/index.d.ts +113 -11
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +182 -58
  17. package/dist/index.js.map +1 -1
  18. package/dist/issue-graph.d.ts +37 -0
  19. package/dist/issue-graph.d.ts.map +1 -0
  20. package/dist/issue-graph.js +125 -0
  21. package/dist/issue-graph.js.map +1 -0
  22. package/dist/issues.d.ts +3 -2
  23. package/dist/issues.d.ts.map +1 -1
  24. package/dist/issues.js +5 -10
  25. package/dist/issues.js.map +1 -1
  26. package/dist/labels.d.ts +47 -0
  27. package/dist/labels.d.ts.map +1 -1
  28. package/dist/labels.js +71 -23
  29. package/dist/labels.js.map +1 -1
  30. package/dist/linear-client.d.ts +51 -0
  31. package/dist/linear-client.d.ts.map +1 -1
  32. package/dist/linear-client.js +234 -34
  33. package/dist/linear-client.js.map +1 -1
  34. package/dist/oauth.d.ts +11 -10
  35. package/dist/oauth.d.ts.map +1 -1
  36. package/dist/oauth.js +35 -32
  37. package/dist/oauth.js.map +1 -1
  38. package/dist/recording-client.d.ts +20 -2
  39. package/dist/recording-client.d.ts.map +1 -1
  40. package/dist/recording-client.js +39 -1
  41. package/dist/recording-client.js.map +1 -1
  42. package/dist/responding-client.d.ts +49 -0
  43. package/dist/responding-client.d.ts.map +1 -0
  44. package/dist/responding-client.js +47 -0
  45. package/dist/responding-client.js.map +1 -0
  46. package/dist/teams.d.ts +20 -0
  47. package/dist/teams.d.ts.map +1 -0
  48. package/dist/teams.js +32 -0
  49. package/dist/teams.js.map +1 -0
  50. package/package.json +8 -10
  51. package/src/comments.ts +126 -0
  52. package/src/documents.ts +162 -0
  53. package/src/format-action.ts +279 -0
  54. package/src/index.ts +556 -0
  55. package/src/issue-graph.ts +169 -0
  56. package/src/issues.ts +93 -0
  57. package/src/labels.ts +254 -0
  58. package/src/linear-client.ts +449 -0
  59. package/src/oauth.ts +194 -0
  60. package/src/recording-client.ts +141 -0
  61. package/src/responding-client.ts +106 -0
  62. package/src/teams.ts +44 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-action.js","sourceRoot":"","sources":["../src/format-action.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,28 @@
1
+ /**
2
+ * @dahrk/linear - the Linear-native control surface (build spec section 14).
3
+ *
4
+ * Two responsibilities:
5
+ * 1. Intake-side (used by the hub): verify the webhook signature, and normalise a
6
+ * raw Linear webhook into the internal LinearEvent. tenantId/workspaceId are
7
+ * resolved from the authenticated connection, never from the payload.
8
+ * 2. Session-side (used by hub + edge): drive the Agent Session API natively -
9
+ * post activities (thought/action/response), render the stage graph as the
10
+ * agent-plan checklist, raise elicitation gates, take prompted-drive turns,
11
+ * handle the stop signal, set externalUrls.
12
+ *
13
+ * Re-implemented directly against the Agent Session API; cyrus's posting code is a
14
+ * reference, not a dependency. Intended runtime dep: the Linear TypeScript SDK
15
+ * (added at M2/M5).
16
+ */
1
17
  import type { LinearEvent } from "@dahrk/contracts";
18
+ import type { LinearWebhookPayload } from "@linear/sdk/webhooks";
2
19
  /**
3
- * Verify a Linear webhook signature and return the parsed payload, or throw.
4
- * Linear signs the raw request body with HMAC-SHA256 (hex) under the connection's
5
- * webhook secret; we recompute and compare in constant time over the raw bytes.
20
+ * Verify a Linear webhook signature and timestamp freshness, then return the parsed
21
+ * payload, or throw. Delegates to LinearWebhookClient.parseData which uses
22
+ * HMAC-SHA256 + timingSafeEqual. The webhookTimestamp field is extracted from the
23
+ * raw body so the SDK's built-in ±60 s replay window applies; a missing or
24
+ * non-numeric timestamp skips the freshness check. Throws "Invalid webhook
25
+ * signature" on bad HMAC and "Invalid webhook timestamp" on a stale delivery.
6
26
  */
7
27
  export declare function verifyWebhook(rawBody: Buffer, signature: string, secret: string): unknown;
8
28
  /**
@@ -11,16 +31,49 @@ export declare function verifyWebhook(rawBody: Buffer, signature: string, secret
11
31
  * connection's registered set. `tenantId` is supplied by the caller from the owning
12
32
  * Connection (the single source of truth for a workspace's tenant), never inferred here.
13
33
  */
14
- export declare function normalise(payload: unknown, connectionId: string, tenantId: string): LinearEvent;
34
+ export declare function normalise(payload: LinearWebhookPayload, connectionId: string, tenantId: string): LinearEvent;
15
35
  /** A Linear agent-session state, mirrored from the engine's run-state (build spec section 14). */
16
36
  export type SessionState = "active" | "awaitingInput" | "complete" | "error";
17
37
  /** An activity kind posted to the session. `error` rides the same surface as a thought. */
18
38
  export type ActivityType = "thought" | "action" | "response" | "error";
39
+ /** The result of `startIssue`, so a caller can SEE a no-op/failed state move rather than have it
40
+ * silently swallowed (a silent no-op is why the ticket sat in Backlog for a whole run). `moved`
41
+ * is true only when the issue was actually transitioned into a working state; otherwise `reason`
42
+ * says why not (a benign skip like `already-active` vs a real failure like `no-started-state`). */
43
+ export type StartIssueOutcome = {
44
+ moved: true;
45
+ stateName: string;
46
+ } | {
47
+ moved: false;
48
+ reason: StartIssueSkip;
49
+ };
50
+ /** Why `startIssue` did not move the issue. The first two are benign (nothing to do); the rest are
51
+ * failures a caller should surface. */
52
+ export type StartIssueSkip = "no-issue" | "already-active" | "no-team" | "no-started-state" | "update-failed";
53
+ /** The result of `moveIssueToReview` (DHK-283), so a caller can SEE a no-op instead of the ticket
54
+ * silently sitting In Progress. `moved` is true only when the issue was actually transitioned into a
55
+ * review state; otherwise `reason` says why not - benign (`already-there`, e.g. a closed issue or one
56
+ * already in the review state) vs a real gap (`no-review-state`: this team has no state named
57
+ * review/in review/qa and `SKAKEL_REVIEW_STATE_NAME` is unset/unmatched). */
58
+ export type MoveToReviewOutcome = {
59
+ moved: true;
60
+ stateName: string;
61
+ } | {
62
+ moved: false;
63
+ reason: MoveToReviewSkip;
64
+ };
65
+ /** Why `moveIssueToReview` did not move the issue. `no-issue`/`already-there` are benign; the rest are
66
+ * gaps a caller should surface as a visible thought. */
67
+ export type MoveToReviewSkip = "no-issue" | "already-there" | "no-team" | "no-review-state" | "update-failed";
19
68
  export interface Activity {
20
69
  type: ActivityType;
21
70
  text: string;
22
71
  /** For `action` activities, the tool name. */
23
72
  tool?: string;
73
+ /** For `action` activities, the tool's outcome folded under the call (markdown, DHK-385). Set once
74
+ * the call completes so the step reads as one self-contained activity: verb + parameter on top,
75
+ * result underneath. Ignored for non-action types. */
76
+ result?: string;
24
77
  /** thought/action only: a transient state, replaced in the UI by the next activity. */
25
78
  ephemeral?: boolean;
26
79
  }
@@ -55,6 +108,26 @@ export interface AuthRequest {
55
108
  userId?: string;
56
109
  providerName?: string;
57
110
  }
111
+ /** A Linear workflow-state category. Mirrors the `type` field on a `WorkflowState`. */
112
+ export type IssueStateType = "triage" | "backlog" | "unstarted" | "started" | "completed" | "canceled";
113
+ /** The disengagement ground truth for one Linear issue, read live off the API (DHK-*: stuck
114
+ * awaitingInput backstop). Only the fields the disengagement predicate needs are carried; an issue
115
+ * ABSENT from a `readIssueEngagement` result (hard-deleted) is represented by the map having no
116
+ * entry, not by a value here, so `present` is always true when an `IssueEngagement` exists. */
117
+ export interface IssueEngagement {
118
+ /** Always true for a returned issue; the "not present" (deleted) case is a missing map entry. */
119
+ present: boolean;
120
+ /** The issue has been archived (soft-deleted). Read from `archivedAt`; archived issues are still
121
+ * returned because the read requests `includeArchived`. */
122
+ archived: boolean;
123
+ /** The issue's current workflow-state category (`state.type`), when known. */
124
+ stateType?: IssueStateType;
125
+ /** The current assignee's user id, when set. */
126
+ assigneeId?: string;
127
+ /** The current delegated agent-user id (`delegateId`), when set. For an agent, engagement is
128
+ * delegation, not assignment, so this is the primary identity to test against the app user. */
129
+ delegateId?: string;
130
+ }
58
131
  /** A pull request to attach to the session's issue (idempotent by `url`). */
59
132
  export interface PrAttachment {
60
133
  url: string;
@@ -105,12 +178,16 @@ export interface AgentSessionClient {
105
178
  addIssueLabel(issueId: string, name: string): Promise<void>;
106
179
  /** Raise an account-linking elicitation carrying the `auth` signal (credential-plane seam). */
107
180
  requestAuth(sessionId: string, prompt: string, auth: AuthRequest): Promise<void>;
108
- /** Move the session's issue to its team's first `started` state and self-delegate (best practice). */
109
- startIssue(sessionId: string): Promise<void>;
181
+ /** Move the session's issue into its team's working (`started`, non-review) state and self-delegate
182
+ * (best practice on delegation). Returns an outcome so a caller can surface a no-op/failed move
183
+ * instead of it vanishing (see `StartIssueOutcome`). */
184
+ startIssue(sessionId: string): Promise<StartIssueOutcome>;
110
185
  /** Move the session's issue to a review-named state on run completion (configurable via
111
186
  * `SKAKEL_REVIEW_STATE_NAME`). Leaves it unchanged when no such state exists - never
112
- * auto-completes, so a human keeps iterating and can re-summon @Skakel on the same PR. */
113
- moveIssueToReview(sessionId: string): Promise<void>;
187
+ * auto-completes, so a human keeps iterating and can re-summon @Dahrk on the same PR. Returns an
188
+ * outcome so a caller can surface a no-op (no matching state) rather than have the ticket silently
189
+ * stay In Progress (see `MoveToReviewOutcome`). */
190
+ moveIssueToReview(sessionId: string): Promise<MoveToReviewOutcome>;
114
191
  /** Post a normal top-level comment on the session's issue (not an agent activity), so a run
115
192
  * summary lands in the issue's comment thread rather than only in the agent session panel. */
116
193
  commentOnIssue(sessionId: string, body: string): Promise<void>;
@@ -125,16 +202,41 @@ export interface AgentSessionClient {
125
202
  setExternalUrls(sessionId: string, urls: ExternalUrl[]): Promise<void>;
126
203
  /** Mirror the run-state to the Linear session state. */
127
204
  setState(sessionId: string, state: SessionState): Promise<void>;
205
+ /** Read disengagement ground truth for a batch of issues in one query (rate-limit friendly; the
206
+ * read includes archived issues). The result maps issue id -> `IssueEngagement`; an issue id that
207
+ * is absent from the result was not returned by Linear (hard-deleted). Used by the disengagement
208
+ * sweep and webhook path to decide whether @Dahrk is still engaged on an issue. */
209
+ readIssueEngagement(issueIds: string[]): Promise<Map<string, IssueEngagement>>;
210
+ /** The app user's own id (`viewer.id`) - the id @Dahrk self-delegates to on `startIssue`. Cached.
211
+ * This is the identity a run's issue must still delegate/assign to for the agent to be "engaged". */
212
+ appUserId(): Promise<string>;
213
+ /** Proactively create an agent session ON an issue (DHK-63): the hub was neither delegated nor
214
+ * @mentioned but has useful work to do (a triage/SLA pre-brief). Returns the new session id so the
215
+ * caller can bind a run to it. Wraps Linear's `agentSessionCreateOnIssue`. */
216
+ createSessionOnIssue(issueId: string): Promise<string>;
217
+ /** Proactively create an agent session ON a comment (DHK-63): the comment analogue of
218
+ * `createSessionOnIssue`. Returns the new session id. Wraps `agentSessionCreateOnComment`. */
219
+ createSessionOnComment(commentId: string): Promise<string>;
128
220
  }
221
+ export type { LinearWebhookPayload } from "@linear/sdk/webhooks";
129
222
  export { createRecordingClient } from "./recording-client.js";
130
- export type { RecordingClient, RecordedCall } from "./recording-client.js";
223
+ export type { RecordingClient, RecordedCall, RecordingClientOptions } from "./recording-client.js";
224
+ export { createRespondingLinearClient } from "./responding-client.js";
225
+ export type { RespondingClient, RespondingClientOptions, SessionProjection, GateDecision, } from "./responding-client.js";
131
226
  export { createLinearClient } from "./linear-client.js";
227
+ export { formatToolAction, formatToolResult, type ToolAction } from "./format-action.js";
132
228
  export { authorizeUrl, exchangeCode, refreshTokens, mintAppToken, fetchOrganizationId, probeToken, DEFAULT_AGENT_SCOPES } from "./oauth.js";
133
229
  export type { LinearTokens, LinearProbe } from "./oauth.js";
134
- export { provisionLabels, provisionWorkflowLabels, provisionRepoLabels, linearLabelApi, projectLabelApi, fetchIssueProjectRepoLabels, REPO_LABEL_GROUP, } from "./labels.js";
135
- export type { LabelApi, ProvisionOptions } from "./labels.js";
230
+ export { provisionLabels, provisionWorkflowLabels, provisionRepoLabels, linearLabelApi, projectLabelApi, fetchIssueProjectRepoLabels, fetchIssueChildCount, fetchOpenBlockers, isBlockerSettled, REPO_LABEL_GROUP, } from "./labels.js";
231
+ export type { LabelApi, ProvisionOptions, OpenBlocker } from "./labels.js";
232
+ export { linearTeamsApi, listWorkspaceTeams } from "./teams.js";
233
+ export type { Team, TeamsApi } from "./teams.js";
136
234
  export { linearTriageApi, linearClientAuth } from "./issues.js";
137
235
  export type { TriageApi } from "./issues.js";
138
236
  export { fetchAttachedDocuments, collectAttachedDocuments, linearDocumentSource, documentSlugFromUrl, documentSlug, } from "./documents.js";
139
237
  export type { DocumentSource, RawDocument } from "./documents.js";
238
+ export { fetchIssueComments, collectIssueComments, linearCommentSource } from "./comments.js";
239
+ export type { CommentSource, RawComment } from "./comments.js";
240
+ export { fetchRelatedIssues, collectRelatedIssues, linearIssueGraphSource, MAX_RELATED_ISSUES, } from "./issue-graph.js";
241
+ export type { IssueGraphSource, RawEdge, RawRelatedIssue } from "./issue-graph.js";
140
242
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,32 +1,66 @@
1
+ import { LinearWebhookClient } from "@linear/sdk/webhooks";
1
2
  /**
2
- * @dahrk/linear - the Linear-native control surface (build spec section 14).
3
- *
4
- * Two responsibilities:
5
- * 1. Intake-side (used by the hub): verify the webhook signature, and normalise a
6
- * raw Linear webhook into the internal LinearEvent. tenantId/workspaceId are
7
- * resolved from the authenticated connection, never from the payload.
8
- * 2. Session-side (used by hub + edge): drive the Agent Session API natively -
9
- * post activities (thought/action/response), render the stage graph as the
10
- * agent-plan checklist, raise elicitation gates, take prompted-drive turns,
11
- * handle the stop signal, set externalUrls.
12
- *
13
- * Re-implemented directly against the Agent Session API; cyrus's posting code is a
14
- * reference, not a dependency. Intended runtime dep: the Linear TypeScript SDK
15
- * (added at M2/M5).
16
- */
17
- import { createHmac, timingSafeEqual } from "node:crypto";
18
- /**
19
- * Verify a Linear webhook signature and return the parsed payload, or throw.
20
- * Linear signs the raw request body with HMAC-SHA256 (hex) under the connection's
21
- * webhook secret; we recompute and compare in constant time over the raw bytes.
3
+ * Verify a Linear webhook signature and timestamp freshness, then return the parsed
4
+ * payload, or throw. Delegates to LinearWebhookClient.parseData which uses
5
+ * HMAC-SHA256 + timingSafeEqual. The webhookTimestamp field is extracted from the
6
+ * raw body so the SDK's built-in ±60 s replay window applies; a missing or
7
+ * non-numeric timestamp skips the freshness check. Throws "Invalid webhook
8
+ * signature" on bad HMAC and "Invalid webhook timestamp" on a stale delivery.
22
9
  */
23
10
  export function verifyWebhook(rawBody, signature, secret) {
24
- const expected = createHmac("sha256", secret).update(rawBody).digest();
25
- const given = Buffer.from(signature ?? "", "hex");
26
- if (expected.length !== given.length || !timingSafeEqual(expected, given)) {
27
- throw new Error("linear webhook signature mismatch");
11
+ // Extract webhookTimestamp so parseData can enforce the ±60 s replay window.
12
+ // If the body is not valid JSON or the field is absent, we omit the argument and
13
+ // parseData skips the check (same as a missing timestamp in the old hand-rolled path).
14
+ let ts;
15
+ try {
16
+ const raw = JSON.parse(rawBody.toString("utf8")).webhookTimestamp;
17
+ if (typeof raw === "number")
18
+ ts = raw;
19
+ else if (typeof raw === "string") {
20
+ const n = Number(raw);
21
+ if (Number.isFinite(n))
22
+ ts = n;
23
+ }
24
+ }
25
+ catch {
26
+ /* non-JSON body – parseData will re-parse and also throw */
28
27
  }
29
- return JSON.parse(rawBody.toString("utf8"));
28
+ return new LinearWebhookClient(secret).parseData(rawBody, signature, ts);
29
+ }
30
+ /**
31
+ * Strip a leading @mention token from a triggering comment body (DHK-322), returning the bare
32
+ * instruction (trimmed). Two spellings are handled: a plain-text `@name` prefix (the structured
33
+ * `agentSession.comment.body` form) and a leading Linear `<user id="...">name</user>` element (the
34
+ * `promptContext` primary-directive-thread form). A body that is only the mention yields "". Pure, so
35
+ * the instruction parsing is unit-testable and free of an LLM.
36
+ */
37
+ function stripLeadingMention(body) {
38
+ let text = body.replace(/^\s+/, "");
39
+ const userMatch = /^<user\b[^>]*>[\s\S]*?<\/user>/.exec(text);
40
+ if (userMatch)
41
+ text = text.slice(userMatch[0].length);
42
+ else
43
+ text = text.replace(/^@\S+/, "");
44
+ return text.trim();
45
+ }
46
+ /**
47
+ * Parse the triggering comment out of a `promptContext` primary-directive-thread (DHK-322): the
48
+ * `comment-id` attribute plus the last `<comment>` body (the triggering message), with its leading
49
+ * mention stripped. The fallback path when the webhook carries no structured `agentSession.comment`.
50
+ * Pure.
51
+ */
52
+ function directiveFromPromptContext(promptContext) {
53
+ const block = /<primary-directive-thread\b([^>]*)>([\s\S]*?)<\/primary-directive-thread>/.exec(promptContext);
54
+ if (!block)
55
+ return {};
56
+ const commentId = /\bcomment-id="([^"]*)"/.exec(block[1] ?? "")?.[1]?.trim();
57
+ const comments = [...(block[2] ?? "").matchAll(/<comment\b[^>]*>([\s\S]*?)<\/comment>/g)];
58
+ const lastBody = comments.at(-1)?.[1];
59
+ const instruction = lastBody !== undefined ? stripLeadingMention(lastBody) : undefined;
60
+ return {
61
+ ...(commentId ? { commentId } : {}),
62
+ ...(instruction ? { instruction } : {}),
63
+ };
30
64
  }
31
65
  /** Fixed 👍/👎 -> sentiment lookup. A reaction's sentiment comes from this table, never an LLM, so the
32
66
  * determinism boundary holds. Returns undefined for any emoji we do not treat as feedback. */
@@ -46,24 +80,48 @@ function reactionSentiment(emoji) {
46
80
  * Connection (the single source of truth for a workspace's tenant), never inferred here.
47
81
  */
48
82
  export function normalise(payload, connectionId, tenantId) {
49
- const p = (payload ?? {});
50
- const ts = typeof p.webhookTimestamp === "string" ? p.webhookTimestamp : "1970-01-01T00:00:00Z";
83
+ const ts = new Date(payload.webhookTimestamp).toISOString();
51
84
  const base = {
52
85
  tenantId,
53
86
  connectionId,
54
- workspaceId: p.organizationId ?? "",
87
+ workspaceId: payload.organizationId,
55
88
  linearPayload: payload,
56
89
  ts,
57
90
  };
58
- if (p.type === "AgentSessionEvent" || p.type === "AgentSession") {
59
- const agentSessionId = p.agentSession?.id ?? "";
91
+ if (payload.type === "AgentSessionEvent" || payload.type === "AgentSession") {
92
+ // Narrow to the AgentSessionEvent shape; "AgentSession" is a legacy alias Linear still emits.
93
+ const p = payload;
94
+ // Linear's webhook body nests the issue under `agentSession.issue.id`; the SDK type models it
95
+ // flattened as `agentSession.issueId`. Tolerate both so the issue id survives for routing.
96
+ const agentSession = p.agentSession;
97
+ const agentSessionId = agentSession.id;
98
+ const issueId = agentSession.issueId ?? agentSession.issue?.id ?? undefined;
60
99
  if (p.action === "created") {
100
+ // DHK-322: classify the trigger modality deterministically from the payload alone. An @mention
101
+ // leaves the issue delegated to someone other than the app; a delegate/assign delegates it to the
102
+ // app itself (mirrors `shouldSetDelegate`). When the app user id cannot be resolved, default to
103
+ // `delegate` - the safe default is today's labelled pipeline, never mis-routing a real assignment
104
+ // to converse. No LLM: this is a pure id comparison.
105
+ const appUserId = agentSession.appUser?.id ?? undefined;
106
+ const issueDelegateId = agentSession.issue?.delegateId ?? agentSession.issue?.delegate?.id ?? undefined;
107
+ const trigger = appUserId !== undefined && issueDelegateId !== appUserId ? "mention" : "delegate";
108
+ // The instruction rides the triggering comment: prefer the structured `agentSession.comment`,
109
+ // else parse it out of the promptContext primary-directive-thread. The leading @mention is
110
+ // stripped so a bare mention yields no instruction.
111
+ const structured = agentSession.comment;
112
+ const promptContext = payload.promptContext;
113
+ const directive = typeof promptContext === "string" ? directiveFromPromptContext(promptContext) : {};
114
+ const structuredInstruction = structured?.body !== undefined ? stripLeadingMention(structured.body) : undefined;
115
+ const instruction = (structuredInstruction && structuredInstruction.length > 0 ? structuredInstruction : undefined) ??
116
+ directive.instruction;
117
+ const commentId = structured?.id ?? directive.commentId;
61
118
  // Carry the issue id so the hub can map issue -> run (for later Inbox-notification routing).
62
- const issueId = p.agentSession?.issue?.id;
63
119
  return {
64
120
  ...base,
65
121
  type: "agent-session-created",
66
- subject: { agentSessionId, ...(issueId ? { issueId } : {}) },
122
+ trigger,
123
+ subject: { agentSessionId, ...(issueId ? { issueId } : {}), ...(commentId ? { commentId } : {}) },
124
+ ...(instruction ? { instruction } : {}),
67
125
  };
68
126
  }
69
127
  if (p.action === "prompted") {
@@ -72,40 +130,101 @@ export function normalise(payload, connectionId, tenantId) {
72
130
  if (p.action === "stopped" || p.action === "stop") {
73
131
  return { ...base, type: "signal-stop", subject: { agentSessionId } };
74
132
  }
75
- }
76
- // Inbox notification: the agent was unassigned from an issue -> disengage (stop its run).
77
- if (p.type === "AppUserNotification" && p.action === "issueUnassignedFromYou") {
78
- const issueId = p.notification?.issueId ?? p.notification?.issue?.id ?? "";
79
- return { ...base, type: "issue-unassigned", subject: { issueId } };
80
- }
81
- // Inbox notification: the issue's status changed. Only a move to a *canceled* workflow-state type is
82
- // a disengagement signal (stop its run); any other status change falls through to ignored.
83
- if (p.type === "AppUserNotification" && p.action === "issueStatusChanged") {
84
- const stateType = p.notification?.issue?.state?.type ?? p.notification?.issueStatusType;
85
- if (stateType === "canceled") {
86
- const issueId = p.notification?.issueId ?? p.notification?.issue?.id ?? "";
87
- return { ...base, type: "issue-canceled", subject: { issueId } };
133
+ // The session was archived or deleted (the human tore the agent off the issue). Linear does not
134
+ // guarantee an Inbox notification for this, but when it sends the raw AgentSession action we can
135
+ // stop the run it drives directly. Carry the issue id when present so the run can also be found by
136
+ // issue if the session map is stale.
137
+ if (p.action === "archived" || p.action === "deleted") {
138
+ return {
139
+ ...base,
140
+ type: "session-archived",
141
+ subject: { agentSessionId, ...(issueId ? { issueId } : {}) },
142
+ };
88
143
  }
89
144
  }
90
- // Inbox notification: a 👍/👎 reaction on a Skakel response -> a feedback signal. A non-thumb emoji
91
- // falls through to ignored (never mis-dispatched).
92
- if (p.type === "AppUserNotification" &&
93
- (p.action === "issueEmojiReaction" || p.action === "issueCommentReaction")) {
94
- const reaction = reactionSentiment(p.notification?.reaction?.emoji ?? p.notification?.reactionEmoji ?? p.notification?.emoji);
95
- if (reaction) {
96
- const issueId = p.notification?.issueId ?? p.notification?.issue?.id ?? "";
97
- return { ...base, type: "issue-reaction", subject: { issueId }, reaction };
145
+ if (payload.type === "AppUserNotification") {
146
+ const p = payload;
147
+ // The notification-kind discriminator is carried at the top-level `action` on the real webhook
148
+ // body (the SDK only models it as `notification.type`, which the live payload omits). Read from
149
+ // `action`, and tolerate the alternate field spellings the live body uses for issue id, reaction
150
+ // emoji, and status type.
151
+ const action = p.action;
152
+ const n = p.notification;
153
+ const issueId = n.issueId ?? n.issue?.id ?? "";
154
+ // Inbox notification: the agent was unassigned from an issue -> disengage (stop its run).
155
+ if (action === "issueUnassignedFromYou") {
156
+ return { ...base, type: "issue-unassigned", subject: { issueId } };
157
+ }
158
+ // Inbox notification: the issue's status changed. Only a move to a *canceled* workflow-state type is
159
+ // a disengagement signal (stop its run); any other status change falls through to ignored.
160
+ if (action === "issueStatusChanged") {
161
+ const stateType = n.issue?.state?.type ?? n.issueStatusType;
162
+ if (stateType === "canceled") {
163
+ return { ...base, type: "issue-canceled", subject: { issueId } };
164
+ }
165
+ }
166
+ // Inbox notification: a 👍/👎 reaction on a Dahrk response -> a feedback signal. A non-thumb emoji
167
+ // falls through to ignored (never mis-dispatched).
168
+ if (action === "issueEmojiReaction" || action === "issueCommentReaction") {
169
+ const reaction = reactionSentiment(n.reactionEmoji ?? n.reaction?.emoji ?? n.emoji);
170
+ if (reaction) {
171
+ return { ...base, type: "issue-reaction", subject: { issueId }, reaction };
172
+ }
98
173
  }
99
174
  }
100
175
  // The OAuth app install was revoked: the connection is dead, deactivate it. No subject needed.
101
- if (p.type === "OAuthApp" && p.action === "revoked") {
176
+ if (payload.type === "OAuthApp" && payload.action === "revoked") {
102
177
  return { ...base, type: "oauth-revoked", subject: {} };
103
178
  }
104
- if (p.type === "Issue") {
105
- const issueId = p.issue?.id ?? p.agentSession?.issue?.id ?? "";
179
+ // Permission Changes webhook: the Connection's set of accessible teams changed. Like `oauth-revoked`
180
+ // it is about the Connection, not an issue/session, so the subject is empty; the added/removed team
181
+ // deltas ride on `teamAccess` for the hub to merge into the Connection's tracked set. The SDK's
182
+ // webhook union does not model `PermissionChange`, so cast the payload (same pattern as the
183
+ // AppUserNotification branch above). Defensive: default missing deltas to [] and the flag to false.
184
+ if (payload.type === "PermissionChange" && payload.action === "teamAccessChanged") {
185
+ const p = payload;
186
+ return {
187
+ ...base,
188
+ type: "team-access-changed",
189
+ subject: {},
190
+ teamAccess: {
191
+ addedTeamIds: p.addedTeamIds ?? [],
192
+ removedTeamIds: p.removedTeamIds ?? [],
193
+ canAccessAllPublicTeams: p.canAccessAllPublicTeams ?? false,
194
+ },
195
+ };
196
+ }
197
+ // Issue SLA webhook (DHK-63): a proactive trigger. Only `breached` is actionable (a pre-brief
198
+ // enrichment worth running); `set`/`highRisk` are lifecycle noise and fall through to the throw so
199
+ // they never spawn a session. The SDK's webhook union does not model `IssueSLA`, so cast to read the
200
+ // serialised issue (`issueData`), tolerating the field spellings the live body may use for the id.
201
+ if (payload.type === "IssueSLA" || payload.type === "Issue SLA") {
202
+ const p = payload;
203
+ if (p.action === "breached") {
204
+ const issueId = p.issueData?.id ?? p.issueId ?? p.issue?.id ?? p.data?.id ?? "";
205
+ return { ...base, type: "sla-breach", subject: { issueId } };
206
+ }
207
+ }
208
+ if (payload.type === "Issue") {
209
+ const p = payload;
210
+ // Live "Issue" entity webhooks carry the issue under `data`; tolerate a top-level `issue` too.
211
+ const issueId = p.data?.id ?? p.issue?.id ?? "";
212
+ // An archive is a soft-delete (`archivedAt` set, or an explicit `archived`/`remove` action): treat
213
+ // it as disengagement so any run parked on the issue is stopped. Any other Issue action is a
214
+ // create/update we currently only route as `issue-created`.
215
+ if (p.action === "archived" || p.action === "remove" || p.data?.archivedAt) {
216
+ return { ...base, type: "issue-archived", subject: { issueId } };
217
+ }
218
+ // Triage entry (DHK-63): the issue just MOVED into a triage-typed state - a proactive trigger for
219
+ // pre-brief enrichment. Conservative on purpose: emit only on positive evidence of an entry (the
220
+ // current state is `triage` AND `updatedFrom` shows the state changed, i.e. carries `stateId`), so
221
+ // an ordinary edit on a ticket already in triage still normalises to `issue-created`.
222
+ if (p.data?.state?.type === "triage" && p.updatedFrom && "stateId" in p.updatedFrom) {
223
+ return { ...base, type: "triage-entry", subject: { issueId } };
224
+ }
106
225
  return { ...base, type: "issue-created", subject: { issueId } };
107
226
  }
108
- throw new Error(`unsupported Linear webhook: type=${p.type} action=${p.action}`);
227
+ throw new Error(`unsupported Linear webhook: type=${payload.type} action=${payload.action}`);
109
228
  }
110
229
  /** Keep only the externalUrls Linear accepts: http(s) URLs (internal `skakel://` refs are dropped),
111
230
  * with empty/blank URLs removed and duplicates collapsed by `url` (first wins, since Linear requires
@@ -123,9 +242,14 @@ export function filterExternalUrls(urls) {
123
242
  return kept;
124
243
  }
125
244
  export { createRecordingClient } from "./recording-client.js";
245
+ export { createRespondingLinearClient } from "./responding-client.js";
126
246
  export { createLinearClient } from "./linear-client.js";
247
+ export { formatToolAction, formatToolResult } from "./format-action.js";
127
248
  export { authorizeUrl, exchangeCode, refreshTokens, mintAppToken, fetchOrganizationId, probeToken, DEFAULT_AGENT_SCOPES } from "./oauth.js";
128
- export { provisionLabels, provisionWorkflowLabels, provisionRepoLabels, linearLabelApi, projectLabelApi, fetchIssueProjectRepoLabels, REPO_LABEL_GROUP, } from "./labels.js";
249
+ export { provisionLabels, provisionWorkflowLabels, provisionRepoLabels, linearLabelApi, projectLabelApi, fetchIssueProjectRepoLabels, fetchIssueChildCount, fetchOpenBlockers, isBlockerSettled, REPO_LABEL_GROUP, } from "./labels.js";
250
+ export { linearTeamsApi, listWorkspaceTeams } from "./teams.js";
129
251
  export { linearTriageApi, linearClientAuth } from "./issues.js";
130
252
  export { fetchAttachedDocuments, collectAttachedDocuments, linearDocumentSource, documentSlugFromUrl, documentSlug, } from "./documents.js";
253
+ export { fetchIssueComments, collectIssueComments, linearCommentSource } from "./comments.js";
254
+ export { fetchRelatedIssues, collectRelatedIssues, linearIssueGraphSource, MAX_RELATED_ISSUES, } from "./issue-graph.js";
131
255
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { IssueRelation, RelatedIssue } from "@dahrk/contracts";
2
+ /** An issue as returned by Linear before normalisation, with its state already resolved. */
3
+ export interface RawRelatedIssue {
4
+ identifier?: string;
5
+ title?: string;
6
+ url?: string;
7
+ stateName?: string;
8
+ stateType?: string;
9
+ }
10
+ /** One edge: the neighbouring issue plus how it sits relative to the subject issue. */
11
+ export interface RawEdge {
12
+ relation: IssueRelation;
13
+ issue: RawRelatedIssue | null;
14
+ }
15
+ /** The read seam the assembly depends on; the live impl wraps GraphQL, tests inject a fake. */
16
+ export interface IssueGraphSource {
17
+ /** Every one-hop edge from the issue, in any order. */
18
+ issueEdges(issueId: string): Promise<RawEdge[]>;
19
+ }
20
+ /** How many neighbours ride the manifest. Beyond this the prompt stops being a summary. */
21
+ export declare const MAX_RELATED_ISSUES = 50;
22
+ /**
23
+ * Collect the issue's one-hop neighbourhood from a source: drop edges whose issue did not resolve or
24
+ * carries no identifier, de-dupe by identifier (an issue can be reachable by more than one edge -
25
+ * keep the structurally strongest, which is the lowest `RELATION_ORDER`), sort, and cap. Pure of any
26
+ * network.
27
+ */
28
+ export declare function collectRelatedIssues(source: IssueGraphSource, issueId: string): Promise<RelatedIssue[]>;
29
+ /** The live `IssueGraphSource`, backed by a Linear bearer token. Uses the typed SDK. */
30
+ export declare function linearIssueGraphSource(token: string): IssueGraphSource;
31
+ /**
32
+ * Fetch the issue's one-hop neighbourhood as contract `RelatedIssue`s, ready to snapshot into a run.
33
+ * The single entry point the hub calls. A hard failure (auth, network) propagates so the caller can
34
+ * log and proceed with none.
35
+ */
36
+ export declare function fetchRelatedIssues(token: string, issueId: string): Promise<RelatedIssue[]>;
37
+ //# sourceMappingURL=issue-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-graph.d.ts","sourceRoot":"","sources":["../src/issue-graph.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEpE,4FAA4F;AAC5F,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,uFAAuF;AACvF,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;CAC/B;AAED,+FAA+F;AAC/F,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;CACjD;AAED,2FAA2F;AAC3F,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAarC;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,EAAE,CAAC,CAwBzB;AAED,wFAAwF;AACxF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAoEtE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAEhG"}