@wiki0/core 0.0.3 → 0.0.5

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/dist/schema.sql CHANGED
@@ -24,6 +24,23 @@ CREATE TABLE IF NOT EXISTS page_links (
24
24
  created_at TEXT DEFAULT (datetime('now'))
25
25
  );
26
26
 
27
+ CREATE TABLE IF NOT EXISTS page_chunks (
28
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
29
+ page_id INTEGER NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
30
+ path TEXT NOT NULL,
31
+ title TEXT NOT NULL,
32
+ heading TEXT,
33
+ body TEXT NOT NULL,
34
+ start_line INTEGER NOT NULL,
35
+ end_line INTEGER NOT NULL,
36
+ sequence INTEGER NOT NULL,
37
+ page_priority INTEGER NOT NULL DEFAULT 0,
38
+ page_status TEXT,
39
+ page_tags TEXT,
40
+ created_at TEXT DEFAULT (datetime('now')),
41
+ UNIQUE(page_id, sequence)
42
+ );
43
+
27
44
  CREATE TABLE IF NOT EXISTS facts (
28
45
  id INTEGER PRIMARY KEY AUTOINCREMENT,
29
46
  page_id INTEGER REFERENCES pages(id) ON DELETE SET NULL,
@@ -31,6 +48,11 @@ CREATE TABLE IF NOT EXISTS facts (
31
48
  summary TEXT NOT NULL,
32
49
  body TEXT,
33
50
  confidence TEXT NOT NULL DEFAULT 'unknown',
51
+ source_path TEXT,
52
+ source_heading TEXT,
53
+ source_start_line INTEGER,
54
+ source_end_line INTEGER,
55
+ source_quote TEXT,
34
56
  created_at TEXT DEFAULT (datetime('now'))
35
57
  );
36
58
 
@@ -40,4 +62,14 @@ CREATE TABLE IF NOT EXISTS wiki_meta (
40
62
  updated_at TEXT DEFAULT (datetime('now'))
41
63
  );
42
64
 
65
+ CREATE TABLE IF NOT EXISTS wiki_events (
66
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
67
+ operation TEXT NOT NULL,
68
+ summary TEXT NOT NULL,
69
+ target TEXT,
70
+ details TEXT,
71
+ created_at TEXT DEFAULT (datetime('now'))
72
+ );
73
+
43
74
  CREATE VIRTUAL TABLE IF NOT EXISTS fts_pages USING fts5(path, title, body);
75
+ CREATE VIRTUAL TABLE IF NOT EXISTS fts_page_chunks USING fts5(chunk_id UNINDEXED, path, title, heading, body);
package/dist/search.d.ts CHANGED
@@ -1,7 +1,9 @@
1
- import type { BacklinkResult, ContextResult, SearchResult } from './types.js';
1
+ import type { BacklinkResult, ChunkSearchResult, ContextResult, SearchResult, ShowChunkResult } from './types.js';
2
2
  export declare function search_wiki(query: string, root?: string, limit?: number): SearchResult[];
3
3
  export declare function plain_text_fts_query(query: string): string;
4
4
  export declare function relaxed_plain_text_fts_query(query: string): string;
5
+ export declare function search_wiki_chunks(query: string, root?: string, limit?: number): ChunkSearchResult[];
6
+ export declare function show_wiki_chunk(target: string, root?: string): ShowChunkResult | null;
5
7
  export declare function get_wiki_context(query: string, root?: string, limit?: number): ContextResult;
6
- export declare function format_context_markdown(query: string, results: SearchResult[]): string;
8
+ export declare function format_context_markdown(query: string, results: ChunkSearchResult[], warnings?: string[]): string;
7
9
  export declare function backlinks_for_page(title: string, root?: string): BacklinkResult[];
package/dist/search.js CHANGED
@@ -1,5 +1,9 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
1
3
  import { open_wiki_database } from './database.js';
4
+ import { index_status } from './indexer.js';
2
5
  import { resolve_page_path } from './pages.js';
6
+ import { resolve_wiki_root } from './paths.js';
3
7
  export function search_wiki(query, root = '.', limit = 10) {
4
8
  const db = open_wiki_database(root);
5
9
  const statement = db.prepare(`SELECT path, title,
@@ -84,22 +88,165 @@ function plain_text_terms(query) {
84
88
  function quote_fts_term(term) {
85
89
  return `"${term.replace(/"/gu, '""')}"`;
86
90
  }
