nod-shout 0.1.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 +82 -0
- package/TASK-AGENT-POSTS.md +112 -0
- package/assets/shout-default.svg +5 -0
- package/bin/shout +68 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/ai.d.ts +13 -0
- package/dist/lib/ai.d.ts.map +1 -0
- package/dist/lib/ai.js +135 -0
- package/dist/lib/ai.js.map +1 -0
- package/dist/lib/content-filter.d.ts +74 -0
- package/dist/lib/content-filter.d.ts.map +1 -0
- package/dist/lib/content-filter.js +188 -0
- package/dist/lib/content-filter.js.map +1 -0
- package/dist/lib/context-extractor.d.ts +39 -0
- package/dist/lib/context-extractor.d.ts.map +1 -0
- package/dist/lib/context-extractor.js +170 -0
- package/dist/lib/context-extractor.js.map +1 -0
- package/dist/lib/match-engine.d.ts +31 -0
- package/dist/lib/match-engine.d.ts.map +1 -0
- package/dist/lib/match-engine.js +322 -0
- package/dist/lib/match-engine.js.map +1 -0
- package/dist/lib/metadata.d.ts +7 -0
- package/dist/lib/metadata.d.ts.map +1 -0
- package/dist/lib/metadata.js +311 -0
- package/dist/lib/metadata.js.map +1 -0
- package/dist/lib/skills.d.ts +3 -0
- package/dist/lib/skills.d.ts.map +1 -0
- package/dist/lib/skills.js +20 -0
- package/dist/lib/skills.js.map +1 -0
- package/dist/lib/supabase.d.ts +2 -0
- package/dist/lib/supabase.d.ts.map +1 -0
- package/dist/lib/supabase.js +8 -0
- package/dist/lib/supabase.js.map +1 -0
- package/dist/tools/collections.d.ts +3 -0
- package/dist/tools/collections.d.ts.map +1 -0
- package/dist/tools/collections.js +142 -0
- package/dist/tools/collections.js.map +1 -0
- package/dist/tools/intros.d.ts +3 -0
- package/dist/tools/intros.d.ts.map +1 -0
- package/dist/tools/intros.js +483 -0
- package/dist/tools/intros.js.map +1 -0
- package/dist/tools/links.d.ts +3 -0
- package/dist/tools/links.d.ts.map +1 -0
- package/dist/tools/links.js +424 -0
- package/dist/tools/links.js.map +1 -0
- package/dist/tools/posts.d.ts +3 -0
- package/dist/tools/posts.d.ts.map +1 -0
- package/dist/tools/posts.js +212 -0
- package/dist/tools/posts.js.map +1 -0
- package/dist/tools/settings.d.ts +3 -0
- package/dist/tools/settings.d.ts.map +1 -0
- package/dist/tools/settings.js +45 -0
- package/dist/tools/settings.js.map +1 -0
- package/dist/tools/shout_agent_curate.d.ts +28 -0
- package/dist/tools/shout_agent_curate.d.ts.map +1 -0
- package/dist/tools/shout_agent_curate.js +80 -0
- package/dist/tools/shout_agent_curate.js.map +1 -0
- package/dist/tools/social.d.ts +3 -0
- package/dist/tools/social.d.ts.map +1 -0
- package/dist/tools/social.js +169 -0
- package/dist/tools/social.js.map +1 -0
- package/dist/types.d.ts +60 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +24 -0
- package/quick-test.ts +22 -0
- package/regenerate-summaries.ts +111 -0
- package/save-jeffries-shout.ts +38 -0
- package/save-openai-shout.ts +35 -0
- package/save-prcarly.ts +46 -0
- package/save-shout.ts +35 -0
- package/save-techcrunch-shout.ts +59 -0
- package/save-zdnet-shout.ts +36 -0
- package/skills/collection-routing/SKILL.md +34 -0
- package/skills/link-summary/SKILL.md +53 -0
- package/skills/tagging-and-routing/SKILL.md +54 -0
- package/src/index.ts +32 -0
- package/src/lib/ai.ts +166 -0
- package/src/lib/content-filter.ts +258 -0
- package/src/lib/metadata.ts +353 -0
- package/src/lib/skills.ts +21 -0
- package/src/lib/supabase.ts +12 -0
- package/src/tools/collections.ts +182 -0
- package/src/tools/links.ts +524 -0
- package/src/tools/posts.ts +264 -0
- package/src/tools/settings.ts +55 -0
- package/src/tools/shout_agent_curate.ts +95 -0
- package/src/tools/social.ts +206 -0
- package/src/types.ts +66 -0
- package/supabase/.temp/cli-latest +1 -0
- package/supabase/.temp/gotrue-version +1 -0
- package/supabase/.temp/pooler-url +1 -0
- package/supabase/.temp/postgres-version +1 -0
- package/supabase/.temp/project-ref +1 -0
- package/supabase/.temp/rest-version +1 -0
- package/supabase/.temp/storage-migration +1 -0
- package/supabase/.temp/storage-version +1 -0
- package/supabase/migrations/001_initial_schema.sql +147 -0
- package/supabase/migrations/20260317010000_decouple_profiles_from_auth.sql +9 -0
- package/supabase/migrations/20260317020000_agent_curation.sql +10 -0
- package/supabase/migrations/20260320000000_agent_posts.sql +41 -0
- package/supabase/migrations/20260320120000_fix_draft_fk.sql +2 -0
- package/supabase/migrations/20260320130000_fix_identity.sql +17 -0
- package/supabase/migrations/20260320170000_intros.sql +118 -0
- package/test-model-comparison.ts +89 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nod intros match engine
|
|
3
|
+
*
|
|
4
|
+
* scores pairs of opted-in users based on:
|
|
5
|
+
* - need/offer alignment (40%) — does user A need what user B offers?
|
|
6
|
+
* - interest/expertise overlap (20%) — shared topics
|
|
7
|
+
* - industry overlap (20%) — same industries
|
|
8
|
+
* - recency (10%) — both recently active
|
|
9
|
+
* - history (10%) — haven't been matched before / past success
|
|
10
|
+
*
|
|
11
|
+
* runs as a callable function (triggered by cron or on profile update)
|
|
12
|
+
*/
|
|
13
|
+
import { supabase } from "./supabase.js";
|
|
14
|
+
const OPENAI_API_KEY = process.env.OPENAI_API_KEY;
|
|
15
|
+
// compute jaccard similarity between two string arrays (case-insensitive)
|
|
16
|
+
function jaccardSimilarity(a, b) {
|
|
17
|
+
if (a.length === 0 && b.length === 0)
|
|
18
|
+
return 0;
|
|
19
|
+
const setA = new Set(a.map(s => s.toLowerCase().trim()));
|
|
20
|
+
const setB = new Set(b.map(s => s.toLowerCase().trim()));
|
|
21
|
+
const intersection = new Set([...setA].filter(x => setB.has(x)));
|
|
22
|
+
const union = new Set([...setA, ...setB]);
|
|
23
|
+
return union.size === 0 ? 0 : intersection.size / union.size;
|
|
24
|
+
}
|
|
25
|
+
// score need/offer alignment between two users using keyword overlap
|
|
26
|
+
function scoreNeedOfferAlignment(a, b) {
|
|
27
|
+
let score = 0;
|
|
28
|
+
let comparisons = 0;
|
|
29
|
+
// check if A's needs match B's offers
|
|
30
|
+
for (const need of a.needs) {
|
|
31
|
+
const needWords = new Set((need.description || "").toLowerCase().split(/\s+/).filter((w) => w.length > 3));
|
|
32
|
+
for (const offer of b.offers) {
|
|
33
|
+
const offerWords = new Set((offer.description || "").toLowerCase().split(/\s+/).filter((w) => w.length > 3));
|
|
34
|
+
const overlap = [...needWords].filter(w => offerWords.has(w)).length;
|
|
35
|
+
const total = new Set([...needWords, ...offerWords]).size;
|
|
36
|
+
if (total > 0) {
|
|
37
|
+
score += overlap / total;
|
|
38
|
+
comparisons++;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// check if B's needs match A's offers
|
|
43
|
+
for (const need of b.needs) {
|
|
44
|
+
const needWords = new Set((need.description || "").toLowerCase().split(/\s+/).filter((w) => w.length > 3));
|
|
45
|
+
for (const offer of a.offers) {
|
|
46
|
+
const offerWords = new Set((offer.description || "").toLowerCase().split(/\s+/).filter((w) => w.length > 3));
|
|
47
|
+
const overlap = [...needWords].filter(w => offerWords.has(w)).length;
|
|
48
|
+
const total = new Set([...needWords, ...offerWords]).size;
|
|
49
|
+
if (total > 0) {
|
|
50
|
+
score += overlap / total;
|
|
51
|
+
comparisons++;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// also check project descriptions against offers
|
|
56
|
+
for (const proj of a.current_projects) {
|
|
57
|
+
const projWords = new Set((proj.description || "").toLowerCase().split(/\s+/).filter((w) => w.length > 3));
|
|
58
|
+
for (const offer of b.offers) {
|
|
59
|
+
const offerWords = new Set((offer.description || "").toLowerCase().split(/\s+/).filter((w) => w.length > 3));
|
|
60
|
+
const overlap = [...projWords].filter(w => offerWords.has(w)).length;
|
|
61
|
+
const total = new Set([...projWords, ...offerWords]).size;
|
|
62
|
+
if (total > 0) {
|
|
63
|
+
score += overlap / total * 0.5; // lower weight for project-offer
|
|
64
|
+
comparisons++;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return comparisons === 0 ? 0 : Math.min(score / comparisons, 1);
|
|
69
|
+
}
|
|
70
|
+
// score recency — both users recently updated their profiles
|
|
71
|
+
function scoreRecency(a, b) {
|
|
72
|
+
const now = Date.now();
|
|
73
|
+
const aAge = a.last_profile_update ? (now - new Date(a.last_profile_update).getTime()) / (1000 * 60 * 60 * 24) : 999;
|
|
74
|
+
const bAge = b.last_profile_update ? (now - new Date(b.last_profile_update).getTime()) / (1000 * 60 * 60 * 24) : 999;
|
|
75
|
+
// score higher if both updated recently (within 7 days = 1.0, 30 days = 0.5, older = 0.1)
|
|
76
|
+
const aScore = aAge < 7 ? 1.0 : aAge < 30 ? 0.5 : 0.1;
|
|
77
|
+
const bScore = bAge < 7 ? 1.0 : bAge < 30 ? 0.5 : 0.1;
|
|
78
|
+
return (aScore + bScore) / 2;
|
|
79
|
+
}
|
|
80
|
+
// compute full match score between two profiles
|
|
81
|
+
function computeMatchScore(a, b) {
|
|
82
|
+
const needOfferScore = scoreNeedOfferAlignment(a, b);
|
|
83
|
+
const interestScore = jaccardSimilarity([...(a.interests || []), ...(a.expertise || [])], [...(b.interests || []), ...(b.expertise || [])]);
|
|
84
|
+
const industryScore = jaccardSimilarity(a.industries || [], b.industries || []);
|
|
85
|
+
const recencyScore = scoreRecency(a, b);
|
|
86
|
+
const historyScore = 1.0; // default — reduced later if they've been matched before
|
|
87
|
+
const score = needOfferScore * 0.4 +
|
|
88
|
+
interestScore * 0.2 +
|
|
89
|
+
industryScore * 0.2 +
|
|
90
|
+
recencyScore * 0.1 +
|
|
91
|
+
historyScore * 0.1;
|
|
92
|
+
return {
|
|
93
|
+
score,
|
|
94
|
+
details: { needOfferScore, interestScore, industryScore, recencyScore, historyScore },
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// generate a reason string explaining why two users match
|
|
98
|
+
function generateMatchReason(a, b, details) {
|
|
99
|
+
const parts = [];
|
|
100
|
+
if (details.needOfferScore > 0.3) {
|
|
101
|
+
// find the best need/offer alignment
|
|
102
|
+
const aNeeds = (a.needs || []).map((n) => n.description).join(", ");
|
|
103
|
+
const bOffers = (b.offers || []).map((o) => o.description).join(", ");
|
|
104
|
+
const bNeeds = (b.needs || []).map((n) => n.description).join(", ");
|
|
105
|
+
const aOffers = (a.offers || []).map((o) => o.description).join(", ");
|
|
106
|
+
if (aNeeds && bOffers)
|
|
107
|
+
parts.push(`${a.user_id} needs help with ${aNeeds.substring(0, 80)} and ${b.user_id} offers ${bOffers.substring(0, 80)}`);
|
|
108
|
+
if (bNeeds && aOffers)
|
|
109
|
+
parts.push(`${b.user_id} needs ${bNeeds.substring(0, 80)} and ${a.user_id} offers ${aOffers.substring(0, 80)}`);
|
|
110
|
+
}
|
|
111
|
+
const sharedInterests = (a.interests || []).filter((i) => (b.interests || []).some((j) => j.toLowerCase() === i.toLowerCase()));
|
|
112
|
+
if (sharedInterests.length > 0) {
|
|
113
|
+
parts.push(`both interested in ${sharedInterests.slice(0, 3).join(", ")}`);
|
|
114
|
+
}
|
|
115
|
+
const sharedIndustries = (a.industries || []).filter((i) => (b.industries || []).some((j) => j.toLowerCase() === i.toLowerCase()));
|
|
116
|
+
if (sharedIndustries.length > 0) {
|
|
117
|
+
parts.push(`both in ${sharedIndustries.slice(0, 2).join(" and ")}`);
|
|
118
|
+
}
|
|
119
|
+
return parts.length > 0 ? parts.join(". ") : "potential synergy based on profiles";
|
|
120
|
+
}
|
|
121
|
+
// generate the pitch each user sees about the other (sanitized — no raw profile data)
|
|
122
|
+
function generatePitch(viewer, subject, reason) {
|
|
123
|
+
const projects = (subject.current_projects || []).map((p) => p.name).filter(Boolean);
|
|
124
|
+
const offers = (subject.offers || []).map((o) => o.description).filter(Boolean);
|
|
125
|
+
const expertise = (subject.expertise || []).slice(0, 3);
|
|
126
|
+
const parts = [];
|
|
127
|
+
if (projects.length > 0)
|
|
128
|
+
parts.push(`working on ${projects.slice(0, 2).join(" and ")}`);
|
|
129
|
+
if (expertise.length > 0)
|
|
130
|
+
parts.push(`skilled in ${expertise.join(", ")}`);
|
|
131
|
+
if (offers.length > 0)
|
|
132
|
+
parts.push(`can help with ${offers[0].substring(0, 60)}`);
|
|
133
|
+
const intro = parts.length > 0 ? `someone in the network ${parts.join(", ")}` : "someone who might be a good match";
|
|
134
|
+
return intro;
|
|
135
|
+
}
|
|
136
|
+
// use LLM to generate better pitches when available
|
|
137
|
+
async function generateLLMPitch(viewer, subject, reason) {
|
|
138
|
+
if (!OPENAI_API_KEY)
|
|
139
|
+
return generatePitch(viewer, subject, reason);
|
|
140
|
+
try {
|
|
141
|
+
const response = await fetch("https://api.openai.com/v1/chat/completions", {
|
|
142
|
+
method: "POST",
|
|
143
|
+
headers: {
|
|
144
|
+
"Content-Type": "application/json",
|
|
145
|
+
Authorization: `Bearer ${OPENAI_API_KEY}`,
|
|
146
|
+
},
|
|
147
|
+
body: JSON.stringify({
|
|
148
|
+
model: "gpt-4o-mini",
|
|
149
|
+
messages: [
|
|
150
|
+
{
|
|
151
|
+
role: "system",
|
|
152
|
+
content: `You write brief, compelling intro pitches for a professional networking tool. The pitch explains why someone should meet another person. Keep it under 2 sentences. Be specific about what makes this connection valuable. Never include names, emails, or identifying info — use vague references like "someone in the network". Don't use filler phrases like "exciting opportunity" or "perfect match".`,
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
role: "user",
|
|
156
|
+
content: `The viewer's needs: ${JSON.stringify((viewer.needs || []).map((n) => n.description))}
|
|
157
|
+
The viewer's interests: ${(viewer.interests || []).join(", ")}
|
|
158
|
+
|
|
159
|
+
The person being pitched:
|
|
160
|
+
- Projects: ${JSON.stringify((subject.current_projects || []).map((p) => ({ name: p.name, description: p.description })))}
|
|
161
|
+
- Offers: ${JSON.stringify((subject.offers || []).map((o) => o.description))}
|
|
162
|
+
- Expertise: ${(subject.expertise || []).join(", ")}
|
|
163
|
+
- Industries: ${(subject.industries || []).join(", ")}
|
|
164
|
+
|
|
165
|
+
Match reason: ${reason}
|
|
166
|
+
|
|
167
|
+
Write a 1-2 sentence pitch for the viewer about why they should meet this person.`,
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
temperature: 0.7,
|
|
171
|
+
max_tokens: 100,
|
|
172
|
+
}),
|
|
173
|
+
});
|
|
174
|
+
if (!response.ok)
|
|
175
|
+
return generatePitch(viewer, subject, reason);
|
|
176
|
+
const data = (await response.json());
|
|
177
|
+
return data.choices?.[0]?.message?.content?.trim() || generatePitch(viewer, subject, reason);
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return generatePitch(viewer, subject, reason);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Run the match engine.
|
|
185
|
+
* Finds all opted-in, non-paused profiles, scores all pairs,
|
|
186
|
+
* and creates match records for scores above threshold.
|
|
187
|
+
*/
|
|
188
|
+
export async function runMatchEngine(options) {
|
|
189
|
+
const minScore = options?.minScore ?? 0.6;
|
|
190
|
+
const maxPerUser = options?.maxMatchesPerUser ?? 3;
|
|
191
|
+
const useLLM = options?.useLLMPitches ?? true;
|
|
192
|
+
const errors = [];
|
|
193
|
+
// fetch all active profiles
|
|
194
|
+
const { data: profiles, error } = await supabase
|
|
195
|
+
.from("intro_profiles")
|
|
196
|
+
.select("*")
|
|
197
|
+
.eq("opted_in", true)
|
|
198
|
+
.eq("paused", false);
|
|
199
|
+
if (error || !profiles) {
|
|
200
|
+
return { matchesCreated: 0, profilesChecked: 0, errors: [`failed to fetch profiles: ${error?.message}`] };
|
|
201
|
+
}
|
|
202
|
+
if (profiles.length < 2) {
|
|
203
|
+
return { matchesCreated: 0, profilesChecked: profiles.length, errors: ["need at least 2 active profiles to match"] };
|
|
204
|
+
}
|
|
205
|
+
// fetch existing pending/completed matches to avoid duplicates
|
|
206
|
+
const { data: existingMatches } = await supabase
|
|
207
|
+
.from("intro_matches")
|
|
208
|
+
.select("user_a_id, user_b_id, status")
|
|
209
|
+
.in("status", ["pending", "completed"]);
|
|
210
|
+
const existingPairs = new Set((existingMatches || []).map(m => [m.user_a_id, m.user_b_id].sort().join("::")));
|
|
211
|
+
// track matches per user to respect max limit
|
|
212
|
+
const matchCountPerUser = {};
|
|
213
|
+
// count existing pending matches per user
|
|
214
|
+
for (const m of existingMatches || []) {
|
|
215
|
+
if (m.status === "pending") {
|
|
216
|
+
matchCountPerUser[m.user_a_id] = (matchCountPerUser[m.user_a_id] || 0) + 1;
|
|
217
|
+
matchCountPerUser[m.user_b_id] = (matchCountPerUser[m.user_b_id] || 0) + 1;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// score all pairs
|
|
221
|
+
const candidates = [];
|
|
222
|
+
for (let i = 0; i < profiles.length; i++) {
|
|
223
|
+
for (let j = i + 1; j < profiles.length; j++) {
|
|
224
|
+
const a = profiles[i];
|
|
225
|
+
const b = profiles[j];
|
|
226
|
+
// skip if already matched
|
|
227
|
+
const pairKey = [a.user_id, b.user_id].sort().join("::");
|
|
228
|
+
if (existingPairs.has(pairKey))
|
|
229
|
+
continue;
|
|
230
|
+
// skip if either has the other on blocklist
|
|
231
|
+
if ((a.blocklist || []).includes(b.user_id) || (b.blocklist || []).includes(a.user_id))
|
|
232
|
+
continue;
|
|
233
|
+
// skip if either has too many pending matches
|
|
234
|
+
if ((matchCountPerUser[a.user_id] || 0) >= maxPerUser)
|
|
235
|
+
continue;
|
|
236
|
+
if ((matchCountPerUser[b.user_id] || 0) >= maxPerUser)
|
|
237
|
+
continue;
|
|
238
|
+
const { score, details } = computeMatchScore(a, b);
|
|
239
|
+
if (score >= minScore) {
|
|
240
|
+
const reason = generateMatchReason(a, b, details);
|
|
241
|
+
let pitchForA;
|
|
242
|
+
let pitchForB;
|
|
243
|
+
if (useLLM) {
|
|
244
|
+
[pitchForA, pitchForB] = await Promise.all([
|
|
245
|
+
generateLLMPitch(a, b, reason),
|
|
246
|
+
generateLLMPitch(b, a, reason),
|
|
247
|
+
]);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
pitchForA = generatePitch(a, b, reason);
|
|
251
|
+
pitchForB = generatePitch(b, a, reason);
|
|
252
|
+
}
|
|
253
|
+
candidates.push({
|
|
254
|
+
userA: a,
|
|
255
|
+
userB: b,
|
|
256
|
+
score,
|
|
257
|
+
reason,
|
|
258
|
+
details,
|
|
259
|
+
pitchForA,
|
|
260
|
+
pitchForB,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// sort by score descending
|
|
266
|
+
candidates.sort((a, b) => b.score - a.score);
|
|
267
|
+
// create matches (respecting per-user limits)
|
|
268
|
+
let matchesCreated = 0;
|
|
269
|
+
for (const candidate of candidates) {
|
|
270
|
+
const aId = candidate.userA.user_id;
|
|
271
|
+
const bId = candidate.userB.user_id;
|
|
272
|
+
if ((matchCountPerUser[aId] || 0) >= maxPerUser)
|
|
273
|
+
continue;
|
|
274
|
+
if ((matchCountPerUser[bId] || 0) >= maxPerUser)
|
|
275
|
+
continue;
|
|
276
|
+
const { error: insertError } = await supabase.from("intro_matches").insert({
|
|
277
|
+
user_a_id: aId,
|
|
278
|
+
user_b_id: bId,
|
|
279
|
+
score: candidate.score,
|
|
280
|
+
match_reason: candidate.reason,
|
|
281
|
+
match_details: candidate.details,
|
|
282
|
+
user_a_pitch: candidate.pitchForA,
|
|
283
|
+
user_b_pitch: candidate.pitchForB,
|
|
284
|
+
status: "pending",
|
|
285
|
+
expires_at: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),
|
|
286
|
+
});
|
|
287
|
+
if (insertError) {
|
|
288
|
+
// unique constraint violation = already matched, skip
|
|
289
|
+
if (insertError.code !== "23505") {
|
|
290
|
+
errors.push(`failed to create match ${aId} <> ${bId}: ${insertError.message}`);
|
|
291
|
+
}
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
matchCountPerUser[aId] = (matchCountPerUser[aId] || 0) + 1;
|
|
295
|
+
matchCountPerUser[bId] = (matchCountPerUser[bId] || 0) + 1;
|
|
296
|
+
matchesCreated++;
|
|
297
|
+
}
|
|
298
|
+
// update last_match_check for all profiles
|
|
299
|
+
const profileIds = profiles.map(p => p.id);
|
|
300
|
+
await supabase
|
|
301
|
+
.from("intro_profiles")
|
|
302
|
+
.update({ last_match_check: new Date().toISOString() })
|
|
303
|
+
.in("id", profileIds);
|
|
304
|
+
return {
|
|
305
|
+
matchesCreated,
|
|
306
|
+
profilesChecked: profiles.length,
|
|
307
|
+
errors,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Expire old matches that haven't been responded to.
|
|
312
|
+
*/
|
|
313
|
+
export async function expireStaleMatches() {
|
|
314
|
+
const { data, error } = await supabase
|
|
315
|
+
.from("intro_matches")
|
|
316
|
+
.update({ status: "expired", updated_at: new Date().toISOString() })
|
|
317
|
+
.eq("status", "pending")
|
|
318
|
+
.lt("expires_at", new Date().toISOString())
|
|
319
|
+
.select("id");
|
|
320
|
+
return data?.length || 0;
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=match-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match-engine.js","sourceRoot":"","sources":["../../src/lib/match-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PageMetadata } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* fetch a url and extract og/meta tags for link preview data.
|
|
4
|
+
* falls back through: twitter api -> og -> twitter -> json-ld -> html tags -> domain-specific selectors.
|
|
5
|
+
*/
|
|
6
|
+
export declare function extractMetadata(url: string): Promise<PageMetadata>;
|
|
7
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/lib/metadata.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAsOhD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAqHxE"}
|