nod-shout 0.2.1 → 0.3.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 (65) hide show
  1. package/backfill-summaries.ts +105 -0
  2. package/dist/agent-instructions.d.ts.map +1 -1
  3. package/dist/agent-instructions.js +2 -1
  4. package/dist/agent-instructions.js.map +1 -1
  5. package/dist/index.d.ts +2 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +7 -16
  8. package/dist/index.js.map +1 -1
  9. package/dist/lib/ai.js +45 -7
  10. package/dist/lib/ai.js.map +1 -1
  11. package/dist/lib/current-user.d.ts +6 -0
  12. package/dist/lib/current-user.d.ts.map +1 -0
  13. package/dist/lib/current-user.js +64 -0
  14. package/dist/lib/current-user.js.map +1 -0
  15. package/dist/lib/queue.d.ts +3 -0
  16. package/dist/lib/queue.d.ts.map +1 -0
  17. package/dist/lib/queue.js +55 -0
  18. package/dist/lib/queue.js.map +1 -0
  19. package/dist/lib/supabase.d.ts +3 -1
  20. package/dist/lib/supabase.d.ts.map +1 -1
  21. package/dist/lib/supabase.js +16 -6
  22. package/dist/lib/supabase.js.map +1 -1
  23. package/dist/tools/collections.d.ts.map +1 -1
  24. package/dist/tools/collections.js +13 -8
  25. package/dist/tools/collections.js.map +1 -1
  26. package/dist/tools/link-queue.d.ts.map +1 -1
  27. package/dist/tools/link-queue.js +9 -35
  28. package/dist/tools/link-queue.js.map +1 -1
  29. package/dist/tools/links.d.ts.map +1 -1
  30. package/dist/tools/links.js +74 -36
  31. package/dist/tools/links.js.map +1 -1
  32. package/dist/tools/posts.d.ts.map +1 -1
  33. package/dist/tools/posts.js +13 -8
  34. package/dist/tools/posts.js.map +1 -1
  35. package/dist/tools/settings.d.ts.map +1 -1
  36. package/dist/tools/settings.js +2 -12
  37. package/dist/tools/settings.js.map +1 -1
  38. package/dist/tools/shout_agent_curate.d.ts +12 -6
  39. package/dist/tools/shout_agent_curate.d.ts.map +1 -1
  40. package/dist/tools/shout_agent_curate.js +30 -17
  41. package/dist/tools/shout_agent_curate.js.map +1 -1
  42. package/dist/tools/social.d.ts.map +1 -1
  43. package/dist/tools/social.js +10 -6
  44. package/dist/tools/social.js.map +1 -1
  45. package/dist/tools/text-posts.d.ts.map +1 -1
  46. package/dist/tools/text-posts.js +4 -22
  47. package/dist/tools/text-posts.js.map +1 -1
  48. package/package.json +1 -1
  49. package/scripts/backfill.ts +166 -0
  50. package/src/agent-instructions.ts +2 -1
  51. package/src/index.ts +9 -16
  52. package/src/lib/ai.ts +53 -7
  53. package/src/lib/current-user.ts +74 -0
  54. package/src/lib/queue.ts +62 -0
  55. package/src/lib/supabase.ts +18 -7
  56. package/src/tools/collections.ts +13 -8
  57. package/src/tools/link-queue.ts +9 -40
  58. package/src/tools/links.ts +77 -36
  59. package/src/tools/posts.ts +13 -8
  60. package/src/tools/settings.ts +2 -14
  61. package/src/tools/shout_agent_curate.ts +31 -17
  62. package/src/tools/social.ts +10 -6
  63. package/src/tools/text-posts.ts +4 -25
  64. package/supabase/migrations/20260320201000_url_nullable.sql +2 -0
  65. 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;AA0CzE,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,QAoC/D"}
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
- const USER_ID = process.env.NOD_USER_ID || "anonymous";
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":"AAEA,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,WAAW,CAAC;AAEvD,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"}
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
@@ -1,2 +1,3 @@
1
- export {};
1
+ import { resolveUserId, username } from "./lib/current-user.js";
2
+ export { resolveUserId, username };
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -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
- // accept username: npx nod-shout makaeel OR npx nod-shout --user makaeel
13
- const args = process.argv.slice(2);
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.2.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: ${process.env.NOD_USER_ID}`);
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,2DAA2D;AAE3D,2EAA2E;AAC3E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC3C,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;AAClD,CAAC;KAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IAC7B,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACjD,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC9C,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,qBAAqB;AACrB,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,sCAAsC;AACtC,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,+BAA+B,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;AAC1E,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"}
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
- function basicExtract(title, description) {
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
- const tags = text
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
- const category = "uncategorized";
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
@@ -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,6BAA6B;IAC7B,OAAO,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,GAAW,EACX,KAAoB,EACpB,WAA0B,EAC1B,QAAuB,EACvB,WAA0B;IAE1B,MAAM,MAAM,GAAG,gDAAgD,aAAa;;;;;;;;;;;;;6BAajD,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;OAG/D,GAAG;SACD,KAAK,IAAI,SAAS;eACZ,WAAW,IAAI,MAAM;EAClC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;EAC3C,WAAW,CAAC,CAAC,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;;;8DAGW,CAAC;IAE7D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,4CAA4C,EAAE;QACzE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,cAAc,EAAE;SAC1C;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,cAAc;YACrB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAC7C,WAAW,EAAE,GAAG;YAChB,UAAU,EAAE,GAAG;YACf,eAAe,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;SACzC,CAAC;QACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;KACnC,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;IACpD,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAE/D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,eAAe,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,WAAW,IAAI,sBAAsB;QAChE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;QAC/D,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,eAAe;KAC7C,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,MAAuB;IAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,sBAAsB,CAAC;SAC7D,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE;SACN,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAEjB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CACrB,IAAI,GAAG,CACL,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;SAChB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;SAC9C,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;SAC9C,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;SACtC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;SACpD,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAC5F,CACF,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEd,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QACzF,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;QAC9C,CAAC,CAAC,eAAe,CAAC;IAEpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,YAAY,CACnB,KAAoB,EACpB,WAA0B;IAE1B,MAAM,OAAO,GAAG,WAAW,IAAI,KAAK,IAAI,sBAAsB,CAAC;IAC/D,MAAM,IAAI,GAAG,GAAG,KAAK,IAAI,EAAE,IAAI,WAAW,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC;IACjE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;QACxB,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;QAC1D,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;QAC1D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;QAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM;QACzD,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK;QAC3D,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ;QACxD,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;QACvD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;QAC5D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK;QAC1D,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK;QAC7D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;KACzD,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,IAAI;SACd,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAChD,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACf,MAAM,QAAQ,GAAG,eAAe,CAAC;IACjC,OAAO,eAAe,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;AACtD,CAAC"}
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,3 @@
1
+ export declare function isObservationUrl(url: string | null | undefined): boolean;
2
+ export declare function normalizeQueueUrl(url: string): string;
3
+ //# sourceMappingURL=queue.d.ts.map
@@ -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"}
@@ -1,2 +1,4 @@
1
- export declare const supabase: import("@supabase/supabase-js").SupabaseClient<any, "public", "public", any, any>;
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":"AASA,eAAO,MAAM,QAAQ,mFAAyC,CAAC"}
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"}
@@ -1,8 +1,18 @@
1
1
  import { createClient } from "@supabase/supabase-js";
2
- // nod's shared supabase instance — anon key is safe to embed (RLS enforced)
3
- const NOD_SUPABASE_URL = "https://ooykzbkcquvreeheaijy.supabase.co";
4
- const NOD_SUPABASE_ANON_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im9veWt6YmtjcXV2cmVlaGVhaWp5Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzM3MDU5OTMsImV4cCI6MjA4OTI4MTk5M30.dR52jvzt6in0hL8eJFD8CGmpbHO0WuE2q8FrN3NxHfw";
5
- const supabaseUrl = process.env.SUPABASE_URL || process.env.NOD_SUPABASE_URL || NOD_SUPABASE_URL;
6
- const supabaseKey = process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.SUPABASE_SERVICE_KEY || process.env.SUPABASE_ANON_KEY || process.env.NOD_SUPABASE_KEY || NOD_SUPABASE_ANON_KEY;
7
- export const supabase = createClient(supabaseUrl, supabaseKey);
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
@@ -1 +1 @@
1
- {"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/lib/supabase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,4EAA4E;AAC5E,MAAM,gBAAgB,GAAG,0CAA0C,CAAC;AACpE,MAAM,qBAAqB,GAAG,kNAAkN,CAAC;AAEjP,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,gBAAgB,CAAC;AACjG,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,qBAAqB,CAAC;AAExL,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC"}
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":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,QAiLxD"}
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":"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"}
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":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,QA+MvD"}
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"}