@knowsuchagency/fulcrum 2.3.4 → 2.4.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
@@ -45641,7 +45641,7 @@ async function runMcpServer(urlOverride, portOverride) {
45641
45641
  const client = new FulcrumClient(urlOverride, portOverride);
45642
45642
  const server = new McpServer({
45643
45643
  name: "fulcrum",
45644
- version: "2.3.4"
45644
+ version: "2.4.0"
45645
45645
  });
45646
45646
  registerTools(server, client);
45647
45647
  const transport = new StdioServerTransport;
@@ -47990,7 +47990,7 @@ var marketplace_default = `{
47990
47990
  "name": "fulcrum",
47991
47991
  "source": "./",
47992
47992
  "description": "Task orchestration for Claude Code",
47993
- "version": "2.3.4",
47993
+ "version": "2.4.0",
47994
47994
  "skills": [
47995
47995
  "./skills/fulcrum"
47996
47996
  ],
@@ -49178,7 +49178,7 @@ function compareVersions(v1, v2) {
49178
49178
  var package_default = {
49179
49179
  name: "@knowsuchagency/fulcrum",
49180
49180
  private: true,
49181
- version: "2.3.4",
49181
+ version: "2.4.0",
49182
49182
  description: "Harness Attention. Orchestrate Agents. Ship.",
49183
49183
  license: "PolyForm-Perimeter-1.0.0",
49184
49184
  type: "module",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knowsuchagency/fulcrum",
3
- "version": "2.3.4",
3
+ "version": "2.4.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
@@ -71286,6 +71286,7 @@ function getSession(id) {
71286
71286
  function listSessions(options) {
71287
71287
  const { limit: limit2 = 50, offset = 0, projectId, search, favorites } = options;
71288
71288
  const conditions2 = [];
71289
+ conditions2.push(or(isNull(chatSessions.connectionId), not(like(chatSessions.connectionId, "assistant-%"))));
71289
71290
  if (projectId) {
71290
71291
  conditions2.push(eq(chatSessions.projectId, projectId));
71291
71292
  }
@@ -409568,6 +409569,27 @@ class EmailChannel {
409568
409569
  this.connectionId = connectionId;
409569
409570
  this.credentials = credentials ?? null;
409570
409571
  }
409572
+ createImapClient() {
409573
+ if (!this.credentials)
409574
+ throw new Error("No credentials available");
409575
+ const client3 = new $ImapFlow({
409576
+ host: this.credentials.imap.host,
409577
+ port: this.credentials.imap.port,
409578
+ secure: this.credentials.imap.secure,
409579
+ auth: {
409580
+ user: this.credentials.imap.user,
409581
+ pass: this.credentials.imap.password
409582
+ },
409583
+ logger: false
409584
+ });
409585
+ client3.on("error", (err) => {
409586
+ log2.messaging.error("IMAP client error", {
409587
+ connectionId: this.connectionId,
409588
+ error: String(err)
409589
+ });
409590
+ });
409591
+ return client3;
409592
+ }
409571
409593
  async initialize(events) {
409572
409594
  this.events = events;
409573
409595
  this.isShuttingDown = false;
@@ -409608,16 +409630,7 @@ class EmailChannel {
409608
409630
  connectionId: this.connectionId,
409609
409631
  host: this.credentials.smtp.host
409610
409632
  });
409611
- this.imapClient = new $ImapFlow({
409612
- host: this.credentials.imap.host,
409613
- port: this.credentials.imap.port,
409614
- secure: this.credentials.imap.secure,
409615
- auth: {
409616
- user: this.credentials.imap.user,
409617
- pass: this.credentials.imap.password
409618
- },
409619
- logger: false
409620
- });
409633
+ this.imapClient = this.createImapClient();
409621
409634
  await this.imapClient.connect();
409622
409635
  log2.messaging.info("IMAP connection established", {
409623
409636
  connectionId: this.connectionId,
@@ -409654,16 +409667,7 @@ class EmailChannel {
409654
409667
  if (this.isShuttingDown || !this.credentials)
409655
409668
  return;
409656
409669
  try {
409657
- const client3 = new $ImapFlow({
409658
- host: this.credentials.imap.host,
409659
- port: this.credentials.imap.port,
409660
- secure: this.credentials.imap.secure,
409661
- auth: {
409662
- user: this.credentials.imap.user,
409663
- pass: this.credentials.imap.password
409664
- },
409665
- logger: false
409666
- });
409670
+ const client3 = this.createImapClient();
409667
409671
  await client3.connect();
409668
409672
  const lock = await client3.getMailboxLock("INBOX");
409669
409673
  try {
@@ -409812,16 +409816,7 @@ class EmailChannel {
409812
409816
  if (!this.credentials) {
409813
409817
  throw new Error("Not connected - no credentials available");
409814
409818
  }
409815
- const client3 = new $ImapFlow({
409816
- host: this.credentials.imap.host,
409817
- port: this.credentials.imap.port,
409818
- secure: this.credentials.imap.secure,
409819
- auth: {
409820
- user: this.credentials.imap.user,
409821
- pass: this.credentials.imap.password
409822
- },
409823
- logger: false
409824
- });
409819
+ const client3 = this.createImapClient();
409825
409820
  try {
409826
409821
  await client3.connect();
409827
409822
  const lock = await client3.getMailboxLock("INBOX");
@@ -409860,16 +409855,7 @@ class EmailChannel {
409860
409855
  }
409861
409856
  const limit2 = options?.limit ?? 50;
409862
409857
  const uidsToFetch = uids.slice(0, limit2);
409863
- const client3 = new $ImapFlow({
409864
- host: this.credentials.imap.host,
409865
- port: this.credentials.imap.port,
409866
- secure: this.credentials.imap.secure,
409867
- auth: {
409868
- user: this.credentials.imap.user,
409869
- pass: this.credentials.imap.password
409870
- },
409871
- logger: false
409872
- });
409858
+ const client3 = this.createImapClient();
409873
409859
  const storedEmails = [];
409874
409860
  try {
409875
409861
  await client3.connect();
@@ -409952,6 +409938,7 @@ async function testEmailCredentials(credentials) {
409952
409938
  },
409953
409939
  logger: false
409954
409940
  });
409941
+ client3.on("error", () => {});
409955
409942
  await client3.connect();
409956
409943
  await client3.logout();
409957
409944
  } catch (err) {
@@ -410994,6 +410981,8 @@ If you create an actionable_event, set an appropriate status:
410994
410981
  function getSweepSystemPrompt(context) {
410995
410982
  return `## Hourly Sweep
410996
410983
 
410984
+ **This is a non-interactive background session. Do not ask questions or wait for user input.**
410985
+
410997
410986
  You are performing your hourly sweep.
410998
410987
 
410999
410988
  **Context:**
@@ -411032,6 +411021,8 @@ function getRitualSystemPrompt(type) {
411032
411021
  if (type === "morning") {
411033
411022
  return `## Morning Ritual
411034
411023
 
411024
+ **This is a non-interactive background session. Do not ask questions or wait for user input.**
411025
+
411035
411026
  You are performing your morning ritual.
411036
411027
 
411037
411028
  ## Output Channels
@@ -411041,6 +411032,8 @@ Then use the \`message\` tool to send your briefing to the connected channels.`;
411041
411032
  }
411042
411033
  return `## Evening Ritual
411043
411034
 
411035
+ **This is a non-interactive background session. Do not ask questions or wait for user input.**
411036
+
411044
411037
  You are performing your evening ritual.
411045
411038
 
411046
411039
  ## Output Channels
@@ -463732,7 +463725,7 @@ mcpRoutes.all("/", async (c) => {
463732
463725
  });
463733
463726
  const server = new McpServer({
463734
463727
  name: "fulcrum",
463735
- version: "2.3.4"
463728
+ version: "2.4.0"
463736
463729
  });
463737
463730
  const client = new FulcrumClient(`http://localhost:${port}`);
463738
463731
  registerTools(server, client);