@knowsuchagency/fulcrum 3.1.0 → 3.2.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/bin/fulcrum.js CHANGED
@@ -1482,6 +1482,9 @@ class FulcrumClient {
1482
1482
  async getEmail(id) {
1483
1483
  return this.fetch(`/api/messaging/email/emails/${id}`);
1484
1484
  }
1485
+ async getMessage(id) {
1486
+ return this.fetch(`/api/messaging/messages/${id}`);
1487
+ }
1485
1488
  async searchEmails(criteria) {
1486
1489
  return this.fetch("/api/messaging/email/search", {
1487
1490
  method: "POST",
@@ -44207,6 +44210,13 @@ var init_registry = __esm(() => {
44207
44210
  keywords: ["email", "fetch", "download", "imap", "uid", "message", "mail"],
44208
44211
  defer_loading: false
44209
44212
  },
44213
+ {
44214
+ name: "get_message",
44215
+ description: "Get details of a specific message by ID, including full content and metadata",
44216
+ category: "messaging",
44217
+ keywords: ["message", "get", "read", "channel", "whatsapp", "discord", "telegram", "slack", "chat"],
44218
+ defer_loading: false
44219
+ },
44210
44220
  {
44211
44221
  name: "message",
44212
44222
  description: "Send a message to a messaging channel (WhatsApp, Discord, Telegram, Slack, Gmail)",
@@ -46185,6 +46195,24 @@ var init_memory_file = __esm(() => {
46185
46195
  init_utils();
46186
46196
  });
46187
46197
 
46198
+ // cli/src/mcp/tools/messaging.ts
46199
+ var registerMessagingTools = (server, client) => {
46200
+ server.tool("get_message", "Get details of a specific message by ID, including full content and metadata.", {
46201
+ id: exports_external.string().describe("Message ID")
46202
+ }, async ({ id }) => {
46203
+ try {
46204
+ const message = await client.getMessage(id);
46205
+ return formatSuccess(message);
46206
+ } catch (err) {
46207
+ return handleToolError(err);
46208
+ }
46209
+ });
46210
+ };
46211
+ var init_messaging = __esm(() => {
46212
+ init_zod2();
46213
+ init_utils();
46214
+ });
46215
+
46188
46216
  // cli/src/mcp/tools/search.ts
46189
46217
  var EntityTypeSchema, registerSearchTools = (server, client) => {
46190
46218
  server.tool("search", 'Search across all Fulcrum entities (tasks, projects, messages, calendar events, memories, conversations) using full-text search. Supports boolean operators (AND, OR, NOT), phrase matching ("quoted phrases"), and prefix matching (term*). Returns results ranked by relevance.', {
@@ -46243,6 +46271,7 @@ function registerTools(server, client) {
46243
46271
  registerSettingsTools(server, client);
46244
46272
  registerBackupTools(server, client);
46245
46273
  registerEmailTools(server, client);
46274
+ registerMessagingTools(server, client);
46246
46275
  registerAssistantTools(server, client);
46247
46276
  registerCaldavTools(server, client);
46248
46277
  registerGmailTools(server, client);
@@ -46267,6 +46296,7 @@ var init_tools = __esm(() => {
46267
46296
  init_gmail();
46268
46297
  init_memory();
46269
46298
  init_memory_file();
46299
+ init_messaging();
46270
46300
  init_search();
46271
46301
  init_types4();
46272
46302
  });
@@ -46286,7 +46316,7 @@ async function runMcpServer(urlOverride, portOverride) {
46286
46316
  const client = new FulcrumClient(urlOverride, portOverride);
46287
46317
  const server = new McpServer({
46288
46318
  name: "fulcrum",
46289
- version: "3.1.0"
46319
+ version: "3.2.0"
46290
46320
  });
46291
46321
  registerTools(server, client);
46292
46322
  const transport = new StdioServerTransport;
@@ -48635,7 +48665,7 @@ var marketplace_default = `{
48635
48665
  "name": "fulcrum",
48636
48666
  "source": "./",
48637
48667
  "description": "Task orchestration for Claude Code",
48638
- "version": "3.1.0",
48668
+ "version": "3.2.0",
48639
48669
  "skills": [
48640
48670
  "./skills/fulcrum"
48641
48671
  ],
@@ -49839,7 +49869,7 @@ function compareVersions(v1, v2) {
49839
49869
  var package_default = {
49840
49870
  name: "@knowsuchagency/fulcrum",
49841
49871
  private: true,
49842
- version: "3.1.0",
49872
+ version: "3.2.0",
49843
49873
  description: "Harness Attention. Orchestrate Agents. Ship.",
49844
49874
  license: "PolyForm-Perimeter-1.0.0",
49845
49875
  type: "module",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knowsuchagency/fulcrum",
3
- "version": "3.1.0",
3
+ "version": "3.2.0",
4
4
  "description": "Harness Attention. Orchestrate Agents. Ship.",
5
5
  "license": "PolyForm-Perimeter-1.0.0",
6
6
  "repository": {
package/server/index.js CHANGED
@@ -1135470,6 +1135470,9 @@ function getChannelMessages(options = {}) {
1135470
1135470
  const results = db2.select().from(channelMessages).where(whereClause).orderBy(desc(channelMessages.messageTimestamp)).limit(options.limit ?? 50).offset(options.offset ?? 0).all();
1135471
1135471
  return results;
1135472
1135472
  }
1135473
+ function getChannelMessageById(id) {
1135474
+ return db2.select().from(channelMessages).where(eq(channelMessages.id, id)).get();
1135475
+ }
1135473
1135476
  function getChannelMessageCounts() {
1135474
1135477
  const results = db2.select({
1135475
1135478
  channelType: channelMessages.channelType,
@@ -1147877,6 +1147880,7 @@ async function* streamMessage(sessionId, userMessage, modelIdOrOptions, editorCo
1147877
1147880
  state = {};
1147878
1147881
  sessionState.set(sessionId, state);
1147879
1147882
  }
1147883
+ const tempFiles = [];
1147880
1147884
  try {
1147881
1147885
  log2.assistant.debug("Starting assistant query", {
1147882
1147886
  sessionId,
@@ -1147905,7 +1147909,6 @@ ${options.editorContent}
1147905
1147909
 
1147906
1147910
  User message: ${userMessage}`;
1147907
1147911
  }
1147908
- const tempFiles2 = [];
1147909
1147912
  let fullPrompt;
1147910
1147913
  if (options.attachments && options.attachments.length > 0) {
1147911
1147914
  const parts = [];
@@ -1147916,7 +1147919,7 @@ User message: ${userMessage}`;
1147916
1147919
  const tempDir = await mkdtemp(join14(tmpdir3(), "fulcrum-img-"));
1147917
1147920
  const tempPath = join14(tempDir, `${attachment.filename || `image.${ext2}`}`);
1147918
1147921
  await writeFile3(tempPath, Buffer.from(attachment.data, "base64"));
1147919
- tempFiles2.push(tempPath);
1147922
+ tempFiles.push(tempPath);
1147920
1147923
  parts.push(`[Attached image: ${tempPath}]`);
1147921
1147924
  break;
1147922
1147925
  }
@@ -1147925,7 +1147928,7 @@ User message: ${userMessage}`;
1147925
1147928
  const tempDir = await mkdtemp(join14(tmpdir3(), "fulcrum-doc-"));
1147926
1147929
  const tempPath = join14(tempDir, attachment.filename || "document.pdf");
1147927
1147930
  await writeFile3(tempPath, Buffer.from(attachment.data, "base64"));
1147928
- tempFiles2.push(tempPath);
1147931
+ tempFiles.push(tempPath);
1147929
1147932
  parts.push(`[Attached document: ${tempPath}]`);
1147930
1147933
  }
1147931
1147934
  break;
@@ -1251641,6 +1251644,13 @@ var toolRegistry = [
1251641
1251644
  keywords: ["email", "fetch", "download", "imap", "uid", "message", "mail"],
1251642
1251645
  defer_loading: false
1251643
1251646
  },
1251647
+ {
1251648
+ name: "get_message",
1251649
+ description: "Get details of a specific message by ID, including full content and metadata",
1251650
+ category: "messaging",
1251651
+ keywords: ["message", "get", "read", "channel", "whatsapp", "discord", "telegram", "slack", "chat"],
1251652
+ defer_loading: false
1251653
+ },
1251644
1251654
  {
1251645
1251655
  name: "message",
1251646
1251656
  description: "Send a message to a messaging channel (WhatsApp, Discord, Telegram, Slack, Gmail)",
@@ -1253559,6 +1253569,20 @@ var registerMemoryFileTools = (server2, client3) => {
1253559
1253569
  });
1253560
1253570
  };
1253561
1253571
 
1253572
+ // cli/src/mcp/tools/messaging.ts
1253573
+ var registerMessagingTools = (server2, client3) => {
1253574
+ server2.tool("get_message", "Get details of a specific message by ID, including full content and metadata.", {
1253575
+ id: exports_external.string().describe("Message ID")
1253576
+ }, async ({ id }) => {
1253577
+ try {
1253578
+ const message = await client3.getMessage(id);
1253579
+ return formatSuccess(message);
1253580
+ } catch (err) {
1253581
+ return handleToolError(err);
1253582
+ }
1253583
+ });
1253584
+ };
1253585
+
1253562
1253586
  // cli/src/mcp/tools/search.ts
1253563
1253587
  var EntityTypeSchema = exports_external.enum(["tasks", "projects", "messages", "events", "memories", "conversations"]);
1253564
1253588
  var registerSearchTools = (server2, client3) => {
@@ -1253613,6 +1253637,7 @@ function registerTools(server2, client3) {
1253613
1253637
  registerSettingsTools(server2, client3);
1253614
1253638
  registerBackupTools(server2, client3);
1253615
1253639
  registerEmailTools(server2, client3);
1253640
+ registerMessagingTools(server2, client3);
1253616
1253641
  registerAssistantTools(server2, client3);
1253617
1253642
  registerCaldavTools(server2, client3);
1253618
1253643
  registerGmailTools(server2, client3);
@@ -1254202,6 +1254227,9 @@ class FulcrumClient {
1254202
1254227
  async getEmail(id) {
1254203
1254228
  return this.fetch(`/api/messaging/email/emails/${id}`);
1254204
1254229
  }
1254230
+ async getMessage(id) {
1254231
+ return this.fetch(`/api/messaging/messages/${id}`);
1254232
+ }
1254205
1254233
  async searchEmails(criteria) {
1254206
1254234
  return this.fetch("/api/messaging/email/search", {
1254207
1254235
  method: "POST",
@@ -1254442,7 +1254470,7 @@ mcpRoutes.all("/", async (c) => {
1254442
1254470
  });
1254443
1254471
  const server2 = new McpServer({
1254444
1254472
  name: "fulcrum",
1254445
- version: "3.1.0"
1254473
+ version: "3.2.0"
1254446
1254474
  });
1254447
1254475
  const client3 = new FulcrumClient(`http://localhost:${port}`);
1254448
1254476
  registerTools(server2, client3);
@@ -1255107,6 +1255135,7 @@ var assistant_default = assistantRoutes;
1255107
1255135
  // server/routes/messaging.ts
1255108
1255136
  init_channels();
1255109
1255137
  init_email_storage();
1255138
+ init_message_storage();
1255110
1255139
  init_logger3();
1255111
1255140
  var app23 = new Hono2;
1255112
1255141
  app23.get("/channels", (c) => {
@@ -1255504,6 +1255533,19 @@ app23.post("/email/fetch", async (c) => {
1255504
1255533
  return c.json({ error: String(err) }, 500);
1255505
1255534
  }
1255506
1255535
  });
1255536
+ app23.get("/messages/:id", (c) => {
1255537
+ try {
1255538
+ const id = c.req.param("id");
1255539
+ const message = getChannelMessageById(id);
1255540
+ if (!message) {
1255541
+ return c.json({ error: "Message not found" }, 404);
1255542
+ }
1255543
+ return c.json(message);
1255544
+ } catch (err) {
1255545
+ log2.messaging.error("Failed to get message", { error: String(err) });
1255546
+ return c.json({ error: String(err) }, 500);
1255547
+ }
1255548
+ });
1255507
1255549
  app23.post("/send", async (c) => {
1255508
1255550
  try {
1255509
1255551
  const body = await c.req.json();