linear-agent-bridge 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +613 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/src/agent/context-builder.d.ts +9 -0
- package/dist/src/agent/context-builder.d.ts.map +1 -0
- package/dist/src/agent/context-builder.js +121 -0
- package/dist/src/agent/context-builder.js.map +1 -0
- package/dist/src/agent/plan-manager.d.ts +5 -0
- package/dist/src/agent/plan-manager.d.ts.map +1 -0
- package/dist/src/agent/plan-manager.js +11 -0
- package/dist/src/agent/plan-manager.js.map +1 -0
- package/dist/src/agent/response-tracker.d.ts +4 -0
- package/dist/src/agent/response-tracker.d.ts.map +1 -0
- package/dist/src/agent/response-tracker.js +11 -0
- package/dist/src/agent/response-tracker.js.map +1 -0
- package/dist/src/agent/session-token.d.ts +5 -0
- package/dist/src/agent/session-token.d.ts.map +1 -0
- package/dist/src/agent/session-token.js +15 -0
- package/dist/src/agent/session-token.js.map +1 -0
- package/dist/src/api/activity-ops.d.ts +2 -0
- package/dist/src/api/activity-ops.d.ts.map +1 -0
- package/dist/src/api/activity-ops.js +71 -0
- package/dist/src/api/activity-ops.js.map +1 -0
- package/dist/src/api/base-url.d.ts +3 -0
- package/dist/src/api/base-url.d.ts.map +1 -0
- package/dist/src/api/base-url.js +11 -0
- package/dist/src/api/base-url.js.map +1 -0
- package/dist/src/api/delegation-ops.d.ts +2 -0
- package/dist/src/api/delegation-ops.d.ts.map +1 -0
- package/dist/src/api/delegation-ops.js +51 -0
- package/dist/src/api/delegation-ops.js.map +1 -0
- package/dist/src/api/issue-ops.d.ts +2 -0
- package/dist/src/api/issue-ops.d.ts.map +1 -0
- package/dist/src/api/issue-ops.js +170 -0
- package/dist/src/api/issue-ops.js.map +1 -0
- package/dist/src/api/query-ops.d.ts +2 -0
- package/dist/src/api/query-ops.d.ts.map +1 -0
- package/dist/src/api/query-ops.js +77 -0
- package/dist/src/api/query-ops.js.map +1 -0
- package/dist/src/api/router.d.ts +12 -0
- package/dist/src/api/router.d.ts.map +1 -0
- package/dist/src/api/router.js +62 -0
- package/dist/src/api/router.js.map +1 -0
- package/dist/src/api/session-ops.d.ts +2 -0
- package/dist/src/api/session-ops.d.ts.map +1 -0
- package/dist/src/api/session-ops.js +96 -0
- package/dist/src/api/session-ops.js.map +1 -0
- package/dist/src/config.d.ts +3 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +47 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/graphql/mutations.d.ts +9 -0
- package/dist/src/graphql/mutations.d.ts.map +1 -0
- package/dist/src/graphql/mutations.js +74 -0
- package/dist/src/graphql/mutations.js.map +1 -0
- package/dist/src/graphql/queries.d.ts +10 -0
- package/dist/src/graphql/queries.d.ts.map +1 -0
- package/dist/src/graphql/queries.js +121 -0
- package/dist/src/graphql/queries.js.map +1 -0
- package/dist/src/linear-client.d.ts +7 -0
- package/dist/src/linear-client.d.ts.map +1 -0
- package/dist/src/linear-client.js +72 -0
- package/dist/src/linear-client.js.map +1 -0
- package/dist/src/types.d.ts +85 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/util.d.ts +13 -0
- package/dist/src/util.d.ts.map +1 -0
- package/dist/src/util.js +80 -0
- package/dist/src/util.js.map +1 -0
- package/dist/src/webhook/close-intent.d.ts +4 -0
- package/dist/src/webhook/close-intent.d.ts.map +1 -0
- package/dist/src/webhook/close-intent.js +37 -0
- package/dist/src/webhook/close-intent.js.map +1 -0
- package/dist/src/webhook/handler.d.ts +5 -0
- package/dist/src/webhook/handler.d.ts.map +1 -0
- package/dist/src/webhook/handler.js +441 -0
- package/dist/src/webhook/handler.js.map +1 -0
- package/dist/src/webhook/issue-policy.d.ts +7 -0
- package/dist/src/webhook/issue-policy.d.ts.map +1 -0
- package/dist/src/webhook/issue-policy.js +139 -0
- package/dist/src/webhook/issue-policy.js.map +1 -0
- package/dist/src/webhook/message-builder.d.ts +34 -0
- package/dist/src/webhook/message-builder.d.ts.map +1 -0
- package/dist/src/webhook/message-builder.js +144 -0
- package/dist/src/webhook/message-builder.js.map +1 -0
- package/dist/src/webhook/response-parser.d.ts +2 -0
- package/dist/src/webhook/response-parser.d.ts.map +1 -0
- package/dist/src/webhook/response-parser.js +51 -0
- package/dist/src/webhook/response-parser.js.map +1 -0
- package/dist/src/webhook/session-resolver.d.ts +6 -0
- package/dist/src/webhook/session-resolver.d.ts.map +1 -0
- package/dist/src/webhook/session-resolver.js +203 -0
- package/dist/src/webhook/session-resolver.js.map +1 -0
- package/dist/src/webhook/skip-filter.d.ts +4 -0
- package/dist/src/webhook/skip-filter.d.ts.map +1 -0
- package/dist/src/webhook/skip-filter.js +42 -0
- package/dist/src/webhook/skip-filter.js.map +1 -0
- package/dist/src/webhook/validation.d.ts +2 -0
- package/dist/src/webhook/validation.d.ts.map +1 -0
- package/dist/src/webhook/validation.js +11 -0
- package/dist/src/webhook/validation.js.map +1 -0
- package/openclaw.plugin.json +92 -0
- package/package.json +51 -0
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { pathToFileURL } from "node:url";
|
|
5
|
+
import { normalizeCfg } from "../config.js";
|
|
6
|
+
import { callLinear } from "../linear-client.js";
|
|
7
|
+
import { ACTIVITY_MUTATION, SESSION_UPDATE_MUTATION } from "../graphql/mutations.js";
|
|
8
|
+
import { readBody, readHeader, readObject, readString, normalizeKey, sendJson, } from "../util.js";
|
|
9
|
+
import { verifySignature } from "./validation.js";
|
|
10
|
+
import { resolveSessionId, resolveSessionIdWithFallback, resolveIssue, rememberSessionHint, } from "./session-resolver.js";
|
|
11
|
+
import { buildMessage, buildLabel, buildThought, buildStopText, resolveAction, resolvePrompt, resolveSignal, resolveContext, resolveKey, resolveRepo, resolveExternal, } from "./message-builder.js";
|
|
12
|
+
import { buildAgentResponse } from "./response-parser.js";
|
|
13
|
+
import { applyIssuePolicy } from "./issue-policy.js";
|
|
14
|
+
import { isCloseIntentPrompt, closeIssueFromPrompt } from "./close-intent.js";
|
|
15
|
+
import { shouldSkipPromptedRun, isSelfAuthoredComment } from "./skip-filter.js";
|
|
16
|
+
import { createSessionToken, revokeSessionToken } from "../agent/session-token.js";
|
|
17
|
+
import { buildEnrichedMessage } from "../agent/context-builder.js";
|
|
18
|
+
import { cleanupSession } from "../agent/plan-manager.js";
|
|
19
|
+
import { hasPostedResponse, clearResponseFlag } from "../agent/response-tracker.js";
|
|
20
|
+
import { captureBaseUrl } from "../api/base-url.js";
|
|
21
|
+
const callRef = {};
|
|
22
|
+
const MAX_BODY = 2 * 1024 * 1024;
|
|
23
|
+
const AGENT_TIMEOUT_MS = 30 * 60 * 1000;
|
|
24
|
+
// Guard against duplicate agent runs for the same session.
|
|
25
|
+
// Linear sends both an AgentSessionEvent and a Comment webhook for the
|
|
26
|
+
// same interaction; without dedup both trigger an agent run.
|
|
27
|
+
// Maps session ID → timestamp when marked inflight.
|
|
28
|
+
const inflightSessions = new Map();
|
|
29
|
+
const DEDUP_WINDOW_MS = 5_000;
|
|
30
|
+
export function createLinearWebhook(api) {
|
|
31
|
+
return async (req, res) => {
|
|
32
|
+
if (req.method !== "POST") {
|
|
33
|
+
res.statusCode = 405;
|
|
34
|
+
res.setHeader("Allow", "POST");
|
|
35
|
+
res.end("Method Not Allowed");
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const read = await readBody(req, MAX_BODY);
|
|
39
|
+
if (!read.ok) {
|
|
40
|
+
sendJson(res, read.status, { ok: false, error: read.error });
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const raw = read.body;
|
|
44
|
+
const cfg = normalizeCfg(api.pluginConfig);
|
|
45
|
+
const secret = cfg.linearWebhookSecret;
|
|
46
|
+
const sig = readHeader(req, "linear-signature");
|
|
47
|
+
const delivery = readHeader(req, "linear-delivery");
|
|
48
|
+
if (secret && !verifySignature(secret, sig, raw)) {
|
|
49
|
+
res.statusCode = 401;
|
|
50
|
+
res.end("Unauthorized");
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Capture the host from incoming webhooks for base URL auto-detection
|
|
54
|
+
const host = readHeader(req, "host");
|
|
55
|
+
if (host)
|
|
56
|
+
captureBaseUrl(host);
|
|
57
|
+
const text = raw.toString("utf8");
|
|
58
|
+
let parsed;
|
|
59
|
+
try {
|
|
60
|
+
parsed = JSON.parse(text);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
sendJson(res, 400, { ok: false, error: "Invalid JSON" });
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const data = normalizePayload(parsed);
|
|
67
|
+
let stamp = typeof data.webhookTimestamp === "number"
|
|
68
|
+
? data.webhookTimestamp
|
|
69
|
+
: undefined;
|
|
70
|
+
if (typeof stamp === "number" && stamp > 0 && stamp < 1e12) {
|
|
71
|
+
stamp = stamp * 1000;
|
|
72
|
+
}
|
|
73
|
+
if (stamp && Math.abs(Date.now() - stamp) > 60_000) {
|
|
74
|
+
res.statusCode = 401;
|
|
75
|
+
res.end("Stale webhook");
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
res.statusCode = 202;
|
|
79
|
+
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
80
|
+
res.end(JSON.stringify({ ok: true }));
|
|
81
|
+
queueMicrotask(() => {
|
|
82
|
+
handleWebhook(api, cfg, data, delivery).catch((err) => {
|
|
83
|
+
api.logger.warn?.(`linear webhook error: ${err instanceof Error ? err.message : String(err)}`);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
async function handleWebhook(api, cfg, data, delivery) {
|
|
89
|
+
const kind = readString(data.type) ?? "";
|
|
90
|
+
if (kind === "PermissionChange" || kind === "OAuthApp") {
|
|
91
|
+
logEvent(api, "permission", data);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (kind === "AppUserNotification") {
|
|
95
|
+
logEvent(api, "notification", data);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (kind === "Comment" && (await isSelfAuthoredComment(api, cfg, data))) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const sessionId = await resolveSessionIdWithFallback(api, cfg, data);
|
|
102
|
+
if (!sessionId) {
|
|
103
|
+
if (kind) {
|
|
104
|
+
if (kind === "Comment") {
|
|
105
|
+
const topKeys = Object.keys(data).join(",");
|
|
106
|
+
const nested = readObject(data.data);
|
|
107
|
+
const nestedKeys = nested ? Object.keys(nested).join(",") : "";
|
|
108
|
+
api.logger.info?.(`linear webhook ignored (${kind}) keys=[${topKeys}] dataKeys=[${nestedKeys}]`);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
api.logger.info?.(`linear webhook ignored (${kind})`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const eventData = resolveSessionId(data)
|
|
117
|
+
? data
|
|
118
|
+
: { ...data, agentSessionId: sessionId };
|
|
119
|
+
rememberSessionHint(eventData, sessionId);
|
|
120
|
+
await handleAgentEvent(api, cfg, eventData, delivery);
|
|
121
|
+
}
|
|
122
|
+
async function handleAgentEvent(api, cfg, data, delivery) {
|
|
123
|
+
const action = resolveAction(data);
|
|
124
|
+
if (!action) {
|
|
125
|
+
api.logger.info?.("linear agent event ignored");
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const issue = resolveIssue(data);
|
|
129
|
+
const issueId = readString(issue?.id) ?? "";
|
|
130
|
+
const id = readString(issue?.identifier) ?? "";
|
|
131
|
+
const title = readString(issue?.title) ?? "";
|
|
132
|
+
const url = readString(issue?.url) ?? "";
|
|
133
|
+
const desc = readString(issue?.description) ?? "";
|
|
134
|
+
const guidance = readString(data.guidance) ?? "";
|
|
135
|
+
const prompt = resolvePrompt(data);
|
|
136
|
+
if (action === "prompted") {
|
|
137
|
+
const skipReason = shouldSkipPromptedRun(prompt);
|
|
138
|
+
if (skipReason) {
|
|
139
|
+
api.logger.info?.(`linear prompted event ignored (${skipReason})`);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const context = resolveContext(data);
|
|
144
|
+
const team = resolveKey(issue?.team);
|
|
145
|
+
const proj = resolveKey(issue?.project);
|
|
146
|
+
const repo = resolveRepo(cfg, team, proj);
|
|
147
|
+
const agent = cfg.devAgentId ?? "dev";
|
|
148
|
+
const label = buildLabel(id, title);
|
|
149
|
+
const session = resolveSessionId(data);
|
|
150
|
+
// Dedup: skip if an agent is already running for this session.
|
|
151
|
+
// "prompted" (follow-up comment) actions are allowed through UNLESS
|
|
152
|
+
// the session was just created (within DEDUP_WINDOW_MS), which means
|
|
153
|
+
// this is the redundant Comment webhook that accompanies session creation.
|
|
154
|
+
if (session && inflightSessions.has(session)) {
|
|
155
|
+
const elapsed = Date.now() - inflightSessions.get(session);
|
|
156
|
+
if (action !== "prompted" || elapsed < DEDUP_WINDOW_MS) {
|
|
157
|
+
api.logger.info?.(`linear handler: skipping duplicate for session ${session.slice(0, 8)}... (action=${action}, elapsed=${elapsed}ms)`);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Mark in-flight immediately (before any await) to prevent races.
|
|
162
|
+
if (session)
|
|
163
|
+
inflightSessions.set(session, Date.now());
|
|
164
|
+
const key = normalizeKey(session || id || title || randomUUID());
|
|
165
|
+
const sessionKey = `agent:${agent}:linear:${key}`;
|
|
166
|
+
const idem = delivery ?? randomUUID();
|
|
167
|
+
const signal = resolveSignal(data);
|
|
168
|
+
const deliver = Boolean(cfg.notifyChannel && cfg.notifyTo);
|
|
169
|
+
// Handle stop signal
|
|
170
|
+
if (signal === "stop") {
|
|
171
|
+
if (session)
|
|
172
|
+
inflightSessions.delete(session);
|
|
173
|
+
const text = buildStopText(id, title);
|
|
174
|
+
postActivity(api, cfg, session, { type: "response", body: text }).catch(() => { });
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
// Post initial "thinking" activity
|
|
178
|
+
const thought = buildThought(action, id, title);
|
|
179
|
+
postActivity(api, cfg, session, { type: "thought", body: thought }, { ephemeral: true }).catch(() => { });
|
|
180
|
+
// Fast-path for explicit close commands
|
|
181
|
+
if (isCloseIntentPrompt(prompt)) {
|
|
182
|
+
if (session)
|
|
183
|
+
inflightSessions.delete(session);
|
|
184
|
+
const closeText = issueId
|
|
185
|
+
? await closeIssueFromPrompt(api, cfg, issueId, id, title)
|
|
186
|
+
: "Не удалось определить задачу для закрытия.";
|
|
187
|
+
postActivity(api, cfg, session, { type: "response", body: closeText }).catch(() => { });
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
// Apply issue policies on create
|
|
191
|
+
if (action === "created") {
|
|
192
|
+
const external = resolveExternal(cfg, session, issueId);
|
|
193
|
+
if (external) {
|
|
194
|
+
updateSessionExternalUrl(api, cfg, session, external.url, external.label).catch(() => { });
|
|
195
|
+
}
|
|
196
|
+
applyIssuePolicy(api, cfg, issueId).catch(() => { });
|
|
197
|
+
}
|
|
198
|
+
// Resolve team ID for context
|
|
199
|
+
const issueTeamObj = readObject(issue?.team);
|
|
200
|
+
const teamId = readString(issueTeamObj?.id) ?? "";
|
|
201
|
+
// Generate per-session API token for agent to call back
|
|
202
|
+
const enableApi = cfg.enableAgentApi !== false;
|
|
203
|
+
api.logger.info?.(`linear handler: enableApi=${enableApi} session=${session ? session.slice(0, 8) + "..." : "(none)"} issueId=${issueId.slice(0, 8) || "(none)"}`);
|
|
204
|
+
let apiToken = "";
|
|
205
|
+
if (enableApi && session) {
|
|
206
|
+
const sessionCtx = {
|
|
207
|
+
sessionId: session,
|
|
208
|
+
issueId,
|
|
209
|
+
issueIdentifier: id,
|
|
210
|
+
issueTitle: title,
|
|
211
|
+
issueUrl: url,
|
|
212
|
+
teamId,
|
|
213
|
+
apiToken: "", // will be set below
|
|
214
|
+
};
|
|
215
|
+
apiToken = createSessionToken(sessionCtx);
|
|
216
|
+
sessionCtx.apiToken = apiToken;
|
|
217
|
+
}
|
|
218
|
+
// Build agent message — enriched with API docs if API is enabled
|
|
219
|
+
let message;
|
|
220
|
+
if (enableApi && apiToken) {
|
|
221
|
+
const { getBaseUrl } = await import("../api/base-url.js");
|
|
222
|
+
const apiBaseUrl = cfg.apiBaseUrl || getBaseUrl();
|
|
223
|
+
api.logger.info?.(`linear handler: ENRICHED message, apiBaseUrl=${apiBaseUrl}, tokenLen=${apiToken.length}`);
|
|
224
|
+
message = buildEnrichedMessage({
|
|
225
|
+
action,
|
|
226
|
+
id,
|
|
227
|
+
title,
|
|
228
|
+
url,
|
|
229
|
+
desc,
|
|
230
|
+
guidance,
|
|
231
|
+
prompt,
|
|
232
|
+
repo,
|
|
233
|
+
session,
|
|
234
|
+
context,
|
|
235
|
+
apiBaseUrl,
|
|
236
|
+
apiToken,
|
|
237
|
+
issueId,
|
|
238
|
+
teamId,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
api.logger.info?.(`linear handler: PLAIN message (no enrichment), enableApi=${enableApi}, apiToken=${apiToken ? "set" : "empty"}`);
|
|
243
|
+
message = buildMessage({
|
|
244
|
+
action,
|
|
245
|
+
id,
|
|
246
|
+
title,
|
|
247
|
+
url,
|
|
248
|
+
desc,
|
|
249
|
+
guidance,
|
|
250
|
+
prompt,
|
|
251
|
+
repo,
|
|
252
|
+
session,
|
|
253
|
+
context,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
// Run the agent and post response
|
|
257
|
+
try {
|
|
258
|
+
const call = await loadCallGateway(api);
|
|
259
|
+
await call({
|
|
260
|
+
method: "agent",
|
|
261
|
+
params: {
|
|
262
|
+
message,
|
|
263
|
+
agentId: agent,
|
|
264
|
+
sessionKey,
|
|
265
|
+
label,
|
|
266
|
+
idempotencyKey: idem,
|
|
267
|
+
deliver,
|
|
268
|
+
channel: cfg.notifyChannel,
|
|
269
|
+
to: cfg.notifyTo,
|
|
270
|
+
accountId: cfg.notifyAccountId,
|
|
271
|
+
},
|
|
272
|
+
expectFinal: true,
|
|
273
|
+
timeoutMs: AGENT_TIMEOUT_MS,
|
|
274
|
+
})
|
|
275
|
+
.then((result) => {
|
|
276
|
+
// Cleanup
|
|
277
|
+
if (session)
|
|
278
|
+
inflightSessions.delete(session);
|
|
279
|
+
if (apiToken)
|
|
280
|
+
revokeSessionToken(apiToken);
|
|
281
|
+
if (session)
|
|
282
|
+
cleanupSession(session);
|
|
283
|
+
const text = buildAgentResponse(result);
|
|
284
|
+
// Only post if agent hasn't already posted a response via API
|
|
285
|
+
if (session && hasPostedResponse(session)) {
|
|
286
|
+
clearResponseFlag(session);
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
if (!text || text === "Agent completed with no reply.")
|
|
290
|
+
return;
|
|
291
|
+
postActivity(api, cfg, session, { type: "response", body: text }).catch(() => { });
|
|
292
|
+
})
|
|
293
|
+
.catch((err) => {
|
|
294
|
+
if (session)
|
|
295
|
+
inflightSessions.delete(session);
|
|
296
|
+
if (apiToken)
|
|
297
|
+
revokeSessionToken(apiToken);
|
|
298
|
+
if (session)
|
|
299
|
+
cleanupSession(session);
|
|
300
|
+
if (session)
|
|
301
|
+
clearResponseFlag(session);
|
|
302
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
303
|
+
api.logger.warn?.(`linear agent run failed: ${msg}`);
|
|
304
|
+
postActivity(api, cfg, session, {
|
|
305
|
+
type: "error",
|
|
306
|
+
body: `Agent run failed: ${msg}`,
|
|
307
|
+
}).catch(() => { });
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
catch (err) {
|
|
311
|
+
if (session)
|
|
312
|
+
inflightSessions.delete(session);
|
|
313
|
+
if (apiToken)
|
|
314
|
+
revokeSessionToken(apiToken);
|
|
315
|
+
if (session)
|
|
316
|
+
cleanupSession(session);
|
|
317
|
+
if (session)
|
|
318
|
+
clearResponseFlag(session);
|
|
319
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
320
|
+
api.logger.warn?.(`linear agent run failed: ${msg}`);
|
|
321
|
+
postActivity(api, cfg, session, {
|
|
322
|
+
type: "error",
|
|
323
|
+
body: `Agent run failed: ${msg}`,
|
|
324
|
+
}).catch(() => { });
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
export async function postActivity(api, cfg, session, content, opts = {}) {
|
|
328
|
+
if (!session)
|
|
329
|
+
return;
|
|
330
|
+
const input = {
|
|
331
|
+
agentSessionId: session,
|
|
332
|
+
content,
|
|
333
|
+
};
|
|
334
|
+
if (opts.signal)
|
|
335
|
+
input.signal = opts.signal;
|
|
336
|
+
if (opts.signalMeta)
|
|
337
|
+
input.signalMetadata = opts.signalMeta;
|
|
338
|
+
if (opts.ephemeral)
|
|
339
|
+
input.ephemeral = true;
|
|
340
|
+
const result = await callLinear(api, cfg, "agentActivityCreate", {
|
|
341
|
+
query: ACTIVITY_MUTATION,
|
|
342
|
+
variables: { input },
|
|
343
|
+
});
|
|
344
|
+
if (!result.ok)
|
|
345
|
+
return;
|
|
346
|
+
const root = readObject(result.data.agentActivityCreate);
|
|
347
|
+
if (root && root.success === true)
|
|
348
|
+
return;
|
|
349
|
+
api.logger.warn?.("linear activity failed");
|
|
350
|
+
}
|
|
351
|
+
async function updateSessionExternalUrl(api, cfg, session, url, label) {
|
|
352
|
+
if (!session || !url)
|
|
353
|
+
return;
|
|
354
|
+
const input = { addedExternalUrls: [{ label, url }] };
|
|
355
|
+
const result = await callLinear(api, cfg, "agentSessionUpdate", {
|
|
356
|
+
query: SESSION_UPDATE_MUTATION,
|
|
357
|
+
variables: { id: session, input },
|
|
358
|
+
});
|
|
359
|
+
if (!result.ok)
|
|
360
|
+
return;
|
|
361
|
+
const root = readObject(result.data.agentSessionUpdate);
|
|
362
|
+
if (root && root.success === true)
|
|
363
|
+
return;
|
|
364
|
+
api.logger.warn?.("linear agentSessionUpdate failed");
|
|
365
|
+
}
|
|
366
|
+
function normalizePayload(input) {
|
|
367
|
+
const root = readObject(input);
|
|
368
|
+
if (!root)
|
|
369
|
+
return {};
|
|
370
|
+
const nested = readObject(root.data);
|
|
371
|
+
if (!nested)
|
|
372
|
+
return root;
|
|
373
|
+
const out = { ...root, ...nested };
|
|
374
|
+
const kind = readString(out.type) ?? "";
|
|
375
|
+
if (kind === "Comment" && !readObject(out.comment))
|
|
376
|
+
out.comment = nested;
|
|
377
|
+
if (kind === "Issue" && !readObject(out.issue))
|
|
378
|
+
out.issue = nested;
|
|
379
|
+
return out;
|
|
380
|
+
}
|
|
381
|
+
function logEvent(api, label, data) {
|
|
382
|
+
const action = readString(data.action) ?? "";
|
|
383
|
+
const name = action ? `${label} ${action}` : label;
|
|
384
|
+
api.logger.info?.(`linear ${name}`);
|
|
385
|
+
}
|
|
386
|
+
async function loadCallGateway(api) {
|
|
387
|
+
if (callRef.value)
|
|
388
|
+
return callRef.value;
|
|
389
|
+
if (api.callGateway && typeof api.callGateway === "function") {
|
|
390
|
+
callRef.value = api.callGateway;
|
|
391
|
+
return callRef.value;
|
|
392
|
+
}
|
|
393
|
+
try {
|
|
394
|
+
const argv1 = typeof process?.argv?.[1] === "string" ? process.argv[1] : "";
|
|
395
|
+
const distDir = argv1 ? path.dirname(argv1) : "";
|
|
396
|
+
if (distDir && fs.existsSync(distDir)) {
|
|
397
|
+
const files = fs
|
|
398
|
+
.readdirSync(distDir)
|
|
399
|
+
.filter((name) => name.startsWith("call-") && name.endsWith(".js"))
|
|
400
|
+
// Prefer call-D* over call--* because call--* imports entry.js
|
|
401
|
+
// which has a module-level side effect that calls runCli(), causing
|
|
402
|
+
// a second gateway start and a GatewayLockError crash.
|
|
403
|
+
.sort((a, b) => a.startsWith("call--") === b.startsWith("call--")
|
|
404
|
+
? 0
|
|
405
|
+
: a.startsWith("call--")
|
|
406
|
+
? 1
|
|
407
|
+
: -1);
|
|
408
|
+
for (const file of files) {
|
|
409
|
+
try {
|
|
410
|
+
const mod = await import(pathToFileURL(path.join(distDir, file)).href);
|
|
411
|
+
const fn = mod?.n ??
|
|
412
|
+
mod?.callGateway;
|
|
413
|
+
if (typeof fn === "function") {
|
|
414
|
+
const auth = api.config?.gateway?.auth ?? {};
|
|
415
|
+
const token = typeof auth.token === "string"
|
|
416
|
+
? auth.token.trim()
|
|
417
|
+
: undefined;
|
|
418
|
+
const password = typeof auth.password === "string"
|
|
419
|
+
? auth.password.trim()
|
|
420
|
+
: undefined;
|
|
421
|
+
const call = (opts) => fn({
|
|
422
|
+
...opts,
|
|
423
|
+
token: opts?.token ?? token,
|
|
424
|
+
password: opts?.password ?? password,
|
|
425
|
+
});
|
|
426
|
+
callRef.value = call;
|
|
427
|
+
return callRef.value;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
catch (err) {
|
|
431
|
+
api.logger?.debug?.(`linear: callGateway import failed (${file}): ${err instanceof Error ? err.message : String(err)}`);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
catch (err) {
|
|
437
|
+
api.logger?.warn?.(`linear: failed to locate gateway callGateway: ${err instanceof Error ? err.message : String(err)}`);
|
|
438
|
+
}
|
|
439
|
+
throw new Error("callGateway not available. Ensure the plugin is running inside an OpenClaw gateway process.");
|
|
440
|
+
}
|
|
441
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/webhook/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { OpenClawPluginApi, PluginConfig, IssueInfo } from "../types.js";
|
|
2
|
+
export declare function applyIssuePolicy(api: OpenClawPluginApi, cfg: PluginConfig, issueId: string): Promise<void>;
|
|
3
|
+
export declare function resolveIssueInfo(api: OpenClawPluginApi, cfg: PluginConfig, issueId: string): Promise<IssueInfo | null>;
|
|
4
|
+
export declare function resolveStartedState(api: OpenClawPluginApi, cfg: PluginConfig, teamId: string): Promise<string>;
|
|
5
|
+
export declare function resolveCompletedState(api: OpenClawPluginApi, cfg: PluginConfig, teamId: string): Promise<string>;
|
|
6
|
+
export declare function updateIssue(api: OpenClawPluginApi, cfg: PluginConfig, issueId: string, input: Record<string, unknown>, label: string): Promise<boolean>;
|
|
7
|
+
//# sourceMappingURL=issue-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-policy.d.ts","sourceRoot":"","sources":["../../../src/webhook/issue-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACV,MAAM,aAAa,CAAC;AAarB,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAoB3B;AAoCD,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAeD,wBAAsB,WAAW,CAC/B,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CAWlB"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { callLinear, resolveViewer } from "../linear-client.js";
|
|
2
|
+
import { ISSUE_INFO_QUERY, TEAM_STARTED_QUERY, TEAM_COMPLETED_QUERY, } from "../graphql/queries.js";
|
|
3
|
+
import { ISSUE_UPDATE_MUTATION } from "../graphql/mutations.js";
|
|
4
|
+
import { readArray, readNumber, readObject, readString, resolveFlag } from "../util.js";
|
|
5
|
+
const stateRef = {};
|
|
6
|
+
const completedStateRef = {};
|
|
7
|
+
export async function applyIssuePolicy(api, cfg, issueId) {
|
|
8
|
+
const start = resolveFlag(cfg.startOnCreate, true);
|
|
9
|
+
const delegate = resolveFlag(cfg.delegateOnCreate, true);
|
|
10
|
+
if (!issueId)
|
|
11
|
+
return;
|
|
12
|
+
if (!start && !delegate)
|
|
13
|
+
return;
|
|
14
|
+
const info = await resolveIssueInfo(api, cfg, issueId);
|
|
15
|
+
if (!info)
|
|
16
|
+
return;
|
|
17
|
+
if (start)
|
|
18
|
+
await ensureStarted(api, cfg, info);
|
|
19
|
+
if (delegate)
|
|
20
|
+
await ensureDelegate(api, cfg, info);
|
|
21
|
+
}
|
|
22
|
+
export async function resolveIssueInfo(api, cfg, issueId) {
|
|
23
|
+
if (!issueId)
|
|
24
|
+
return null;
|
|
25
|
+
const result = await callLinear(api, cfg, "issue", {
|
|
26
|
+
query: ISSUE_INFO_QUERY,
|
|
27
|
+
variables: { id: issueId },
|
|
28
|
+
});
|
|
29
|
+
if (!result.ok)
|
|
30
|
+
return null;
|
|
31
|
+
const issue = readObject(result.data.issue);
|
|
32
|
+
if (!issue)
|
|
33
|
+
return null;
|
|
34
|
+
const id = readString(issue.id) ?? "";
|
|
35
|
+
if (!id)
|
|
36
|
+
return null;
|
|
37
|
+
const team = readObject(issue.team);
|
|
38
|
+
const state = readObject(issue.state);
|
|
39
|
+
const delegateObj = readObject(issue.delegate);
|
|
40
|
+
return {
|
|
41
|
+
id,
|
|
42
|
+
teamId: readString(team?.id) ?? "",
|
|
43
|
+
stateType: readString(state?.type) ?? "",
|
|
44
|
+
delegateId: readString(delegateObj?.id) ?? "",
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async function ensureStarted(api, cfg, info) {
|
|
48
|
+
if (!info.teamId)
|
|
49
|
+
return;
|
|
50
|
+
if (info.stateType === "started" ||
|
|
51
|
+
info.stateType === "completed" ||
|
|
52
|
+
info.stateType === "canceled")
|
|
53
|
+
return;
|
|
54
|
+
const stateId = await resolveStartedState(api, cfg, info.teamId);
|
|
55
|
+
if (!stateId)
|
|
56
|
+
return;
|
|
57
|
+
await updateIssue(api, cfg, info.id, { stateId }, "issueUpdate(state)");
|
|
58
|
+
}
|
|
59
|
+
async function ensureDelegate(api, cfg, info) {
|
|
60
|
+
if (info.delegateId)
|
|
61
|
+
return;
|
|
62
|
+
const viewer = await resolveViewer(api, cfg);
|
|
63
|
+
if (!viewer)
|
|
64
|
+
return;
|
|
65
|
+
await updateIssue(api, cfg, info.id, { delegateId: viewer }, "issueUpdate(delegate)");
|
|
66
|
+
}
|
|
67
|
+
export async function resolveStartedState(api, cfg, teamId) {
|
|
68
|
+
if (!teamId)
|
|
69
|
+
return "";
|
|
70
|
+
const cached = stateRef[teamId];
|
|
71
|
+
if (cached)
|
|
72
|
+
return cached;
|
|
73
|
+
const result = await callLinear(api, cfg, "team(states)", {
|
|
74
|
+
query: TEAM_STARTED_QUERY,
|
|
75
|
+
variables: { id: teamId },
|
|
76
|
+
});
|
|
77
|
+
if (!result.ok)
|
|
78
|
+
return "";
|
|
79
|
+
const team = readObject(result.data.team);
|
|
80
|
+
const states = readObject(team?.states);
|
|
81
|
+
const nodes = readArray(states?.nodes);
|
|
82
|
+
const picked = pickLowestPosition(nodes);
|
|
83
|
+
if (!picked)
|
|
84
|
+
return "";
|
|
85
|
+
stateRef[teamId] = picked;
|
|
86
|
+
return picked;
|
|
87
|
+
}
|
|
88
|
+
export async function resolveCompletedState(api, cfg, teamId) {
|
|
89
|
+
if (!teamId)
|
|
90
|
+
return "";
|
|
91
|
+
const cached = completedStateRef[teamId];
|
|
92
|
+
if (cached)
|
|
93
|
+
return cached;
|
|
94
|
+
const result = await callLinear(api, cfg, "team(completed-states)", {
|
|
95
|
+
query: TEAM_COMPLETED_QUERY,
|
|
96
|
+
variables: { id: teamId },
|
|
97
|
+
});
|
|
98
|
+
if (!result.ok)
|
|
99
|
+
return "";
|
|
100
|
+
const team = readObject(result.data.team);
|
|
101
|
+
const states = readObject(team?.states);
|
|
102
|
+
const nodes = readArray(states?.nodes);
|
|
103
|
+
const picked = pickLowestPosition(nodes);
|
|
104
|
+
if (!picked)
|
|
105
|
+
return "";
|
|
106
|
+
completedStateRef[teamId] = picked;
|
|
107
|
+
return picked;
|
|
108
|
+
}
|
|
109
|
+
function pickLowestPosition(nodes) {
|
|
110
|
+
let best = null;
|
|
111
|
+
for (const node of nodes) {
|
|
112
|
+
const item = readObject(node);
|
|
113
|
+
if (!item)
|
|
114
|
+
continue;
|
|
115
|
+
const id = readString(item.id) ?? "";
|
|
116
|
+
const pos = readNumber(item.position) ?? Number.POSITIVE_INFINITY;
|
|
117
|
+
if (!id)
|
|
118
|
+
continue;
|
|
119
|
+
if (!best || pos < best.pos)
|
|
120
|
+
best = { id, pos };
|
|
121
|
+
}
|
|
122
|
+
return best?.id ?? "";
|
|
123
|
+
}
|
|
124
|
+
export async function updateIssue(api, cfg, issueId, input, label) {
|
|
125
|
+
if (!issueId)
|
|
126
|
+
return false;
|
|
127
|
+
const result = await callLinear(api, cfg, label, {
|
|
128
|
+
query: ISSUE_UPDATE_MUTATION,
|
|
129
|
+
variables: { id: issueId, input },
|
|
130
|
+
});
|
|
131
|
+
if (!result.ok)
|
|
132
|
+
return false;
|
|
133
|
+
const root = readObject(result.data.issueUpdate);
|
|
134
|
+
if (root && root.success === true)
|
|
135
|
+
return true;
|
|
136
|
+
api.logger.warn?.(`linear ${label} failed`);
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=issue-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-policy.js","sourceRoot":"","sources":["../../../src/webhook/issue-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface MessageParams {
|
|
2
|
+
action: string;
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
url: string;
|
|
6
|
+
desc: string;
|
|
7
|
+
guidance: string;
|
|
8
|
+
prompt: string;
|
|
9
|
+
repo: string;
|
|
10
|
+
session: string;
|
|
11
|
+
context: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function buildLabel(id: string, title: string): string;
|
|
14
|
+
export declare function buildMessage(params: MessageParams): string;
|
|
15
|
+
export declare function buildThought(action: string, id: string, title: string): string;
|
|
16
|
+
export declare function buildStopText(id: string, title: string): string;
|
|
17
|
+
export declare function resolveRepo(cfg: {
|
|
18
|
+
repoByProject?: Record<string, string>;
|
|
19
|
+
repoByTeam?: Record<string, string>;
|
|
20
|
+
defaultDir?: string;
|
|
21
|
+
}, team: string, proj: string): string;
|
|
22
|
+
export declare function resolveAction(data: Record<string, unknown>): string;
|
|
23
|
+
export declare function resolvePrompt(data: Record<string, unknown>): string;
|
|
24
|
+
export declare function resolveSignal(data: Record<string, unknown>): string;
|
|
25
|
+
export declare function resolveContext(data: Record<string, unknown>): string;
|
|
26
|
+
export declare function resolveKey(input: unknown): string;
|
|
27
|
+
export declare function resolveExternal(cfg: {
|
|
28
|
+
externalUrlBase?: string;
|
|
29
|
+
externalUrlLabel?: string;
|
|
30
|
+
}, session: string, issueId: string): {
|
|
31
|
+
url: string;
|
|
32
|
+
label: string;
|
|
33
|
+
} | null;
|
|
34
|
+
//# sourceMappingURL=message-builder.d.ts.map
|