wikimem 0.3.0 → 0.8.1

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 (228) hide show
  1. package/CHANGELOG.md +138 -29
  2. package/README.md +171 -309
  3. package/dist/cli/commands/ask.d.ts +3 -0
  4. package/dist/cli/commands/ask.d.ts.map +1 -0
  5. package/dist/cli/commands/ask.js +63 -0
  6. package/dist/cli/commands/ask.js.map +1 -0
  7. package/dist/cli/commands/export.d.ts +3 -0
  8. package/dist/cli/commands/export.d.ts.map +1 -0
  9. package/dist/cli/commands/export.js +108 -0
  10. package/dist/cli/commands/export.js.map +1 -0
  11. package/dist/cli/commands/history.d.ts +3 -0
  12. package/dist/cli/commands/history.d.ts.map +1 -0
  13. package/dist/cli/commands/history.js +61 -0
  14. package/dist/cli/commands/history.js.map +1 -0
  15. package/dist/cli/commands/improve.d.ts.map +1 -1
  16. package/dist/cli/commands/improve.js +4 -3
  17. package/dist/cli/commands/improve.js.map +1 -1
  18. package/dist/cli/commands/ingest.d.ts.map +1 -1
  19. package/dist/cli/commands/ingest.js +5 -4
  20. package/dist/cli/commands/ingest.js.map +1 -1
  21. package/dist/cli/commands/init.d.ts.map +1 -1
  22. package/dist/cli/commands/init.js +337 -81
  23. package/dist/cli/commands/init.js.map +1 -1
  24. package/dist/cli/commands/lint.d.ts.map +1 -1
  25. package/dist/cli/commands/lint.js +4 -3
  26. package/dist/cli/commands/lint.js.map +1 -1
  27. package/dist/cli/commands/mcp.d.ts +3 -0
  28. package/dist/cli/commands/mcp.d.ts.map +1 -0
  29. package/dist/cli/commands/mcp.js +11 -0
  30. package/dist/cli/commands/mcp.js.map +1 -0
  31. package/dist/cli/commands/open.d.ts +3 -0
  32. package/dist/cli/commands/open.d.ts.map +1 -0
  33. package/dist/cli/commands/open.js +36 -0
  34. package/dist/cli/commands/open.js.map +1 -0
  35. package/dist/cli/commands/query.d.ts.map +1 -1
  36. package/dist/cli/commands/query.js +5 -4
  37. package/dist/cli/commands/query.js.map +1 -1
  38. package/dist/cli/commands/search.d.ts +3 -0
  39. package/dist/cli/commands/search.d.ts.map +1 -0
  40. package/dist/cli/commands/search.js +61 -0
  41. package/dist/cli/commands/search.js.map +1 -0
  42. package/dist/cli/commands/serve.d.ts.map +1 -1
  43. package/dist/cli/commands/serve.js +41 -2
  44. package/dist/cli/commands/serve.js.map +1 -1
  45. package/dist/cli/commands/watch.d.ts.map +1 -1
  46. package/dist/cli/commands/watch.js +4 -3
  47. package/dist/cli/commands/watch.js.map +1 -1
  48. package/dist/cli/index.d.ts.map +1 -1
  49. package/dist/cli/index.js +27 -1
  50. package/dist/cli/index.js.map +1 -1
  51. package/dist/core/audit-trail.d.ts +15 -0
  52. package/dist/core/audit-trail.d.ts.map +1 -0
  53. package/dist/core/audit-trail.js +43 -0
  54. package/dist/core/audit-trail.js.map +1 -0
  55. package/dist/core/claude-code.d.ts +10 -0
  56. package/dist/core/claude-code.d.ts.map +1 -0
  57. package/dist/core/claude-code.js +81 -0
  58. package/dist/core/claude-code.js.map +1 -0
  59. package/dist/core/config.d.ts +23 -0
  60. package/dist/core/config.d.ts.map +1 -1
  61. package/dist/core/config.js.map +1 -1
  62. package/dist/core/connectors.d.ts +58 -0
  63. package/dist/core/connectors.d.ts.map +1 -0
  64. package/dist/core/connectors.js +189 -0
  65. package/dist/core/connectors.js.map +1 -0
  66. package/dist/core/folder-scanner.d.ts +10 -0
  67. package/dist/core/folder-scanner.d.ts.map +1 -0
  68. package/dist/core/folder-scanner.js +84 -0
  69. package/dist/core/folder-scanner.js.map +1 -0
  70. package/dist/core/git.d.ts +137 -0
  71. package/dist/core/git.d.ts.map +1 -0
  72. package/dist/core/git.js +520 -0
  73. package/dist/core/git.js.map +1 -0
  74. package/dist/core/history.d.ts +21 -0
  75. package/dist/core/history.d.ts.map +1 -0
  76. package/dist/core/history.js +107 -0
  77. package/dist/core/history.js.map +1 -0
  78. package/dist/core/improve.d.ts.map +1 -1
  79. package/dist/core/improve.js +9 -0
  80. package/dist/core/improve.js.map +1 -1
  81. package/dist/core/ingest.d.ts +1 -0
  82. package/dist/core/ingest.d.ts.map +1 -1
  83. package/dist/core/ingest.js +151 -7
  84. package/dist/core/ingest.js.map +1 -1
  85. package/dist/core/lint.d.ts.map +1 -1
  86. package/dist/core/lint.js +23 -4
  87. package/dist/core/lint.js.map +1 -1
  88. package/dist/core/oauth-defaults.d.ts +31 -0
  89. package/dist/core/oauth-defaults.d.ts.map +1 -0
  90. package/dist/core/oauth-defaults.js +77 -0
  91. package/dist/core/oauth-defaults.js.map +1 -0
  92. package/dist/core/observer.d.ts +94 -0
  93. package/dist/core/observer.d.ts.map +1 -0
  94. package/dist/core/observer.js +492 -0
  95. package/dist/core/observer.js.map +1 -0
  96. package/dist/core/pipeline-events.d.ts +63 -0
  97. package/dist/core/pipeline-events.d.ts.map +1 -0
  98. package/dist/core/pipeline-events.js +109 -0
  99. package/dist/core/pipeline-events.js.map +1 -0
  100. package/dist/core/query.d.ts.map +1 -1
  101. package/dist/core/query.js +16 -8
  102. package/dist/core/query.js.map +1 -1
  103. package/dist/core/scraper.d.ts +41 -0
  104. package/dist/core/scraper.d.ts.map +1 -0
  105. package/dist/core/scraper.js +277 -0
  106. package/dist/core/scraper.js.map +1 -0
  107. package/dist/core/sync/gdrive.d.ts +14 -0
  108. package/dist/core/sync/gdrive.d.ts.map +1 -0
  109. package/dist/core/sync/gdrive.js +205 -0
  110. package/dist/core/sync/gdrive.js.map +1 -0
  111. package/dist/core/sync/github.d.ts +20 -0
  112. package/dist/core/sync/github.d.ts.map +1 -0
  113. package/dist/core/sync/github.js +206 -0
  114. package/dist/core/sync/github.js.map +1 -0
  115. package/dist/core/sync/gmail.d.ts +15 -0
  116. package/dist/core/sync/gmail.d.ts.map +1 -0
  117. package/dist/core/sync/gmail.js +159 -0
  118. package/dist/core/sync/gmail.js.map +1 -0
  119. package/dist/core/sync/index.d.ts +47 -0
  120. package/dist/core/sync/index.d.ts.map +1 -0
  121. package/dist/core/sync/index.js +100 -0
  122. package/dist/core/sync/index.js.map +1 -0
  123. package/dist/core/sync/jira.d.ts +15 -0
  124. package/dist/core/sync/jira.d.ts.map +1 -0
  125. package/dist/core/sync/jira.js +176 -0
  126. package/dist/core/sync/jira.js.map +1 -0
  127. package/dist/core/sync/linear.d.ts +15 -0
  128. package/dist/core/sync/linear.d.ts.map +1 -0
  129. package/dist/core/sync/linear.js +111 -0
  130. package/dist/core/sync/linear.js.map +1 -0
  131. package/dist/core/sync/notion.d.ts +14 -0
  132. package/dist/core/sync/notion.d.ts.map +1 -0
  133. package/dist/core/sync/notion.js +168 -0
  134. package/dist/core/sync/notion.js.map +1 -0
  135. package/dist/core/sync/rss.d.ts +20 -0
  136. package/dist/core/sync/rss.d.ts.map +1 -0
  137. package/dist/core/sync/rss.js +165 -0
  138. package/dist/core/sync/rss.js.map +1 -0
  139. package/dist/core/sync/scheduler.d.ts +31 -0
  140. package/dist/core/sync/scheduler.d.ts.map +1 -0
  141. package/dist/core/sync/scheduler.js +129 -0
  142. package/dist/core/sync/scheduler.js.map +1 -0
  143. package/dist/core/sync/slack.d.ts +16 -0
  144. package/dist/core/sync/slack.d.ts.map +1 -0
  145. package/dist/core/sync/slack.js +173 -0
  146. package/dist/core/sync/slack.js.map +1 -0
  147. package/dist/core/vault.d.ts +22 -0
  148. package/dist/core/vault.d.ts.map +1 -1
  149. package/dist/core/vault.js +65 -0
  150. package/dist/core/vault.js.map +1 -1
  151. package/dist/core/webhooks.d.ts +13 -0
  152. package/dist/core/webhooks.d.ts.map +1 -0
  153. package/dist/core/webhooks.js +206 -0
  154. package/dist/core/webhooks.js.map +1 -0
  155. package/dist/index.js +3 -2
  156. package/dist/index.js.map +1 -1
  157. package/dist/mcp-entry.d.ts +10 -0
  158. package/dist/mcp-entry.d.ts.map +1 -0
  159. package/dist/mcp-entry.js +21 -0
  160. package/dist/mcp-entry.js.map +1 -0
  161. package/dist/mcp-server.d.ts +20 -0
  162. package/dist/mcp-server.d.ts.map +1 -0
  163. package/dist/mcp-server.js +483 -0
  164. package/dist/mcp-server.js.map +1 -0
  165. package/dist/mcp-tools-extended.d.ts +15 -0
  166. package/dist/mcp-tools-extended.d.ts.map +1 -0
  167. package/dist/mcp-tools-extended.js +277 -0
  168. package/dist/mcp-tools-extended.js.map +1 -0
  169. package/dist/processors/audio.d.ts.map +1 -1
  170. package/dist/processors/audio.js +42 -4
  171. package/dist/processors/audio.js.map +1 -1
  172. package/dist/processors/csv.d.ts +18 -0
  173. package/dist/processors/csv.d.ts.map +1 -0
  174. package/dist/processors/csv.js +230 -0
  175. package/dist/processors/csv.js.map +1 -0
  176. package/dist/processors/image.d.ts.map +1 -1
  177. package/dist/processors/image.js +55 -27
  178. package/dist/processors/image.js.map +1 -1
  179. package/dist/processors/pdf.d.ts.map +1 -1
  180. package/dist/processors/pdf.js +6 -3
  181. package/dist/processors/pdf.js.map +1 -1
  182. package/dist/processors/pptx.d.ts +3 -1
  183. package/dist/processors/pptx.d.ts.map +1 -1
  184. package/dist/processors/pptx.js +236 -95
  185. package/dist/processors/pptx.js.map +1 -1
  186. package/dist/processors/url.js +4 -1
  187. package/dist/processors/url.js.map +1 -1
  188. package/dist/processors/xlsx.d.ts +2 -0
  189. package/dist/processors/xlsx.d.ts.map +1 -1
  190. package/dist/processors/xlsx.js +182 -46
  191. package/dist/processors/xlsx.js.map +1 -1
  192. package/dist/providers/claude.d.ts +1 -0
  193. package/dist/providers/claude.d.ts.map +1 -1
  194. package/dist/providers/claude.js +5 -3
  195. package/dist/providers/claude.js.map +1 -1
  196. package/dist/providers/index.d.ts +17 -1
  197. package/dist/providers/index.d.ts.map +1 -1
  198. package/dist/providers/index.js +144 -0
  199. package/dist/providers/index.js.map +1 -1
  200. package/dist/providers/openai.d.ts +1 -0
  201. package/dist/providers/openai.d.ts.map +1 -1
  202. package/dist/providers/openai.js +5 -3
  203. package/dist/providers/openai.js.map +1 -1
  204. package/dist/providers/types.d.ts +18 -0
  205. package/dist/providers/types.d.ts.map +1 -1
  206. package/dist/templates/config-yaml.d.ts.map +1 -1
  207. package/dist/templates/config-yaml.js +12 -1
  208. package/dist/templates/config-yaml.js.map +1 -1
  209. package/dist/templates/source-types.d.ts +33 -0
  210. package/dist/templates/source-types.d.ts.map +1 -0
  211. package/dist/templates/source-types.js +178 -0
  212. package/dist/templates/source-types.js.map +1 -0
  213. package/dist/web/public/index.html +9836 -742
  214. package/dist/web/server.d.ts.map +1 -1
  215. package/dist/web/server.js +2823 -43
  216. package/dist/web/server.js.map +1 -1
  217. package/package.json +10 -4
  218. package/scripts/install.sh +54 -0
  219. package/src/web/public/index.html +9836 -742
  220. package/templates/mcp-config.json +9 -0
  221. package/templates/source-types/article.md +21 -0
  222. package/templates/source-types/book.md +21 -0
  223. package/templates/source-types/paper.md +23 -0
  224. package/templates/source-types/podcast.md +21 -0
  225. package/templates/source-types/raw-notes.md +17 -0
  226. package/templates/source-types/tweet-thread.md +19 -0
  227. package/templates/source-types/video.md +21 -0
  228. package/dist/web/public/public/index.html +0 -946
