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,483 @@
1
+ import { z } from "zod";
2
+ import { supabase } from "../lib/supabase.js";
3
+ import { filterPII } from "../lib/content-filter.js";
4
+ import { runMatchEngine, expireStaleMatches } from "../lib/match-engine.js";
5
+ import { extractContext, hasContextSignals } from "../lib/context-extractor.js";
6
+ const USER_ID = process.env.NOD_USER_ID || "anonymous";
7
+ // sanitize profile text through PII filter before storage
8
+ function sanitize(text) {
9
+ return filterPII(text).text;
10
+ }
11
+ export function registerIntroTools(server) {
12
+ // ─── Opt In ───────────────────────────────────────────────────────────
13
+ server.tool("intros_opt_in", "Opt in to nod intros — agent-brokered warm introductions. Set your preferences for how you want to be matched. Your agent will find people you should meet based on what you're working on, what you need, and what you can offer.", {
14
+ frequency: z.enum(["daily", "weekly", "monthly", "on_demand"]).optional().default("weekly").describe("How often to receive intro suggestions"),
15
+ trust_radius: z.enum(["contacts_only", "friends_of_friends", "open"]).optional().default("open").describe("Who can be suggested: contacts only, friends of friends, or anyone"),
16
+ preferred_method: z.enum(["agent_chat", "email", "text"]).optional().default("agent_chat").describe("How intros are facilitated"),
17
+ }, async ({ frequency, trust_radius, preferred_method }) => {
18
+ const { data, error } = await supabase
19
+ .from("intro_profiles")
20
+ .upsert({
21
+ user_id: USER_ID,
22
+ opted_in: true,
23
+ paused: false,
24
+ intro_frequency: frequency,
25
+ trust_radius,
26
+ preferred_intro_method: preferred_method,
27
+ updated_at: new Date().toISOString(),
28
+ }, { onConflict: "user_id" })
29
+ .select()
30
+ .single();
31
+ if (error)
32
+ return { content: [{ type: "text", text: `error opting in: ${error.message}` }] };
33
+ // log consent
34
+ await supabase.from("intro_consent_log").insert({
35
+ user_id: USER_ID,
36
+ action: "opt_in",
37
+ metadata: { frequency, trust_radius, preferred_method },
38
+ });
39
+ return {
40
+ content: [{
41
+ type: "text",
42
+ text: `āœ… you're opted in to nod intros!\n\nfrequency: ${frequency}\ntrust radius: ${trust_radius}\nintro method: ${preferred_method}\n\nnext: tell me about what you're working on, what you need, and what you can offer. i'll build your intro profile so i can find the right people for you.`,
43
+ }],
44
+ };
45
+ });
46
+ // ─── Update Profile ───────────────────────────────────────────────────
47
+ server.tool("intros_update_profile", "Update your intro profile with what you're working on, what you need, and what you can offer. This is what the match engine uses to find people you should meet. All text is sanitized to remove PII before storage.", {
48
+ current_projects: z.array(z.object({
49
+ name: z.string(),
50
+ description: z.string(),
51
+ stage: z.enum(["idea", "building", "launched", "growing", "mature"]).optional().default("building"),
52
+ })).optional().describe("What you're currently working on"),
53
+ needs: z.array(z.object({
54
+ description: z.string(),
55
+ urgency: z.enum(["low", "medium", "high"]).optional().default("medium"),
56
+ category: z.string().optional().default("general"),
57
+ })).optional().describe("What you need — skills, connections, advice, tools"),
58
+ offers: z.array(z.object({
59
+ description: z.string(),
60
+ category: z.string().optional().default("general"),
61
+ })).optional().describe("What you can offer — expertise, connections, resources"),
62
+ interests: z.array(z.string()).optional().describe("Topics you're interested in"),
63
+ expertise: z.array(z.string()).optional().describe("Areas of expertise"),
64
+ industries: z.array(z.string()).optional().describe("Industries you work in"),
65
+ }, async ({ current_projects, needs, offers, interests, expertise, industries }) => {
66
+ // get existing profile
67
+ const { data: existing } = await supabase
68
+ .from("intro_profiles")
69
+ .select("*")
70
+ .eq("user_id", USER_ID)
71
+ .single();
72
+ if (!existing) {
73
+ return { content: [{ type: "text", text: "you need to opt in first. use intros_opt_in to get started." }] };
74
+ }
75
+ // sanitize all text fields through PII filter
76
+ const updates = { updated_at: new Date().toISOString(), last_profile_update: new Date().toISOString() };
77
+ if (current_projects) {
78
+ const sanitized = current_projects.map(p => ({
79
+ ...p,
80
+ name: sanitize(p.name),
81
+ description: sanitize(p.description),
82
+ updated_at: new Date().toISOString(),
83
+ }));
84
+ // merge with existing, replacing by name
85
+ const existingProjects = (existing.current_projects || []);
86
+ const merged = [...existingProjects];
87
+ for (const proj of sanitized) {
88
+ const idx = merged.findIndex((p) => p.name === proj.name);
89
+ if (idx >= 0)
90
+ merged[idx] = proj;
91
+ else
92
+ merged.push(proj);
93
+ }
94
+ updates.current_projects = merged;
95
+ }
96
+ if (needs) {
97
+ const sanitized = needs.map(n => ({
98
+ ...n,
99
+ description: sanitize(n.description),
100
+ created_at: new Date().toISOString(),
101
+ }));
102
+ const existingNeeds = (existing.needs || []);
103
+ updates.needs = [...existingNeeds, ...sanitized];
104
+ }
105
+ if (offers) {
106
+ const sanitized = offers.map(o => ({
107
+ ...o,
108
+ description: sanitize(o.description),
109
+ confidence: 0.8,
110
+ }));
111
+ const existingOffers = (existing.offers || []);
112
+ updates.offers = [...existingOffers, ...sanitized];
113
+ }
114
+ if (interests)
115
+ updates.interests = [...new Set([...(existing.interests || []), ...interests])];
116
+ if (expertise)
117
+ updates.expertise = [...new Set([...(existing.expertise || []), ...expertise])];
118
+ if (industries)
119
+ updates.industries = [...new Set([...(existing.industries || []), ...industries])];
120
+ const { error } = await supabase
121
+ .from("intro_profiles")
122
+ .update(updates)
123
+ .eq("user_id", USER_ID);
124
+ if (error)
125
+ return { content: [{ type: "text", text: `error updating profile: ${error.message}` }] };
126
+ const parts = [];
127
+ if (current_projects)
128
+ parts.push(`${current_projects.length} project(s)`);
129
+ if (needs)
130
+ parts.push(`${needs.length} need(s)`);
131
+ if (offers)
132
+ parts.push(`${offers.length} offer(s)`);
133
+ if (interests)
134
+ parts.push(`${interests.length} interest(s)`);
135
+ if (expertise)
136
+ parts.push(`${expertise.length} expertise area(s)`);
137
+ if (industries)
138
+ parts.push(`${industries.length} industry/industries`);
139
+ return {
140
+ content: [{
141
+ type: "text",
142
+ text: `āœ… profile updated: ${parts.join(", ")}\n\nthe match engine will use this to find people you should meet.`,
143
+ }],
144
+ };
145
+ });
146
+ // ─── Get Suggestions ──────────────────────────────────────────────────
147
+ server.tool("intros_get_suggestions", "Get current intro suggestions — people you might want to meet based on your profile. Shows pending matches that need your approval.", {
148
+ limit: z.number().optional().default(5).describe("Max suggestions to return"),
149
+ include_context: z.boolean().optional().default(true).describe("Include match context/reason"),
150
+ }, async ({ limit, include_context }) => {
151
+ // get pending matches where this user hasn't responded yet
152
+ const { data: matches, error } = await supabase
153
+ .from("intro_matches")
154
+ .select("*")
155
+ .or(`user_a_id.eq.${USER_ID},user_b_id.eq.${USER_ID}`)
156
+ .eq("status", "pending")
157
+ .gt("expires_at", new Date().toISOString())
158
+ .order("score", { ascending: false })
159
+ .limit(limit);
160
+ if (error)
161
+ return { content: [{ type: "text", text: `error fetching suggestions: ${error.message}` }] };
162
+ if (!matches || matches.length === 0) {
163
+ return { content: [{ type: "text", text: "no pending intro suggestions right now. i'll let you know when i find someone you should meet." }] };
164
+ }
165
+ // filter to ones where this user hasn't responded
166
+ const pending = matches.filter(m => {
167
+ if (m.user_a_id === USER_ID)
168
+ return m.user_a_status === "pending";
169
+ return m.user_b_status === "pending";
170
+ });
171
+ if (pending.length === 0) {
172
+ return { content: [{ type: "text", text: "you've responded to all current suggestions. i'll find more matches soon." }] };
173
+ }
174
+ const lines = pending.map((m, i) => {
175
+ const isUserA = m.user_a_id === USER_ID;
176
+ const pitch = isUserA ? m.user_a_pitch : m.user_b_pitch;
177
+ const score = Math.round(m.score * 100);
178
+ return `**${i + 1}.** ${pitch || "someone in the network might be a good match"}\n match strength: ${score}%\n match id: \`${m.id}\`${include_context ? `\n why: ${m.match_reason}` : ""}`;
179
+ });
180
+ return {
181
+ content: [{
182
+ type: "text",
183
+ text: `šŸ¤ ${pending.length} intro suggestion(s):\n\n${lines.join("\n\n")}\n\nuse intros_respond with the match id to approve, decline, or defer.`,
184
+ }],
185
+ };
186
+ });
187
+ // ─── Respond to Match ─────────────────────────────────────────────────
188
+ server.tool("intros_respond", "Respond to an intro suggestion. Approve to connect, decline (invisible to the other person), or defer to revisit later.", {
189
+ match_id: z.string().describe("ID of the match to respond to"),
190
+ action: z.enum(["approve", "decline", "defer"]).describe("Your response"),
191
+ }, async ({ match_id, action }) => {
192
+ // get the match
193
+ const { data: match, error: fetchErr } = await supabase
194
+ .from("intro_matches")
195
+ .select("*")
196
+ .eq("id", match_id)
197
+ .single();
198
+ if (fetchErr || !match)
199
+ return { content: [{ type: "text", text: "match not found." }] };
200
+ const isUserA = match.user_a_id === USER_ID;
201
+ if (!isUserA && match.user_b_id !== USER_ID) {
202
+ return { content: [{ type: "text", text: "this match isn't for you." }] };
203
+ }
204
+ // update this user's status
205
+ const statusField = isUserA ? "user_a_status" : "user_b_status";
206
+ const respondedField = isUserA ? "user_a_responded_at" : "user_b_responded_at";
207
+ const { error: updateErr } = await supabase
208
+ .from("intro_matches")
209
+ .update({
210
+ [statusField]: action === "defer" ? "deferred" : action === "approve" ? "approved" : "declined",
211
+ [respondedField]: new Date().toISOString(),
212
+ updated_at: new Date().toISOString(),
213
+ })
214
+ .eq("id", match_id);
215
+ if (updateErr)
216
+ return { content: [{ type: "text", text: `error responding: ${updateErr.message}` }] };
217
+ // log consent
218
+ await supabase.from("intro_consent_log").insert({
219
+ user_id: USER_ID,
220
+ action: `${action}_match`,
221
+ target_match_id: match_id,
222
+ });
223
+ // check if both users approved
224
+ if (action === "approve") {
225
+ const otherStatus = isUserA ? match.user_b_status : match.user_a_status;
226
+ if (otherStatus === "approved") {
227
+ // both approved — create the intro!
228
+ await supabase.from("intro_matches").update({ status: "completed", updated_at: new Date().toISOString() }).eq("id", match_id);
229
+ const { data: profileA } = await supabase.from("intro_profiles").select("preferred_intro_method").eq("user_id", match.user_a_id).single();
230
+ const { data: profileB } = await supabase.from("intro_profiles").select("preferred_intro_method").eq("user_id", match.user_b_id).single();
231
+ await supabase.from("intros").insert({
232
+ match_id: match.id,
233
+ user_a_id: match.user_a_id,
234
+ user_b_id: match.user_b_id,
235
+ shared_context: match.match_reason,
236
+ intro_method: profileA?.preferred_intro_method || profileB?.preferred_intro_method || "agent_chat",
237
+ });
238
+ return {
239
+ content: [{
240
+ type: "text",
241
+ text: `šŸŽ‰ it's a match! both of you approved. i'll facilitate the intro now.\n\nreason you're connecting: ${match.match_reason}`,
242
+ }],
243
+ };
244
+ }
245
+ return {
246
+ content: [{
247
+ type: "text",
248
+ text: `šŸ‘ approved. waiting for the other person to respond. i'll let you know when they do.\n\n(if they decline, you'll never know — that's by design.)`,
249
+ }],
250
+ };
251
+ }
252
+ if (action === "decline") {
253
+ // update match status if both have responded and at least one declined
254
+ await supabase.from("intro_matches").update({ status: "declined", updated_at: new Date().toISOString() }).eq("id", match_id);
255
+ return {
256
+ content: [{
257
+ type: "text",
258
+ text: "declined. the other person won't know you were suggested. no awkwardness.",
259
+ }],
260
+ };
261
+ }
262
+ // defer
263
+ return {
264
+ content: [{
265
+ type: "text",
266
+ text: `deferred. i'll remind you about this later. the match expires ${match.expires_at ? new Date(match.expires_at).toLocaleDateString() : "in 7 days"}.`,
267
+ }],
268
+ };
269
+ });
270
+ // ─── History ──────────────────────────────────────────────────────────
271
+ server.tool("intros_history", "See your past intros and their outcomes.", {
272
+ limit: z.number().optional().default(10),
273
+ }, async ({ limit }) => {
274
+ const { data, error } = await supabase
275
+ .from("intros")
276
+ .select("*")
277
+ .or(`user_a_id.eq.${USER_ID},user_b_id.eq.${USER_ID}`)
278
+ .order("created_at", { ascending: false })
279
+ .limit(limit);
280
+ if (error)
281
+ return { content: [{ type: "text", text: `error: ${error.message}` }] };
282
+ if (!data || data.length === 0)
283
+ return { content: [{ type: "text", text: "no intros yet. once you approve a match and the other person does too, it'll show up here." }] };
284
+ const lines = data.map((intro, i) => {
285
+ const other = intro.user_a_id === USER_ID ? intro.user_b_id : intro.user_a_id;
286
+ return `${i + 1}. connected with **${other}** — ${intro.outcome || "pending feedback"}\n ${intro.shared_context || ""}\n ${new Date(intro.created_at).toLocaleDateString()}`;
287
+ });
288
+ return {
289
+ content: [{
290
+ type: "text",
291
+ text: `šŸ“‹ your intro history:\n\n${lines.join("\n\n")}`,
292
+ }],
293
+ };
294
+ });
295
+ // ─── Set Preferences ──────────────────────────────────────────────────
296
+ server.tool("intros_set_preferences", "Update your intro preferences — frequency, trust radius, blocklist, preferred intro method.", {
297
+ frequency: z.enum(["daily", "weekly", "monthly", "on_demand"]).optional(),
298
+ trust_radius: z.enum(["contacts_only", "friends_of_friends", "open"]).optional(),
299
+ preferred_method: z.enum(["agent_chat", "email", "text"]).optional(),
300
+ blocklist_add: z.array(z.string()).optional().describe("User IDs to add to blocklist"),
301
+ blocklist_remove: z.array(z.string()).optional().describe("User IDs to remove from blocklist"),
302
+ }, async ({ frequency, trust_radius, preferred_method, blocklist_add, blocklist_remove }) => {
303
+ const { data: existing } = await supabase.from("intro_profiles").select("blocklist").eq("user_id", USER_ID).single();
304
+ if (!existing)
305
+ return { content: [{ type: "text", text: "opt in first with intros_opt_in." }] };
306
+ const updates = { updated_at: new Date().toISOString() };
307
+ if (frequency)
308
+ updates.intro_frequency = frequency;
309
+ if (trust_radius)
310
+ updates.trust_radius = trust_radius;
311
+ if (preferred_method)
312
+ updates.preferred_intro_method = preferred_method;
313
+ if (blocklist_add || blocklist_remove) {
314
+ let bl = new Set(existing.blocklist || []);
315
+ if (blocklist_add)
316
+ blocklist_add.forEach(id => bl.add(id));
317
+ if (blocklist_remove)
318
+ blocklist_remove.forEach(id => bl.delete(id));
319
+ updates.blocklist = [...bl];
320
+ }
321
+ const { error } = await supabase.from("intro_profiles").update(updates).eq("user_id", USER_ID);
322
+ if (error)
323
+ return { content: [{ type: "text", text: `error: ${error.message}` }] };
324
+ return { content: [{ type: "text", text: "āœ… preferences updated." }] };
325
+ });
326
+ // ─── Pause / Unpause ──────────────────────────────────────────────────
327
+ server.tool("intros_pause", "Temporarily pause intros without losing your profile. No new matches will be suggested.", {}, async () => {
328
+ const { error } = await supabase.from("intro_profiles").update({ paused: true, updated_at: new Date().toISOString() }).eq("user_id", USER_ID);
329
+ if (error)
330
+ return { content: [{ type: "text", text: `error: ${error.message}` }] };
331
+ await supabase.from("intro_consent_log").insert({ user_id: USER_ID, action: "pause" });
332
+ return { content: [{ type: "text", text: "āø intros paused. your profile is saved. say 'unpause intros' when you're ready." }] };
333
+ });
334
+ server.tool("intros_unpause", "Resume intros after pausing.", {}, async () => {
335
+ const { error } = await supabase.from("intro_profiles").update({ paused: false, updated_at: new Date().toISOString() }).eq("user_id", USER_ID);
336
+ if (error)
337
+ return { content: [{ type: "text", text: `error: ${error.message}` }] };
338
+ await supabase.from("intro_consent_log").insert({ user_id: USER_ID, action: "unpause" });
339
+ return { content: [{ type: "text", text: "ā–¶ļø intros resumed. i'll start looking for matches again." }] };
340
+ });
341
+ // ─── Forget (Right to Delete) ─────────────────────────────────────────
342
+ server.tool("intros_forget", "Permanently delete your intro profile and all match history. This cannot be undone.", {
343
+ confirm: z.boolean().describe("Must be true to confirm deletion"),
344
+ }, async ({ confirm }) => {
345
+ if (!confirm)
346
+ return { content: [{ type: "text", text: "pass confirm: true to permanently delete your intro profile." }] };
347
+ // delete in order: consent log, intros, matches, profile
348
+ await supabase.from("intro_consent_log").insert({ user_id: USER_ID, action: "forget" });
349
+ await supabase.from("intros").delete().or(`user_a_id.eq.${USER_ID},user_b_id.eq.${USER_ID}`);
350
+ await supabase.from("intro_matches").delete().or(`user_a_id.eq.${USER_ID},user_b_id.eq.${USER_ID}`);
351
+ await supabase.from("intro_profiles").delete().eq("user_id", USER_ID);
352
+ return { content: [{ type: "text", text: "šŸ—‘ intro profile deleted. all match history wiped. you can opt in again anytime." }] };
353
+ });
354
+ // ─── View Profile ─────────────────────────────────────────────────────
355
+ server.tool("intros_view_profile", "See your current intro profile — what the match engine knows about you.", {}, async () => {
356
+ const { data, error } = await supabase.from("intro_profiles").select("*").eq("user_id", USER_ID).single();
357
+ if (error || !data)
358
+ return { content: [{ type: "text", text: "no intro profile found. use intros_opt_in to get started." }] };
359
+ const projects = (data.current_projects || []).map((p) => ` - ${p.name}: ${p.description} (${p.stage})`).join("\n");
360
+ const needs = (data.needs || []).map((n) => ` - [${n.urgency}] ${n.description}`).join("\n");
361
+ const offers = (data.offers || []).map((o) => ` - ${o.description} (${o.category})`).join("\n");
362
+ return {
363
+ content: [{
364
+ type: "text",
365
+ text: `šŸ“‹ your intro profile:\n\n**status:** ${data.opted_in ? (data.paused ? "paused" : "active") : "not opted in"}\n**frequency:** ${data.intro_frequency}\n**trust radius:** ${data.trust_radius}\n**intro method:** ${data.preferred_intro_method}\n\n**projects:**\n${projects || " (none set)"}\n\n**needs:**\n${needs || " (none set)"}\n\n**offers:**\n${offers || " (none set)"}\n\n**interests:** ${(data.interests || []).join(", ") || "(none)"}\n**expertise:** ${(data.expertise || []).join(", ") || "(none)"}\n**industries:** ${(data.industries || []).join(", ") || "(none)"}\n\nlast updated: ${data.last_profile_update ? new Date(data.last_profile_update).toLocaleDateString() : "never"}`,
366
+ }],
367
+ };
368
+ });
369
+ // ─── Extract Context from Conversation ──────────────────────────────────
370
+ server.tool("intros_extract_context", "Extract needs, offers, projects, interests, and expertise from conversation text and auto-update the user's intro profile. Call this when the user mentions what they're working on, what they need, or what they can offer.", {
371
+ text: z.string().describe("The conversation text to extract context from"),
372
+ auto_update: z.boolean().optional().default(true).describe("Automatically update the user's intro profile with extracted data"),
373
+ }, async ({ text, auto_update }) => {
374
+ // quick check — is there anything worth extracting?
375
+ if (!hasContextSignals(text)) {
376
+ return { content: [{ type: "text", text: "no relevant signals found in that text." }] };
377
+ }
378
+ const extracted = await extractContext(text, true);
379
+ const hasData = extracted.needs.length > 0 ||
380
+ extracted.offers.length > 0 ||
381
+ extracted.projects.length > 0 ||
382
+ extracted.interests.length > 0 ||
383
+ extracted.expertise.length > 0 ||
384
+ extracted.industries.length > 0;
385
+ if (!hasData) {
386
+ return { content: [{ type: "text", text: "couldn't extract any structured context from that text." }] };
387
+ }
388
+ // auto-update profile if opted in
389
+ if (auto_update) {
390
+ const { data: profile } = await supabase
391
+ .from("intro_profiles")
392
+ .select("*")
393
+ .eq("user_id", USER_ID)
394
+ .single();
395
+ if (profile && profile.opted_in) {
396
+ const updates = { updated_at: new Date().toISOString(), last_profile_update: new Date().toISOString() };
397
+ if (extracted.projects.length > 0) {
398
+ const existing = (profile.current_projects || []);
399
+ const sanitized = extracted.projects.map(p => ({
400
+ ...p,
401
+ name: sanitize(p.name),
402
+ description: sanitize(p.description),
403
+ updated_at: new Date().toISOString(),
404
+ }));
405
+ updates.current_projects = [...existing, ...sanitized];
406
+ }
407
+ if (extracted.needs.length > 0) {
408
+ const existing = (profile.needs || []);
409
+ const sanitized = extracted.needs.map(n => ({
410
+ ...n,
411
+ description: sanitize(n.description),
412
+ created_at: new Date().toISOString(),
413
+ }));
414
+ updates.needs = [...existing, ...sanitized];
415
+ }
416
+ if (extracted.offers.length > 0) {
417
+ const existing = (profile.offers || []);
418
+ const sanitized = extracted.offers.map(o => ({
419
+ ...o,
420
+ description: sanitize(o.description),
421
+ confidence: 0.7,
422
+ }));
423
+ updates.offers = [...existing, ...sanitized];
424
+ }
425
+ if (extracted.interests.length > 0) {
426
+ updates.interests = [...new Set([...(profile.interests || []), ...extracted.interests])];
427
+ }
428
+ if (extracted.expertise.length > 0) {
429
+ updates.expertise = [...new Set([...(profile.expertise || []), ...extracted.expertise])];
430
+ }
431
+ if (extracted.industries.length > 0) {
432
+ updates.industries = [...new Set([...(profile.industries || []), ...extracted.industries])];
433
+ }
434
+ await supabase.from("intro_profiles").update(updates).eq("user_id", USER_ID);
435
+ }
436
+ }
437
+ // format results
438
+ const parts = [];
439
+ if (extracted.needs.length > 0)
440
+ parts.push(`**needs:** ${extracted.needs.map(n => n.description).join(", ")}`);
441
+ if (extracted.offers.length > 0)
442
+ parts.push(`**offers:** ${extracted.offers.map(o => o.description).join(", ")}`);
443
+ if (extracted.projects.length > 0)
444
+ parts.push(`**projects:** ${extracted.projects.map(p => `${p.name} (${p.stage})`).join(", ")}`);
445
+ if (extracted.interests.length > 0)
446
+ parts.push(`**interests:** ${extracted.interests.join(", ")}`);
447
+ if (extracted.expertise.length > 0)
448
+ parts.push(`**expertise:** ${extracted.expertise.join(", ")}`);
449
+ if (extracted.industries.length > 0)
450
+ parts.push(`**industries:** ${extracted.industries.join(", ")}`);
451
+ const updated = auto_update ? "\n\nāœ… profile updated with extracted data." : "";
452
+ return {
453
+ content: [{
454
+ type: "text",
455
+ text: `šŸ” extracted from conversation:\n\n${parts.join("\n")}${updated}`,
456
+ }],
457
+ };
458
+ });
459
+ // ─── Run Match Engine (admin/agent tool) ───────────────────────────────
460
+ server.tool("intros_run_matches", "Run the match engine to find new intro suggestions across all opted-in users. This scores all profile pairs and creates match records for high-scoring pairs. Also expires stale matches.", {
461
+ min_score: z.number().optional().default(0.6).describe("Minimum match score (0-1) to create a suggestion. Default 0.6."),
462
+ use_llm_pitches: z.boolean().optional().default(true).describe("Use AI to generate pitch text for each match"),
463
+ }, async ({ min_score, use_llm_pitches }) => {
464
+ // expire old matches first
465
+ const expired = await expireStaleMatches();
466
+ // run the engine
467
+ const result = await runMatchEngine({
468
+ minScore: min_score,
469
+ useLLMPitches: use_llm_pitches,
470
+ });
471
+ const lines = [
472
+ `šŸ”„ match engine results:`,
473
+ ` profiles checked: ${result.profilesChecked}`,
474
+ ` new matches created: ${result.matchesCreated}`,
475
+ ` stale matches expired: ${expired}`,
476
+ ];
477
+ if (result.errors.length > 0) {
478
+ lines.push(` errors: ${result.errors.join("; ")}`);
479
+ }
480
+ return { content: [{ type: "text", text: lines.join("\n") }] };
481
+ });
482
+ }
483
+ //# sourceMappingURL=intros.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intros.js","sourceRoot":"","sources":["../../src/tools/intros.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerLinkTools(server: McpServer): void;
3
+ //# sourceMappingURL=links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/tools/links.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqCzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,QAielD"}