@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 +33 -3
- package/package.json +1 -1
- package/server/index.js +46 -4
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.
|
|
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.
|
|
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.
|
|
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
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
|
-
|
|
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
|
-
|
|
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.
|
|
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();
|