@@ -0,0 +1,492 @@
1
+ /**
2
+ * Automation 2: Observer (Self-Improvement Engine)
3
+ *
4
+ * Runs nightly at 3am (or on demand) to score every wiki page for quality,
5
+ * find orphans, flag contradictions, and identify knowledge gaps.
6
+ *
7
+ * Reports saved to .wikimem/observer-reports/YYYY-MM-DD.json
8
+ * Auto-committed as: wiki: observe: nightly quality scan
9
+ */
10
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
11
+ import { basename, join } from 'node:path';
12
+ import cron from 'node-cron';
13
+ import { listWikiPages, readWikiPage } from './vault.js';
14
+ import { appendAuditEntry } from './audit-trail.js';
15
+ function scoreFreshness(frontmatter) {
16
+ const updated = frontmatter['updated'];
17
+ if (!updated)
18
+ return 0;
19
+ try {
20
+ const daysSince = (Date.now() - new Date(updated).getTime()) / 86_400_000;
21
+ if (daysSince <= 7)
22
+ return 2;
23
+ if (daysSince <= 30)
24
+ return 1;
25
+ return 0;
26
+ }
27
+ catch {
28
+ return 0;
29
+ }
30
+ }
31
+ function scoreReadability(content) {
32
+ let r = 0;
33
+ if (/^#{2,3}\s/m.test(content))
34
+ r++;
35
+ const paragraphs = content.split(/\n\n+/).filter(p => p.trim().length > 0);
36
+ if (paragraphs.length >= 3)
37
+ r++;
38
+ return r;
39
+ }
40
+ const MAX_SCORE = 14;
41
+ function scorePage(pagePath, incomingLinks) {
42
+ const page = readWikiPage(pagePath);
43
+ const slug = basename(pagePath, '.md');
44
+ const issues = [];
45
+ const hasSummary = Boolean(page.frontmatter['summary'] && String(page.frontmatter['summary']).trim().length > 10);
46
+ const hasLinksOut = page.wikilinks.length > 0;
47
+ const linksIn = incomingLinks.get(slug) ?? 0;
48
+ const hasLinksIn = linksIn > 0;
49
+ const hasTags = Array.isArray(page.frontmatter['tags'])
50
+ ? page.frontmatter['tags'].length > 0
51
+ : false;
52
+ const freshness = scoreFreshness(page.frontmatter);
53
+ const readability = scoreReadability(page.content);
54
+ let score = 0;
55
+ if (hasSummary)
56
+ score += 2;
57
+ if (hasLinksOut)
58
+ score += 2;
59
+ if (hasLinksIn)
60
+ score += 2;
61
+ if (page.wordCount >= 50)
62
+ score += 2;
63
+ else if (page.wordCount >= 20)
64
+ score += 1;
65
+ if (hasTags)
66
+ score += 2;
67
+ score += freshness;
68
+ score += readability;
69
+ if (!hasSummary)
70
+ issues.push('Missing or empty summary in frontmatter');
71
+ if (!hasLinksOut)
72
+ issues.push('No outbound [[wikilinks]] — isolated page');
73
+ if (!hasLinksIn)
74
+ issues.push('No pages link to this page (orphan candidate)');
75
+ if (page.wordCount < 50)
76
+ issues.push(`Very short content (${page.wordCount} words)`);
77
+ if (!hasTags)
78
+ issues.push('No tags defined');
79
+ if (freshness === 0)
80
+ issues.push('Stale or missing updated date (>30 days)');
81
+ if (readability === 0)
82
+ issues.push('No headings or structured paragraphs');
83
+ return {
84
+ page: pagePath,
85
+ title: page.title,
86
+ score,
87
+ maxScore: MAX_SCORE,
88
+ breakdown: {
89
+ hasSummary,
90
+ hasLinksOut,
91
+ hasLinksIn,
92
+ wordCount: page.wordCount,
93
+ hasTags,
94
+ freshness,
95
+ readability,
96
+ },
97
+ issues,
98
+ };
99
+ }
100
+ function findOrphans(pagePaths, incomingLinks) {
101
+ return pagePaths
102
+ .filter((p) => {
103
+ const slug = basename(p, '.md');
104
+ return (incomingLinks.get(slug) ?? 0) === 0;
105
+ })
106
+ .map((p) => {
107
+ const page = readWikiPage(p);
108
+ return { page: p, title: page.title, slug: basename(p, '.md') };
109
+ });
110
+ }
111
+ /**
112
+ * Lightweight heuristic: two pages share a topic keyword in their title
113
+ * but their summaries contain opposing sentiment words.
114
+ */
115
+ /** Exported for lint + UI — heuristic opposing-summary pairs across related pages */
116
+ export function flagContradictions(pagePaths) {
117
+ const contradictions = [];
118
+ const OPPOSING_PAIRS = [
119
+ ['deprecated', 'recommended'],
120
+ ['avoid', 'use'],
121
+ ['slow', 'fast'],
122
+ ['removed', 'added'],
123
+ ['disabled', 'enabled'],
124
+ ['legacy', 'modern'],
125
+ ['broken', 'working'],
126
+ ];
127
+ const pages = pagePaths.map((p) => {
128
+ const page = readWikiPage(p);
129
+ const summary = String(page.frontmatter['summary'] ?? '').toLowerCase();
130
+ return { path: p, title: page.title, summary };
131
+ });
132
+ for (let i = 0; i < pages.length; i++) {
133
+ for (let j = i + 1; j < pages.length; j++) {
134
+ const a = pages[i];
135
+ const b = pages[j];
136
+ // Only compare pages that share a word in their title (likely related)
137
+ const wordsA = new Set(a.title.toLowerCase().split(/\s+/));
138
+ const wordsB = new Set(b.title.toLowerCase().split(/\s+/));
139
+ const sharedWords = [...wordsA].filter((w) => w.length > 3 && wordsB.has(w));
140
+ if (sharedWords.length === 0)
141
+ continue;
142
+ for (const [pos, neg] of OPPOSING_PAIRS) {
143
+ const aHasPos = a.summary.includes(pos) || a.summary.includes(neg);
144
+ const bHasPos = b.summary.includes(pos) || b.summary.includes(neg);
145
+ if (aHasPos && bHasPos) {
146
+ const aWord = a.summary.includes(pos) ? pos : neg;
147
+ const bWord = b.summary.includes(pos) ? pos : neg;
148
+ if (aWord !== bWord) {
149
+ contradictions.push({
150
+ pageA: a.path,
151
+ titleA: a.title,
152
+ pageB: b.path,
153
+ titleB: b.title,
154
+ reason: `"${a.title}" uses "${aWord}" while "${b.title}" uses "${bWord}" for shared topic "${sharedWords[0]}"`,
155
+ });
156
+ }
157
+ }
158
+ }
159
+ }
160
+ // Cap at 50 contradictions to avoid O(n²) blowup on large wikis
161
+ if (contradictions.length >= 50)
162
+ break;
163
+ }
164
+ return contradictions;
165
+ }
166
+ /**
167
+ * Find [[wikilinks]] that point to non-existent pages — these are knowledge gaps.
168
+ */
169
+ function findGaps(pagePaths) {
170
+ const existingSlugs = new Set(pagePaths.map((p) => basename(p, '.md').toLowerCase()));
171
+ const existingTitles = new Set();
172
+ for (const p of pagePaths) {
173
+ try {
174
+ const page = readWikiPage(p);
175
+ existingTitles.add(page.title.toLowerCase());
176
+ }
177
+ catch { /* skip */ }
178
+ }
179
+ const missing = new Map();
180
+ for (const p of pagePaths) {
181
+ try {
182
+ const page = readWikiPage(p);
183
+ for (const link of page.wikilinks) {
184
+ const slug = link.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
185
+ if (!existingSlugs.has(slug) && !existingTitles.has(link.toLowerCase())) {
186
+ const refs = missing.get(link) ?? [];
187
+ refs.push(page.title);
188
+ missing.set(link, refs);
189
+ }
190
+ }
191
+ }
192
+ catch { /* skip unreadable pages */ }
193
+ }
194
+ return Array.from(missing.entries())
195
+ .map(([topic, refs]) => ({
196
+ mentionedTopic: topic,
197
+ mentionedIn: [...new Set(refs)],
198
+ mentionCount: refs.length,
199
+ }))
200
+ .sort((a, b) => b.mentionCount - a.mentionCount)
201
+ .slice(0, 50);
202
+ }
203
+ // ─── Inbound Link Map ─────────────────────────────────────────────────────────
204
+ function buildIncomingLinksMap(pagePaths) {
205
+ const titleToSlug = new Map();
206
+ // Build title → slug lookup
207
+ for (const p of pagePaths) {
208
+ const slug = basename(p, '.md');
209
+ try {
210
+ const page = readWikiPage(p);
211
+ titleToSlug.set(page.title.toLowerCase(), slug);
212
+ titleToSlug.set(slug, slug);
213
+ }
214
+ catch { /* skip */ }
215
+ }
216
+ const incoming = new Map();
217
+ for (const p of pagePaths) {
218
+ try {
219
+ const page = readWikiPage(p);
220
+ for (const link of page.wikilinks) {
221
+ const slug = titleToSlug.get(link.toLowerCase()) ??
222
+ titleToSlug.get(link.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, ''));
223
+ if (slug) {
224
+ incoming.set(slug, (incoming.get(slug) ?? 0) + 1);
225
+ }
226
+ }
227
+ }
228
+ catch { /* skip */ }
229
+ }
230
+ return incoming;
231
+ }
232
+ const COST_PER_IMPROVEMENT_ESTIMATE = 0.15;
233
+ const IMPROVE_SYSTEM_PROMPT = `You are a wiki quality improvement agent. You are given a wiki page that has quality issues.
234
+
235
+ Your job is to improve the page by:
236
+ 1. Adding a meaningful summary to the frontmatter if missing
237
+ 2. Adding relevant tags if missing
238
+ 3. Improving structure with proper headings if readability is low
239
+ 4. Expanding very short pages with useful context
240
+ 5. Adding [[wikilinks]] to related concepts if the page has no outbound links
241
+
242
+ Rules:
243
+ - Preserve all existing content — only ADD, never remove
244
+ - Keep the existing YAML frontmatter format
245
+ - Use [[Double Bracket]] notation for wikilinks
246
+ - Be concise but informative
247
+ - Return the COMPLETE page content including frontmatter
248
+
249
+ Return ONLY the improved markdown content, nothing else.`;
250
+ async function improveWeakPages(config, scores, options, incomingLinks) {
251
+ const results = [];
252
+ const maxToImprove = options.maxImprovements ?? 3;
253
+ const maxBudget = options.maxBudget ?? 2.0;
254
+ const budgetAllowedPages = Math.floor(maxBudget / COST_PER_IMPROVEMENT_ESTIMATE);
255
+ const effectiveMax = Math.min(maxToImprove, budgetAllowedPages);
256
+ if (effectiveMax <= 0)
257
+ return results;
258
+ const weakPages = scores
259
+ .filter((s) => s.score < s.maxScore * 0.5 && s.issues.length > 0)
260
+ .sort((a, b) => a.score - b.score)
261
+ .slice(0, effectiveMax);
262
+ if (weakPages.length === 0)
263
+ return results;
264
+ const { loadConfig } = await import('./config.js');
265
+ const userConfig = loadConfig(config.configPath);
266
+ for (const weak of weakPages) {
267
+ try {
268
+ const page = readWikiPage(weak.page);
269
+ const fullContent = readFileSync(weak.page, 'utf-8');
270
+ const issueList = weak.issues.map((i) => `- ${i}`).join('\n');
271
+ const prompt = `Improve this wiki page. Current quality score: ${weak.score}/${weak.maxScore}
272
+
273
+ Issues found:
274
+ ${issueList}
275
+
276
+ Current page content:
277
+ ---
278
+ ${fullContent}
279
+ ---
280
+
281
+ Return the improved complete page content.`;
282
+ let improved;
283
+ if (userConfig.llm_mode === 'claude-code') {
284
+ const { runClaudeCode } = await import('./claude-code.js');
285
+ improved = await runClaudeCode(IMPROVE_SYSTEM_PROMPT, prompt, { maxTokens: 4096 });
286
+ }
287
+ else {
288
+ const { createProviderFromUserConfig } = await import('../providers/index.js');
289
+ const provider = createProviderFromUserConfig(userConfig);
290
+ const response = await provider.chat([
291
+ { role: 'user', content: prompt },
292
+ ], { systemPrompt: IMPROVE_SYSTEM_PROMPT, maxTokens: 4096 });
293
+ improved = response.content;
294
+ }
295
+ if (improved && improved.trim().length > fullContent.length * 0.5) {
296
+ const { writeFileSync } = await import('node:fs');
297
+ writeFileSync(weak.page, improved.trim(), 'utf-8');
298
+ // Re-score to get newScore
299
+ const reScored = scorePage(weak.page, incomingLinks);
300
+ results.push({
301
+ page: weak.page,
302
+ title: weak.title,
303
+ originalScore: weak.score,
304
+ newScore: reScored.score,
305
+ action: `Improved: ${weak.issues.slice(0, 3).join(', ')}`,
306
+ improved: true,
307
+ });
308
+ }
309
+ else {
310
+ results.push({
311
+ page: weak.page,
312
+ title: weak.title,
313
+ originalScore: weak.score,
314
+ action: 'LLM response too short — skipped',
315
+ improved: false,
316
+ });
317
+ }
318
+ }
319
+ catch (err) {
320
+ results.push({
321
+ page: weak.page,
322
+ title: weak.title,
323
+ originalScore: weak.score,
324
+ action: 'Error during improvement',
325
+ improved: false,
326
+ error: err instanceof Error ? err.message : String(err),
327
+ });
328
+ }
329
+ }
330
+ return results;
331
+ }
332
+ export function getObserverReportsDir(vaultRoot) {
333
+ return join(vaultRoot, '.wikimem', 'observer-reports');
334
+ }
335
+ export async function runObserver(config, options) {
336
+ const startMs = Date.now();
337
+ const allPaths = listWikiPages(config.wikiDir);
338
+ const incomingLinks = buildIncomingLinksMap(allPaths);
339
+ const reviewPaths = options?.maxPagesToReview
340
+ ? allPaths.slice(0, options.maxPagesToReview)
341
+ : allPaths;
342
+ const scores = reviewPaths.map((p) => scorePage(p, incomingLinks));
343
+ const orphans = findOrphans(allPaths, incomingLinks);
344
+ const contradictions = flagContradictions(reviewPaths);
345
+ const gaps = findGaps(allPaths);
346
+ const avgScore = scores.length > 0
347
+ ? Math.round((scores.reduce((s, p) => s + p.score, 0) / scores.length) * 10) / 10
348
+ : 0;
349
+ // Tally most common issues
350
+ const issueCounts = new Map();
351
+ for (const s of scores) {
352
+ for (const issue of s.issues) {
353
+ issueCounts.set(issue, (issueCounts.get(issue) ?? 0) + 1);
354
+ }
355
+ }
356
+ const topIssues = Array.from(issueCounts.entries())
357
+ .map(([issue, count]) => ({ issue, count }))
358
+ .sort((a, b) => b.count - a.count)
359
+ .slice(0, 10);
360
+ // LLM-powered improvement of weakest pages
361
+ let improvements = [];
362
+ if (options?.autoImprove) {
363
+ improvements = await improveWeakPages(config, scores, options, incomingLinks);
364
+ }
365
+ const date = new Date().toISOString().split('T')[0] ?? '';
366
+ const report = {
367
+ date,
368
+ generatedAt: new Date().toISOString(),
369
+ totalPages: allPaths.length,
370
+ pagesReviewed: reviewPaths.length,
371
+ averageScore: avgScore,
372
+ maxScore: MAX_SCORE,
373
+ scores: scores.sort((a, b) => a.score - b.score),
374
+ orphans,
375
+ contradictions,
376
+ gaps,
377
+ topIssues,
378
+ improvements,
379
+ };
380
+ // Save report
381
+ const reportsDir = getObserverReportsDir(config.root);
382
+ mkdirSync(reportsDir, { recursive: true });
383
+ const reportPath = join(reportsDir, `${date}.json`);
384
+ writeFileSync(reportPath, JSON.stringify(report, null, 2), 'utf-8');
385
+ // Build rich commit body with details
386
+ const improvementLines = improvements
387
+ .filter((i) => i.improved)
388
+ .map((i) => ` ✓ ${i.title} (was ${i.originalScore}/${MAX_SCORE}): ${i.action}`);
389
+ const failedLines = improvements
390
+ .filter((i) => !i.improved)
391
+ .map((i) => ` ✗ ${i.title}: ${i.action}${i.error ? ` — ${i.error}` : ''}`);
392
+ const weakestPages = scores
393
+ .filter((s) => s.score < MAX_SCORE * 0.7)
394
+ .slice(0, 5)
395
+ .map((s) => ` ${s.title}: ${s.score}/${MAX_SCORE} — ${s.issues[0] ?? 'no issues'}`);
396
+ const commitBodyParts = [
397
+ `Pages: ${allPaths.length} (reviewed: ${reviewPaths.length})`,
398
+ `Average score: ${avgScore}/${MAX_SCORE}`,
399
+ `Orphans: ${orphans.length} | Gaps: ${gaps.length} | Contradictions: ${contradictions.length}`,
400
+ ];
401
+ if (improvementLines.length > 0) {
402
+ commitBodyParts.push('', 'Improvements applied:', ...improvementLines);
403
+ }
404
+ if (failedLines.length > 0) {
405
+ commitBodyParts.push('', 'Improvement failures:', ...failedLines);
406
+ }
407
+ if (weakestPages.length > 0) {
408
+ commitBodyParts.push('', 'Weakest pages:', ...weakestPages);
409
+ }
410
+ const commitBody = commitBodyParts.join('\n');
411
+ const commitSubject = improvements.some((i) => i.improved)
412
+ ? `quality scan + ${improvements.filter((i) => i.improved).length} page(s) improved`
413
+ : 'nightly quality scan';
414
+ // Auto-commit
415
+ try {
416
+ const { autoCommit, isGitRepo } = await import('./git.js');
417
+ let commitHash;
418
+ if (await isGitRepo(config.root)) {
419
+ const commitResult = await autoCommit(config.root, 'observe', commitSubject, commitBody);
420
+ commitHash = commitResult?.hash;
421
+ }
422
+ const improveSummary = improvements.length > 0
423
+ ? ` Improved ${improvements.filter((i) => i.improved).length}/${improvements.length} pages.`
424
+ : '';
425
+ appendAuditEntry(config.root, {
426
+ action: 'observe',
427
+ actor: 'observer',
428
+ source: reportPath,
429
+ summary: `Quality scan: ${allPaths.length} pages (${reviewPaths.length} reviewed), avg score ${avgScore}/${MAX_SCORE}, ${orphans.length} orphans, ${gaps.length} gaps, ${contradictions.length} contradictions.${improveSummary}`,
430
+ pagesAffected: [
431
+ ...improvements.filter((i) => i.improved).map((i) => basename(i.page, '.md')),
432
+ ...reviewPaths.map((p) => basename(p, '.md')),
433
+ ],
434
+ commitHash,
435
+ duration: Date.now() - startMs,
436
+ });
437
+ }
438
+ catch {
439
+ // git/audit failure is non-fatal
440
+ }
441
+ return report;
442
+ }
443
+ // ─── Report Listing ───────────────────────────────────────────────────────────
444
+ export function listObserverReports(vaultRoot) {
445
+ const dir = getObserverReportsDir(vaultRoot);
446
+ if (!existsSync(dir))
447
+ return [];
448
+ return readdirSync(dir)
449
+ .filter((f) => f.endsWith('.json'))
450
+ .sort()
451
+ .reverse();
452
+ }
453
+ export function readObserverReport(vaultRoot, date) {
454
+ const dir = getObserverReportsDir(vaultRoot);
455
+ const reportPath = join(dir, `${date}.json`);
456
+ if (!existsSync(reportPath))
457
+ return null;
458
+ try {
459
+ return JSON.parse(readFileSync(reportPath, 'utf-8'));
460
+ }
461
+ catch {
462
+ return null;
463
+ }
464
+ }
465
+ // ─── Cron Scheduler ──────────────────────────────────────────────────────────
466
+ let scheduledJob = null;
467
+ export function startObserverCron(config) {
468
+ if (scheduledJob)
469
+ return; // already running
470
+ // Run at 3:00 AM every night
471
+ scheduledJob = cron.schedule('0 3 * * *', async () => {
472
+ console.log('[observer] Starting nightly quality scan...');
473
+ try {
474
+ const report = await runObserver(config);
475
+ console.log(`[observer] Done — ${report.totalPages} pages (${report.pagesReviewed} reviewed), avg score ${report.averageScore}/${report.maxScore}, ${report.orphans.length} orphans.`);
476
+ }
477
+ catch (err) {
478
+ console.error('[observer] Nightly scan failed:', err);
479
+ }
480
+ });
481
+ console.log(' Observer cron scheduled: nightly at 3:00 AM');
482
+ }
483
+ export function stopObserverCron() {
484
+ if (scheduledJob) {
485
+ scheduledJob.stop();
486
+ scheduledJob = null;
487
+ }
488
+ }
489
+ export function isObserverCronRunning() {
490
+ return scheduledJob !== null;
491
+ }
492
+ //# sourceMappingURL=observer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observer.js","sourceRoot":"","sources":["../../src/core/observer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { EventEmitter } from 'node:events';
2
+ export type PipelineStep = 'detect' | 'extract' | 'dedup' | 'copy-raw' | 'llm-compile' | 'write-pages' | 'update-index' | 'embed' | 'git-commit' | 'complete' | 'error';
3
+ export type StepStatus = 'pending' | 'running' | 'done' | 'error' | 'skipped';
4
+ export interface PipelineEvent {
5
+ step: PipelineStep;
6
+ status: StepStatus;
7
+ detail?: string;
8
+ progress?: number;
9
+ timestamp: string;
10
+ }
11
+ export interface LLMTrace {
12
+ systemPrompt: string;
13
+ userPrompt: string;
14
+ response: string;
15
+ model?: string;
16
+ tokensUsed?: number;
17
+ durationMs?: number;
18
+ }
19
+ export interface PipelineRun {
20
+ id: string;
21
+ source: string;
22
+ startedAt: string;
23
+ events: PipelineEvent[];
24
+ llmTrace?: LLMTrace;
25
+ summary?: PipelineSummary;
26
+ result?: {
27
+ pagesCreated: number;
28
+ linksAdded: number;
29
+ title: string;
30
+ };
31
+ }
32
+ export interface PipelineSummary {
33
+ whatHappened: string;
34
+ pagesCreated: string[];
35
+ pagesUpdated: string[];
36
+ entitiesFound: string[];
37
+ conceptsFound: string[];
38
+ linksCreated: number;
39
+ decisionsExplained: string;
40
+ }
41
+ declare class PipelineEventBus extends EventEmitter {
42
+ private currentRun;
43
+ private runs;
44
+ private persistPath;
45
+ /**
46
+ * Enable file-based persistence so runs survive server restarts.
47
+ * Call once at startup with the vault root path.
48
+ */
49
+ initPersistence(vaultRoot: string): void;
50
+ private loadFromDisk;
51
+ private saveToDisk;
52
+ startRun(source: string): string;
53
+ emitStep(step: PipelineStep, status: StepStatus, detail?: string): void;
54
+ setLLMTrace(trace: LLMTrace): void;
55
+ setSummary(summary: PipelineSummary): void;
56
+ completeRun(result?: PipelineRun['result']): void;
57
+ errorRun(error: string): void;
58
+ getRecentRuns(): PipelineRun[];
59
+ getCurrentRun(): PipelineRun | null;
60
+ }
61
+ export declare const pipelineEvents: PipelineEventBus;
62
+ export {};
63
+ //# sourceMappingURL=pipeline-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-events.d.ts","sourceRoot":"","sources":["../../src/core/pipeline-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,SAAS,GACT,OAAO,GACP,UAAU,GACV,aAAa,GACb,aAAa,GACb,cAAc,GACd,OAAO,GACP,YAAY,GACZ,UAAU,GACV,OAAO,CAAC;AAEZ,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,MAAM,CAAC,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAID,cAAM,gBAAiB,SAAQ,YAAY;IACzC,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,WAAW,CAAuB;IAE1C;;;OAGG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKxC,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,UAAU;IAkBlB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAchC,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAavE,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAOlC,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAM1C,WAAW,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,GAAG,IAAI;IASjD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM7B,aAAa,IAAI,WAAW,EAAE;IAI9B,aAAa,IAAI,WAAW,GAAG,IAAI;CAGpC;AAED,eAAO,MAAM,cAAc,kBAAyB,CAAC"}