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.
- package/LICENSE +21 -0
- package/README.md +254 -0
- package/dist/ai/local.d.ts +9 -0
- package/dist/ai/local.d.ts.map +1 -0
- package/dist/ai/local.js +148 -0
- package/dist/ai/local.js.map +1 -0
- package/dist/ai/provider.d.ts +43 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +191 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +193 -0
- package/dist/cli.js.map +1 -0
- package/dist/connectors/github.d.ts +13 -0
- package/dist/connectors/github.d.ts.map +1 -0
- package/dist/connectors/github.js +212 -0
- package/dist/connectors/github.js.map +1 -0
- package/dist/connectors/linear.d.ts +12 -0
- package/dist/connectors/linear.d.ts.map +1 -0
- package/dist/connectors/linear.js +160 -0
- package/dist/connectors/linear.js.map +1 -0
- package/dist/connectors/registry.d.ts +10 -0
- package/dist/connectors/registry.d.ts.map +1 -0
- package/dist/connectors/registry.js +36 -0
- package/dist/connectors/registry.js.map +1 -0
- package/dist/connectors/slack.d.ts +11 -0
- package/dist/connectors/slack.d.ts.map +1 -0
- package/dist/connectors/slack.js +212 -0
- package/dist/connectors/slack.js.map +1 -0
- package/dist/connectors/types.d.ts +2 -0
- package/dist/connectors/types.d.ts.map +1 -0
- package/dist/connectors/types.js +3 -0
- package/dist/connectors/types.js.map +1 -0
- package/dist/display.d.ts +9 -0
- package/dist/display.d.ts.map +1 -0
- package/dist/display.js +216 -0
- package/dist/display.js.map +1 -0
- package/dist/env.d.ts +4 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +64 -0
- package/dist/env.js.map +1 -0
- package/dist/pipeline/ai-synthesize.d.ts +11 -0
- package/dist/pipeline/ai-synthesize.d.ts.map +1 -0
- package/dist/pipeline/ai-synthesize.js +264 -0
- package/dist/pipeline/ai-synthesize.js.map +1 -0
- package/dist/pipeline/cluster-id.d.ts +5 -0
- package/dist/pipeline/cluster-id.d.ts.map +1 -0
- package/dist/pipeline/cluster-id.js +13 -0
- package/dist/pipeline/cluster-id.js.map +1 -0
- package/dist/pipeline/correlate.d.ts +7 -0
- package/dist/pipeline/correlate.d.ts.map +1 -0
- package/dist/pipeline/correlate.js +105 -0
- package/dist/pipeline/correlate.js.map +1 -0
- package/dist/pipeline/ingest.d.ts +17 -0
- package/dist/pipeline/ingest.d.ts.map +1 -0
- package/dist/pipeline/ingest.js +56 -0
- package/dist/pipeline/ingest.js.map +1 -0
- package/dist/pipeline/merge-plan.d.ts +14 -0
- package/dist/pipeline/merge-plan.d.ts.map +1 -0
- package/dist/pipeline/merge-plan.js +70 -0
- package/dist/pipeline/merge-plan.js.map +1 -0
- package/dist/pipeline/normalize.d.ts +3 -0
- package/dist/pipeline/normalize.d.ts.map +1 -0
- package/dist/pipeline/normalize.js +169 -0
- package/dist/pipeline/normalize.js.map +1 -0
- package/dist/pipeline/prioritize.d.ts +6 -0
- package/dist/pipeline/prioritize.d.ts.map +1 -0
- package/dist/pipeline/prioritize.js +453 -0
- package/dist/pipeline/prioritize.js.map +1 -0
- package/dist/pipeline/schedule.d.ts +11 -0
- package/dist/pipeline/schedule.d.ts.map +1 -0
- package/dist/pipeline/schedule.js +98 -0
- package/dist/pipeline/schedule.js.map +1 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +276 -0
- package/dist/setup.js.map +1 -0
- package/dist/types/index.d.ts +90 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.aiSynthesize = aiSynthesize;
|
|
4
|
+
const cluster_id_1 = require("./cluster-id");
|
|
5
|
+
const prioritize_1 = require("./prioritize");
|
|
6
|
+
const correlate_1 = require("./correlate");
|
|
7
|
+
const prioritize_2 = require("./prioritize");
|
|
8
|
+
const VALID_CATEGORIES = new Set([
|
|
9
|
+
"review",
|
|
10
|
+
"implementation",
|
|
11
|
+
"respond",
|
|
12
|
+
"investigate",
|
|
13
|
+
"meeting_prep",
|
|
14
|
+
"follow_up",
|
|
15
|
+
"other",
|
|
16
|
+
]);
|
|
17
|
+
/** Scale LLM time estimates toward AI-assisted work (Cursor, Copilot). */
|
|
18
|
+
const AI_ASSIST_TIME_FACTOR = 0.62;
|
|
19
|
+
const CATEGORY_MINUTE_CAPS = {
|
|
20
|
+
review: 45,
|
|
21
|
+
respond: 22,
|
|
22
|
+
investigate: 55,
|
|
23
|
+
implementation: 85,
|
|
24
|
+
follow_up: 45,
|
|
25
|
+
meeting_prep: 28,
|
|
26
|
+
other: 55,
|
|
27
|
+
};
|
|
28
|
+
const GLOBAL_MAX_MINUTES = 120;
|
|
29
|
+
function clampAiEstimateMinutes(category, raw) {
|
|
30
|
+
let m = typeof raw === "number" && !Number.isNaN(raw) ? raw : 18;
|
|
31
|
+
m = Math.round(m * AI_ASSIST_TIME_FACTOR);
|
|
32
|
+
const cap = CATEGORY_MINUTE_CAPS[category] ?? 60;
|
|
33
|
+
m = Math.min(m, cap, GLOBAL_MAX_MINUTES);
|
|
34
|
+
return Math.max(5, m);
|
|
35
|
+
}
|
|
36
|
+
async function aiSynthesize(artifacts, provider, log) {
|
|
37
|
+
if (artifacts.length === 0) {
|
|
38
|
+
return { clusters: [], mode: "rules" };
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const available = await provider.isAvailable();
|
|
42
|
+
if (!available) {
|
|
43
|
+
log?.info("AI provider not available, falling back to rules");
|
|
44
|
+
return fallback(artifacts);
|
|
45
|
+
}
|
|
46
|
+
log?.info(`AI synthesis: sending ${artifacts.length} artifacts to ${provider.name}`);
|
|
47
|
+
const prompt = buildPrompt(artifacts);
|
|
48
|
+
const raw = await provider.complete(prompt);
|
|
49
|
+
if (!raw || raw.trim().length === 0) {
|
|
50
|
+
log?.warn("AI returned empty response, falling back to rules");
|
|
51
|
+
return fallback(artifacts);
|
|
52
|
+
}
|
|
53
|
+
const parsed = parseResponse(raw, artifacts);
|
|
54
|
+
if (!parsed) {
|
|
55
|
+
log?.warn("AI response could not be parsed, falling back to rules");
|
|
56
|
+
return fallback(artifacts);
|
|
57
|
+
}
|
|
58
|
+
const clusters = hydrateClusters(parsed, artifacts);
|
|
59
|
+
log?.info(`AI synthesis: ${clusters.length} clusters from LLM`);
|
|
60
|
+
return { clusters, mode: "ai" };
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
64
|
+
log?.warn(`AI synthesis failed: ${msg}, falling back to rules`);
|
|
65
|
+
return fallback(artifacts);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function fallback(artifacts) {
|
|
69
|
+
const correlated = (0, correlate_1.correlate)(artifacts);
|
|
70
|
+
const clusters = (0, prioritize_2.prioritize)(correlated);
|
|
71
|
+
return { clusters, mode: "rules" };
|
|
72
|
+
}
|
|
73
|
+
function buildArtifactItems(artifacts) {
|
|
74
|
+
return artifacts.map((a) => ({
|
|
75
|
+
id: a.id,
|
|
76
|
+
type: a.type,
|
|
77
|
+
title: a.title,
|
|
78
|
+
description: a.description?.slice(0, 300),
|
|
79
|
+
source: a.connectorId,
|
|
80
|
+
sourceUrl: a.sourceUrl,
|
|
81
|
+
priority: a.priority,
|
|
82
|
+
createdAt: a.createdAt,
|
|
83
|
+
metadata: {
|
|
84
|
+
author: a.metadata.author,
|
|
85
|
+
isAuthor: a.metadata.isAuthor,
|
|
86
|
+
repository: a.metadata.repository,
|
|
87
|
+
project: a.metadata.project,
|
|
88
|
+
labels: a.metadata.labels,
|
|
89
|
+
dueDate: a.metadata.dueDate,
|
|
90
|
+
state: a.metadata.state,
|
|
91
|
+
priorityLabel: a.metadata.priorityLabel,
|
|
92
|
+
channel: a.metadata.channel,
|
|
93
|
+
isDm: a.metadata.isDm,
|
|
94
|
+
from: a.metadata.from,
|
|
95
|
+
links: a.metadata.links,
|
|
96
|
+
estimate: a.metadata.estimate,
|
|
97
|
+
},
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
function buildPrompt(artifacts) {
|
|
101
|
+
const items = artifacts.map((a) => ({
|
|
102
|
+
id: a.id,
|
|
103
|
+
type: a.type,
|
|
104
|
+
title: a.title,
|
|
105
|
+
description: a.description?.slice(0, 300),
|
|
106
|
+
source: a.connectorId,
|
|
107
|
+
sourceUrl: a.sourceUrl,
|
|
108
|
+
priority: a.priority,
|
|
109
|
+
createdAt: a.createdAt,
|
|
110
|
+
metadata: {
|
|
111
|
+
author: a.metadata.author,
|
|
112
|
+
isAuthor: a.metadata.isAuthor,
|
|
113
|
+
repository: a.metadata.repository,
|
|
114
|
+
project: a.metadata.project,
|
|
115
|
+
labels: a.metadata.labels,
|
|
116
|
+
dueDate: a.metadata.dueDate,
|
|
117
|
+
state: a.metadata.state,
|
|
118
|
+
priorityLabel: a.metadata.priorityLabel,
|
|
119
|
+
channel: a.metadata.channel,
|
|
120
|
+
isDm: a.metadata.isDm,
|
|
121
|
+
from: a.metadata.from,
|
|
122
|
+
links: a.metadata.links,
|
|
123
|
+
estimate: a.metadata.estimate,
|
|
124
|
+
},
|
|
125
|
+
}));
|
|
126
|
+
return `You are a developer workday planner. Analyze these work items from multiple tools and synthesize them into an actionable, prioritized plan for today.
|
|
127
|
+
|
|
128
|
+
## Work Items
|
|
129
|
+
${JSON.stringify(items, null, 2)}
|
|
130
|
+
|
|
131
|
+
## Instructions
|
|
132
|
+
|
|
133
|
+
1. **Group related items** into clusters. Items are related if they reference the same PR, issue, project, or topic. A Slack message about a PR should be grouped with that PR. Items with no relation should be their own cluster.
|
|
134
|
+
|
|
135
|
+
2. **Write a clear, actionable title** for each cluster. Instead of raw identifiers like "WOR-5: Implement auth", write something like "Implement authentication flow". For Slack messages, summarize the ask: "Reply to John about the auth refactor".
|
|
136
|
+
|
|
137
|
+
3. **Write a 1-sentence summary** explaining why this task matters or what context the developer needs.
|
|
138
|
+
|
|
139
|
+
4. **Categorize** each cluster:
|
|
140
|
+
- "review" — PR that needs code review (not authored by the developer)
|
|
141
|
+
- "follow_up" — PR authored by the developer that needs attention (merge, address comments)
|
|
142
|
+
- "implementation" — coding task, feature, or bug fix
|
|
143
|
+
- "investigate" — research, evaluate a tool, spike, POC
|
|
144
|
+
- "respond" — reply to a message, thread, or discussion
|
|
145
|
+
- "meeting_prep" — prepare for a meeting
|
|
146
|
+
- "other" — anything else
|
|
147
|
+
|
|
148
|
+
5. **Score priority** 0-100 based on:
|
|
149
|
+
- Urgency (deadlines, due dates, how old it is)
|
|
150
|
+
- Importance (priority labels, blocking status)
|
|
151
|
+
- Social pressure (people waiting, @mentions, review requests)
|
|
152
|
+
- Impact (how many people or systems are affected)
|
|
153
|
+
|
|
154
|
+
6. **Provide priority reasons** — 1-3 short phrases explaining the score.
|
|
155
|
+
|
|
156
|
+
7. **Estimate time** in minutes for each cluster. Assume the developer uses **AI coding assistants** (Cursor, Copilot, etc.): estimates are **active time** to decide, review, and ship with tooling — not manual greenfield coding. Anchors: Slack reply ~5–15m; small PR review ~10–25m; larger PR ~20–45m; focused implementation ~20–55m; quick investigate ~15–35m.
|
|
157
|
+
|
|
158
|
+
8. **Order clusters** to minimize context switching — group related work together when priority allows.
|
|
159
|
+
|
|
160
|
+
Return ONLY valid JSON matching this schema (no markdown fences, no explanation outside the JSON):
|
|
161
|
+
{
|
|
162
|
+
"clusters": [
|
|
163
|
+
{
|
|
164
|
+
"artifactIds": ["artifact-id-1", "artifact-id-2"],
|
|
165
|
+
"title": "Human-readable actionable title",
|
|
166
|
+
"summary": "Why this matters, 1 sentence",
|
|
167
|
+
"category": "review|implementation|respond|investigate|follow_up|meeting_prep|other",
|
|
168
|
+
"priorityScore": 75,
|
|
169
|
+
"priorityReasons": ["Due tomorrow", "Blocking release"],
|
|
170
|
+
"estimatedMinutes": 30
|
|
171
|
+
}
|
|
172
|
+
],
|
|
173
|
+
"reasoning": "Brief explanation of ordering logic"
|
|
174
|
+
}`;
|
|
175
|
+
}
|
|
176
|
+
function parseResponse(raw, artifacts) {
|
|
177
|
+
let text = raw.trim();
|
|
178
|
+
const fenceMatch = text.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
179
|
+
if (fenceMatch) {
|
|
180
|
+
text = fenceMatch[1].trim();
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
const parsed = JSON.parse(text);
|
|
184
|
+
if (!parsed.clusters || !Array.isArray(parsed.clusters)) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
const artifactIds = new Set(artifacts.map((a) => a.id));
|
|
188
|
+
const validClusters = parsed.clusters.filter((c) => {
|
|
189
|
+
if (!Array.isArray(c.artifactIds) || c.artifactIds.length === 0) {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
if (!c.title || typeof c.title !== "string")
|
|
193
|
+
return false;
|
|
194
|
+
if (typeof c.priorityScore !== "number")
|
|
195
|
+
return false;
|
|
196
|
+
return true;
|
|
197
|
+
});
|
|
198
|
+
// Deduplicate: each artifact can only appear in one cluster (first wins).
|
|
199
|
+
// Small models sometimes repeat clusters or reassign the same artifacts.
|
|
200
|
+
const claimedIds = new Set();
|
|
201
|
+
const deduped = [];
|
|
202
|
+
for (const cluster of validClusters) {
|
|
203
|
+
cluster.artifactIds = cluster.artifactIds.filter((id) => artifactIds.has(id) && !claimedIds.has(id));
|
|
204
|
+
if (cluster.artifactIds.length === 0)
|
|
205
|
+
continue;
|
|
206
|
+
cluster.artifactIds.forEach((id) => claimedIds.add(id));
|
|
207
|
+
deduped.push(cluster);
|
|
208
|
+
}
|
|
209
|
+
const uniqueClusters = deduped;
|
|
210
|
+
for (const cluster of uniqueClusters) {
|
|
211
|
+
if (!VALID_CATEGORIES.has(cluster.category)) {
|
|
212
|
+
cluster.category = "other";
|
|
213
|
+
}
|
|
214
|
+
cluster.priorityScore = Math.max(0, Math.min(100, cluster.priorityScore));
|
|
215
|
+
cluster.estimatedMinutes = cluster.estimatedMinutes || 15;
|
|
216
|
+
cluster.priorityReasons = cluster.priorityReasons || [];
|
|
217
|
+
cluster.summary = cluster.summary || "";
|
|
218
|
+
}
|
|
219
|
+
const unassigned = artifacts
|
|
220
|
+
.filter((a) => !claimedIds.has(a.id));
|
|
221
|
+
for (const artifact of unassigned) {
|
|
222
|
+
uniqueClusters.push({
|
|
223
|
+
artifactIds: [artifact.id],
|
|
224
|
+
title: artifact.title,
|
|
225
|
+
summary: artifact.connectorId,
|
|
226
|
+
category: "other",
|
|
227
|
+
priorityScore: 20,
|
|
228
|
+
priorityReasons: [],
|
|
229
|
+
estimatedMinutes: 15,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
clusters: uniqueClusters,
|
|
234
|
+
reasoning: parsed.reasoning,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function hydrateClusters(response, artifacts) {
|
|
242
|
+
const artifactMap = new Map(artifacts.map((a) => [a.id, a]));
|
|
243
|
+
return response.clusters.map((llmCluster) => {
|
|
244
|
+
const clusterArtifacts = llmCluster.artifactIds
|
|
245
|
+
.map((id) => artifactMap.get(id))
|
|
246
|
+
.filter((a) => !!a);
|
|
247
|
+
const category = llmCluster.category;
|
|
248
|
+
const actions = (0, prioritize_1.buildActions)(clusterArtifacts, category);
|
|
249
|
+
const ids = clusterArtifacts.map((a) => a.id);
|
|
250
|
+
return {
|
|
251
|
+
id: (0, cluster_id_1.stableClusterId)(ids),
|
|
252
|
+
title: llmCluster.title,
|
|
253
|
+
summary: llmCluster.summary,
|
|
254
|
+
category,
|
|
255
|
+
artifacts: clusterArtifacts,
|
|
256
|
+
priorityScore: llmCluster.priorityScore,
|
|
257
|
+
priorityReasons: llmCluster.priorityReasons,
|
|
258
|
+
estimatedMinutes: clampAiEstimateMinutes(category, llmCluster.estimatedMinutes),
|
|
259
|
+
status: "todo",
|
|
260
|
+
actions,
|
|
261
|
+
};
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=ai-synthesize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-synthesize.js","sourceRoot":"","sources":["../../src/pipeline/ai-synthesize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster-id.d.ts","sourceRoot":"","sources":["../../src/pipeline/cluster-id.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAI7D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.stableClusterId = stableClusterId;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
/**
|
|
6
|
+
* Stable id for a cluster from its artifact membership (same set => same id across runs).
|
|
7
|
+
*/
|
|
8
|
+
function stableClusterId(artifactIds) {
|
|
9
|
+
const key = [...artifactIds].sort().join("|");
|
|
10
|
+
const hash = (0, crypto_1.createHash)("sha256").update(key).digest("hex").slice(0, 12);
|
|
11
|
+
return `cluster-${hash}`;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=cluster-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster-id.js","sourceRoot":"","sources":["../../src/pipeline/cluster-id.ts"],"names":[],"mappings":";;AAKA,0CAIC;AATD,mCAAoC;AAEpC;;GAEG;AACH,SAAgB,eAAe,CAAC,WAAqB;IACnD,MAAM,GAAG,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzE,OAAO,WAAW,IAAI,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Artifact } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Links related artifacts by matching IDs, URLs, and branch names across sources.
|
|
4
|
+
* For V1, this is purely deterministic (regex + exact match).
|
|
5
|
+
*/
|
|
6
|
+
export declare function correlate(artifacts: Artifact[]): Artifact[];
|
|
7
|
+
//# sourceMappingURL=correlate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correlate.d.ts","sourceRoot":"","sources":["../../src/pipeline/correlate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC;;;GAGG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAuE3D"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.correlate = correlate;
|
|
4
|
+
/**
|
|
5
|
+
* Links related artifacts by matching IDs, URLs, and branch names across sources.
|
|
6
|
+
* For V1, this is purely deterministic (regex + exact match).
|
|
7
|
+
*/
|
|
8
|
+
function correlate(artifacts) {
|
|
9
|
+
const urlIndex = new Map();
|
|
10
|
+
const idPatterns = new Map();
|
|
11
|
+
for (const artifact of artifacts) {
|
|
12
|
+
urlIndex.set(artifact.sourceUrl, artifact.id);
|
|
13
|
+
const ids = extractIdentifiers(artifact);
|
|
14
|
+
for (const id of ids) {
|
|
15
|
+
const existing = idPatterns.get(id) ?? [];
|
|
16
|
+
existing.push(artifact.id);
|
|
17
|
+
idPatterns.set(id, existing);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const sourceUrlToId = new Map();
|
|
21
|
+
for (const a of artifacts) {
|
|
22
|
+
if (a.sourceUrl)
|
|
23
|
+
sourceUrlToId.set(a.sourceUrl, a.id);
|
|
24
|
+
}
|
|
25
|
+
const correlated = artifacts.map((artifact) => {
|
|
26
|
+
const related = new Set(artifact.relatedArtifactIds);
|
|
27
|
+
const textToSearch = [
|
|
28
|
+
artifact.title,
|
|
29
|
+
artifact.description ?? "",
|
|
30
|
+
String(artifact.metadata.headRefName ?? ""),
|
|
31
|
+
].join(" ");
|
|
32
|
+
for (const other of artifacts) {
|
|
33
|
+
if (other.id === artifact.id)
|
|
34
|
+
continue;
|
|
35
|
+
if (textMentionsId(textToSearch, other)) {
|
|
36
|
+
related.add(other.id);
|
|
37
|
+
}
|
|
38
|
+
const otherText = [
|
|
39
|
+
other.title,
|
|
40
|
+
other.description ?? "",
|
|
41
|
+
String(other.metadata.headRefName ?? ""),
|
|
42
|
+
].join(" ");
|
|
43
|
+
if (textMentionsId(otherText, artifact)) {
|
|
44
|
+
related.add(other.id);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const embeddedLinks = artifact.metadata.links ?? [];
|
|
48
|
+
for (const link of embeddedLinks) {
|
|
49
|
+
const matchedId = sourceUrlToId.get(link);
|
|
50
|
+
if (matchedId && matchedId !== artifact.id) {
|
|
51
|
+
related.add(matchedId);
|
|
52
|
+
}
|
|
53
|
+
for (const other of artifacts) {
|
|
54
|
+
if (other.id === artifact.id)
|
|
55
|
+
continue;
|
|
56
|
+
if (other.sourceUrl && link.includes(other.sourceUrl)) {
|
|
57
|
+
related.add(other.id);
|
|
58
|
+
}
|
|
59
|
+
if (other.sourceUrl && other.sourceUrl.includes(link)) {
|
|
60
|
+
related.add(other.id);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
...artifact,
|
|
66
|
+
relatedArtifactIds: Array.from(related),
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
return correlated;
|
|
70
|
+
}
|
|
71
|
+
function extractIdentifiers(artifact) {
|
|
72
|
+
const ids = [];
|
|
73
|
+
ids.push(artifact.externalId);
|
|
74
|
+
if (artifact.connectorId === "linear" && artifact.externalId) {
|
|
75
|
+
ids.push(artifact.externalId); // e.g., "ENG-451"
|
|
76
|
+
}
|
|
77
|
+
if (artifact.connectorId === "github") {
|
|
78
|
+
const repo = artifact.metadata.repository;
|
|
79
|
+
if (repo) {
|
|
80
|
+
ids.push(`${repo}#${artifact.externalId}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return ids;
|
|
84
|
+
}
|
|
85
|
+
function textMentionsId(text, artifact) {
|
|
86
|
+
const externalId = artifact.externalId;
|
|
87
|
+
// Direct mention of issue/PR number with # prefix
|
|
88
|
+
if (artifact.connectorId === "github") {
|
|
89
|
+
const repo = artifact.metadata.repository;
|
|
90
|
+
if (repo && text.includes(`${repo}#${externalId}`))
|
|
91
|
+
return true;
|
|
92
|
+
if (text.match(new RegExp(`#${externalId}\\b`)))
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
// Linear identifier (e.g., ENG-451)
|
|
96
|
+
if (artifact.connectorId === "linear") {
|
|
97
|
+
if (text.includes(externalId))
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
// URL match
|
|
101
|
+
if (text.includes(artifact.sourceUrl))
|
|
102
|
+
return true;
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=correlate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correlate.js","sourceRoot":"","sources":["../../src/pipeline/correlate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ConnectorRegistry } from "../connectors/registry";
|
|
2
|
+
import type { RawEvent } from "../types";
|
|
3
|
+
export declare const log: {
|
|
4
|
+
info: (msg: string) => void;
|
|
5
|
+
warn: (msg: string) => void;
|
|
6
|
+
error: (msg: string) => void;
|
|
7
|
+
};
|
|
8
|
+
export interface IngestionResult {
|
|
9
|
+
events: RawEvent[];
|
|
10
|
+
errors: string[];
|
|
11
|
+
}
|
|
12
|
+
export declare class IngestionOrchestrator {
|
|
13
|
+
private readonly registry;
|
|
14
|
+
constructor(registry: ConnectorRegistry);
|
|
15
|
+
fetchAll(enabledIds: string[]): Promise<IngestionResult>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ingest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/pipeline/ingest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,GAAG;gBACF,MAAM;gBACN,MAAM;iBACL,MAAM;CACpB,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,iBAAiB;IAElD,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC;CAmD/D"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IngestionOrchestrator = exports.log = void 0;
|
|
4
|
+
exports.log = {
|
|
5
|
+
info: (msg) => console.error(`[info] ${msg}`),
|
|
6
|
+
warn: (msg) => console.error(`[warn] ${msg}`),
|
|
7
|
+
error: (msg) => console.error(`[error] ${msg}`),
|
|
8
|
+
};
|
|
9
|
+
class IngestionOrchestrator {
|
|
10
|
+
registry;
|
|
11
|
+
constructor(registry) {
|
|
12
|
+
this.registry = registry;
|
|
13
|
+
}
|
|
14
|
+
async fetchAll(enabledIds) {
|
|
15
|
+
const connectors = this.registry.getEnabled(enabledIds);
|
|
16
|
+
exports.log.info(`Fetching from ${connectors.length} connector(s): ${enabledIds.join(", ")}`);
|
|
17
|
+
if (connectors.length === 0) {
|
|
18
|
+
exports.log.warn("No enabled connectors found.");
|
|
19
|
+
return { events: [], errors: [] };
|
|
20
|
+
}
|
|
21
|
+
const events = [];
|
|
22
|
+
const errors = [];
|
|
23
|
+
const results = await Promise.allSettled(connectors.map(async (connector) => {
|
|
24
|
+
exports.log.info(`[${connector.id}] Authenticating...`);
|
|
25
|
+
const authed = await connector.authenticate();
|
|
26
|
+
if (!authed) {
|
|
27
|
+
throw new Error("Authentication failed");
|
|
28
|
+
}
|
|
29
|
+
exports.log.info(`[${connector.id}] Authenticated. Fetching data...`);
|
|
30
|
+
const fetched = await connector.fetch();
|
|
31
|
+
exports.log.info(`[${connector.id}] Got ${fetched.length} event(s).`);
|
|
32
|
+
return fetched;
|
|
33
|
+
}));
|
|
34
|
+
for (let i = 0; i < results.length; i++) {
|
|
35
|
+
const result = results[i];
|
|
36
|
+
const connectorId = connectors[i].id;
|
|
37
|
+
if (result.status === "fulfilled") {
|
|
38
|
+
events.push(...result.value);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
const msg = result.reason instanceof Error
|
|
42
|
+
? result.reason.message
|
|
43
|
+
: String(result.reason);
|
|
44
|
+
exports.log.error(`[${connectorId}] Failed: ${msg}`);
|
|
45
|
+
errors.push(`${connectors[i].name}: ${msg}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.log.info(`Total: ${events.length} event(s), ${errors.length} error(s).`);
|
|
49
|
+
if (events.length === 0 && errors.length > 0) {
|
|
50
|
+
throw new Error(`All connectors failed:\n${errors.join("\n")}`);
|
|
51
|
+
}
|
|
52
|
+
return { events, errors };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.IngestionOrchestrator = IngestionOrchestrator;
|
|
56
|
+
//# sourceMappingURL=ingest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/pipeline/ingest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Artifact, TaskCluster } from "../types";
|
|
2
|
+
/** Calendar date string aligned with `WorkweavePlan.date` / `getCachedPlan` (UTC YYYY-MM-DD). */
|
|
3
|
+
export declare function calendarTodayString(): string;
|
|
4
|
+
/**
|
|
5
|
+
* Drop clusters with no remaining artifacts; refresh artifact refs and actions from current data.
|
|
6
|
+
*/
|
|
7
|
+
export declare function pruneAndRefreshClusters(clusters: TaskCluster[], artifactById: Map<string, Artifact>): TaskCluster[];
|
|
8
|
+
/**
|
|
9
|
+
* Insert each incoming cluster by descending priority score without reordering
|
|
10
|
+
* existing clusters relative to each other.
|
|
11
|
+
*/
|
|
12
|
+
export declare function mergeByPriorityInsertion(oldClusters: TaskCluster[], newClusters: TaskCluster[]): TaskCluster[];
|
|
13
|
+
export declare function applyClusterStatuses(merged: TaskCluster[], previous: TaskCluster[]): TaskCluster[];
|
|
14
|
+
//# sourceMappingURL=merge-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-plan.d.ts","sourceRoot":"","sources":["../../src/pipeline/merge-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAItD,iGAAiG;AACjG,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,WAAW,EAAE,EACvB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAClC,WAAW,EAAE,CAsBf;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,WAAW,EAAE,EAC1B,WAAW,EAAE,WAAW,EAAE,GACzB,WAAW,EAAE,CAgBf;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,WAAW,EAAE,EACrB,QAAQ,EAAE,WAAW,EAAE,GACtB,WAAW,EAAE,CAWf"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calendarTodayString = calendarTodayString;
|
|
4
|
+
exports.pruneAndRefreshClusters = pruneAndRefreshClusters;
|
|
5
|
+
exports.mergeByPriorityInsertion = mergeByPriorityInsertion;
|
|
6
|
+
exports.applyClusterStatuses = applyClusterStatuses;
|
|
7
|
+
const cluster_id_1 = require("./cluster-id");
|
|
8
|
+
const prioritize_1 = require("./prioritize");
|
|
9
|
+
/** Calendar date string aligned with `WorkweavePlan.date` / `getCachedPlan` (UTC YYYY-MM-DD). */
|
|
10
|
+
function calendarTodayString() {
|
|
11
|
+
return new Date().toISOString().split("T")[0];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Drop clusters with no remaining artifacts; refresh artifact refs and actions from current data.
|
|
15
|
+
*/
|
|
16
|
+
function pruneAndRefreshClusters(clusters, artifactById) {
|
|
17
|
+
const out = [];
|
|
18
|
+
for (const c of clusters) {
|
|
19
|
+
const kept = c.artifacts
|
|
20
|
+
.map((a) => artifactById.get(a.id))
|
|
21
|
+
.filter((a) => !!a);
|
|
22
|
+
if (kept.length === 0)
|
|
23
|
+
continue;
|
|
24
|
+
const category = (0, prioritize_1.inferCategory)(kept);
|
|
25
|
+
const actions = (0, prioritize_1.buildActions)(kept, category);
|
|
26
|
+
const id = (0, cluster_id_1.stableClusterId)(kept.map((a) => a.id));
|
|
27
|
+
out.push({
|
|
28
|
+
...c,
|
|
29
|
+
id,
|
|
30
|
+
category,
|
|
31
|
+
artifacts: kept,
|
|
32
|
+
summary: (0, prioritize_1.buildSummary)(kept),
|
|
33
|
+
actions,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Insert each incoming cluster by descending priority score without reordering
|
|
40
|
+
* existing clusters relative to each other.
|
|
41
|
+
*/
|
|
42
|
+
function mergeByPriorityInsertion(oldClusters, newClusters) {
|
|
43
|
+
const result = [...oldClusters];
|
|
44
|
+
const sortedNew = [...newClusters].sort((a, b) => b.priorityScore - a.priorityScore);
|
|
45
|
+
for (const nc of sortedNew) {
|
|
46
|
+
let insertAt = result.length;
|
|
47
|
+
for (let i = 0; i < result.length; i++) {
|
|
48
|
+
if (nc.priorityScore > result[i].priorityScore) {
|
|
49
|
+
insertAt = i;
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
result.splice(insertAt, 0, nc);
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
function applyClusterStatuses(merged, previous) {
|
|
58
|
+
const prevById = new Map(previous.map((c) => [c.id, c]));
|
|
59
|
+
return merged.map((c) => {
|
|
60
|
+
const p = prevById.get(c.id);
|
|
61
|
+
if (!p)
|
|
62
|
+
return c;
|
|
63
|
+
return {
|
|
64
|
+
...c,
|
|
65
|
+
status: p.status,
|
|
66
|
+
snoozedUntil: p.snoozedUntil,
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=merge-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-plan.js","sourceRoot":"","sources":["../../src/pipeline/merge-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/pipeline/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAgB,MAAM,UAAU,CAAC;AAEjE,wBAAgB,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAWxD"}
|