91
+ export function search_wiki_chunks(query, root = '.', limit = 10) {
92
+ const db = open_wiki_database(root);
93
+ const statement = db.prepare(`SELECT fts_page_chunks.chunk_id AS chunk_id,
94
+ fts_page_chunks.path,
95
+ fts_page_chunks.title,
96
+ page_chunks.heading,
97
+ page_chunks.body,
98
+ page_chunks.start_line AS start_line,
99
+ page_chunks.end_line AS end_line,
100
+ page_chunks.page_priority,
101
+ page_chunks.page_status,
102
+ page_chunks.page_tags,
103
+ snippet(fts_page_chunks, 4, '[', ']', '…', 12) AS snippet,
104
+ bm25(fts_page_chunks) AS rank
105
+ FROM fts_page_chunks
106
+ JOIN page_chunks ON page_chunks.id = fts_page_chunks.chunk_id
107
+ WHERE fts_page_chunks MATCH ?
108
+ ORDER BY rank
109
+ LIMIT ?`);
110
+ const fts_query = plain_text_fts_query(query);
111
+ if (!fts_query) {
112
+ db.close();
113
+ return [];
114
+ }
115
+ try {
116
+ const rows = boosted_chunk_rows(statement.all(fts_query, limit * 5).map(chunk_row_from_sql), limit);
117
+ if (rows.length > 0)
118
+ return rows;
119
+ const relaxed_query = relaxed_plain_text_fts_query(query);
120
+ if (!relaxed_query || relaxed_query === fts_query)
121
+ return rows;
122
+ return boosted_chunk_rows(statement.all(relaxed_query, limit * 5).map(chunk_row_from_sql), limit);
123
+ }
124
+ catch (error) {
125
+ throw new Error(`Invalid wiki chunk search query: ${query}`, {
126
+ cause: error,
127
+ });
128
+ }
129
+ finally {
130
+ db.close();
131
+ }
132
+ }
133
+ function chunk_row_from_sql(row) {
134
+ return {
135
+ chunk_id: Number(row.chunk_id),
136
+ path: String(row.path),
137
+ title: String(row.title),
138
+ heading: row.heading === null ? null : String(row.heading),
139
+ body: String(row.body),
140
+ start_line: Number(row.start_line),
141
+ end_line: Number(row.end_line),
142
+ page_priority: Number(row.page_priority ?? 0),
143
+ page_status: row.page_status === null ? null : String(row.page_status),
144
+ page_tags: parse_page_tags(row.page_tags),
145
+ snippet: String(row.snippet),
146
+ rank: Number(row.rank),
147
+ };
148
+ }
149
+ function boosted_chunk_rows(rows, limit) {
150
+ return rows
151
+ .map(normalize_chunk_row)
152
+ .map((row) => ({ ...row, rank: boosted_rank(row) }))
153
+ .sort((left, right) => left.rank - right.rank)
154
+ .slice(0, limit);
155
+ }
156
+ function normalize_chunk_row(row) {
157
+ return {
158
+ ...row,
159
+ page_tags: parse_page_tags(row.page_tags),
160
+ };
161
+ }
162
+ function boosted_rank(row) {
163
+ const priority = row.page_priority ?? 0;
164
+ const status = (row.page_status ?? '').toLowerCase();
165
+ const tags = row.page_tags ?? [];
166
+ let rank = row.rank - priority * 0.1;
167
+ if (status === 'verified' || status === 'accepted')
168
+ rank -= 0.5;
169
+ if (status === 'draft' || status === 'review')
170
+ rank += 0.5;
171
+ if (status === 'stale' ||
172
+ status === 'superseded' ||
173
+ status === 'archived') {
174
+ rank += 2;
175
+ }
176
+ if (tags.includes('canonical') || tags.includes('source'))
177
+ rank -= 0.25;
178
+ if (tags.includes('archive') || tags.includes('superseded'))
179
+ rank += 2;
180
+ return rank;
181
+ }
182
+ function parse_page_tags(value) {
183
+ if (Array.isArray(value))
184
+ return value.filter((item) => typeof item === 'string');
185
+ if (typeof value !== 'string')
186
+ return [];
187
+ try {
188
+ const parsed = JSON.parse(value);
189
+ return Array.isArray(parsed)
190
+ ? parsed.filter((item) => typeof item === 'string')
191
+ : [];
192
+ }
193
+ catch {
194
+ return [];
195
+ }
196
+ }
197
+ export function show_wiki_chunk(target, root = '.') {
198
+ const { path, line } = parse_chunk_target(target, root);
199
+ const db = open_wiki_database(root);
200
+ const row = db
201
+ .prepare(`SELECT id AS chunk_id, path, title, heading, body,
202
+ start_line AS start_line, end_line AS end_line,
203
+ body AS snippet, 0 AS rank
204
+ FROM page_chunks
205
+ WHERE path = ? AND (? IS NULL OR (start_line <= ? AND end_line >= ?))
206
+ ORDER BY sequence
207
+ LIMIT 1`)
208
+ .get(path, line, line, line);
209
+ db.close();
210
+ return row ?? null;
211
+ }
212
+ function parse_chunk_target(target, root) {
213
+ const match = target.match(/^(.*?)(?::(\d+))?$/u);
214
+ const title = match?.[1]?.trim() ?? target;
215
+ const line = match?.[2] ? Number(match[2]) : null;
216
+ const wiki_root = resolve_wiki_root(root);
217
+ const direct_path = title.endsWith('.md') ? title : `${title}.md`;
218
+ if (existsSync(join(wiki_root, 'wiki', direct_path))) {
219
+ return { path: direct_path, line };
220
+ }
221
+ return { path: resolve_page_path(title, root), line };
222
+ }
87
223
  export function get_wiki_context(query, root = '.', limit = 5) {
88
- const results = search_wiki(query, root, limit);
224
+ const status = index_status(root);
225
+ const warnings = status.stale
226
+ ? [
227
+ `Index is stale (${status.reasons.join(', ')}); run index_wiki before relying on these results.`,
228
+ ]
229
+ : [];
230
+ const results = search_wiki_chunks(query, root, limit);
89
231
  return {
90
232
  query,
91
233
  results,
92
- markdown: format_context_markdown(query, results),
234
+ warnings,
235
+ markdown: format_context_markdown(query, results, warnings),
93
236
  };
94
237
  }
