wikimem 0.8.0 → 0.8.2

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 (113) hide show
  1. package/dist/cli/commands/init.d.ts.map +1 -1
  2. package/dist/cli/commands/init.js +97 -8
  3. package/dist/cli/commands/init.js.map +1 -1
  4. package/dist/core/connectors.d.ts +1 -1
  5. package/dist/core/connectors.d.ts.map +1 -1
  6. package/dist/core/git.d.ts +1 -1
  7. package/dist/core/git.d.ts.map +1 -1
  8. package/dist/core/git.js.map +1 -1
  9. package/dist/core/ingest.d.ts.map +1 -1
  10. package/dist/core/ingest.js +74 -3
  11. package/dist/core/ingest.js.map +1 -1
  12. package/dist/core/lint.d.ts.map +1 -1
  13. package/dist/core/lint.js +23 -4
  14. package/dist/core/lint.js.map +1 -1
  15. package/dist/core/oauth-defaults.d.ts +31 -0
  16. package/dist/core/oauth-defaults.d.ts.map +1 -0
  17. package/dist/core/oauth-defaults.js +79 -0
  18. package/dist/core/oauth-defaults.js.map +1 -0
  19. package/dist/core/observer.d.ts +24 -1
  20. package/dist/core/observer.d.ts.map +1 -1
  21. package/dist/core/observer.js +146 -4
  22. package/dist/core/observer.js.map +1 -1
  23. package/dist/core/sync/gdrive.d.ts +14 -0
  24. package/dist/core/sync/gdrive.d.ts.map +1 -0
  25. package/dist/core/sync/gdrive.js +205 -0
  26. package/dist/core/sync/gdrive.js.map +1 -0
  27. package/dist/core/sync/github.d.ts +20 -0
  28. package/dist/core/sync/github.d.ts.map +1 -0
  29. package/dist/core/sync/github.js +206 -0
  30. package/dist/core/sync/github.js.map +1 -0
  31. package/dist/core/sync/gmail.d.ts +15 -0
  32. package/dist/core/sync/gmail.d.ts.map +1 -0
  33. package/dist/core/sync/gmail.js +159 -0
  34. package/dist/core/sync/gmail.js.map +1 -0
  35. package/dist/core/sync/index.d.ts +47 -0
  36. package/dist/core/sync/index.d.ts.map +1 -0
  37. package/dist/core/sync/index.js +100 -0
  38. package/dist/core/sync/index.js.map +1 -0
  39. package/dist/core/sync/jira.d.ts +15 -0
  40. package/dist/core/sync/jira.d.ts.map +1 -0
  41. package/dist/core/sync/jira.js +176 -0
  42. package/dist/core/sync/jira.js.map +1 -0
  43. package/dist/core/sync/linear.d.ts +15 -0
  44. package/dist/core/sync/linear.d.ts.map +1 -0
  45. package/dist/core/sync/linear.js +111 -0
  46. package/dist/core/sync/linear.js.map +1 -0
  47. package/dist/core/sync/notion.d.ts +14 -0
  48. package/dist/core/sync/notion.d.ts.map +1 -0
  49. package/dist/core/sync/notion.js +168 -0
  50. package/dist/core/sync/notion.js.map +1 -0
  51. package/dist/core/sync/rss.d.ts +20 -0
  52. package/dist/core/sync/rss.d.ts.map +1 -0
  53. package/dist/core/sync/rss.js +165 -0
  54. package/dist/core/sync/rss.js.map +1 -0
  55. package/dist/core/sync/scheduler.d.ts +31 -0
  56. package/dist/core/sync/scheduler.d.ts.map +1 -0
  57. package/dist/core/sync/scheduler.js +129 -0
  58. package/dist/core/sync/scheduler.js.map +1 -0
  59. package/dist/core/sync/slack.d.ts +16 -0
  60. package/dist/core/sync/slack.d.ts.map +1 -0
  61. package/dist/core/sync/slack.js +173 -0
  62. package/dist/core/sync/slack.js.map +1 -0
  63. package/dist/core/vault.d.ts +22 -0
  64. package/dist/core/vault.d.ts.map +1 -1
  65. package/dist/core/vault.js +65 -0
  66. package/dist/core/vault.js.map +1 -1
  67. package/dist/core/webhooks.d.ts +13 -0
  68. package/dist/core/webhooks.d.ts.map +1 -0
  69. package/dist/core/webhooks.js +206 -0
  70. package/dist/core/webhooks.js.map +1 -0
  71. package/dist/mcp-server.d.ts +11 -6
  72. package/dist/mcp-server.d.ts.map +1 -1
  73. package/dist/mcp-server.js +99 -6
  74. package/dist/mcp-server.js.map +1 -1
  75. package/dist/mcp-tools-extended.d.ts +15 -0
  76. package/dist/mcp-tools-extended.d.ts.map +1 -0
  77. package/dist/mcp-tools-extended.js +277 -0
  78. package/dist/mcp-tools-extended.js.map +1 -0
  79. package/dist/processors/csv.d.ts +18 -0
  80. package/dist/processors/csv.d.ts.map +1 -0
  81. package/dist/processors/csv.js +230 -0
  82. package/dist/processors/csv.js.map +1 -0
  83. package/dist/processors/image.d.ts.map +1 -1
  84. package/dist/processors/image.js +55 -27
  85. package/dist/processors/image.js.map +1 -1
  86. package/dist/processors/pdf.d.ts.map +1 -1
  87. package/dist/processors/pdf.js +5 -1
  88. package/dist/processors/pdf.js.map +1 -1
  89. package/dist/processors/pptx.d.ts +3 -1
  90. package/dist/processors/pptx.d.ts.map +1 -1
  91. package/dist/processors/pptx.js +236 -95
  92. package/dist/processors/pptx.js.map +1 -1
  93. package/dist/processors/xlsx.d.ts +2 -0
  94. package/dist/processors/xlsx.d.ts.map +1 -1
  95. package/dist/processors/xlsx.js +182 -46
  96. package/dist/processors/xlsx.js.map +1 -1
  97. package/dist/templates/source-types.d.ts +33 -0
  98. package/dist/templates/source-types.d.ts.map +1 -0
  99. package/dist/templates/source-types.js +178 -0
  100. package/dist/templates/source-types.js.map +1 -0
  101. package/dist/web/public/index.html +1785 -103
  102. package/dist/web/server.d.ts.map +1 -1
  103. package/dist/web/server.js +746 -38
  104. package/dist/web/server.js.map +1 -1
  105. package/package.json +4 -1
  106. package/src/web/public/index.html +1785 -103
  107. package/templates/source-types/article.md +21 -0
  108. package/templates/source-types/book.md +21 -0
  109. package/templates/source-types/paper.md +23 -0
  110. package/templates/source-types/podcast.md +21 -0
  111. package/templates/source-types/raw-notes.md +17 -0
  112. package/templates/source-types/tweet-thread.md +19 -0
  113. package/templates/source-types/video.md +21 -0
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Notion Sync — fetches pages and databases via Notion's internal integration API,
3
+ * converts blocks to markdown, and writes files into the wiki vault.
4
+ */
5
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ const NOTION_API = 'https://api.notion.com/v1';
8
+ const NOTION_VERSION = '2022-06-28';
9
+ async function notionFetch(url, token, method = 'GET', body) {
10
+ const res = await fetch(url, {
11
+ method,
12
+ headers: { 'Authorization': `Bearer ${token}`, 'Notion-Version': NOTION_VERSION, 'Content-Type': 'application/json' },
13
+ body: body ? JSON.stringify(body) : undefined,
14
+ });
15
+ if (!res.ok)
16
+ throw new Error(`Notion API ${res.status}: ${await res.text()}`);
17
+ return res.json();
18
+ }
19
+ function richText(items) {
20
+ return items?.map((t) => t.plain_text).join('') ?? '';
21
+ }
22
+ function blockToMd(block) {
23
+ const data = block[block.type];
24
+ const text = richText(data?.rich_text);
25
+ switch (block.type) {
26
+ case 'paragraph': return text;
27
+ case 'heading_1': return `# ${text}`;
28
+ case 'heading_2': return `## ${text}`;
29
+ case 'heading_3': return `### ${text}`;
30
+ case 'bulleted_list_item': return `- ${text}`;
31
+ case 'numbered_list_item': return `1. ${text}`;
32
+ case 'to_do': return `- [${data?.checked ? 'x' : ' '}] ${text}`;
33
+ case 'code': return `\`\`\`${data?.language ?? ''}\n${text}\n\`\`\``;
34
+ case 'quote':
35
+ case 'callout': return `> ${text}`;
36
+ case 'divider': return '---';
37
+ case 'toggle': return `<details><summary>${text}</summary></details>`;
38
+ default: return text;
39
+ }
40
+ }
41
+ function pageTitle(page) {
42
+ for (const p of Object.values(page.properties)) {
43
+ if (p.type === 'title' && p.title?.length)
44
+ return richText(p.title);
45
+ }
46
+ return `Untitled-${page.id.slice(0, 8)}`;
47
+ }
48
+ function propStr(prop) {
49
+ switch (prop.type) {
50
+ case 'title': return richText(prop.title);
51
+ case 'rich_text': return richText(prop.rich_text);
52
+ case 'number': return prop.number != null ? String(prop.number) : '';
53
+ case 'select': return prop.select?.name ?? '';
54
+ case 'multi_select': return (prop.multi_select ?? []).map((s) => s.name).join(', ');
55
+ case 'date': return prop.date?.start ?? '';
56
+ case 'checkbox': return prop.checkbox ? 'Yes' : 'No';
57
+ case 'url': return prop.url ?? '';
58
+ default: return '';
59
+ }
60
+ }
61
+ function slugify(t) {
62
+ return t.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 80);
63
+ }
64
+ function frontmatter(notionId, edited, title) {
65
+ return `---\ntitle: "${title.replace(/"/g, '\\"')}"\naddedBy: connector\nsource: notion\nnotionId: "${notionId}"\nlastEditedTime: "${edited}"\nsyncedAt: "${new Date().toISOString()}"\n---\n`;
66
+ }
67
+ async function fetchBlocks(pageId, token) {
68
+ const blocks = [];
69
+ let cursor = null;
70
+ do {
71
+ const ep = `${NOTION_API}/blocks/${pageId}/children` + (cursor ? `?start_cursor=${cursor}` : '');
72
+ const res = await notionFetch(ep, token);
73
+ blocks.push(...res.results);
74
+ cursor = res.has_more ? res.next_cursor : null;
75
+ } while (cursor);
76
+ return blocks;
77
+ }
78
+ async function fetchPages(token, max) {
79
+ const pages = [];
80
+ let cursor = null;
81
+ do {
82
+ const body = {
83
+ filter: { property: 'object', value: 'page' },
84
+ page_size: Math.min(max - pages.length, 100),
85
+ };
86
+ if (cursor)
87
+ body.start_cursor = cursor;
88
+ const res = await notionFetch(`${NOTION_API}/search`, token, 'POST', body);
89
+ pages.push(...res.results);
90
+ cursor = res.has_more && pages.length < max ? res.next_cursor : null;
91
+ } while (cursor);
92
+ return pages.slice(0, max);
93
+ }
94
+ async function syncPage(page, outDir, token) {
95
+ const title = pageTitle(page);
96
+ const blocks = await fetchBlocks(page.id, token);
97
+ const md = blocks.map(blockToMd).filter(Boolean).join('\n\n');
98
+ const content = frontmatter(page.id, page.last_edited_time, title) + `# ${title}\n\n${md}\n`;
99
+ const fp = join(outDir, `${slugify(title)}.md`);
100
+ writeFileSync(fp, content, 'utf-8');
101
+ return fp;
102
+ }
103
+ async function syncDatabase(dbId, outDir, token) {
104
+ const entries = [];
105
+ let cursor = null;
106
+ do {
107
+ const body = { page_size: 100 };
108
+ if (cursor)
109
+ body.start_cursor = cursor;
110
+ const res = await notionFetch(`${NOTION_API}/databases/${dbId}/query`, token, 'POST', body);
111
+ entries.push(...res.results);
112
+ cursor = res.has_more ? res.next_cursor : null;
113
+ } while (cursor);
114
+ const first = entries[0];
115
+ if (!first)
116
+ return null;
117
+ const cols = Object.keys(first.properties);
118
+ const header = `| ${cols.join(' | ')} |`;
119
+ const sep = `| ${cols.map(() => '---').join(' | ')} |`;
120
+ const rows = entries.map((e) => `| ${cols.map((c) => { const p = e.properties[c]; return p ? propStr(p) : ''; }).join(' | ')} |`);
121
+ const content = frontmatter(dbId, new Date().toISOString(), `Database ${dbId.slice(0, 8)}`)
122
+ + `# Database ${dbId.slice(0, 8)}\n\n${[header, sep, ...rows].join('\n')}\n`;
123
+ const fp = join(outDir, `db-${dbId.slice(0, 8)}.md`);
124
+ writeFileSync(fp, content, 'utf-8');
125
+ return fp;
126
+ }
127
+ function errMsg(err) {
128
+ return err instanceof Error ? err.message : String(err);
129
+ }
130
+ export async function syncNotion(options) {
131
+ const start = Date.now();
132
+ const errors = [];
133
+ let filesWritten = 0;
134
+ const max = options.maxPages ?? 50;
135
+ const date = new Date().toISOString().slice(0, 10);
136
+ const outDir = join(options.vaultRoot, 'raw', date);
137
+ if (!existsSync(outDir))
138
+ mkdirSync(outDir, { recursive: true });
139
+ try {
140
+ const pages = await fetchPages(options.token, max);
141
+ for (const page of pages) {
142
+ try {
143
+ await syncPage(page, outDir, options.token);
144
+ filesWritten++;
145
+ }
146
+ catch (err) {
147
+ errors.push(`Page ${page.id}: ${errMsg(err)}`);
148
+ }
149
+ }
150
+ }
151
+ catch (err) {
152
+ errors.push(`Search pages: ${errMsg(err)}`);
153
+ }
154
+ if (options.databaseIds?.length) {
155
+ for (const dbId of options.databaseIds) {
156
+ try {
157
+ const r = await syncDatabase(dbId, outDir, options.token);
158
+ if (r)
159
+ filesWritten++;
160
+ }
161
+ catch (err) {
162
+ errors.push(`Database ${dbId}: ${errMsg(err)}`);
163
+ }
164
+ }
165
+ }
166
+ return { provider: 'notion', filesWritten, errors, duration: Date.now() - start };
167
+ }
168
+ //# sourceMappingURL=notion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notion.js","sourceRoot":"","sources":["../../../src/core/sync/notion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * RSS Feed Sync — fetches RSS/Atom feeds into raw/ for wiki ingest.
3
+ * Connector-style: reads feed URL from config, applies topic guardrails,
4
+ * writes markdown files with frontmatter.
5
+ */
6
+ export interface RssSyncOptions {
7
+ vaultRoot: string;
8
+ feedUrl: string;
9
+ feedName: string;
10
+ topics?: string[];
11
+ maxItems?: number;
12
+ }
13
+ export interface PlatformSyncResult {
14
+ provider: string;
15
+ filesWritten: number;
16
+ errors: string[];
17
+ duration: number;
18
+ }
19
+ export declare function syncRss(options: RssSyncOptions): Promise<PlatformSyncResult>;
20
+ //# sourceMappingURL=rss.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rss.d.ts","sourceRoot":"","sources":["../../../src/core/sync/rss.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAsGD,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkFlF"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * RSS Feed Sync — fetches RSS/Atom feeds into raw/ for wiki ingest.
3
+ * Connector-style: reads feed URL from config, applies topic guardrails,
4
+ * writes markdown files with frontmatter.
5
+ */
6
+ import { mkdirSync, writeFileSync, existsSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ const MAX_PAGE_CONTENT_BYTES = 6 * 1024;
9
+ const FEED_TIMEOUT_MS = 20_000;
10
+ const PAGE_TIMEOUT_MS = 15_000;
11
+ // ─── XML Helpers ────────────────────────────────────────────────────────────
12
+ function stripCdata(text) {
13
+ return text.replace(/<!\[CDATA\[([\s\S]*?)\]\]>/g, '$1');
14
+ }
15
+ function stripHtml(html) {
16
+ return html.replace(/<[^>]*>/g, '').trim();
17
+ }
18
+ function extractTag(xml, tag) {
19
+ const re = new RegExp(`<${tag}[^>]*>([\\s\\S]*?)<\\/${tag}>`, 'i');
20
+ const match = re.exec(xml);
21
+ return match ? stripCdata(match[1] ?? '').trim() : '';
22
+ }
23
+ function extractAtomLink(xml) {
24
+ // Atom <link href="..." /> or <link href="..." rel="alternate" />
25
+ const altMatch = /< link[^>]*rel\s*=\s*["']alternate["'][^>]*href\s*=\s*["']([^"']+)["']/i.exec(xml);
26
+ if (altMatch)
27
+ return altMatch[1] ?? '';
28
+ const hrefMatch = /<link[^>]*href\s*=\s*["']([^"']+)["']/i.exec(xml);
29
+ return hrefMatch ? (hrefMatch[1] ?? '') : '';
30
+ }
31
+ function slugify(text) {
32
+ return text
33
+ .toLowerCase()
34
+ .replace(/[^a-z0-9]+/g, '-')
35
+ .replace(/^-+|-+$/g, '')
36
+ .slice(0, 80);
37
+ }
38
+ // ─── Feed Parsing ───────────────────────────────────────────────────────────
39
+ function parseRss2Items(xml) {
40
+ const items = xml.match(/<item[\s>][\s\S]*?<\/item>/gi) ?? [];
41
+ return items.map((block) => ({
42
+ title: stripHtml(extractTag(block, 'title')),
43
+ link: extractTag(block, 'link'),
44
+ description: stripHtml(extractTag(block, 'description')),
45
+ pubDate: extractTag(block, 'pubDate'),
46
+ }));
47
+ }
48
+ function parseAtomEntries(xml) {
49
+ const entries = xml.match(/<entry[\s>][\s\S]*?<\/entry>/gi) ?? [];
50
+ return entries.map((block) => ({
51
+ title: stripHtml(extractTag(block, 'title')),
52
+ link: extractAtomLink(block),
53
+ description: stripHtml(extractTag(block, 'summary') || extractTag(block, 'content')),
54
+ pubDate: extractTag(block, 'updated') || extractTag(block, 'published'),
55
+ }));
56
+ }
57
+ function parseFeed(xml) {
58
+ // Detect Atom vs RSS 2.0
59
+ if (/<feed[\s>]/i.test(xml)) {
60
+ return parseAtomEntries(xml);
61
+ }
62
+ return parseRss2Items(xml);
63
+ }
64
+ // ─── Topic Guardrails ───────────────────────────────────────────────────────
65
+ function passesGuardrails(item, topics) {
66
+ if (topics.length === 0)
67
+ return true;
68
+ const haystack = `${item.title} ${item.description}`.toLowerCase();
69
+ return topics.some((kw) => haystack.includes(kw.toLowerCase()));
70
+ }
71
+ // ─── Page Fetching ──────────────────────────────────────────────────────────
72
+ async function fetchPageContent(url) {
73
+ try {
74
+ const res = await fetch(url, {
75
+ signal: AbortSignal.timeout(PAGE_TIMEOUT_MS),
76
+ headers: { 'User-Agent': 'WikiMem-RSS-Sync/1.0' },
77
+ });
78
+ if (!res.ok)
79
+ return '';
80
+ const html = await res.text();
81
+ const stripped = stripHtml(html);
82
+ return stripped.slice(0, MAX_PAGE_CONTENT_BYTES);
83
+ }
84
+ catch {
85
+ return '';
86
+ }
87
+ }
88
+ // ─── Sync Entry Point ───────────────────────────────────────────────────────
89
+ export async function syncRss(options) {
90
+ const { vaultRoot, feedUrl, feedName, topics = [], maxItems = 20 } = options;
91
+ const start = Date.now();
92
+ const errors = [];
93
+ let filesWritten = 0;
94
+ // Build output directory: raw/{YYYY-MM-DD}/
95
+ const dateStr = new Date().toISOString().slice(0, 10);
96
+ const rawDir = join(vaultRoot, 'raw', dateStr);
97
+ mkdirSync(rawDir, { recursive: true });
98
+ // Fetch feed XML
99
+ let xml;
100
+ try {
101
+ const res = await fetch(feedUrl, {
102
+ signal: AbortSignal.timeout(FEED_TIMEOUT_MS),
103
+ headers: { 'User-Agent': 'WikiMem-RSS-Sync/1.0' },
104
+ });
105
+ if (!res.ok) {
106
+ errors.push(`Feed fetch failed: HTTP ${res.status} from ${feedUrl}`);
107
+ return { provider: `rss:${feedName}`, filesWritten, errors, duration: Date.now() - start };
108
+ }
109
+ xml = await res.text();
110
+ }
111
+ catch (err) {
112
+ const msg = err instanceof Error ? err.message : String(err);
113
+ errors.push(`Feed fetch error: ${msg}`);
114
+ return { provider: `rss:${feedName}`, filesWritten, errors, duration: Date.now() - start };
115
+ }
116
+ // Parse items
117
+ const allItems = parseFeed(xml);
118
+ const filtered = allItems.filter((item) => passesGuardrails(item, topics));
119
+ const items = filtered.slice(0, maxItems);
120
+ // Process each item
121
+ for (const item of items) {
122
+ try {
123
+ const slug = slugify(item.title || 'untitled');
124
+ const filename = `rss-${slug}.md`;
125
+ const filepath = join(rawDir, filename);
126
+ // Skip if already synced today
127
+ if (existsSync(filepath))
128
+ continue;
129
+ // Optionally fetch full page content
130
+ const pageContent = item.link ? await fetchPageContent(item.link) : '';
131
+ const frontmatter = [
132
+ '---',
133
+ 'addedBy: connector',
134
+ 'source: rss',
135
+ `feed: "${feedName}"`,
136
+ `url: "${item.link}"`,
137
+ `published: "${item.pubDate}"`,
138
+ `syncedAt: "${new Date().toISOString()}"`,
139
+ '---',
140
+ ].join('\n');
141
+ const body = [
142
+ `# ${item.title}`,
143
+ '',
144
+ item.description,
145
+ '',
146
+ pageContent ? `## Full Content\n\n${pageContent}` : '',
147
+ ]
148
+ .filter(Boolean)
149
+ .join('\n');
150
+ writeFileSync(filepath, `${frontmatter}\n\n${body}\n`, 'utf-8');
151
+ filesWritten++;
152
+ }
153
+ catch (err) {
154
+ const msg = err instanceof Error ? err.message : String(err);
155
+ errors.push(`Item "${item.title}": ${msg}`);
156
+ }
157
+ }
158
+ return {
159
+ provider: `rss:${feedName}`,
160
+ filesWritten,
161
+ errors,
162
+ duration: Date.now() - start,
163
+ };
164
+ }
165
+ //# sourceMappingURL=rss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rss.js","sourceRoot":"","sources":["../../../src/core/sync/rss.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * SyncScheduler — cron-based periodic sync for connected platforms.
3
+ * Emits events: sync-start, sync-complete, sync-error.
4
+ */
5
+ import { EventEmitter } from 'node:events';
6
+ /** Human-friendly schedule presets mapped to cron patterns */
7
+ declare const SCHEDULE_PRESETS: Record<string, string>;
8
+ export declare class SyncScheduler extends EventEmitter {
9
+ private jobs;
10
+ private vaultRoot;
11
+ constructor(vaultRoot: string);
12
+ /** Resolve a schedule string (preset name or raw cron) to a cron pattern */
13
+ private resolveCron;
14
+ /** Schedule a provider sync on a cron pattern */
15
+ schedule(provider: string, cronPattern: string): void;
16
+ /** Remove a scheduled sync */
17
+ unschedule(provider: string): void;
18
+ /** Get all active schedules */
19
+ getSchedules(): Array<{
20
+ provider: string;
21
+ pattern: string;
22
+ }>;
23
+ /** Start all configured schedules from connector configs + OAuth tokens */
24
+ startFromConfig(): void;
25
+ /** Stop all scheduled jobs */
26
+ stopAll(): void;
27
+ /** Execute a sync for a provider, emitting events */
28
+ private runSync;
29
+ }
30
+ export { SCHEDULE_PRESETS };
31
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/core/sync/scheduler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAuB3C,8DAA8D;AAC9D,QAAA,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAK5C,CAAC;AAQF,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,IAAI,CAAyC;IACrD,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,EAAE,MAAM;IAK7B,4EAA4E;IAC5E,OAAO,CAAC,WAAW;IAInB,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAoBrD,8BAA8B;IAC9B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IASlC,+BAA+B;IAC/B,YAAY,IAAI,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAQ5D,2EAA2E;IAC3E,eAAe,IAAI,IAAI;IAgCvB,8BAA8B;IAC9B,OAAO,IAAI,IAAI;IAQf,qDAAqD;YACvC,OAAO;CAqBtB;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * SyncScheduler — cron-based periodic sync for connected platforms.
3
+ * Emits events: sync-start, sync-complete, sync-error.
4
+ */
5
+ import { EventEmitter } from 'node:events';
6
+ import { readFileSync, existsSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ import * as cron from 'node-cron';
9
+ /** Human-friendly schedule presets mapped to cron patterns */
10
+ const SCHEDULE_PRESETS = {
11
+ 'hourly': '0 * * * *',
12
+ 'every-6h': '0 */6 * * *',
13
+ 'daily': '0 9 * * *',
14
+ 'weekly': '0 9 * * 1',
15
+ };
16
+ const DEFAULT_SCHEDULE = '0 */6 * * *';
17
+ export class SyncScheduler extends EventEmitter {
18
+ jobs = new Map();
19
+ vaultRoot;
20
+ constructor(vaultRoot) {
21
+ super();
22
+ this.vaultRoot = vaultRoot;
23
+ }
24
+ /** Resolve a schedule string (preset name or raw cron) to a cron pattern */
25
+ resolveCron(schedule) {
26
+ return SCHEDULE_PRESETS[schedule] ?? schedule;
27
+ }
28
+ /** Schedule a provider sync on a cron pattern */
29
+ schedule(provider, cronPattern) {
30
+ // Unschedule existing job for this provider
31
+ this.unschedule(provider);
32
+ const resolved = this.resolveCron(cronPattern);
33
+ if (!cron.validate(resolved)) {
34
+ console.log(`[SyncScheduler] Invalid cron pattern for ${provider}: ${resolved}`);
35
+ return;
36
+ }
37
+ console.log(`[SyncScheduler] Scheduling ${provider} sync: ${resolved}`);
38
+ const task = cron.schedule(resolved, async () => {
39
+ await this.runSync(provider);
40
+ }, { scheduled: true });
41
+ this.jobs.set(provider, { provider, pattern: resolved, task });
42
+ }
43
+ /** Remove a scheduled sync */
44
+ unschedule(provider) {
45
+ const existing = this.jobs.get(provider);
46
+ if (existing) {
47
+ existing.task.stop();
48
+ this.jobs.delete(provider);
49
+ console.log(`[SyncScheduler] Unscheduled ${provider} sync`);
50
+ }
51
+ }
52
+ /** Get all active schedules */
53
+ getSchedules() {
54
+ const result = [];
55
+ this.jobs.forEach((entry) => {
56
+ result.push({ provider: entry.provider, pattern: entry.pattern });
57
+ });
58
+ return result;
59
+ }
60
+ /** Start all configured schedules from connector configs + OAuth tokens */
61
+ startFromConfig() {
62
+ const tokensPath = join(this.vaultRoot, '.wikimem', 'tokens.json');
63
+ const connectorsPath = join(this.vaultRoot, '.wikimem-connectors.json');
64
+ let tokens = {};
65
+ if (existsSync(tokensPath)) {
66
+ try {
67
+ tokens = JSON.parse(readFileSync(tokensPath, 'utf-8'));
68
+ }
69
+ catch {
70
+ console.log('[SyncScheduler] Failed to parse tokens.json');
71
+ }
72
+ }
73
+ const scheduleMap = new Map();
74
+ if (existsSync(connectorsPath)) {
75
+ try {
76
+ const connectors = JSON.parse(readFileSync(connectorsPath, 'utf-8'));
77
+ for (const c of connectors) {
78
+ if (c.syncSchedule && c.type)
79
+ scheduleMap.set(c.type, c.syncSchedule);
80
+ }
81
+ }
82
+ catch {
83
+ console.log('[SyncScheduler] Failed to parse connectors config');
84
+ }
85
+ }
86
+ const providers = Object.keys(tokens);
87
+ if (providers.length === 0) {
88
+ console.log('[SyncScheduler] No OAuth tokens found — nothing to schedule');
89
+ return;
90
+ }
91
+ for (const provider of providers) {
92
+ if (!tokens[provider]?.access_token)
93
+ continue;
94
+ this.schedule(provider, scheduleMap.get(provider) ?? DEFAULT_SCHEDULE);
95
+ }
96
+ console.log(`[SyncScheduler] Started ${this.jobs.size} sync schedule(s)`);
97
+ }
98
+ /** Stop all scheduled jobs */
99
+ stopAll() {
100
+ this.jobs.forEach((entry, provider) => {
101
+ entry.task.stop();
102
+ console.log(`[SyncScheduler] Stopped ${provider} sync`);
103
+ });
104
+ this.jobs.clear();
105
+ }
106
+ /** Execute a sync for a provider, emitting events */
107
+ async runSync(provider) {
108
+ console.log(`[SyncScheduler] Starting sync for ${provider}`);
109
+ this.emit('sync-start', provider);
110
+ try {
111
+ const { syncProvider: doSync } = await import('./index.js');
112
+ const result = await doSync(provider, this.vaultRoot);
113
+ if (result.errors.length > 0) {
114
+ console.log(`[SyncScheduler] ${provider} sync completed with ${result.errors.length} error(s)`);
115
+ }
116
+ else {
117
+ console.log(`[SyncScheduler] ${provider} sync complete: ${result.filesWritten} files in ${result.duration}ms`);
118
+ }
119
+ this.emit('sync-complete', result);
120
+ }
121
+ catch (err) {
122
+ const error = err instanceof Error ? err : new Error(String(err));
123
+ console.log(`[SyncScheduler] ${provider} sync failed: ${error.message}`);
124
+ this.emit('sync-error', provider, error);
125
+ }
126
+ }
127
+ }
128
+ export { SCHEDULE_PRESETS };
129
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/core/sync/scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface SlackSyncOptions {
2
+ token: string;
3
+ vaultRoot: string;
4
+ channels?: string[];
5
+ maxChannels?: number;
6
+ maxMessagesPerChannel?: number;
7
+ since?: string;
8
+ }
9
+ export interface PlatformSyncResult {
10
+ provider: string;
11
+ filesWritten: number;
12
+ errors: string[];
13
+ duration: number;
14
+ }
15
+ export declare function syncSlack(options: SlackSyncOptions): Promise<PlatformSyncResult>;
16
+ //# sourceMappingURL=slack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../../src/core/sync/slack.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAsHD,wBAAsB,SAAS,CAC7B,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAyG7B"}