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,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 @@
|
|
|
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"}
|