95
- export function format_context_markdown(query, results) {
238
+ export function format_context_markdown(query, results, warnings = []) {
96
239
  const lines = [`# wiki0 context: ${query}`, ''];
240
+ if (warnings.length > 0) {
241
+ lines.push('## Warnings', '', ...warnings.map((warning) => `- ${warning}`), '');
242
+ }
97
243
  if (results.length === 0) {
98
244
  lines.push('No indexed wiki context found.');
99
245
  return `${lines.join('\n')}\n`;
100
246
  }
101
247
  for (const [index, result] of results.entries()) {
102
- lines.push(`## ${index + 1}. ${result.title}`, `Source: \`wiki/${result.path}\``, '', result.snippet.replace(/\s+/gu, ' ').trim(), '');
248
+ const line_range = `${result.start_line}-${result.end_line}`;
249
+ lines.push(`## ${index + 1}. ${result.title}`, `Source: \`wiki/${result.path}:${line_range}\``, result.heading ? `Heading: ${result.heading}` : '', '', result.body.trim(), '');
103
250
  }
104
251
  return `${lines.join('\n').trimEnd()}\n`;
105
252
  }
@@ -107,7 +254,7 @@ export function backlinks_for_page(title, root = '.') {
107
254
  const db = open_wiki_database(root);
108
255
  const page_path = resolve_page_path(title, root);
109
256
  const rows = db
110
- .prepare(`SELECT pages.path, pages.title, page_links.raw_text AS rawText,
257
+ .prepare(`SELECT pages.path, pages.title, page_links.raw_text AS raw_text,
111
258
  page_links.alias, page_links.embed
112
259
  FROM page_links
113
260
  JOIN pages ON pages.id = page_links.from_page_id
@@ -115,6 +262,15 @@ export function backlinks_for_page(title, root = '.') {
115
262
  ORDER BY pages.path`)
116
263
  .all(page_path);
117
264
  db.close();
118
- return rows.map((row) => ({ ...row, embed: Boolean(row.embed) }));
265
+ return rows.map(backlink_from_row);
266
+ }
267
+ function backlink_from_row(row) {
268
+ return {
269
+ path: String(row.path),
270
+ title: String(row.title),
271
+ raw_text: String(row.raw_text),
272
+ alias: row.alias === null ? null : String(row.alias),
273
+ embed: Boolean(row.embed),
274
+ };
119
275
  }
120
276
  //# sourceMappingURL=search.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
package/dist/sync.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import type { WikiDocumentSyncOptions, WikiDocumentSyncResult } from './types.js';
2
+ export declare function sync_documents(options: WikiDocumentSyncOptions): Promise<WikiDocumentSyncResult>;
package/dist/sync.js ADDED
@@ -0,0 +1,340 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, readFileSync, readdirSync, statSync, } from 'node:fs';
3
+ import { join, relative, resolve } from 'node:path';
4
+ import { parse_document } from './documents.js';
5
+ import { log_wiki_event } from './events.js';
6
+ import { add_fact, derive_facts_from_markdown } from './facts.js';
7
+ import { index_wiki } from './indexer.js';
8
+ import { parse_markdown, serialize_frontmatter } from './markdown.js';
9
+ import { create_page } from './pages.js';
10
+ import { page_file_path, resolve_wiki_root, slugify_title, } from './paths.js';
11
+ const supported_extensions = new Set([
12
+ '.md',
13
+ '.markdown',
14
+ '.txt',
15
+ '.pdf',
16
+ '.docx',
17
+ ]);
18
+ export async function sync_documents(options) {
19
+ const root = resolve_wiki_root(options.root);
20
+ const sources = discover_sources(root, options.sources, {
21
+ include: options.include,
22
+ ignore: options.ignore,
23
+ });
24
+ const display_sources = sources.map((source) => source_display_path(root, source));
25
+ const created = [];
26
+ const skipped = [];
27
+ const proposed_pages = [];
28
+ const fact_inputs = [];
29
+ const synced_sources = [];
30
+ for (const source of sources) {
31
+ const display_source = source_display_path(root, source);
32
+ const page = source_page_path(display_source);
33
+ const file_path = page_file_path(page, root);
34
+ const page_exists = existsSync(file_path);
35
+ const fingerprint = source_fingerprint(source);
36
+ const existing_fingerprint = page_exists
37
+ ? existing_source_fingerprint(file_path)
38
+ : null;
39
+ const existing_kind = page_exists
40
+ ? existing_source_kind(file_path)
41
+ : 'unsupported';
42
+ if (page_exists &&
43
+ fingerprint !== null &&
44
+ existing_fingerprint === fingerprint) {
45
+ skipped.push(page);
46
+ synced_sources.push({
47
+ source: display_source,
48
+ page: `${page}.md`,
49
+ kind: existing_kind,
50
+ status: 'unchanged',
51
+ warnings: [],
52
+ });
53
+ continue;
54
+ }
55
+ if (page_exists && !options.overwrite) {
56
+ skipped.push(page);
57
+ synced_sources.push({
58
+ source: display_source,
59
+ page: `${page}.md`,
60
+ kind: existing_kind,
61
+ status: 'changed',
62
+ warnings: [
63
+ 'Source page exists and source fingerprint changed; rerun with overwrite to refresh generated content.',
64
+ ],
65
+ });
66
+ continue;
67
+ }
68
+ const parsed = await parse_document(source);
69
+ create_page(page, source_page_template(parsed, display_source, fingerprint), {
70
+ root,
71
+ overwrite: options.overwrite,
72
+ });
73
+ created.push(page);
74
+ if (options.derive_facts !== false && options.index !== false) {
75
+ for (const fact of derive_facts_from_markdown(parsed.text)) {
76
+ fact_inputs.push({ page, fact });
77
+ }
78
+ }
79
+ if (options.propose_pages) {
80
+ proposed_pages.push(...create_proposed_pages(parsed, display_source, root));
81
+ }
82
+ synced_sources.push({
83
+ source: display_source,
84
+ page: `${page}.md`,
85
+ kind: parsed.kind,
86
+ status: parsed.kind === 'unsupported'
87
+ ? 'warning'
88
+ : page_exists
89
+ ? 'updated'
90
+ : 'created',
91
+ warnings: parsed.warnings,
92
+ });
93
+ }
94
+ const indexed = options.index === false ? null : index_wiki(root);
95
+ const derived_facts = fact_inputs.map(({ page, fact }) => add_fact({
96
+ root,
97
+ page,
98
+ source: `${page}.md:${fact.line}`,
99
+ ...fact,
100
+ }));
101
+ log_wiki_event({
102
+ root,
103
+ operation: 'sync_documents',
104
+ summary: `Synced ${created.length} document sources`,
105
+ target: root,
106
+ details: {
107
+ sources: display_sources,
108
+ created,
109
+ skipped,
110
+ proposed_pages,
111
+ derived_fact_count: derived_facts.length,
112
+ synced_sources,
113
+ },
114
+ });
115
+ return {
116
+ root,
117
+ sources: display_sources,
118
+ created,
119
+ skipped,
120
+ proposed_pages,
121
+ derived_facts,
122
+ synced_sources,
123
+ indexed,
124
+ };
125
+ }
126
+ function discover_sources(root, sources, filters = {}) {
127
+ const discovered = [];
128
+ for (const source of sources) {
129
+ const absolute_source = resolve(root, source);
130
+ if (!existsSync(absolute_source)) {
131
+ discovered.push(absolute_source);
132
+ continue;
133
+ }
134
+ const stats = statSync(absolute_source);
135
+ if (stats.isDirectory()) {
136
+ discovered.push(...discover_directory(absolute_source, root, filters));
137
+ continue;
138
+ }
139
+ if (matches_source_filters(root, absolute_source, filters)) {
140
+ discovered.push(absolute_source);
141
+ }
142
+ }
143
+ return [...new Set(discovered)].sort();
144
+ }
145
+ function discover_directory(directory, root, filters) {
146
+ const sources = [];
147
+ for (const entry of readdirSync(directory, {
148
+ withFileTypes: true,
149
+ })) {
150
+ if (entry.name.startsWith('.'))
151
+ continue;
152
+ const entry_path = join(directory, entry.name);
153
+ if (entry.isDirectory()) {
154
+ sources.push(...discover_directory(entry_path, root, filters));
155
+ continue;
156
+ }
157
+ if (supported_extensions.has(extension(entry.name)) &&
158
+ matches_source_filters(root, entry_path, filters)) {
159
+ sources.push(entry_path);
160
+ }
161
+ }
162
+ return sources;
163
+ }
164
+ function matches_source_filters(root, source, filters) {
165
+ const display = source_display_path(root, source);
166
+ const included = !filters.include ||
167
+ filters.include.length === 0 ||
168
+ filters.include.some((pattern) => glob_match(pattern, display));
169
+ const ignored = (filters.ignore ?? []).some((pattern) => glob_match(pattern, display));
170
+ return included && !ignored;
171
+ }
172
+ function glob_match(pattern, value) {
173
+ let regex = '';
174
+ for (let index = 0; index < pattern.length; index += 1) {
175
+ const character = pattern[index];
176
+ const next = pattern[index + 1];
177
+ if (character === '*' && next === '*') {
178
+ regex += '.*';
179
+ index += 1;
180
+ continue;
181
+ }
182
+ if (character === '*') {
183
+ regex += '[^/]*';
184
+ continue;
185
+ }
186
+ regex += character?.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&') ?? '';
187
+ }
188
+ return new RegExp(`^${regex}$`, 'u').test(value);
189
+ }
190
+ function source_page_path(source) {
191
+ return `sources/synced/${slugify_title(source)}`;
192
+ }
193
+ function source_page_template(parsed, display_source, fingerprint) {
194
+ const frontmatter = serialize_frontmatter({
195
+ title: `Source: ${parsed.title ?? display_source}`,
196
+ tags: ['source', parsed.kind],
197
+ status: parsed.kind === 'unsupported' ? 'review' : 'draft',
198
+ source_path: display_source,
199
+ source_kind: parsed.kind,
200
+ source_fingerprint: fingerprint,
201
+ });
202
+ return `${frontmatter}# Source: ${parsed.title ?? display_source}
203
+
204
+ Source path: \`${display_source}\`
205
+ Source kind: \`${parsed.kind}\`
206
+
207
+ ## Extracted text
208
+
209
+ ${format_extracted_text(parsed)}
210
+
211
+ ## Parser metadata
212
+
213
+ ${format_metadata(parsed)}
214
+
215
+ ## Parser warnings
216
+
217
+ ${format_list(parsed.warnings, '- None.')}
218
+
219
+ ## Candidate facts
220
+
221
+ ${format_candidate_facts(parsed.text)}
222
+
223
+ ## Open questions
224
+
225
+ - What claims from this source should become stable wiki pages?
226
+ - What needs citation, owner confirmation, or freshness review?
227
+ `;
228
+ }
229
+ function format_extracted_text(parsed) {
230
+ if (parsed.text.length === 0)
231
+ return '- No text extracted.';
232
+ const fence = markdown_code_fence(parsed.text);
233
+ return `${fence}\n${parsed.text}\n${fence}`;
234
+ }
235
+ function markdown_code_fence(text) {
236
+ const longest_backtick_run = Math.max(0, ...Array.from(text.matchAll(/`+/gu), (match) => match[0]?.length ?? 0));
237
+ return '`'.repeat(Math.max(3, longest_backtick_run + 1));
238
+ }
239
+ function format_metadata(parsed) {
240
+ const entries = Object.entries(parsed.metadata);
241
+ if (entries.length === 0)
242
+ return '- None.';
243
+ return entries
244
+ .map(([key, value]) => `- ${key}: ${value ?? 'null'}`)
245
+ .join('\n');
246
+ }
247
+ function format_list(items, empty) {
248
+ return items.length > 0
249
+ ? items.map((item) => `- ${item}`).join('\n')
250
+ : empty;
251
+ }
252
+ function format_candidate_facts(text) {
253
+ const facts = derive_facts_from_markdown(text).map((fact) => `- Candidate from extracted line ${fact.line}: ${fact.summary}`);
254
+ return facts.length > 0
255
+ ? facts.join('\n')
256
+ : '- Review this source and promote durable claims into wiki pages.';
257
+ }
258
+ function create_proposed_pages(parsed, display_source, root) {
259
+ const pages = [];
260
+ for (const proposal of propose_pages(parsed, display_source)) {
261
+ if (existsSync(page_file_path(proposal.path, root)))
262
+ continue;
263
+ create_page(proposal.path, proposal.body, {
264
+ root,
265
+ overwrite: false,
266
+ });
267
+ pages.push(proposal.path);
268
+ }
269
+ return pages;
270
+ }
271
+ function propose_pages(parsed, display_source) {
272
+ const headings = parsed.text
273
+ .split(/\n/u)
274
+ .map((line) => line.match(/^#{1,3}\s+(.+)$/u)?.[1]?.trim())
275
+ .filter((heading) => Boolean(heading))
276
+ .slice(0, 5);
277
+ const workflow_lines = parsed.text
278
+ .split(/\n/u)
279
+ .filter((line) => /\b(workflow|process|step|how to)\b/iu.test(line))
280
+ .slice(0, 3);
281
+ return [
282
+ ...headings.map((heading) => proposed_page('concepts', heading, display_source)),
283
+ ...workflow_lines.map((line) => proposed_page('workflows', line.replace(/^[-*]\s*/u, '').slice(0, 80), display_source)),
284
+ ];
285
+ }
286
+ function proposed_page(section, title, display_source) {
287
+ const clean_title = title.replace(/[#:]/gu, '').trim();
288
+ const path = `${section}/proposed/${slugify_title(clean_title)}`;
289
+ const frontmatter = serialize_frontmatter({
290
+ title: clean_title,
291
+ tags: [section.slice(0, -1), 'proposed', 'needs-review'],
292
+ status: 'review',
293
+ source_path: display_source,
294
+ });
295
+ return {
296
+ path,
297
+ body: `${frontmatter}# ${clean_title}\n\nProposed from [[${source_page_path(display_source)}|${display_source}]].\n\n## Notes\n\n- Needs human review before becoming a stable wiki page.\n`,
298
+ };
299
+ }
300
+ function extension(path) {
301
+ return path.slice(path.lastIndexOf('.')).toLowerCase();
302
+ }
303
+ function source_display_path(root, source) {
304
+ const relative_source = relative(root, source);
305
+ return relative_source.startsWith('..') || relative_source === ''
306
+ ? source
307
+ : relative_source;
308
+ }
309
+ function source_fingerprint(source) {
310
+ try {
311
+ const stats = statSync(source);
312
+ if (!stats.isFile())
313
+ return null;
314
+ return createHash('sha256')
315
+ .update(readFileSync(source))
316
+ .digest('hex');
317
+ }
318
+ catch {
319
+ return null;
320
+ }
321
+ }
322
+ function existing_source_fingerprint(file_path) {
323
+ const fingerprint = parse_markdown(readFileSync(file_path, 'utf-8'))
324
+ .frontmatter.source_fingerprint;
325
+ return typeof fingerprint === 'string' && fingerprint.length > 0
326
+ ? fingerprint
327
+ : null;
328
+ }
329
+ function existing_source_kind(file_path) {
330
+ const kind = parse_markdown(readFileSync(file_path, 'utf-8'))
331
+ .frontmatter.source_kind;
332
+ return kind === 'markdown' ||
333
+ kind === 'text' ||
334
+ kind === 'pdf' ||
335
+ kind === 'docx' ||
336
+ kind === 'unsupported'
337
+ ? kind
338
+ : 'unsupported';
339
+ }
340
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { TopicThreadResult } from './types.js';
2
+ export declare function list_topic_threads(root?: string, limit?: number): TopicThreadResult[];