nothumanallowed 13.2.63 → 13.2.64

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nothumanallowed",
3
- "version": "13.2.63",
3
+ "version": "13.2.64",
4
4
  "description": "NotHumanAllowed — 38 AI agents, 80 tools, Studio (visual agentic workflows). Email, calendar, browser automation, screen capture, canvas, cron/heartbeat, Alexandria E2E messaging, GitHub, Notion, Slack, voice chat, free AI (Liara), 28 languages. Zero-dependency CLI.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/constants.mjs CHANGED
@@ -5,7 +5,7 @@ import { fileURLToPath } from 'url';
5
5
  const __filename = fileURLToPath(import.meta.url);
6
6
  const __dirname = path.dirname(__filename);
7
7
 
8
- export const VERSION = '13.2.63';
8
+ export const VERSION = '13.2.64';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11
 
@@ -110,9 +110,15 @@ export async function getTodayEvents(config) {
110
110
  } catch { /* skip failed calendars */ }
111
111
  }
112
112
 
113
- // Sort by start time
113
+ // Sort by start time, then deduplicate same-day same-title events (holiday feeds)
114
114
  allEvents.sort((a, b) => new Date(a.start).getTime() - new Date(b.start).getTime());
115
- return allEvents;
115
+ const seen = new Set();
116
+ return allEvents.filter(e => {
117
+ const key = (e.start || '').slice(0, 10) + '|' + (e.summary || '').toLowerCase().trim();
118
+ if (seen.has(key)) return false;
119
+ seen.add(key);
120
+ return true;
121
+ });
116
122
  }
117
123
 
118
124
  /**
@@ -139,7 +145,15 @@ export async function getEventsForDate(config, date) {
139
145
  } catch { /* skip */ }
140
146
  }
141
147
  allEvents.sort((a, b) => new Date(a.start).getTime() - new Date(b.start).getTime());
142
- return allEvents;
148
+
149
+ // Deduplicate: same start date + same normalized title = same event (e.g. IT + EN holiday feeds)
150
+ const seen = new Set();
151
+ const deduped = [];
152
+ for (const e of allEvents) {
153
+ const key = (e.start || '').slice(0, 10) + '|' + (e.summary || '').toLowerCase().trim();
154
+ if (!seen.has(key)) { seen.add(key); deduped.push(e); }
155
+ }
156
+ return deduped;
143
157
  }
144
158
 
145
159
  /**