nod-shout 0.2.1 → 0.3.1
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/backfill-summaries.ts +105 -0
- package/dist/agent-instructions.d.ts.map +1 -1
- package/dist/agent-instructions.js +2 -1
- package/dist/agent-instructions.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -16
- package/dist/index.js.map +1 -1
- package/dist/lib/ai.js +45 -7
- package/dist/lib/ai.js.map +1 -1
- package/dist/lib/current-user.d.ts +6 -0
- package/dist/lib/current-user.d.ts.map +1 -0
- package/dist/lib/current-user.js +64 -0
- package/dist/lib/current-user.js.map +1 -0
- package/dist/lib/queue.d.ts +3 -0
- package/dist/lib/queue.d.ts.map +1 -0
- package/dist/lib/queue.js +55 -0
- package/dist/lib/queue.js.map +1 -0
- package/dist/lib/supabase.d.ts +3 -1
- package/dist/lib/supabase.d.ts.map +1 -1
- package/dist/lib/supabase.js +16 -6
- package/dist/lib/supabase.js.map +1 -1
- package/dist/tools/collections.d.ts.map +1 -1
- package/dist/tools/collections.js +13 -8
- package/dist/tools/collections.js.map +1 -1
- package/dist/tools/link-queue.d.ts.map +1 -1
- package/dist/tools/link-queue.js +9 -35
- package/dist/tools/link-queue.js.map +1 -1
- package/dist/tools/links.d.ts.map +1 -1
- package/dist/tools/links.js +74 -36
- package/dist/tools/links.js.map +1 -1
- package/dist/tools/posts.d.ts.map +1 -1
- package/dist/tools/posts.js +13 -8
- package/dist/tools/posts.js.map +1 -1
- package/dist/tools/settings.d.ts.map +1 -1
- package/dist/tools/settings.js +2 -12
- package/dist/tools/settings.js.map +1 -1
- package/dist/tools/shout_agent_curate.d.ts +12 -6
- package/dist/tools/shout_agent_curate.d.ts.map +1 -1
- package/dist/tools/shout_agent_curate.js +30 -17
- package/dist/tools/shout_agent_curate.js.map +1 -1
- package/dist/tools/social.d.ts.map +1 -1
- package/dist/tools/social.js +141 -6
- package/dist/tools/social.js.map +1 -1
- package/dist/tools/text-posts.d.ts.map +1 -1
- package/dist/tools/text-posts.js +4 -22
- package/dist/tools/text-posts.js.map +1 -1
- package/package.json +1 -1
- package/scripts/backfill.ts +166 -0
- package/src/agent-instructions.ts +2 -1
- package/src/index.ts +9 -16
- package/src/lib/ai.ts +53 -7
- package/src/lib/current-user.ts +74 -0
- package/src/lib/queue.ts +62 -0
- package/src/lib/supabase.ts +18 -7
- package/src/tools/collections.ts +13 -8
- package/src/tools/link-queue.ts +9 -40
- package/src/tools/links.ts +77 -36
- package/src/tools/posts.ts +13 -8
- package/src/tools/settings.ts +2 -14
- package/src/tools/shout_agent_curate.ts +31 -17
- package/src/tools/social.ts +166 -6
- package/src/tools/text-posts.ts +4 -25
- package/supabase/migrations/20260320201000_url_nullable.sql +2 -0
- package/supabase/migrations/20260320210000_url_nullable.sql +2 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* backfill shouts with null summaries or empty tags.
|
|
3
|
+
* uses the improved basicExtract + metadata fetching.
|
|
4
|
+
*
|
|
5
|
+
* usage: npx tsx backfill-summaries.ts
|
|
6
|
+
*/
|
|
7
|
+
import { createClient } from "@supabase/supabase-js";
|
|
8
|
+
import { extractMetadata } from "./src/lib/metadata.js";
|
|
9
|
+
import { generateSummary } from "./src/lib/ai.js";
|
|
10
|
+
|
|
11
|
+
const SUPABASE_URL = "https://ooykzbkcquvreeheaijy.supabase.co";
|
|
12
|
+
const SUPABASE_SERVICE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im9veWt6YmtjcXV2cmVlaGVhaWp5Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc3MzcwNTk5MywiZXhwIjoyMDg5MjgxOTkzfQ.pnwrIb_75h3m_VlhRkCev6z_lnwayjidSTA0dGA2B6A";
|
|
13
|
+
const USER_ID = "00000000-0000-0000-0000-000000000001";
|
|
14
|
+
|
|
15
|
+
const supabase = createClient(SUPABASE_URL, SUPABASE_SERVICE_KEY);
|
|
16
|
+
|
|
17
|
+
async function backfill() {
|
|
18
|
+
// fetch shouts with null summary or empty tags
|
|
19
|
+
const { data: shouts, error } = await supabase
|
|
20
|
+
.from("shouts")
|
|
21
|
+
.select("id, url, title, description, summary, tags")
|
|
22
|
+
.eq("user_id", USER_ID)
|
|
23
|
+
.or("summary.is.null,tags.eq.{}");
|
|
24
|
+
|
|
25
|
+
if (error) {
|
|
26
|
+
console.error("error fetching shouts:", error.message);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (!shouts || shouts.length === 0) {
|
|
31
|
+
console.log("no shouts need backfilling");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
console.log(`found ${shouts.length} shouts to backfill\n`);
|
|
36
|
+
|
|
37
|
+
let updated = 0;
|
|
38
|
+
let failed = 0;
|
|
39
|
+
|
|
40
|
+
for (const shout of shouts) {
|
|
41
|
+
const needsSummary = !shout.summary;
|
|
42
|
+
const needsTags = !shout.tags || shout.tags.length === 0;
|
|
43
|
+
|
|
44
|
+
if (!needsSummary && !needsTags) continue;
|
|
45
|
+
|
|
46
|
+
console.log(`[${updated + failed + 1}/${shouts.length}] ${shout.title || shout.url}`);
|
|
47
|
+
|
|
48
|
+
try {
|
|
49
|
+
// fetch fresh metadata if we have a url
|
|
50
|
+
let metadata = { title: shout.title, description: shout.description, bodyText: null as string | null };
|
|
51
|
+
if (shout.url) {
|
|
52
|
+
try {
|
|
53
|
+
const fresh = await extractMetadata(shout.url);
|
|
54
|
+
metadata = {
|
|
55
|
+
title: fresh.title || shout.title,
|
|
56
|
+
description: fresh.description || shout.description,
|
|
57
|
+
bodyText: fresh.bodyText,
|
|
58
|
+
};
|
|
59
|
+
} catch (e) {
|
|
60
|
+
console.log(` metadata fetch failed, using existing data`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const result = await generateSummary({
|
|
65
|
+
url: shout.url || "",
|
|
66
|
+
title: metadata.title,
|
|
67
|
+
description: metadata.description,
|
|
68
|
+
bodyText: metadata.bodyText,
|
|
69
|
+
userContext: null,
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
const updates: Record<string, unknown> = {};
|
|
73
|
+
if (needsSummary) updates.summary = result.summary;
|
|
74
|
+
if (needsTags) updates.tags = result.tags;
|
|
75
|
+
if (!shout.tags?.length || shout.tags.length === 0) updates.category = result.category;
|
|
76
|
+
|
|
77
|
+
const { error: updateErr } = await supabase
|
|
78
|
+
.from("shouts")
|
|
79
|
+
.update(updates)
|
|
80
|
+
.eq("id", shout.id);
|
|
81
|
+
|
|
82
|
+
if (updateErr) {
|
|
83
|
+
console.log(` ✗ update failed: ${updateErr.message}`);
|
|
84
|
+
failed++;
|
|
85
|
+
} else {
|
|
86
|
+
console.log(` ✓ summary: ${result.summary.slice(0, 80)}...`);
|
|
87
|
+
console.log(` tags: [${result.tags.join(", ")}] category: ${result.category}`);
|
|
88
|
+
updated++;
|
|
89
|
+
}
|
|
90
|
+
} catch (err) {
|
|
91
|
+
console.log(` ✗ error: ${err}`);
|
|
92
|
+
failed++;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// small delay to avoid hammering
|
|
96
|
+
await new Promise(r => setTimeout(r, 500));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
console.log(`\ndone: ${updated} updated, ${failed} failed out of ${shouts.length}`);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
backfill().catch(err => {
|
|
103
|
+
console.error("fatal:", err);
|
|
104
|
+
process.exit(1);
|
|
105
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-instructions.d.ts","sourceRoot":"","sources":["../src/agent-instructions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-instructions.d.ts","sourceRoot":"","sources":["../src/agent-instructions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA2CzE,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,QAoC/D"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { getCurrentUsername } from "./lib/current-user.js";
|
|
2
|
+
const USER_ID = getCurrentUsername();
|
|
2
3
|
const SHOUT_AGENT_INSTRUCTIONS = `you have nod shout installed for user "${USER_ID}". here's how to use it well:
|
|
3
4
|
|
|
4
5
|
LINK HARVESTING (do this throughout every conversation):
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-instructions.js","sourceRoot":"","sources":["../src/agent-instructions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-instructions.js","sourceRoot":"","sources":["../src/agent-instructions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;AAErC,MAAM,wBAAwB,GAAG,0CAA0C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oDAmC9B,OAAO;iEACM,CAAC;AAElE,MAAM,UAAU,8BAA8B,CAAC,MAAiB;IAC9D,0DAA0D;IAC1D,MAAM,CAAC,QAAQ,CACb,oBAAoB,EACpB,gCAAgC,EAChC;QACE,WAAW,EAAE,0FAA0F;QACvG,QAAQ,EAAE,YAAY;KACvB,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,gCAAgC;gBACrC,QAAQ,EAAE,YAAY;gBACtB,IAAI,EAAE,wBAAwB;aAC/B;SACF;KACF,CAAC,CACH,CAAC;IAEF,gEAAgE;IAChE,MAAM,CAAC,MAAM,CACX,aAAa,EACb,4FAA4F,EAC5F,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,wBAAwB;iBAC/B;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAoB,MAAM,uBAAuB,CAAC;AAmClF,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -8,26 +8,16 @@ import { registerPostTools } from "./tools/posts.js";
|
|
|
8
8
|
import { registerLinkQueueTools } from "./tools/link-queue.js";
|
|
9
9
|
import { registerTextPostTools } from "./tools/text-posts.js";
|
|
10
10
|
import { registerShoutAgentInstructions } from "./agent-instructions.js";
|
|
11
|
+
import { resolveUserId, username, getCurrentUserId } from "./lib/current-user.js";
|
|
11
12
|
// agent curate tool is registered inside registerLinkTools
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const userFlagIdx = args.indexOf("--user");
|
|
15
|
-
if (userFlagIdx !== -1 && args[userFlagIdx + 1]) {
|
|
16
|
-
process.env.NOD_USER_ID = args[userFlagIdx + 1];
|
|
17
|
-
}
|
|
18
|
-
else if (args.length > 0 && !args[0].startsWith("-")) {
|
|
19
|
-
process.env.NOD_USER_ID = args[0];
|
|
20
|
-
}
|
|
21
|
-
if (!process.env.NOD_USER_ID) {
|
|
22
|
-
console.error("usage: npx nod-shout <username>");
|
|
23
|
-
console.error(" e.g. npx nod-shout makaeel");
|
|
13
|
+
if (!username) {
|
|
14
|
+
console.error("Usage: nod-shout <username>");
|
|
24
15
|
process.exit(1);
|
|
25
16
|
}
|
|
26
17
|
const server = new McpServer({
|
|
27
18
|
name: "nod-shout",
|
|
28
|
-
version: "0.
|
|
19
|
+
version: "0.3.0",
|
|
29
20
|
});
|
|
30
|
-
// register all tools
|
|
31
21
|
registerLinkTools(server);
|
|
32
22
|
registerCollectionTools(server);
|
|
33
23
|
registerSocialTools(server);
|
|
@@ -36,14 +26,15 @@ registerPostTools(server);
|
|
|
36
26
|
registerLinkQueueTools(server);
|
|
37
27
|
registerTextPostTools(server);
|
|
38
28
|
registerShoutAgentInstructions(server);
|
|
39
|
-
// start the server on stdio transport
|
|
40
29
|
async function main() {
|
|
30
|
+
await resolveUserId();
|
|
41
31
|
const transport = new StdioServerTransport();
|
|
42
32
|
await server.connect(transport);
|
|
43
|
-
console.error(`nod-shout running for user: ${
|
|
33
|
+
console.error(`nod-shout running for user: ${username} (${getCurrentUserId()})`);
|
|
44
34
|
}
|
|
45
35
|
main().catch((err) => {
|
|
46
36
|
console.error("fatal error:", err);
|
|
47
37
|
process.exit(1);
|
|
48
38
|
});
|
|
39
|
+
export { resolveUserId, username };
|
|
49
40
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAClF,2DAA2D;AAE3D,IAAI,CAAC,QAAQ,EAAE,CAAC;IACd,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC1B,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAChC,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC1B,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC/B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,8BAA8B,CAAC,MAAM,CAAC,CAAC;AAEvC,KAAK,UAAU,IAAI;IACjB,MAAM,aAAa,EAAE,CAAC;IAEtB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,+BAA+B,QAAQ,KAAK,gBAAgB,EAAE,GAAG,CAAC,CAAC;AACnF,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC"}
|
package/dist/lib/ai.js
CHANGED
|
@@ -35,8 +35,8 @@ export async function generateSummary(params) {
|
|
|
35
35
|
console.error("ai summary failed, falling back to basic extraction:", err);
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
// fallback: basic extraction
|
|
39
|
-
return basicExtract(title, description);
|
|
38
|
+
// fallback: basic extraction with all available context
|
|
39
|
+
return basicExtract(title, description, url, bodyText);
|
|
40
40
|
}
|
|
41
41
|
async function aiSummarize(url, title, description, bodyText, userContext) {
|
|
42
42
|
const prompt = `You are generating data for a nod shout card.${SKILL_CONTEXT}
|
|
@@ -108,9 +108,27 @@ function normalizeResult(result) {
|
|
|
108
108
|
: "uncategorized";
|
|
109
109
|
return { summary, tags, category };
|
|
110
110
|
}
|
|
111
|
-
|
|
111
|
+
/** map of keyword patterns to categories for basic heuristic routing */
|
|
112
|
+
const CATEGORY_KEYWORDS = {
|
|
113
|
+
ai: /\b(ai|artificial intelligence|llm|gpt|claude|openai|anthropic|machine learning|ml|deep learning|neural|transformer|diffusion|generative)\b/i,
|
|
114
|
+
agents: /\b(agent|mcp|model context protocol|a2a|agentic|tool use|function calling|autonomous)\b/i,
|
|
115
|
+
devtools: /\b(sdk|api|cli|github|developer|devtool|typescript|rust|python|npm|package|library|framework|vscode|ide|git)\b/i,
|
|
116
|
+
security: /\b(security|vulnerability|exploit|breach|auth|encryption|privacy|hack|malware|cve)\b/i,
|
|
117
|
+
crypto: /\b(crypto|bitcoin|ethereum|blockchain|web3|defi|nft|token)\b/i,
|
|
118
|
+
design: /\b(design|figma|ui|ux|typography|css|tailwind|interface)\b/i,
|
|
119
|
+
startups: /\b(startup|funding|venture|seed|series [a-d]|yc|y combinator|founder|valuation)\b/i,
|
|
120
|
+
product: /\b(product|launch|feature|roadmap|user research|onboarding)\b/i,
|
|
121
|
+
research: /\b(paper|arxiv|research|study|findings|peer.?review|journal)\b/i,
|
|
122
|
+
engineering: /\b(infrastructure|scaling|database|postgres|redis|kubernetes|docker|deploy|cicd|performance)\b/i,
|
|
123
|
+
social: /\b(social media|twitter|bluesky|mastodon|fediverse|threads|instagram|tiktok)\b/i,
|
|
124
|
+
marketing: /\b(marketing|seo|growth hack|conversion|analytics|campaign|brand)\b/i,
|
|
125
|
+
media: /\b(media|journalism|podcast|newsletter|blog|publication|press)\b/i,
|
|
126
|
+
finance: /\b(finance|stock|market|investment|banking|fintech|revenue)\b/i,
|
|
127
|
+
policy: /\b(policy|regulation|government|law|legislation|compliance|gdpr)\b/i,
|
|
128
|
+
};
|
|
129
|
+
function basicExtract(title, description, url, bodyText) {
|
|
112
130
|
const summary = description || title || "no summary available";
|
|
113
|
-
const text = `${title || ""} ${description || ""}`.toLowerCase();
|
|
131
|
+
const text = `${title || ""} ${description || ""} ${url || ""} ${bodyText || ""}`.toLowerCase();
|
|
114
132
|
const stopWords = new Set([
|
|
115
133
|
"the", "a", "an", "is", "are", "was", "were", "be", "been",
|
|
116
134
|
"being", "have", "has", "had", "do", "does", "did", "will",
|
|
@@ -123,13 +141,33 @@ function basicExtract(title, description) {
|
|
|
123
141
|
"than", "too", "very", "just", "that", "this", "it", "its",
|
|
124
142
|
"how", "what", "which", "who", "whom", "where", "when", "why",
|
|
125
143
|
"about", "up", "out", "if", "then", "also", "new", "one",
|
|
144
|
+
"using", "used", "use", "like", "get", "got", "make", "made",
|
|
145
|
+
"first", "way", "now", "know", "here", "there", "your", "you",
|
|
146
|
+
"our", "we", "they", "them", "their", "his", "her", "she", "he",
|
|
126
147
|
]);
|
|
127
|
-
|
|
148
|
+
// extract multi-word phrases and single keywords, score by frequency
|
|
149
|
+
const words = text
|
|
128
150
|
.replace(/[^a-z0-9\s-]/g, "")
|
|
129
151
|
.split(/\s+/)
|
|
130
|
-
.filter((w) => w.length > 2 && !stopWords.has(w))
|
|
152
|
+
.filter((w) => w.length > 2 && !stopWords.has(w));
|
|
153
|
+
// count word frequency
|
|
154
|
+
const freq = new Map();
|
|
155
|
+
for (const w of words) {
|
|
156
|
+
freq.set(w, (freq.get(w) || 0) + 1);
|
|
157
|
+
}
|
|
158
|
+
// sort by frequency, take top 5 unique
|
|
159
|
+
const tags = [...freq.entries()]
|
|
160
|
+
.sort((a, b) => b[1] - a[1])
|
|
161
|
+
.map(([w]) => w)
|
|
131
162
|
.slice(0, 5);
|
|
132
|
-
|
|
163
|
+
// detect category from keywords
|
|
164
|
+
let category = "uncategorized";
|
|
165
|
+
for (const [cat, pattern] of Object.entries(CATEGORY_KEYWORDS)) {
|
|
166
|
+
if (pattern.test(text)) {
|
|
167
|
+
category = cat;
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
133
171
|
return normalizeResult({ summary, tags, category });
|
|
134
172
|
}
|
|
135
173
|
//# sourceMappingURL=ai.js.map
|
package/dist/lib/ai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/lib/ai.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAClD,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,cAAc,EAAE,qBAAqB,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAChG,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,IAAI;IACJ,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,UAAU;IACV,OAAO;IACP,QAAQ;IACR,SAAS;IACT,aAAa;IACb,UAAU;IACV,UAAU;IACV,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,eAAe;CAChB,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAMrC;IACC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAElE,2CAA2C;IAC3C,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,OAAO,MAAM,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sDAAsD,EAAE,GAAG,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/lib/ai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const username: string;
|
|
2
|
+
export declare function getCurrentUserId(): string | null;
|
|
3
|
+
export declare function getCurrentUsername(): string;
|
|
4
|
+
export declare function requireCurrentUserId(override?: string): string;
|
|
5
|
+
export declare function resolveUserId(): Promise<string>;
|
|
6
|
+
//# sourceMappingURL=current-user.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"current-user.d.ts","sourceRoot":"","sources":["../../src/lib/current-user.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,QAAQ,EAAE,MAIa,CAAC;AAIrC,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAM9D;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CA4CrD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { getSupabase } from "./supabase.js";
|
|
2
|
+
const args = process.argv.slice(2);
|
|
3
|
+
const userFlagIdx = args.indexOf("--user");
|
|
4
|
+
export const username = userFlagIdx !== -1 && args[userFlagIdx + 1]
|
|
5
|
+
? args[userFlagIdx + 1]
|
|
6
|
+
: args.length > 0 && !args[0].startsWith("-")
|
|
7
|
+
? args[0]
|
|
8
|
+
: process.env.NOD_USERNAME || "";
|
|
9
|
+
let _userId = process.env.NOD_USER_ID || null;
|
|
10
|
+
export function getCurrentUserId() {
|
|
11
|
+
return process.env.NOD_USER_ID || _userId || null;
|
|
12
|
+
}
|
|
13
|
+
export function getCurrentUsername() {
|
|
14
|
+
return process.env.NOD_USERNAME || username || process.env.NOD_USER_ID || "anonymous";
|
|
15
|
+
}
|
|
16
|
+
export function requireCurrentUserId(override) {
|
|
17
|
+
const resolved = override || getCurrentUserId();
|
|
18
|
+
if (!resolved) {
|
|
19
|
+
throw new Error("no current user id set. start the server with: npx nod-shout <username>");
|
|
20
|
+
}
|
|
21
|
+
return resolved;
|
|
22
|
+
}
|
|
23
|
+
export async function resolveUserId() {
|
|
24
|
+
if (_userId)
|
|
25
|
+
return _userId;
|
|
26
|
+
if (!username) {
|
|
27
|
+
throw new Error("Usage: nod-shout <username>");
|
|
28
|
+
}
|
|
29
|
+
const sb = getSupabase();
|
|
30
|
+
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(username)) {
|
|
31
|
+
const userId = username;
|
|
32
|
+
_userId = userId;
|
|
33
|
+
process.env.NOD_USER_ID = userId;
|
|
34
|
+
process.env.NOD_USERNAME = username;
|
|
35
|
+
return userId;
|
|
36
|
+
}
|
|
37
|
+
const { data: existing } = await sb
|
|
38
|
+
.from("profiles")
|
|
39
|
+
.select("id")
|
|
40
|
+
.eq("username", username)
|
|
41
|
+
.single();
|
|
42
|
+
if (existing) {
|
|
43
|
+
const userId = existing.id;
|
|
44
|
+
_userId = userId;
|
|
45
|
+
process.env.NOD_USER_ID = userId;
|
|
46
|
+
process.env.NOD_USERNAME = username;
|
|
47
|
+
console.error(`nod-shout: resolved user "${username}" → ${userId}`);
|
|
48
|
+
return userId;
|
|
49
|
+
}
|
|
50
|
+
const { data: created, error } = await sb
|
|
51
|
+
.from("profiles")
|
|
52
|
+
.insert({ username, display_name: username })
|
|
53
|
+
.select("id")
|
|
54
|
+
.single();
|
|
55
|
+
if (error)
|
|
56
|
+
throw new Error(`Failed to create profile for "${username}": ${error.message}`);
|
|
57
|
+
const userId = created.id;
|
|
58
|
+
_userId = userId;
|
|
59
|
+
process.env.NOD_USER_ID = userId;
|
|
60
|
+
process.env.NOD_USERNAME = username;
|
|
61
|
+
console.error(`nod-shout: created new user "${username}" → ${userId}`);
|
|
62
|
+
return userId;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=current-user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"current-user.js","sourceRoot":"","sources":["../../src/lib/current-user.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/lib/queue.ts"],"names":[],"mappings":"AAwBA,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAExE;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiCrD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
const TRACKING_PARAMS = new Set([
|
|
2
|
+
"utm_source",
|
|
3
|
+
"utm_medium",
|
|
4
|
+
"utm_campaign",
|
|
5
|
+
"utm_term",
|
|
6
|
+
"utm_content",
|
|
7
|
+
"utm_id",
|
|
8
|
+
"utm_name",
|
|
9
|
+
"utm_cid",
|
|
10
|
+
"utm_reader",
|
|
11
|
+
"utm_viz_id",
|
|
12
|
+
"utm_pubreferrer",
|
|
13
|
+
"utm_swu",
|
|
14
|
+
"fbclid",
|
|
15
|
+
"gclid",
|
|
16
|
+
"igshid",
|
|
17
|
+
"mc_cid",
|
|
18
|
+
"mc_eid",
|
|
19
|
+
"ref",
|
|
20
|
+
"ref_src",
|
|
21
|
+
"feature",
|
|
22
|
+
"si",
|
|
23
|
+
]);
|
|
24
|
+
export function isObservationUrl(url) {
|
|
25
|
+
return Boolean(url && url.startsWith("observation://"));
|
|
26
|
+
}
|
|
27
|
+
export function normalizeQueueUrl(url) {
|
|
28
|
+
if (isObservationUrl(url))
|
|
29
|
+
return url;
|
|
30
|
+
try {
|
|
31
|
+
const normalized = new URL(url.trim());
|
|
32
|
+
normalized.hash = "";
|
|
33
|
+
normalized.protocol = normalized.protocol.toLowerCase();
|
|
34
|
+
normalized.hostname = normalized.hostname.toLowerCase().replace(/^www\./, "");
|
|
35
|
+
for (const key of Array.from(normalized.searchParams.keys())) {
|
|
36
|
+
if (TRACKING_PARAMS.has(key.toLowerCase())) {
|
|
37
|
+
normalized.searchParams.delete(key);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const sortedParams = Array.from(normalized.searchParams.entries()).sort(([aKey, aValue], [bKey, bValue]) => aKey.localeCompare(bKey) || aValue.localeCompare(bValue));
|
|
41
|
+
normalized.search = "";
|
|
42
|
+
for (const [key, value] of sortedParams) {
|
|
43
|
+
normalized.searchParams.append(key, value);
|
|
44
|
+
}
|
|
45
|
+
let pathname = normalized.pathname.replace(/\/+$/, "");
|
|
46
|
+
if (!pathname)
|
|
47
|
+
pathname = "/";
|
|
48
|
+
normalized.pathname = pathname;
|
|
49
|
+
return normalized.toString();
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return url.trim();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/lib/queue.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,UAAU;IACV,aAAa;IACb,QAAQ;IACR,UAAU;IACV,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,iBAAiB;IACjB,SAAS;IACT,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,SAAS;IACT,SAAS;IACT,IAAI;CACL,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,GAA8B;IAC7D,OAAO,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,IAAI,gBAAgB,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACvC,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC;QACrB,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QACxD,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAE9E,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC7D,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC3C,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CACrE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CACjC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAC3D,CAAC;QAEF,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;YACxC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ;YAAE,QAAQ,GAAG,GAAG,CAAC;QAC9B,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAE/B,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;AACH,CAAC"}
|
package/dist/lib/supabase.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import { type SupabaseClient } from "@supabase/supabase-js";
|
|
2
|
+
export declare function getSupabase(): SupabaseClient;
|
|
3
|
+
export declare const supabase: SupabaseClient<any, "public", "public", any, any>;
|
|
2
4
|
//# sourceMappingURL=supabase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/lib/supabase.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/lib/supabase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAO1E,wBAAgB,WAAW,IAAI,cAAc,CAO5C;AAED,eAAO,MAAM,QAAQ,mDAInB,CAAC"}
|
package/dist/lib/supabase.js
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
import { createClient } from "@supabase/supabase-js";
|
|
2
|
-
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
const DEFAULT_URL = "https://ooykzbkcquvreeheaijy.supabase.co";
|
|
3
|
+
const DEFAULT_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im9veWt6YmtjcXV2cmVlaGVhaWp5Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzM3MDU5OTMsImV4cCI6MjA4OTI4MTk5M30.dR52jvzt6in0hL8eJFD8CGmpbHO0WuE2q8FrN3NxHfw";
|
|
4
|
+
let _client = null;
|
|
5
|
+
export function getSupabase() {
|
|
6
|
+
if (!_client) {
|
|
7
|
+
const url = process.env.SUPABASE_URL || process.env.NOD_SUPABASE_URL || DEFAULT_URL;
|
|
8
|
+
const key = process.env.SUPABASE_SERVICE_KEY || process.env.NOD_SUPABASE_KEY || DEFAULT_KEY;
|
|
9
|
+
_client = createClient(url, key);
|
|
10
|
+
}
|
|
11
|
+
return _client;
|
|
12
|
+
}
|
|
13
|
+
export const supabase = new Proxy({}, {
|
|
14
|
+
get(_target, prop) {
|
|
15
|
+
return getSupabase()[prop];
|
|
16
|
+
},
|
|
17
|
+
});
|
|
8
18
|
//# sourceMappingURL=supabase.js.map
|
package/dist/lib/supabase.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/lib/supabase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/lib/supabase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuB,MAAM,uBAAuB,CAAC;AAE1E,MAAM,WAAW,GAAG,0CAA0C,CAAC;AAC/D,MAAM,WAAW,GAAG,kNAAkN,CAAC;AAEvO,IAAI,OAAO,GAA0B,IAAI,CAAC;AAE1C,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,WAAW,CAAC;QACpF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,WAAW,CAAC;QAC5F,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,EAAoB,EAAE;IACtD,GAAG,CAAC,OAAO,EAAE,IAAI;QACf,OAAS,WAAW,EAAmD,CAAC,IAAI,CAAC,CAAC;IAChF,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../src/tools/collections.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../src/tools/collections.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,QAqLxD"}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { supabase } from "../lib/supabase.js";
|
|
3
|
+
import { resolveUserId } from "../lib/current-user.js";
|
|
3
4
|
export function registerCollectionTools(server) {
|
|
4
5
|
// shout_create_collection
|
|
5
6
|
server.tool("shout_create_collection", "create a new collection to organize your shouts.", {
|
|
6
|
-
user_id: z.string().uuid().describe("the user's id"),
|
|
7
|
+
user_id: z.string().uuid().optional().describe("the user's id (auto-resolved if omitted)"),
|
|
7
8
|
name: z.string().describe("collection name"),
|
|
8
9
|
description: z.string().optional().describe("collection description"),
|
|
9
10
|
auto_rules: z
|
|
10
11
|
.record(z.unknown())
|
|
11
12
|
.optional()
|
|
12
13
|
.describe("auto-sort rules (e.g. tag-based routing)"),
|
|
13
|
-
}, async ({ user_id, name, description, auto_rules }) => {
|
|
14
|
+
}, async ({ user_id: rawUserId, name, description, auto_rules }) => {
|
|
15
|
+
const user_id = rawUserId || await resolveUserId();
|
|
14
16
|
// generate slug from name
|
|
15
17
|
const slug = name
|
|
16
18
|
.toLowerCase()
|
|
@@ -48,9 +50,10 @@ export function registerCollectionTools(server) {
|
|
|
48
50
|
// shout_add_to_collection
|
|
49
51
|
server.tool("shout_add_to_collection", "add a shout to a collection by slug.", {
|
|
50
52
|
shout_id: z.string().uuid().describe("the shout id"),
|
|
51
|
-
user_id: z.string().uuid().describe("the user's id"),
|
|
53
|
+
user_id: z.string().uuid().optional().describe("the user's id (auto-resolved if omitted)"),
|
|
52
54
|
collection_slug: z.string().describe("the collection slug to add to"),
|
|
53
|
-
}, async ({ shout_id, user_id, collection_slug }) => {
|
|
55
|
+
}, async ({ shout_id, user_id: rawUserId2, collection_slug }) => {
|
|
56
|
+
const user_id = rawUserId2 || await resolveUserId();
|
|
54
57
|
// resolve collection by slug for this user
|
|
55
58
|
const { data: col, error: colErr } = await supabase
|
|
56
59
|
.from("collections")
|
|
@@ -87,8 +90,9 @@ export function registerCollectionTools(server) {
|
|
|
87
90
|
// shout_remove_from_collection
|
|
88
91
|
server.tool("shout_remove_from_collection", "remove a shout from its collection (sets collection_id to null).", {
|
|
89
92
|
shout_id: z.string().uuid().describe("the shout id"),
|
|
90
|
-
user_id: z.string().uuid().describe("the user's id"),
|
|
91
|
-
}, async ({ shout_id, user_id }) => {
|
|
93
|
+
user_id: z.string().uuid().optional().describe("the user's id (auto-resolved if omitted)"),
|
|
94
|
+
}, async ({ shout_id, user_id: rawUserId3 }) => {
|
|
95
|
+
const user_id = rawUserId3 || await resolveUserId();
|
|
92
96
|
const { error } = await supabase
|
|
93
97
|
.from("shouts")
|
|
94
98
|
.update({ collection_id: null })
|
|
@@ -109,8 +113,9 @@ export function registerCollectionTools(server) {
|
|
|
109
113
|
});
|
|
110
114
|
// shout_list_collections
|
|
111
115
|
server.tool("shout_list_collections", "list all your collections.", {
|
|
112
|
-
user_id: z.string().uuid().describe("the user's id"),
|
|
113
|
-
}, async ({ user_id }) => {
|
|
116
|
+
user_id: z.string().uuid().optional().describe("the user's id (auto-resolved if omitted)"),
|
|
117
|
+
}, async ({ user_id: rawUserId4 }) => {
|
|
118
|
+
const user_id = rawUserId4 || await resolveUserId();
|
|
114
119
|
const { data, error } = await supabase
|
|
115
120
|
.from("collections")
|
|
116
121
|
.select("*")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/tools/collections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/tools/collections.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-queue.d.ts","sourceRoot":"","sources":["../../src/tools/link-queue.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"link-queue.d.ts","sourceRoot":"","sources":["../../src/tools/link-queue.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,QAgLvD"}
|