workweave 0.2.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.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +254 -0
  3. package/dist/ai/local.d.ts +9 -0
  4. package/dist/ai/local.d.ts.map +1 -0
  5. package/dist/ai/local.js +148 -0
  6. package/dist/ai/local.js.map +1 -0
  7. package/dist/ai/provider.d.ts +43 -0
  8. package/dist/ai/provider.d.ts.map +1 -0
  9. package/dist/ai/provider.js +191 -0
  10. package/dist/ai/provider.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +193 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/connectors/github.d.ts +13 -0
  16. package/dist/connectors/github.d.ts.map +1 -0
  17. package/dist/connectors/github.js +212 -0
  18. package/dist/connectors/github.js.map +1 -0
  19. package/dist/connectors/linear.d.ts +12 -0
  20. package/dist/connectors/linear.d.ts.map +1 -0
  21. package/dist/connectors/linear.js +160 -0
  22. package/dist/connectors/linear.js.map +1 -0
  23. package/dist/connectors/registry.d.ts +10 -0
  24. package/dist/connectors/registry.d.ts.map +1 -0
  25. package/dist/connectors/registry.js +36 -0
  26. package/dist/connectors/registry.js.map +1 -0
  27. package/dist/connectors/slack.d.ts +11 -0
  28. package/dist/connectors/slack.d.ts.map +1 -0
  29. package/dist/connectors/slack.js +212 -0
  30. package/dist/connectors/slack.js.map +1 -0
  31. package/dist/connectors/types.d.ts +2 -0
  32. package/dist/connectors/types.d.ts.map +1 -0
  33. package/dist/connectors/types.js +3 -0
  34. package/dist/connectors/types.js.map +1 -0
  35. package/dist/display.d.ts +9 -0
  36. package/dist/display.d.ts.map +1 -0
  37. package/dist/display.js +216 -0
  38. package/dist/display.js.map +1 -0
  39. package/dist/env.d.ts +4 -0
  40. package/dist/env.d.ts.map +1 -0
  41. package/dist/env.js +64 -0
  42. package/dist/env.js.map +1 -0
  43. package/dist/pipeline/ai-synthesize.d.ts +11 -0
  44. package/dist/pipeline/ai-synthesize.d.ts.map +1 -0
  45. package/dist/pipeline/ai-synthesize.js +264 -0
  46. package/dist/pipeline/ai-synthesize.js.map +1 -0
  47. package/dist/pipeline/cluster-id.d.ts +5 -0
  48. package/dist/pipeline/cluster-id.d.ts.map +1 -0
  49. package/dist/pipeline/cluster-id.js +13 -0
  50. package/dist/pipeline/cluster-id.js.map +1 -0
  51. package/dist/pipeline/correlate.d.ts +7 -0
  52. package/dist/pipeline/correlate.d.ts.map +1 -0
  53. package/dist/pipeline/correlate.js +105 -0
  54. package/dist/pipeline/correlate.js.map +1 -0
  55. package/dist/pipeline/ingest.d.ts +17 -0
  56. package/dist/pipeline/ingest.d.ts.map +1 -0
  57. package/dist/pipeline/ingest.js +56 -0
  58. package/dist/pipeline/ingest.js.map +1 -0
  59. package/dist/pipeline/merge-plan.d.ts +14 -0
  60. package/dist/pipeline/merge-plan.d.ts.map +1 -0
  61. package/dist/pipeline/merge-plan.js +70 -0
  62. package/dist/pipeline/merge-plan.js.map +1 -0
  63. package/dist/pipeline/normalize.d.ts +3 -0
  64. package/dist/pipeline/normalize.d.ts.map +1 -0
  65. package/dist/pipeline/normalize.js +169 -0
  66. package/dist/pipeline/normalize.js.map +1 -0
  67. package/dist/pipeline/prioritize.d.ts +6 -0
  68. package/dist/pipeline/prioritize.d.ts.map +1 -0
  69. package/dist/pipeline/prioritize.js +453 -0
  70. package/dist/pipeline/prioritize.js.map +1 -0
  71. package/dist/pipeline/schedule.d.ts +11 -0
  72. package/dist/pipeline/schedule.d.ts.map +1 -0
  73. package/dist/pipeline/schedule.js +98 -0
  74. package/dist/pipeline/schedule.js.map +1 -0
  75. package/dist/setup.d.ts +2 -0
  76. package/dist/setup.d.ts.map +1 -0
  77. package/dist/setup.js +276 -0
  78. package/dist/setup.js.map +1 -0
  79. package/dist/types/index.d.ts +90 -0
  80. package/dist/types/index.d.ts.map +1 -0
  81. package/dist/types/index.js +3 -0
  82. package/dist/types/index.js.map +1 -0
  83. package/package.json +51 -0
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalize = normalize;
4
+ function normalize(events) {
5
+ const artifacts = [];
6
+ for (const event of events) {
7
+ const artifact = normalizeEvent(event);
8
+ if (artifact) {
9
+ artifacts.push(artifact);
10
+ }
11
+ }
12
+ return artifacts;
13
+ }
14
+ function normalizeEvent(event) {
15
+ switch (event.connectorId) {
16
+ case "github":
17
+ return normalizeGitHub(event);
18
+ case "linear":
19
+ return normalizeLinear(event);
20
+ case "slack":
21
+ return normalizeSlack(event);
22
+ default:
23
+ return null;
24
+ }
25
+ }
26
+ function normalizeGitHub(event) {
27
+ const payload = event.rawPayload;
28
+ if (event.sourceType === "pr") {
29
+ return {
30
+ id: event.id,
31
+ type: "pr",
32
+ title: `PR #${payload.number}: ${payload.title}`,
33
+ description: payload.body ?? undefined,
34
+ sourceUrl: payload.url,
35
+ connectorId: "github",
36
+ externalId: String(payload.number),
37
+ priority: undefined,
38
+ createdAt: payload.createdAt,
39
+ updatedAt: payload.updatedAt,
40
+ metadata: {
41
+ author: payload.author?.login,
42
+ isAuthor: payload.isAuthor,
43
+ labels: (payload.labels ?? []).map((l) => l.name),
44
+ repository: payload.repository
45
+ ?.nameWithOwner,
46
+ headRefName: payload.headRefName,
47
+ additions: payload.additions,
48
+ deletions: payload.deletions,
49
+ reviewRequests: payload.reviewRequests,
50
+ },
51
+ relatedArtifactIds: [],
52
+ };
53
+ }
54
+ if (event.sourceType === "issue") {
55
+ const labels = (payload.labels ?? []).map((l) => l.name);
56
+ const priorityFromLabels = extractPriorityFromLabels(labels);
57
+ return {
58
+ id: event.id,
59
+ type: "issue",
60
+ title: `#${payload.number}: ${payload.title}`,
61
+ description: payload.body ?? undefined,
62
+ sourceUrl: payload.url,
63
+ connectorId: "github",
64
+ externalId: String(payload.number),
65
+ priority: priorityFromLabels,
66
+ createdAt: payload.createdAt,
67
+ updatedAt: payload.updatedAt,
68
+ metadata: {
69
+ author: payload.author?.login,
70
+ labels,
71
+ repository: payload.repository
72
+ ?.nameWithOwner,
73
+ },
74
+ relatedArtifactIds: [],
75
+ };
76
+ }
77
+ return null;
78
+ }
79
+ function normalizeLinear(event) {
80
+ const payload = event.rawPayload;
81
+ if (event.sourceType === "issue") {
82
+ const priority = payload.priority;
83
+ // Linear priority: 0=none, 1=urgent, 2=high, 3=medium, 4=low
84
+ const normalizedPriority = priority !== undefined && priority > 0
85
+ ? 1 - (priority - 1) / 3 // 1->1.0, 2->0.67, 3->0.33, 4->0.0
86
+ : undefined;
87
+ return {
88
+ id: event.id,
89
+ type: "issue",
90
+ title: `${payload.identifier}: ${payload.title}`,
91
+ description: payload.description ?? undefined,
92
+ sourceUrl: payload.url,
93
+ connectorId: "linear",
94
+ externalId: payload.identifier,
95
+ priority: normalizedPriority,
96
+ createdAt: payload.createdAt,
97
+ updatedAt: payload.updatedAt,
98
+ metadata: {
99
+ priorityLabel: payload.priorityLabel,
100
+ estimate: payload.estimate,
101
+ dueDate: payload.dueDate,
102
+ state: payload.state,
103
+ labels: payload.labels?.nodes?.map((l) => l.name),
104
+ project: payload.project?.name,
105
+ cycle: payload.cycle,
106
+ },
107
+ relatedArtifactIds: [],
108
+ };
109
+ }
110
+ return null;
111
+ }
112
+ function normalizeSlack(event) {
113
+ const payload = event.rawPayload;
114
+ if (event.sourceType === "slack_message") {
115
+ const rawText = payload.text ?? "";
116
+ const cleanText = payload.cleanText ?? rawText;
117
+ const channel = payload.channel ?? "unknown";
118
+ const isDm = payload.isDm ?? false;
119
+ const from = payload.from ?? "someone";
120
+ const permalink = payload.permalink ?? "";
121
+ const ts = payload.ts;
122
+ const links = payload.links ?? [];
123
+ const preview = cleanText.length > 100 ? cleanText.slice(0, 100) + "..." : cleanText;
124
+ const locationLabel = isDm ? `DM from ${from}` : `#${channel}`;
125
+ const title = preview
126
+ ? `${preview}`
127
+ : `Message from ${from}`;
128
+ const createdAt = ts
129
+ ? new Date(Number(ts) * 1000).toISOString()
130
+ : new Date().toISOString();
131
+ return {
132
+ id: event.id,
133
+ type: "slack_message",
134
+ title,
135
+ description: `${from} in ${locationLabel}`,
136
+ sourceUrl: permalink,
137
+ connectorId: "slack",
138
+ externalId: ts ?? event.id,
139
+ priority: 0.5,
140
+ createdAt,
141
+ updatedAt: createdAt,
142
+ metadata: {
143
+ channel,
144
+ channelId: payload.channelId,
145
+ isDm,
146
+ from,
147
+ threadTs: payload.threadTs,
148
+ links,
149
+ },
150
+ relatedArtifactIds: [],
151
+ };
152
+ }
153
+ return null;
154
+ }
155
+ function extractPriorityFromLabels(labels) {
156
+ for (const label of labels) {
157
+ const lower = label.toLowerCase();
158
+ if (lower === "p0" || lower === "critical" || lower === "urgent")
159
+ return 1.0;
160
+ if (lower === "p1" || lower === "high")
161
+ return 0.75;
162
+ if (lower === "p2" || lower === "medium")
163
+ return 0.5;
164
+ if (lower === "p3" || lower === "low")
165
+ return 0.25;
166
+ }
167
+ return undefined;
168
+ }
169
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/pipeline/normalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Artifact, TaskCluster, TaskCategory, ExecutionAction } from "../types";
2
+ export declare function prioritize(artifacts: Artifact[]): TaskCluster[];
3
+ export declare function inferCategory(artifacts: Artifact[]): TaskCategory;
4
+ export declare function buildActions(artifacts: Artifact[], category: TaskCategory): ExecutionAction[];
5
+ export declare function buildSummary(artifacts: Artifact[]): string;
6
+ //# sourceMappingURL=prioritize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prioritize.d.ts","sourceRoot":"","sources":["../../src/pipeline/prioritize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAuBrF,wBAAgB,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,CAK/D;AAiFD,wBAAgB,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,YAAY,CAmBjE;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,QAAQ,EAAE,EACrB,QAAQ,EAAE,YAAY,GACrB,eAAe,EAAE,CAsKnB;AAqDD,wBAAgB,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAqB1D"}
@@ -0,0 +1,453 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prioritize = prioritize;
4
+ exports.inferCategory = inferCategory;
5
+ exports.buildActions = buildActions;
6
+ exports.buildSummary = buildSummary;
7
+ const cluster_id_1 = require("./cluster-id");
8
+ const WEIGHTS = {
9
+ urgency: 0.25,
10
+ importance: 0.2,
11
+ socialPressure: 0.2,
12
+ staleness: 0.15,
13
+ blockingFactor: 0.2,
14
+ };
15
+ /** Baseline minutes before AI-assist scaling (developer uses Cursor / copilots). */
16
+ const TIME_ESTIMATES = {
17
+ pr: 18,
18
+ issue_small: 28,
19
+ issue_medium: 55,
20
+ slack_message: 6,
21
+ slack_thread: 10,
22
+ meeting: 12,
23
+ };
24
+ const AI_ASSIST_TIME_SCALE = 0.52;
25
+ function prioritize(artifacts) {
26
+ const groups = groupIntoCluster(artifacts);
27
+ const scored = groups.map(scoreCluster);
28
+ scored.sort((a, b) => b.priorityScore - a.priorityScore);
29
+ return scored;
30
+ }
31
+ function groupIntoCluster(artifacts) {
32
+ // Group related artifacts into clusters using union-find
33
+ const parent = new Map();
34
+ function find(id) {
35
+ if (!parent.has(id))
36
+ parent.set(id, id);
37
+ if (parent.get(id) !== id) {
38
+ parent.set(id, find(parent.get(id)));
39
+ }
40
+ return parent.get(id);
41
+ }
42
+ function union(a, b) {
43
+ const ra = find(a);
44
+ const rb = find(b);
45
+ if (ra !== rb)
46
+ parent.set(ra, rb);
47
+ }
48
+ for (const artifact of artifacts) {
49
+ find(artifact.id);
50
+ for (const relId of artifact.relatedArtifactIds) {
51
+ if (artifacts.some((a) => a.id === relId)) {
52
+ union(artifact.id, relId);
53
+ }
54
+ }
55
+ }
56
+ const clusterMap = new Map();
57
+ for (const artifact of artifacts) {
58
+ const root = find(artifact.id);
59
+ const group = clusterMap.get(root) ?? [];
60
+ group.push(artifact);
61
+ clusterMap.set(root, group);
62
+ }
63
+ const clusters = [];
64
+ for (const [, group] of clusterMap) {
65
+ const primary = selectPrimaryArtifact(group);
66
+ const category = inferCategory(group);
67
+ const actions = buildActions(group, category);
68
+ const ids = group.map((a) => a.id);
69
+ clusters.push({
70
+ id: (0, cluster_id_1.stableClusterId)(ids),
71
+ title: primary.title,
72
+ summary: buildSummary(group),
73
+ category,
74
+ artifacts: group,
75
+ priorityScore: 0,
76
+ priorityReasons: [],
77
+ estimatedMinutes: estimateTime(group),
78
+ status: "todo",
79
+ actions,
80
+ });
81
+ }
82
+ return clusters;
83
+ }
84
+ function selectPrimaryArtifact(artifacts) {
85
+ // Prefer PRs over issues over messages
86
+ const typeOrder = {
87
+ pr: 0,
88
+ issue: 1,
89
+ slack_thread: 2,
90
+ slack_message: 3,
91
+ meeting: 4,
92
+ notion_page: 5,
93
+ commit: 6,
94
+ };
95
+ return [...artifacts].sort((a, b) => (typeOrder[a.type] ?? 99) - (typeOrder[b.type] ?? 99))[0];
96
+ }
97
+ const INVESTIGATE_PATTERNS = /\b(check out|try out|look into|explore|evaluate|investigate|research|learn about|look at|play with|experiment|spike|poc|proof of concept|compare)\b/i;
98
+ function inferCategory(artifacts) {
99
+ const types = new Set(artifacts.map((a) => a.type));
100
+ if (types.has("pr")) {
101
+ const pr = artifacts.find((a) => a.type === "pr");
102
+ if (pr?.metadata.isAuthor)
103
+ return "follow_up";
104
+ return "review";
105
+ }
106
+ if (types.has("slack_message") || types.has("slack_thread"))
107
+ return "respond";
108
+ if (types.has("meeting"))
109
+ return "meeting_prep";
110
+ if (types.has("issue")) {
111
+ const text = artifacts
112
+ .map((a) => `${a.title} ${a.description ?? ""}`)
113
+ .join(" ");
114
+ if (INVESTIGATE_PATTERNS.test(text))
115
+ return "investigate";
116
+ return "implementation";
117
+ }
118
+ return "other";
119
+ }
120
+ function buildActions(artifacts, category) {
121
+ const actions = [];
122
+ const primary = selectPrimaryArtifact(artifacts);
123
+ // ── 1. Primary action: the single "do this now" button ──
124
+ switch (category) {
125
+ case "review":
126
+ if (primary.type === "pr") {
127
+ actions.push({
128
+ id: "primary",
129
+ type: "review",
130
+ label: "Review",
131
+ icon: "git-pull-request",
132
+ params: {
133
+ prUrl: primary.sourceUrl,
134
+ repository: primary.metadata.repository,
135
+ prNumber: primary.externalId,
136
+ branch: primary.metadata.headRefName,
137
+ },
138
+ });
139
+ }
140
+ break;
141
+ case "follow_up":
142
+ if (primary.type === "pr") {
143
+ actions.push({
144
+ id: "primary",
145
+ type: "review",
146
+ label: "Check PR",
147
+ icon: "git-pull-request",
148
+ params: {
149
+ prUrl: primary.sourceUrl,
150
+ repository: primary.metadata.repository,
151
+ prNumber: primary.externalId,
152
+ branch: primary.metadata.headRefName,
153
+ },
154
+ });
155
+ }
156
+ break;
157
+ case "implementation":
158
+ actions.push({
159
+ id: "primary",
160
+ type: "plan",
161
+ label: "Plan",
162
+ icon: "lightbulb",
163
+ params: {
164
+ issueUrl: primary.sourceUrl,
165
+ title: primary.title,
166
+ description: primary.description,
167
+ externalId: primary.externalId,
168
+ connectorId: primary.connectorId,
169
+ },
170
+ });
171
+ break;
172
+ case "investigate":
173
+ actions.push({
174
+ id: "primary",
175
+ type: "investigate",
176
+ label: "Research",
177
+ icon: "search",
178
+ params: {
179
+ issueUrl: primary.sourceUrl,
180
+ title: primary.title,
181
+ description: primary.description,
182
+ externalId: primary.externalId,
183
+ connectorId: primary.connectorId,
184
+ },
185
+ });
186
+ break;
187
+ case "respond":
188
+ actions.push({
189
+ id: "primary",
190
+ type: "start_work",
191
+ label: "Reply",
192
+ icon: "reply",
193
+ params: { url: primary.sourceUrl },
194
+ });
195
+ break;
196
+ default:
197
+ actions.push({
198
+ id: "primary",
199
+ type: "open_url",
200
+ label: "Open",
201
+ icon: "link-external",
202
+ params: { url: primary.sourceUrl },
203
+ });
204
+ break;
205
+ }
206
+ // ── 2. Context links: every related source the developer might need ──
207
+ // Ordered by likely usefulness: Slack context first (someone pinged you),
208
+ // then the issue/PR itself, then other links.
209
+ const primaryUrl = primary.sourceUrl;
210
+ const seenUrls = new Set([primaryUrl]);
211
+ const contextOrder = {
212
+ slack_message: 0,
213
+ slack_thread: 1,
214
+ pr: 2,
215
+ issue: 3,
216
+ meeting: 4,
217
+ notion_page: 5,
218
+ commit: 6,
219
+ };
220
+ const contextArtifacts = [...artifacts]
221
+ .filter((a) => a.id !== primary.id && a.sourceUrl && !seenUrls.has(a.sourceUrl))
222
+ .sort((a, b) => (contextOrder[a.type] ?? 99) - (contextOrder[b.type] ?? 99));
223
+ for (const artifact of contextArtifacts) {
224
+ if (seenUrls.has(artifact.sourceUrl))
225
+ continue;
226
+ seenUrls.add(artifact.sourceUrl);
227
+ actions.push({
228
+ id: `ctx-${artifact.id}`,
229
+ type: "context_link",
230
+ label: contextLabel(artifact),
231
+ icon: contextIcon(artifact),
232
+ params: {
233
+ url: artifact.sourceUrl,
234
+ source: artifact.connectorId,
235
+ artifactType: artifact.type,
236
+ },
237
+ });
238
+ }
239
+ // If the primary artifact's URL wasn't already used as the primary action's
240
+ // direct open target, or if there are extra links in metadata, add them.
241
+ const metadataLinks = primary.metadata.links ?? [];
242
+ for (const link of metadataLinks) {
243
+ if (seenUrls.has(link))
244
+ continue;
245
+ seenUrls.add(link);
246
+ actions.push({
247
+ id: `link-${actions.length}`,
248
+ type: "context_link",
249
+ label: linkLabel(link),
250
+ icon: "link-external",
251
+ params: { url: link, source: "link", artifactType: "link" },
252
+ });
253
+ }
254
+ // ── 3. Utilities: Done and Snooze ──
255
+ actions.push({
256
+ id: "mark_done",
257
+ type: "mark_done",
258
+ label: "Done",
259
+ icon: "check",
260
+ params: {},
261
+ });
262
+ actions.push({
263
+ id: "snooze",
264
+ type: "snooze",
265
+ label: "Snooze",
266
+ icon: "clock",
267
+ params: {},
268
+ });
269
+ return actions;
270
+ }
271
+ function contextLabel(artifact) {
272
+ switch (artifact.type) {
273
+ case "slack_message":
274
+ case "slack_thread": {
275
+ const from = artifact.metadata.from;
276
+ const isDm = artifact.metadata.isDm;
277
+ if (isDm && from)
278
+ return `DM from ${from}`;
279
+ if (from)
280
+ return `${from} in Slack`;
281
+ return "Slack message";
282
+ }
283
+ case "pr":
284
+ return artifact.metadata.isAuthor ? "Your PR" : "PR";
285
+ case "issue":
286
+ return artifact.connectorId === "linear" ? "Linear ticket" : "Issue";
287
+ case "meeting":
288
+ return "Meeting";
289
+ case "notion_page":
290
+ return "Notion page";
291
+ case "commit":
292
+ return "Commit";
293
+ default:
294
+ return "Link";
295
+ }
296
+ }
297
+ function contextIcon(artifact) {
298
+ switch (artifact.connectorId) {
299
+ case "slack":
300
+ return "message-square";
301
+ case "github":
302
+ return artifact.type === "pr" ? "git-pull-request" : "github";
303
+ case "linear":
304
+ return "list-ordered";
305
+ default:
306
+ return "link-external";
307
+ }
308
+ }
309
+ function linkLabel(url) {
310
+ try {
311
+ const host = new URL(url).hostname.replace("www.", "");
312
+ if (host.includes("github.com"))
313
+ return "GitHub";
314
+ if (host.includes("youtube.com") || host.includes("youtu.be"))
315
+ return "YouTube";
316
+ if (host.includes("linear.app"))
317
+ return "Linear";
318
+ if (host.includes("slack.com"))
319
+ return "Slack";
320
+ return host.split(".")[0];
321
+ }
322
+ catch {
323
+ return "Link";
324
+ }
325
+ }
326
+ function buildSummary(artifacts) {
327
+ if (artifacts.length === 1) {
328
+ const a = artifacts[0];
329
+ if (a.connectorId === "slack") {
330
+ const from = a.metadata.from ?? "someone";
331
+ const isDm = a.metadata.isDm;
332
+ const channel = a.metadata.channel ?? "Slack";
333
+ return isDm ? `DM from ${from}` : `${from} in #${channel}`;
334
+ }
335
+ if (a.connectorId === "github") {
336
+ return a.metadata.repository ?? "GitHub";
337
+ }
338
+ if (a.connectorId === "linear") {
339
+ const project = a.metadata.project ?? undefined;
340
+ return project ? `Linear · ${project}` : "Linear";
341
+ }
342
+ return a.connectorId;
343
+ }
344
+ const sources = [...new Set(artifacts.map((a) => a.connectorId))];
345
+ return `${artifacts.length} related items from ${sources.join(", ")}`;
346
+ }
347
+ function estimateTime(artifacts) {
348
+ let total = 0;
349
+ for (const a of artifacts) {
350
+ if (a.type === "pr") {
351
+ const additions = a.metadata.additions ?? 0;
352
+ const deletions = a.metadata.deletions ?? 0;
353
+ const lines = additions + deletions;
354
+ total += lines > 500 ? 38 : lines > 100 ? 22 : 12;
355
+ }
356
+ else if (a.type === "issue") {
357
+ const estimate = a.metadata.estimate ?? 0;
358
+ if (estimate > 0) {
359
+ total += estimate * 14; // Linear points -> minutes (AI-assisted)
360
+ }
361
+ else {
362
+ total += TIME_ESTIMATES.issue_small;
363
+ }
364
+ }
365
+ else {
366
+ total += TIME_ESTIMATES[a.type] ?? 12;
367
+ }
368
+ }
369
+ return Math.max(5, Math.round(total * AI_ASSIST_TIME_SCALE));
370
+ }
371
+ function scoreCluster(cluster) {
372
+ const reasons = [];
373
+ let urgency = 0;
374
+ let importance = 0;
375
+ let socialPressure = 0;
376
+ let staleness = 0;
377
+ let blockingFactor = 0;
378
+ const now = Date.now();
379
+ for (const artifact of cluster.artifacts) {
380
+ // Urgency: deadline proximity
381
+ const dueDate = artifact.metadata.dueDate ?? undefined;
382
+ if (dueDate) {
383
+ const daysUntil = (new Date(dueDate).getTime() - now) / (1000 * 60 * 60 * 24);
384
+ const u = Math.max(0, Math.min(1, 1 - daysUntil / 14));
385
+ if (u > urgency) {
386
+ urgency = u;
387
+ if (daysUntil <= 1)
388
+ reasons.push("Due tomorrow");
389
+ else if (daysUntil <= 3)
390
+ reasons.push(`Due in ${Math.ceil(daysUntil)} days`);
391
+ }
392
+ }
393
+ // Importance: priority field
394
+ if (artifact.priority !== undefined && artifact.priority > importance) {
395
+ importance = artifact.priority;
396
+ const label = artifact.metadata.priorityLabel ?? `P${Math.round((1 - artifact.priority) * 3)}`;
397
+ reasons.push(`Priority: ${label}`);
398
+ }
399
+ // Social pressure: review requests, mentions
400
+ if (artifact.type === "pr") {
401
+ const reviewRequests = artifact.metadata.reviewRequests ?? [];
402
+ if (reviewRequests.length > 0) {
403
+ const sp = Math.min(reviewRequests.length / 5, 1);
404
+ if (sp > socialPressure) {
405
+ socialPressure = sp;
406
+ reasons.push(`${reviewRequests.length} reviewer${reviewRequests.length > 1 ? "s" : ""} waiting`);
407
+ }
408
+ }
409
+ }
410
+ if (artifact.type === "slack_message") {
411
+ const sp = 0.6;
412
+ if (sp > socialPressure) {
413
+ socialPressure = sp;
414
+ const from = artifact.metadata.from;
415
+ reasons.push(from ? `@mentioned by ${from}` : "@mentioned in Slack");
416
+ }
417
+ }
418
+ // Staleness: age
419
+ const createdAt = new Date(artifact.createdAt).getTime();
420
+ const daysOld = (now - createdAt) / (1000 * 60 * 60 * 24);
421
+ const s = Math.min(daysOld / 7, 1);
422
+ if (s > staleness) {
423
+ staleness = s;
424
+ if (daysOld > 3) {
425
+ reasons.push(`${Math.round(daysOld)} days old`);
426
+ }
427
+ }
428
+ // Blocking factor: labels
429
+ const labels = artifact.metadata.labels ?? [];
430
+ const isBlocking = labels.some((l) => {
431
+ const lower = l.toLowerCase();
432
+ return (lower.includes("block") ||
433
+ lower.includes("urgent") ||
434
+ lower.includes("critical"));
435
+ });
436
+ if (isBlocking) {
437
+ blockingFactor = 1;
438
+ reasons.push("Marked as blocking");
439
+ }
440
+ }
441
+ const score = (WEIGHTS.urgency * urgency +
442
+ WEIGHTS.importance * importance +
443
+ WEIGHTS.socialPressure * socialPressure +
444
+ WEIGHTS.staleness * staleness +
445
+ WEIGHTS.blockingFactor * blockingFactor) *
446
+ 100;
447
+ return {
448
+ ...cluster,
449
+ priorityScore: Math.round(score * 10) / 10,
450
+ priorityReasons: [...new Set(reasons)],
451
+ };
452
+ }
453
+ //# sourceMappingURL=prioritize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prioritize.js","sourceRoot":"","sources":["../../src/pipeline/prioritize.ts"],"names":[],"mappings":"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"}