openclaw-linear 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -1
- package/dist/event-router.d.ts +6 -0
- package/dist/event-router.d.ts.map +1 -1
- package/dist/event-router.js +216 -48
- package/dist/event-router.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -2
- package/dist/index.js.map +1 -1
- package/dist/webhook-handler.d.ts +1 -0
- package/dist/webhook-handler.d.ts.map +1 -1
- package/dist/webhook-handler.js +1 -0
- package/dist/webhook-handler.js.map +1 -1
- package/dist/work-queue.d.ts +6 -5
- package/dist/work-queue.d.ts.map +1 -1
- package/dist/work-queue.js +52 -93
- package/dist/work-queue.js.map +1 -1
- package/openclaw.plugin.json +5 -0
- package/package.json +1 -1
- package/skills/linear-queue/SKILL.md +7 -7
package/README.md
CHANGED
|
@@ -29,6 +29,13 @@ plugins:
|
|
|
29
29
|
teamIds: ["ENG", "OPS"] # Optional: filter to specific teams (empty = all)
|
|
30
30
|
eventFilter: ["Issue", "Comment"] # Optional: filter event types (empty = all)
|
|
31
31
|
debounceMs: 30000 # Optional: batch window in ms (default: 30000)
|
|
32
|
+
stateActions: # Optional: map state types/names to queue actions
|
|
33
|
+
backlog: "add"
|
|
34
|
+
unstarted: "add"
|
|
35
|
+
started: "ignore"
|
|
36
|
+
"In Review": "remove" # State names override type matches (case-insensitive)
|
|
37
|
+
completed: "remove"
|
|
38
|
+
canceled: "remove"
|
|
32
39
|
```
|
|
33
40
|
|
|
34
41
|
### Config Fields
|
|
@@ -40,6 +47,7 @@ plugins:
|
|
|
40
47
|
| `teamIds` | string[] | No | Team keys to scope webhook processing. Empty = all teams. |
|
|
41
48
|
| `eventFilter` | string[] | No | Event types to handle (`Issue`, `Comment`). Empty = all. |
|
|
42
49
|
| `debounceMs` | integer | No | Debounce window in milliseconds. Events arriving within this window are batched into a single message. Must be positive. Default: `30000` (30s). |
|
|
50
|
+
| `stateActions` | object | No | Maps Linear state types or names to queue actions (`"add"`, `"remove"`, `"ignore"`). Keys can be state types (`triage`, `backlog`, `unstarted`, `started`, `completed`, `canceled`) or custom state names (e.g. `"In Review"`). Name matches take precedence over type matches, both case-insensitive. See [State Actions](#state-actions) below. |
|
|
43
51
|
|
|
44
52
|
## Webhook Setup
|
|
45
53
|
|
|
@@ -65,9 +73,36 @@ plugins:
|
|
|
65
73
|
| Issue assigned to mapped user | `wake` | `issue.assigned` |
|
|
66
74
|
| Issue unassigned from mapped user | `notify` | `issue.unassigned` |
|
|
67
75
|
| Issue reassigned away from mapped user | `notify` | `issue.reassigned` |
|
|
76
|
+
| Issue state change → `add` action | `wake` | `issue.state_readded` |
|
|
77
|
+
| Issue state change → `remove` action | `notify` | `issue.state_removed` |
|
|
68
78
|
| @mention in comment (mapped user) | `wake` | `comment.mention` |
|
|
69
79
|
|
|
70
|
-
`wake` events are enqueued into the debouncer and dispatched to the agent. `notify` events
|
|
80
|
+
`wake` events are enqueued into the debouncer and dispatched to the agent. `notify` events write to the queue without waking.
|
|
81
|
+
|
|
82
|
+
## State Actions
|
|
83
|
+
|
|
84
|
+
When an issue's state changes, the plugin resolves what to do based on the `stateActions` config. This lets you control which state transitions re-add issues to the queue (e.g. bounced back from testing) vs. remove them (e.g. done/canceled) vs. are ignored (e.g. in progress).
|
|
85
|
+
|
|
86
|
+
**Resolution order:** state name match → state type match → built-in default.
|
|
87
|
+
|
|
88
|
+
Linear has 6 fixed state types. Custom state names (e.g. "In Review", "QA") are team-specific but always belong to one of these types. The `stateActions` config lets you match on either.
|
|
89
|
+
|
|
90
|
+
**Built-in defaults** (used when `stateActions` is not configured or a state isn't mapped):
|
|
91
|
+
|
|
92
|
+
| State Type | Default Action |
|
|
93
|
+
|---|---|
|
|
94
|
+
| `triage` | `ignore` |
|
|
95
|
+
| `backlog` | `add` |
|
|
96
|
+
| `unstarted` | `add` |
|
|
97
|
+
| `started` | `ignore` |
|
|
98
|
+
| `completed` | `remove` |
|
|
99
|
+
| `canceled` | `remove` |
|
|
100
|
+
|
|
101
|
+
**Actions:**
|
|
102
|
+
|
|
103
|
+
- `"add"` — re-add the issue to the queue as a ticket and wake the agent
|
|
104
|
+
- `"remove"` — remove the issue's ticket from the queue
|
|
105
|
+
- `"ignore"` — do nothing (default for unmapped states)
|
|
71
106
|
|
|
72
107
|
## How Dispatch Works
|
|
73
108
|
|
package/dist/event-router.d.ts
CHANGED
|
@@ -6,8 +6,11 @@ export type RouterAction = {
|
|
|
6
6
|
detail: string;
|
|
7
7
|
issueId: string;
|
|
8
8
|
issueLabel: string;
|
|
9
|
+
identifier: string;
|
|
10
|
+
issuePriority: number;
|
|
9
11
|
linearUserId: string;
|
|
10
12
|
};
|
|
13
|
+
export type StateAction = "add" | "remove" | "ignore";
|
|
11
14
|
export type EventRouterConfig = {
|
|
12
15
|
agentMapping: Record<string, string>;
|
|
13
16
|
logger: {
|
|
@@ -16,6 +19,9 @@ export type EventRouterConfig = {
|
|
|
16
19
|
};
|
|
17
20
|
eventFilter?: string[];
|
|
18
21
|
teamIds?: string[];
|
|
22
|
+
stateActions?: Record<string, string>;
|
|
19
23
|
};
|
|
24
|
+
export declare const DEFAULT_STATE_ACTIONS: Record<string, StateAction>;
|
|
25
|
+
export declare function resolveStateAction(config: EventRouterConfig, stateType: string | undefined, stateName: string | undefined): StateAction;
|
|
20
26
|
export declare function createEventRouter(config: EventRouterConfig): (event: LinearWebhookPayload) => RouterAction[];
|
|
21
27
|
//# sourceMappingURL=event-router.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-router.d.ts","sourceRoot":"","sources":["../src/event-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;QAChC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;KAClC,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"event-router.d.ts","sourceRoot":"","sources":["../src/event-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEtD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;QAChC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;KAClC,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAO7D,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,WAAW,CA+Bb;AAmTD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,IACnC,OAAO,oBAAoB,KAAG,YAAY,EAAE,CAmCnE"}
|
package/dist/event-router.js
CHANGED
|
@@ -1,3 +1,39 @@
|
|
|
1
|
+
export const DEFAULT_STATE_ACTIONS = {
|
|
2
|
+
triage: "ignore",
|
|
3
|
+
backlog: "add",
|
|
4
|
+
unstarted: "add",
|
|
5
|
+
started: "ignore",
|
|
6
|
+
completed: "remove",
|
|
7
|
+
canceled: "remove",
|
|
8
|
+
};
|
|
9
|
+
export function resolveStateAction(config, stateType, stateName) {
|
|
10
|
+
if (config.stateActions) {
|
|
11
|
+
// Build lowercase lookup from config
|
|
12
|
+
const lookup = new Map();
|
|
13
|
+
for (const [key, value] of Object.entries(config.stateActions)) {
|
|
14
|
+
lookup.set(key.toLowerCase(), value);
|
|
15
|
+
}
|
|
16
|
+
// Check state name first (case-insensitive)
|
|
17
|
+
if (stateName) {
|
|
18
|
+
const byName = lookup.get(stateName.toLowerCase());
|
|
19
|
+
if (byName === "add" || byName === "remove" || byName === "ignore") {
|
|
20
|
+
return byName;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// Check state type
|
|
24
|
+
if (stateType) {
|
|
25
|
+
const byType = lookup.get(stateType.toLowerCase());
|
|
26
|
+
if (byType === "add" || byType === "remove" || byType === "ignore") {
|
|
27
|
+
return byType;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Fall back to built-in defaults
|
|
32
|
+
if (stateType && stateType in DEFAULT_STATE_ACTIONS) {
|
|
33
|
+
return DEFAULT_STATE_ACTIONS[stateType];
|
|
34
|
+
}
|
|
35
|
+
return "ignore";
|
|
36
|
+
}
|
|
1
37
|
/**
|
|
2
38
|
* Extract mention user IDs from ProseMirror bodyData JSON.
|
|
3
39
|
* Traverses the document tree looking for "mention" nodes with an `attrs.id`.
|
|
@@ -44,64 +80,187 @@ function resolveIssueLabel(data) {
|
|
|
44
80
|
return title ? `${label}: ${title}` : label;
|
|
45
81
|
}
|
|
46
82
|
function handleIssueUpdate(event, config) {
|
|
47
|
-
const
|
|
48
|
-
if (!changes?.assigneeId)
|
|
49
|
-
return [];
|
|
83
|
+
const updatedFrom = event.updatedFrom ?? {};
|
|
50
84
|
const actions = [];
|
|
51
|
-
const { from: oldAssignee, to: newAssignee } = changes.assigneeId;
|
|
52
85
|
const issueId = String(event.data.id ?? "unknown");
|
|
53
86
|
const issueLabel = resolveIssueLabel(event.data);
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
87
|
+
const identifier = event.data.identifier ?? issueId;
|
|
88
|
+
const issuePriority = event.data.priority ?? 0;
|
|
89
|
+
// --- Assignee changes ---
|
|
90
|
+
if ("assigneeId" in updatedFrom) {
|
|
91
|
+
const oldAssignee = updatedFrom.assigneeId;
|
|
92
|
+
const newAssignee = event.data.assigneeId;
|
|
93
|
+
if (newAssignee) {
|
|
94
|
+
const agentId = config.agentMapping[newAssignee];
|
|
95
|
+
if (agentId) {
|
|
96
|
+
actions.push({
|
|
97
|
+
type: "wake",
|
|
98
|
+
agentId,
|
|
99
|
+
event: "issue.assigned",
|
|
100
|
+
detail: `Assigned to issue ${issueLabel}`,
|
|
101
|
+
issueId,
|
|
102
|
+
issueLabel,
|
|
103
|
+
identifier,
|
|
104
|
+
issuePriority,
|
|
105
|
+
linearUserId: newAssignee,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
config.logger.info(`Unmapped Linear user ${newAssignee} assigned to ${issueId}`);
|
|
110
|
+
}
|
|
66
111
|
}
|
|
67
|
-
|
|
68
|
-
|
|
112
|
+
if (oldAssignee && !newAssignee) {
|
|
113
|
+
const agentId = config.agentMapping[oldAssignee];
|
|
114
|
+
if (agentId) {
|
|
115
|
+
actions.push({
|
|
116
|
+
type: "notify",
|
|
117
|
+
agentId,
|
|
118
|
+
event: "issue.unassigned",
|
|
119
|
+
detail: `Unassigned from issue ${issueLabel}`,
|
|
120
|
+
issueId,
|
|
121
|
+
issueLabel,
|
|
122
|
+
identifier,
|
|
123
|
+
issuePriority,
|
|
124
|
+
linearUserId: oldAssignee,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
config.logger.info(`Unmapped Linear user ${oldAssignee} unassigned from ${issueId}`);
|
|
129
|
+
}
|
|
69
130
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
131
|
+
// Reassignment: both old and new assignee present — notify old assignee
|
|
132
|
+
if (oldAssignee && newAssignee) {
|
|
133
|
+
const agentId = config.agentMapping[oldAssignee];
|
|
134
|
+
if (agentId) {
|
|
135
|
+
actions.push({
|
|
136
|
+
type: "notify",
|
|
137
|
+
agentId,
|
|
138
|
+
event: "issue.reassigned",
|
|
139
|
+
detail: `Reassigned away from issue ${issueLabel}`,
|
|
140
|
+
issueId,
|
|
141
|
+
issueLabel,
|
|
142
|
+
identifier,
|
|
143
|
+
issuePriority,
|
|
144
|
+
linearUserId: oldAssignee,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
83
147
|
}
|
|
84
|
-
|
|
85
|
-
|
|
148
|
+
}
|
|
149
|
+
// --- State changes (configurable per state type/name) ---
|
|
150
|
+
if ("stateId" in updatedFrom) {
|
|
151
|
+
const state = event.data.state;
|
|
152
|
+
const stateType = state?.type;
|
|
153
|
+
const stateName = state?.name;
|
|
154
|
+
const action = resolveStateAction(config, stateType, stateName);
|
|
155
|
+
if (action === "remove" || action === "add") {
|
|
156
|
+
const assigneeId = event.data.assigneeId;
|
|
157
|
+
if (assigneeId) {
|
|
158
|
+
const agentId = config.agentMapping[assigneeId];
|
|
159
|
+
if (agentId) {
|
|
160
|
+
if (action === "remove") {
|
|
161
|
+
actions.push({
|
|
162
|
+
type: "notify",
|
|
163
|
+
agentId,
|
|
164
|
+
event: "issue.state_removed",
|
|
165
|
+
detail: `Issue ${issueLabel} moved to ${stateName ?? stateType ?? "unknown"}`,
|
|
166
|
+
issueId,
|
|
167
|
+
issueLabel,
|
|
168
|
+
identifier,
|
|
169
|
+
issuePriority,
|
|
170
|
+
linearUserId: assigneeId,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
actions.push({
|
|
175
|
+
type: "wake",
|
|
176
|
+
agentId,
|
|
177
|
+
event: "issue.state_readded",
|
|
178
|
+
detail: `Issue ${issueLabel} moved to ${stateName ?? stateType ?? "unknown"}`,
|
|
179
|
+
issueId,
|
|
180
|
+
issueLabel,
|
|
181
|
+
identifier,
|
|
182
|
+
issuePriority,
|
|
183
|
+
linearUserId: assigneeId,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
86
188
|
}
|
|
87
189
|
}
|
|
88
|
-
//
|
|
89
|
-
if (
|
|
90
|
-
const
|
|
91
|
-
if (
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
190
|
+
// --- Priority changes ---
|
|
191
|
+
if ("priority" in updatedFrom) {
|
|
192
|
+
const assigneeId = event.data.assigneeId;
|
|
193
|
+
if (assigneeId) {
|
|
194
|
+
const agentId = config.agentMapping[assigneeId];
|
|
195
|
+
if (agentId) {
|
|
196
|
+
actions.push({
|
|
197
|
+
type: "notify",
|
|
198
|
+
agentId,
|
|
199
|
+
event: "issue.priority_changed",
|
|
200
|
+
detail: `Priority changed on issue ${issueLabel}`,
|
|
201
|
+
issueId,
|
|
202
|
+
issueLabel,
|
|
203
|
+
identifier,
|
|
204
|
+
issuePriority,
|
|
205
|
+
linearUserId: assigneeId,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
101
208
|
}
|
|
102
209
|
}
|
|
103
210
|
return actions;
|
|
104
211
|
}
|
|
212
|
+
function handleIssueCreate(event, config) {
|
|
213
|
+
const assigneeId = event.data.assigneeId;
|
|
214
|
+
if (!assigneeId)
|
|
215
|
+
return [];
|
|
216
|
+
const agentId = config.agentMapping[assigneeId];
|
|
217
|
+
if (!agentId) {
|
|
218
|
+
config.logger.info(`Unmapped Linear user ${assigneeId} assigned to ${String(event.data.id ?? "unknown")}`);
|
|
219
|
+
return [];
|
|
220
|
+
}
|
|
221
|
+
const issueId = String(event.data.id ?? "unknown");
|
|
222
|
+
const issueLabel = resolveIssueLabel(event.data);
|
|
223
|
+
const identifier = event.data.identifier ?? issueId;
|
|
224
|
+
const issuePriority = event.data.priority ?? 0;
|
|
225
|
+
return [
|
|
226
|
+
{
|
|
227
|
+
type: "wake",
|
|
228
|
+
agentId,
|
|
229
|
+
event: "issue.assigned",
|
|
230
|
+
detail: `Assigned to issue ${issueLabel}`,
|
|
231
|
+
issueId,
|
|
232
|
+
issueLabel,
|
|
233
|
+
identifier,
|
|
234
|
+
issuePriority,
|
|
235
|
+
linearUserId: assigneeId,
|
|
236
|
+
},
|
|
237
|
+
];
|
|
238
|
+
}
|
|
239
|
+
function handleIssueRemove(event, config) {
|
|
240
|
+
const assigneeId = event.data.assigneeId;
|
|
241
|
+
if (!assigneeId)
|
|
242
|
+
return [];
|
|
243
|
+
const agentId = config.agentMapping[assigneeId];
|
|
244
|
+
if (!agentId)
|
|
245
|
+
return [];
|
|
246
|
+
const issueId = String(event.data.id ?? "unknown");
|
|
247
|
+
const issueLabel = resolveIssueLabel(event.data);
|
|
248
|
+
const identifier = event.data.identifier ?? issueId;
|
|
249
|
+
const issuePriority = event.data.priority ?? 0;
|
|
250
|
+
return [
|
|
251
|
+
{
|
|
252
|
+
type: "notify",
|
|
253
|
+
agentId,
|
|
254
|
+
event: "issue.removed",
|
|
255
|
+
detail: `Issue ${issueLabel} removed`,
|
|
256
|
+
issueId,
|
|
257
|
+
issueLabel,
|
|
258
|
+
identifier,
|
|
259
|
+
issuePriority,
|
|
260
|
+
linearUserId: assigneeId,
|
|
261
|
+
},
|
|
262
|
+
];
|
|
263
|
+
}
|
|
105
264
|
function handleComment(event, config) {
|
|
106
265
|
const body = event.data.body;
|
|
107
266
|
if (!body)
|
|
@@ -114,6 +273,8 @@ function handleComment(event, config) {
|
|
|
114
273
|
const issueLabel = issueRef
|
|
115
274
|
? resolveIssueLabel(issueRef)
|
|
116
275
|
: issueId;
|
|
276
|
+
const identifier = issueRef?.identifier ?? issueId;
|
|
277
|
+
const issuePriority = issueRef?.priority ?? 0;
|
|
117
278
|
for (const userId of mentionedIds) {
|
|
118
279
|
const agentId = config.agentMapping[userId];
|
|
119
280
|
if (agentId) {
|
|
@@ -124,6 +285,8 @@ function handleComment(event, config) {
|
|
|
124
285
|
detail: `Mentioned in comment on issue ${issueLabel}\n\n> ${body}`,
|
|
125
286
|
issueId,
|
|
126
287
|
issueLabel,
|
|
288
|
+
identifier,
|
|
289
|
+
issuePriority,
|
|
127
290
|
linearUserId: userId,
|
|
128
291
|
});
|
|
129
292
|
}
|
|
@@ -149,8 +312,13 @@ export function createEventRouter(config) {
|
|
|
149
312
|
if (!match && (teamId || teamKey))
|
|
150
313
|
return [];
|
|
151
314
|
}
|
|
152
|
-
if (event.type === "Issue"
|
|
153
|
-
|
|
315
|
+
if (event.type === "Issue") {
|
|
316
|
+
if (event.action === "update")
|
|
317
|
+
return handleIssueUpdate(event, config);
|
|
318
|
+
if (event.action === "create")
|
|
319
|
+
return handleIssueCreate(event, config);
|
|
320
|
+
if (event.action === "remove")
|
|
321
|
+
return handleIssueRemove(event, config);
|
|
154
322
|
}
|
|
155
323
|
if (event.type === "Comment" &&
|
|
156
324
|
(event.action === "create" || event.action === "update")) {
|
package/dist/event-router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-router.js","sourceRoot":"","sources":["../src/event-router.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-router.js","sourceRoot":"","sources":["../src/event-router.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAkBzE,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAYzE;AA0FD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAmGrD;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAStE;AAED,QAAA,MAAM,MAAM;;;;;;CAYX,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -8,6 +8,10 @@ const EVENT_LABELS = {
|
|
|
8
8
|
"issue.assigned": "Assigned",
|
|
9
9
|
"issue.unassigned": "Unassigned",
|
|
10
10
|
"issue.reassigned": "Reassigned",
|
|
11
|
+
"issue.removed": "Removed",
|
|
12
|
+
"issue.state_removed": "State Removed",
|
|
13
|
+
"issue.state_readded": "State Re-added",
|
|
14
|
+
"issue.priority_changed": "Priority Changed",
|
|
11
15
|
"comment.mention": "Mentioned",
|
|
12
16
|
};
|
|
13
17
|
export function formatConsolidatedMessage(actions) {
|
|
@@ -47,8 +51,13 @@ async function dispatchConsolidatedActions(actions, api, queue) {
|
|
|
47
51
|
},
|
|
48
52
|
});
|
|
49
53
|
// Write to queue deterministically — no LLM involved
|
|
50
|
-
const
|
|
51
|
-
|
|
54
|
+
const entries = actions.map((a) => ({
|
|
55
|
+
id: a.identifier,
|
|
56
|
+
event: a.event,
|
|
57
|
+
summary: a.issueLabel,
|
|
58
|
+
issuePriority: a.issuePriority,
|
|
59
|
+
}));
|
|
60
|
+
const added = await queue.enqueue(entries);
|
|
52
61
|
if (added === 0) {
|
|
53
62
|
api.logger.info("[linear] All notifications deduped — skipping agent dispatch");
|
|
54
63
|
return;
|
|
@@ -107,11 +116,13 @@ export function activate(api) {
|
|
|
107
116
|
const queuePath = api.resolvePath("queue/inbox.jsonl");
|
|
108
117
|
const queue = new InboxQueue(queuePath);
|
|
109
118
|
api.registerTool(createQueueTool(queue));
|
|
119
|
+
const stateActions = api.pluginConfig?.["stateActions"] ?? undefined;
|
|
110
120
|
const route = createEventRouter({
|
|
111
121
|
agentMapping,
|
|
112
122
|
logger: api.logger,
|
|
113
123
|
eventFilter: eventFilter.length ? eventFilter : undefined,
|
|
114
124
|
teamIds: teamIds.length ? teamIds : undefined,
|
|
125
|
+
stateActions,
|
|
115
126
|
});
|
|
116
127
|
const debouncer = api.runtime.channel.debounce.createInboundDebouncer({
|
|
117
128
|
debounceMs,
|
|
@@ -136,6 +147,18 @@ export function activate(api) {
|
|
|
136
147
|
activeDebouncerKeys.add(action.agentId);
|
|
137
148
|
debouncer.enqueue(action);
|
|
138
149
|
}
|
|
150
|
+
if (action.type === "notify") {
|
|
151
|
+
queue
|
|
152
|
+
.enqueue([
|
|
153
|
+
{
|
|
154
|
+
id: action.identifier,
|
|
155
|
+
event: action.event,
|
|
156
|
+
summary: action.issueLabel,
|
|
157
|
+
issuePriority: action.issuePriority,
|
|
158
|
+
},
|
|
159
|
+
])
|
|
160
|
+
.catch((err) => api.logger.error(`[linear] Notify enqueue error: ${err instanceof Error ? err.message : String(err)}`));
|
|
161
|
+
}
|
|
139
162
|
}
|
|
140
163
|
},
|
|
141
164
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAqB,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-handler.d.ts","sourceRoot":"","sources":["../src/webhook-handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;QAChC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;KAClC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;CACjD,CAAC;AAgCF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,IAqB7C,KAAK,eAAe,EAAE,KAAK,cAAc,KAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"webhook-handler.d.ts","sourceRoot":"","sources":["../src/webhook-handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;QAChC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;KAClC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;CACjD,CAAC;AAgCF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,IAqB7C,KAAK,eAAe,EAAE,KAAK,cAAc,KAAG,OAAO,CAAC,IAAI,CAAC,CA0ExE"}
|
package/dist/webhook-handler.js
CHANGED
|
@@ -93,6 +93,7 @@ export function createWebhookHandler(deps) {
|
|
|
93
93
|
action: String(payload.action ?? ""),
|
|
94
94
|
type: String(payload.type ?? ""),
|
|
95
95
|
data: payload.data ?? {},
|
|
96
|
+
updatedFrom: payload.updatedFrom ?? undefined,
|
|
96
97
|
createdAt: String(payload.createdAt ?? ""),
|
|
97
98
|
};
|
|
98
99
|
deps.logger.info(`Linear webhook: ${event.action} ${event.type} (${String(event.data.id ?? "unknown")})`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-handler.js","sourceRoot":"","sources":["../src/webhook-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"webhook-handler.js","sourceRoot":"","sources":["../src/webhook-handler.ts"],"names":[],"mappings":"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"}
|
package/dist/work-queue.d.ts
CHANGED
|
@@ -6,12 +6,13 @@ export interface QueueItem {
|
|
|
6
6
|
priority: number;
|
|
7
7
|
addedAt: string;
|
|
8
8
|
}
|
|
9
|
-
export declare const
|
|
10
|
-
export
|
|
9
|
+
export declare const QUEUE_EVENT: Record<string, string>;
|
|
10
|
+
export interface EnqueueEntry {
|
|
11
11
|
id: string;
|
|
12
12
|
event: string;
|
|
13
13
|
summary: string;
|
|
14
|
-
|
|
14
|
+
issuePriority: number;
|
|
15
|
+
}
|
|
15
16
|
export declare class Mutex {
|
|
16
17
|
private _lock;
|
|
17
18
|
acquire(): Promise<() => void>;
|
|
@@ -20,8 +21,8 @@ export declare class InboxQueue {
|
|
|
20
21
|
private readonly path;
|
|
21
22
|
private readonly mutex;
|
|
22
23
|
constructor(path: string);
|
|
23
|
-
/**
|
|
24
|
-
enqueue(
|
|
24
|
+
/** Dedup and append entries to the queue. Returns count added. */
|
|
25
|
+
enqueue(entries: EnqueueEntry[]): Promise<number>;
|
|
25
26
|
/** Return all items sorted by priority (lowest number first). Non-destructive. */
|
|
26
27
|
peek(): Promise<QueueItem[]>;
|
|
27
28
|
/** Remove and return the highest-priority item, or null if empty. */
|
package/dist/work-queue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"work-queue.d.ts","sourceRoot":"","sources":["../src/work-queue.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"work-queue.d.ts","sourceRoot":"","sources":["../src/work-queue.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAI9C,CAAC;AASF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AASD,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAoC;IAE3C,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;CAUrC;AAyDD,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;gBAER,IAAI,EAAE,MAAM;IAEzC,kEAAkE;IAC5D,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAiFvD,kFAAkF;IAC5E,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAUlC,qEAAqE;IAC/D,GAAG,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAetC,sDAAsD;IAChD,KAAK,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;CAapC"}
|
package/dist/work-queue.js
CHANGED
|
@@ -1,90 +1,19 @@
|
|
|
1
1
|
import { readFileSync, existsSync, mkdirSync, openSync, writeSync, fsyncSync, closeSync, unlinkSync, renameSync, appendFileSync, } from "node:fs";
|
|
2
2
|
import { dirname } from "node:path";
|
|
3
|
-
export const
|
|
4
|
-
"issue.assigned":
|
|
5
|
-
"issue.
|
|
6
|
-
"comment.mention":
|
|
7
|
-
"issue.unassigned": 4,
|
|
3
|
+
export const QUEUE_EVENT = {
|
|
4
|
+
"issue.assigned": "ticket",
|
|
5
|
+
"issue.state_readded": "ticket",
|
|
6
|
+
"comment.mention": "mention",
|
|
8
7
|
};
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
// Multi-notification format: "N. [Label] TEAM-123: summary"
|
|
21
|
-
const multiMatch = line.match(/^\d+\.\s+\[(\w+(?:\s+\w+)?)\]\s+([A-Z]+-\d+):\s*(.+)$/);
|
|
22
|
-
if (multiMatch) {
|
|
23
|
-
const [, label, id, summary] = multiMatch;
|
|
24
|
-
return { id, event: labelToEvent(label), summary: summary.trim() };
|
|
25
|
-
}
|
|
26
|
-
// Single: "Assigned to issue TEAM-123: summary"
|
|
27
|
-
const assignedMatch = line.match(/^Assigned to issue ([A-Z]+-\d+):\s*(.+)$/);
|
|
28
|
-
if (assignedMatch) {
|
|
29
|
-
return {
|
|
30
|
-
id: assignedMatch[1],
|
|
31
|
-
event: "issue.assigned",
|
|
32
|
-
summary: assignedMatch[2].trim(),
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
// Single: "Unassigned from issue TEAM-123: summary"
|
|
36
|
-
const unassignedMatch = line.match(/^Unassigned from issue ([A-Z]+-\d+):\s*(.+)$/);
|
|
37
|
-
if (unassignedMatch) {
|
|
38
|
-
return {
|
|
39
|
-
id: unassignedMatch[1],
|
|
40
|
-
event: "issue.unassigned",
|
|
41
|
-
summary: unassignedMatch[2].trim(),
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
// Single: "Reassigned away from issue TEAM-123: summary"
|
|
45
|
-
const reassignedMatch = line.match(/^Reassigned away from issue ([A-Z]+-\d+):\s*(.+)$/);
|
|
46
|
-
if (reassignedMatch) {
|
|
47
|
-
return {
|
|
48
|
-
id: reassignedMatch[1],
|
|
49
|
-
event: "issue.reassigned",
|
|
50
|
-
summary: reassignedMatch[2].trim(),
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
// Single: "Mentioned in comment on issue TEAM-123: summary\n\n> body"
|
|
54
|
-
const mentionedMatch = line.match(/^Mentioned in comment on issue ([A-Z]+-\d+):\s*(.+?)(?:\n|$)/);
|
|
55
|
-
if (mentionedMatch) {
|
|
56
|
-
return {
|
|
57
|
-
id: mentionedMatch[1],
|
|
58
|
-
event: "comment.mention",
|
|
59
|
-
summary: mentionedMatch[2].trim(),
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
function labelToEvent(label) {
|
|
65
|
-
const map = {
|
|
66
|
-
Assigned: "issue.assigned",
|
|
67
|
-
Unassigned: "issue.unassigned",
|
|
68
|
-
Reassigned: "issue.reassigned",
|
|
69
|
-
Mentioned: "comment.mention",
|
|
70
|
-
};
|
|
71
|
-
return map[label] ?? `unknown.${label.toLowerCase()}`;
|
|
72
|
-
}
|
|
73
|
-
export function parseNotificationMessage(message) {
|
|
74
|
-
const results = [];
|
|
75
|
-
if (message.startsWith("You have ")) {
|
|
76
|
-
for (const line of message.split("\n").filter((l) => l.trim())) {
|
|
77
|
-
const parsed = parseNotificationLine(line.trim());
|
|
78
|
-
if (parsed)
|
|
79
|
-
results.push(parsed);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
const parsed = parseNotificationLine(message.trim());
|
|
84
|
-
if (parsed)
|
|
85
|
-
results.push(parsed);
|
|
86
|
-
}
|
|
87
|
-
return results;
|
|
8
|
+
const REMOVAL_EVENTS = new Set([
|
|
9
|
+
"issue.unassigned",
|
|
10
|
+
"issue.reassigned",
|
|
11
|
+
"issue.removed",
|
|
12
|
+
"issue.state_removed",
|
|
13
|
+
]);
|
|
14
|
+
/** Map Linear priority (0=none) so no-priority sorts last. */
|
|
15
|
+
function mapPriority(linearPriority) {
|
|
16
|
+
return linearPriority === 0 ? 5 : linearPriority;
|
|
88
17
|
}
|
|
89
18
|
// --- Mutex ---
|
|
90
19
|
export class Mutex {
|
|
@@ -164,27 +93,57 @@ export class InboxQueue {
|
|
|
164
93
|
constructor(path) {
|
|
165
94
|
this.path = path;
|
|
166
95
|
}
|
|
167
|
-
/**
|
|
168
|
-
async enqueue(
|
|
169
|
-
|
|
170
|
-
if (parsed.length === 0)
|
|
96
|
+
/** Dedup and append entries to the queue. Returns count added. */
|
|
97
|
+
async enqueue(entries) {
|
|
98
|
+
if (entries.length === 0)
|
|
171
99
|
return 0;
|
|
172
100
|
const release = await this.mutex.acquire();
|
|
173
101
|
try {
|
|
174
102
|
const existing = readJsonl(this.path);
|
|
175
|
-
|
|
103
|
+
// Handle removal events — remove existing ticket items for affected issues
|
|
104
|
+
const removalIds = new Set(entries
|
|
105
|
+
.filter((e) => REMOVAL_EVENTS.has(e.event))
|
|
106
|
+
.map((e) => e.id));
|
|
107
|
+
// Handle priority updates — update matching items' priority in-place
|
|
108
|
+
const priorityUpdates = new Map(entries
|
|
109
|
+
.filter((e) => e.event === "issue.priority_changed")
|
|
110
|
+
.map((e) => [e.id, mapPriority(e.issuePriority)]));
|
|
111
|
+
let filtered = existing;
|
|
112
|
+
let dirty = false;
|
|
113
|
+
if (removalIds.size > 0) {
|
|
114
|
+
filtered = existing.filter((item) => !(removalIds.has(item.issueId) && item.event === "ticket"));
|
|
115
|
+
if (filtered.length !== existing.length)
|
|
116
|
+
dirty = true;
|
|
117
|
+
}
|
|
118
|
+
if (priorityUpdates.size > 0) {
|
|
119
|
+
for (const item of filtered) {
|
|
120
|
+
const newPriority = priorityUpdates.get(item.issueId);
|
|
121
|
+
if (newPriority !== undefined && item.priority !== newPriority) {
|
|
122
|
+
item.priority = newPriority;
|
|
123
|
+
dirty = true;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (dirty) {
|
|
128
|
+
writeJsonl(this.path, filtered);
|
|
129
|
+
}
|
|
130
|
+
// Build dedup set from remaining items using mapped queue events
|
|
131
|
+
const existingKeys = new Set(filtered.map((item) => `${item.issueId}:${item.event}`));
|
|
176
132
|
const newItems = [];
|
|
177
133
|
const now = new Date().toISOString();
|
|
178
|
-
for (const entry of
|
|
179
|
-
const
|
|
134
|
+
for (const entry of entries) {
|
|
135
|
+
const queueEvent = QUEUE_EVENT[entry.event];
|
|
136
|
+
if (!queueEvent)
|
|
137
|
+
continue; // skip unmapped events
|
|
138
|
+
const dedupKey = `${entry.id}:${queueEvent}`;
|
|
180
139
|
if (existingKeys.has(dedupKey))
|
|
181
140
|
continue;
|
|
182
141
|
newItems.push({
|
|
183
142
|
id: entry.id,
|
|
184
143
|
issueId: entry.id,
|
|
185
|
-
event:
|
|
144
|
+
event: queueEvent,
|
|
186
145
|
summary: entry.summary,
|
|
187
|
-
priority:
|
|
146
|
+
priority: mapPriority(entry.issuePriority),
|
|
188
147
|
addedAt: now,
|
|
189
148
|
});
|
|
190
149
|
existingKeys.add(dedupKey);
|
package/dist/work-queue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"work-queue.js","sourceRoot":"","sources":["../src/work-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,UAAU,EACV,SAAS,EACT,QAAQ,EACR,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAU,EACV,UAAU,EACV,cAAc,GACf,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"work-queue.js","sourceRoot":"","sources":["../src/work-queue.ts"],"names":[],"mappings":"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"}
|
package/openclaw.plugin.json
CHANGED
|
@@ -30,6 +30,11 @@
|
|
|
30
30
|
"debounceMs": {
|
|
31
31
|
"type": "integer",
|
|
32
32
|
"description": "Debounce window in milliseconds for batching webhook events before dispatch (default: 30000)"
|
|
33
|
+
},
|
|
34
|
+
"stateActions": {
|
|
35
|
+
"type": "object",
|
|
36
|
+
"additionalProperties": { "type": "string", "enum": ["add", "remove", "ignore"] },
|
|
37
|
+
"description": "Map Linear state types or names to queue actions. Keys can be state types (triage, backlog, unstarted, started, completed, canceled) or state names (e.g. \"In Review\", \"Todo\"). Name matches take precedence over type matches (case-insensitive). Actions: add (re-add to queue), remove (remove from queue), ignore (do nothing). Defaults: backlog/unstarted=add, completed/canceled=remove, others=ignore."
|
|
33
38
|
}
|
|
34
39
|
},
|
|
35
40
|
"required": ["webhookSecret"]
|
package/package.json
CHANGED
|
@@ -22,7 +22,7 @@ You have a `linear_queue` tool for managing Linear notifications that need your
|
|
|
22
22
|
{
|
|
23
23
|
"id": "TEAM-123",
|
|
24
24
|
"issueId": "TEAM-123",
|
|
25
|
-
"event": "
|
|
25
|
+
"event": "ticket",
|
|
26
26
|
"summary": "Issue title or comment text",
|
|
27
27
|
"priority": 1,
|
|
28
28
|
"addedAt": "ISO timestamp"
|
|
@@ -31,12 +31,12 @@ You have a `linear_queue` tool for managing Linear notifications that need your
|
|
|
31
31
|
|
|
32
32
|
## Event types and expected actions
|
|
33
33
|
|
|
34
|
-
| Event |
|
|
35
|
-
|
|
36
|
-
| `
|
|
37
|
-
| `
|
|
38
|
-
|
|
39
|
-
|
|
34
|
+
| Event | Action |
|
|
35
|
+
|---|---|
|
|
36
|
+
| `ticket` | You have a ticket to work on. Read issue details and begin work. |
|
|
37
|
+
| `mention` | You were mentioned in a comment. Read and respond. |
|
|
38
|
+
|
|
39
|
+
Priority is determined by the Linear issue's priority (1=Urgent, 2=High, 3=Medium, 4=Low, 5=None). Higher-priority items are popped first.
|
|
40
40
|
|
|
41
41
|
## Processing workflow
|
|
42
42
|
|