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.
Files changed (110) hide show
  1. package/README.md +82 -0
  2. package/TASK-AGENT-POSTS.md +112 -0
  3. package/assets/shout-default.svg +5 -0
  4. package/bin/shout +68 -0
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +29 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/lib/ai.d.ts +13 -0
  10. package/dist/lib/ai.d.ts.map +1 -0
  11. package/dist/lib/ai.js +135 -0
  12. package/dist/lib/ai.js.map +1 -0
  13. package/dist/lib/content-filter.d.ts +74 -0
  14. package/dist/lib/content-filter.d.ts.map +1 -0
  15. package/dist/lib/content-filter.js +188 -0
  16. package/dist/lib/content-filter.js.map +1 -0
  17. package/dist/lib/context-extractor.d.ts +39 -0
  18. package/dist/lib/context-extractor.d.ts.map +1 -0
  19. package/dist/lib/context-extractor.js +170 -0
  20. package/dist/lib/context-extractor.js.map +1 -0
  21. package/dist/lib/match-engine.d.ts +31 -0
  22. package/dist/lib/match-engine.d.ts.map +1 -0
  23. package/dist/lib/match-engine.js +322 -0
  24. package/dist/lib/match-engine.js.map +1 -0
  25. package/dist/lib/metadata.d.ts +7 -0
  26. package/dist/lib/metadata.d.ts.map +1 -0
  27. package/dist/lib/metadata.js +311 -0
  28. package/dist/lib/metadata.js.map +1 -0
  29. package/dist/lib/skills.d.ts +3 -0
  30. package/dist/lib/skills.d.ts.map +1 -0
  31. package/dist/lib/skills.js +20 -0
  32. package/dist/lib/skills.js.map +1 -0
  33. package/dist/lib/supabase.d.ts +2 -0
  34. package/dist/lib/supabase.d.ts.map +1 -0
  35. package/dist/lib/supabase.js +8 -0
  36. package/dist/lib/supabase.js.map +1 -0
  37. package/dist/tools/collections.d.ts +3 -0
  38. package/dist/tools/collections.d.ts.map +1 -0
  39. package/dist/tools/collections.js +142 -0
  40. package/dist/tools/collections.js.map +1 -0
  41. package/dist/tools/intros.d.ts +3 -0
  42. package/dist/tools/intros.d.ts.map +1 -0
  43. package/dist/tools/intros.js +483 -0
  44. package/dist/tools/intros.js.map +1 -0
  45. package/dist/tools/links.d.ts +3 -0
  46. package/dist/tools/links.d.ts.map +1 -0
  47. package/dist/tools/links.js +424 -0
  48. package/dist/tools/links.js.map +1 -0
  49. package/dist/tools/posts.d.ts +3 -0
  50. package/dist/tools/posts.d.ts.map +1 -0
  51. package/dist/tools/posts.js +212 -0
  52. package/dist/tools/posts.js.map +1 -0
  53. package/dist/tools/settings.d.ts +3 -0
  54. package/dist/tools/settings.d.ts.map +1 -0
  55. package/dist/tools/settings.js +45 -0
  56. package/dist/tools/settings.js.map +1 -0
  57. package/dist/tools/shout_agent_curate.d.ts +28 -0
  58. package/dist/tools/shout_agent_curate.d.ts.map +1 -0
  59. package/dist/tools/shout_agent_curate.js +80 -0
  60. package/dist/tools/shout_agent_curate.js.map +1 -0
  61. package/dist/tools/social.d.ts +3 -0
  62. package/dist/tools/social.d.ts.map +1 -0
  63. package/dist/tools/social.js +169 -0
  64. package/dist/tools/social.js.map +1 -0
  65. package/dist/types.d.ts +60 -0
  66. package/dist/types.d.ts.map +1 -0
  67. package/dist/types.js +3 -0
  68. package/dist/types.js.map +1 -0
  69. package/package.json +24 -0
  70. package/quick-test.ts +22 -0
  71. package/regenerate-summaries.ts +111 -0
  72. package/save-jeffries-shout.ts +38 -0
  73. package/save-openai-shout.ts +35 -0
  74. package/save-prcarly.ts +46 -0
  75. package/save-shout.ts +35 -0
  76. package/save-techcrunch-shout.ts +59 -0
  77. package/save-zdnet-shout.ts +36 -0
  78. package/skills/collection-routing/SKILL.md +34 -0
  79. package/skills/link-summary/SKILL.md +53 -0
  80. package/skills/tagging-and-routing/SKILL.md +54 -0
  81. package/src/index.ts +32 -0
  82. package/src/lib/ai.ts +166 -0
  83. package/src/lib/content-filter.ts +258 -0
  84. package/src/lib/metadata.ts +353 -0
  85. package/src/lib/skills.ts +21 -0
  86. package/src/lib/supabase.ts +12 -0
  87. package/src/tools/collections.ts +182 -0
  88. package/src/tools/links.ts +524 -0
  89. package/src/tools/posts.ts +264 -0
  90. package/src/tools/settings.ts +55 -0
  91. package/src/tools/shout_agent_curate.ts +95 -0
  92. package/src/tools/social.ts +206 -0
  93. package/src/types.ts +66 -0
  94. package/supabase/.temp/cli-latest +1 -0
  95. package/supabase/.temp/gotrue-version +1 -0
  96. package/supabase/.temp/pooler-url +1 -0
  97. package/supabase/.temp/postgres-version +1 -0
  98. package/supabase/.temp/project-ref +1 -0
  99. package/supabase/.temp/rest-version +1 -0
  100. package/supabase/.temp/storage-migration +1 -0
  101. package/supabase/.temp/storage-version +1 -0
  102. package/supabase/migrations/001_initial_schema.sql +147 -0
  103. package/supabase/migrations/20260317010000_decouple_profiles_from_auth.sql +9 -0
  104. package/supabase/migrations/20260317020000_agent_curation.sql +10 -0
  105. package/supabase/migrations/20260320000000_agent_posts.sql +41 -0
  106. package/supabase/migrations/20260320120000_fix_draft_fk.sql +2 -0
  107. package/supabase/migrations/20260320130000_fix_identity.sql +17 -0
  108. package/supabase/migrations/20260320170000_intros.sql +118 -0
  109. package/test-model-comparison.ts +89 -0
  110. 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"}