wikimem 0.1.7 → 0.2.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 (47) hide show
  1. package/dist/cli/commands/init.d.ts.map +1 -1
  2. package/dist/cli/commands/init.js +8 -1
  3. package/dist/cli/commands/init.js.map +1 -1
  4. package/dist/cli/commands/lint.d.ts.map +1 -1
  5. package/dist/cli/commands/lint.js +4 -0
  6. package/dist/cli/commands/lint.js.map +1 -1
  7. package/dist/cli/commands/query.d.ts.map +1 -1
  8. package/dist/cli/commands/query.js +3 -0
  9. package/dist/cli/commands/query.js.map +1 -1
  10. package/dist/cli/commands/status.d.ts.map +1 -1
  11. package/dist/cli/commands/status.js +19 -1
  12. package/dist/cli/commands/status.js.map +1 -1
  13. package/dist/core/index-manager.d.ts.map +1 -1
  14. package/dist/core/index-manager.js +2 -0
  15. package/dist/core/index-manager.js.map +1 -1
  16. package/dist/core/ingest.d.ts.map +1 -1
  17. package/dist/core/ingest.js +76 -7
  18. package/dist/core/ingest.js.map +1 -1
  19. package/dist/core/obsidian.d.ts +1 -1
  20. package/dist/core/obsidian.js +1 -1
  21. package/dist/core/scrape.js +9 -2
  22. package/dist/core/scrape.js.map +1 -1
  23. package/dist/index.js +46 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/processors/audio.js +1 -1
  26. package/dist/processors/video.js +1 -1
  27. package/dist/providers/claude.d.ts.map +1 -1
  28. package/dist/providers/claude.js +46 -21
  29. package/dist/providers/claude.js.map +1 -1
  30. package/dist/providers/embeddings.d.ts +1 -1
  31. package/dist/providers/embeddings.js +1 -1
  32. package/dist/providers/index.d.ts.map +1 -1
  33. package/dist/providers/index.js +6 -1
  34. package/dist/providers/index.js.map +1 -1
  35. package/dist/providers/ollama.d.ts.map +1 -1
  36. package/dist/providers/ollama.js +29 -13
  37. package/dist/providers/ollama.js.map +1 -1
  38. package/dist/providers/openai.d.ts.map +1 -1
  39. package/dist/providers/openai.js +42 -17
  40. package/dist/providers/openai.js.map +1 -1
  41. package/dist/web/public/index.html +82 -8
  42. package/dist/web/public/public/index.html +81 -7
  43. package/dist/web/server.d.ts.map +1 -1
  44. package/dist/web/server.js +15 -1
  45. package/dist/web/server.js.map +1 -1
  46. package/package.json +2 -2
  47. package/src/web/public/index.html +81 -7
@@ -10,32 +10,57 @@ export class ClaudeProvider {
10
10
  this.defaultModel = model ?? 'claude-sonnet-4-20250514';
11
11
  }
12
12
  async chat(messages, options) {
13
+ if (!process.env['ANTHROPIC_API_KEY'] && !this.client.apiKey) {
14
+ throw new Error('Anthropic API key not found.\n' +
15
+ 'Set it via: export ANTHROPIC_API_KEY=sk-ant-...\n' +
16
+ 'Or add to config.yaml: api_key: sk-ant-...\n' +
17
+ 'Get a key at: https://console.anthropic.com/settings/keys');
18
+ }
13
19
  const systemMessages = messages.filter((m) => m.role === 'system');
14
20
  const nonSystemMessages = messages.filter((m) => m.role !== 'system');
15
21
  const systemPrompt = options?.systemPrompt
16
22
  ?? systemMessages.map((m) => m.content).join('\n\n')
17
23
  ?? undefined;
18
- const response = await this.client.messages.create({
19
- model: options?.model ?? this.defaultModel,
20
- max_tokens: options?.maxTokens ?? 4096,
21
- ...(systemPrompt ? { system: systemPrompt } : {}),
22
- messages: nonSystemMessages.map((m) => ({
23
- role: m.role,
24
- content: m.content,
25
- })),
26
- });
27
- const content = response.content
28
- .filter((block) => block.type === 'text')
29
- .map((block) => block.text)
30
- .join('');
31
- return {
32
- content,
33
- model: response.model,
34
- tokensUsed: {
35
- input: response.usage.input_tokens,
36
- output: response.usage.output_tokens,
37
- },
38
- };
24
+ try {
25
+ const response = await this.client.messages.create({
26
+ model: options?.model ?? this.defaultModel,
27
+ max_tokens: options?.maxTokens ?? 4096,
28
+ ...(systemPrompt ? { system: systemPrompt } : {}),
29
+ messages: nonSystemMessages.map((m) => ({
30
+ role: m.role,
31
+ content: m.content,
32
+ })),
33
+ });
34
+ const content = response.content
35
+ .filter((block) => block.type === 'text')
36
+ .map((block) => block.text)
37
+ .join('');
38
+ return {
39
+ content,
40
+ model: response.model,
41
+ tokensUsed: {
42
+ input: response.usage.input_tokens,
43
+ output: response.usage.output_tokens,
44
+ },
45
+ };
46
+ }
47
+ catch (error) {
48
+ if (error instanceof Error) {
49
+ if (error.message.includes('401') || error.message.includes('authentication')) {
50
+ throw new Error('Anthropic API key is invalid or expired.\n' +
51
+ 'Check your key at: https://console.anthropic.com/settings/keys');
52
+ }
53
+ if (error.message.includes('429')) {
54
+ throw new Error('Anthropic rate limit exceeded. Wait a moment and try again.\n' +
55
+ 'Check your usage at: https://console.anthropic.com');
56
+ }
57
+ if (error.message.includes('ENOTFOUND') || error.message.includes('ECONNREFUSED') || error.message.includes('fetch failed')) {
58
+ throw new Error('Network error: could not reach Anthropic API.\n' +
59
+ 'Check your internet connection and try again.');
60
+ }
61
+ }
62
+ throw error;
63
+ }
39
64
  }
40
65
  async isAvailable() {
41
66
  return !!process.env['ANTHROPIC_API_KEY'];
@@ -1 +1 @@
1
- {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/providers/claude.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAG1C,MAAM,OAAO,cAAc;IACzB,IAAI,GAAG,QAAQ,CAAC;IACR,MAAM,CAAY;IAClB,YAAY,CAAS;IAE7B,YAAY,KAAc,EAAE,MAAe;QACzC,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC;YAC1B,MAAM,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;SACnD,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,KAAK,IAAI,0BAA0B,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAsB,EAAE,OAAoB;QACrD,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACnE,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAEtE,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY;eACrC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;eACjD,SAAS,CAAC;QAEf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjD,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,YAAY;YAC1C,UAAU,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI;YACtC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,QAAQ,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtC,IAAI,EAAE,CAAC,CAAC,IAA4B;gBACpC,OAAO,EAAE,CAAC,CAAC,OAAO;aACnB,CAAC,CAAC;SACJ,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO;aAC7B,MAAM,CAAC,CAAC,KAAK,EAAgC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;aACtE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;aAC1B,IAAI,CAAC,EAAE,CAAC,CAAC;QAEZ,OAAO;YACL,OAAO;YACP,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,UAAU,EAAE;gBACV,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY;gBAClC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa;aACrC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC5C,CAAC;CACF"}
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/providers/claude.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAG1C,MAAM,OAAO,cAAc;IACzB,IAAI,GAAG,QAAQ,CAAC;IACR,MAAM,CAAY;IAClB,YAAY,CAAS;IAE7B,YAAY,KAAc,EAAE,MAAe;QACzC,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC;YAC1B,MAAM,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;SACnD,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,KAAK,IAAI,0BAA0B,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAsB,EAAE,OAAoB;QACrD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CACb,gCAAgC;gBAChC,oDAAoD;gBACpD,+CAA+C;gBAC/C,2DAA2D,CAC5D,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACnE,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAEtE,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY;eACrC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;eACjD,SAAS,CAAC;QAEf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACjD,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,YAAY;gBAC1C,UAAU,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI;gBACtC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,QAAQ,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACtC,IAAI,EAAE,CAAC,CAAC,IAA4B;oBACpC,OAAO,EAAE,CAAC,CAAC,OAAO;iBACnB,CAAC,CAAC;aACJ,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO;iBAC7B,MAAM,CAAC,CAAC,KAAK,EAAgC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;iBACtE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;iBAC1B,IAAI,CAAC,EAAE,CAAC,CAAC;YAEZ,OAAO;gBACL,OAAO;gBACP,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,UAAU,EAAE;oBACV,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY;oBAClC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa;iBACrC;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBAC9E,MAAM,IAAI,KAAK,CACb,4CAA4C;wBAC5C,gEAAgE,CACjE,CAAC;gBACJ,CAAC;gBACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClC,MAAM,IAAI,KAAK,CACb,+DAA+D;wBAC/D,oDAAoD,CACrD,CAAC;gBACJ,CAAC;gBACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;oBAC5H,MAAM,IAAI,KAAK,CACb,iDAAiD;wBACjD,+CAA+C,CAChD,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC5C,CAAC;CACF"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Embedding providers for llmwiki.
2
+ * Embedding providers for wikimem.
3
3
  * Supports Google Gemini (text-embedding-004), OpenAI (text-embedding-3-small), and local fallback.
4
4
  */
5
5
  export interface EmbeddingVector {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Embedding providers for llmwiki.
2
+ * Embedding providers for wikimem.
3
3
  * Supports Google Gemini (text-embedding-004), OpenAI (text-embedding-3-small), and local fallback.
4
4
  */
5
5
  // --- Google Gemini Embeddings ---
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAK1D,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D,WAAW,CAgBb"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAK1D,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D,WAAW,CAqBb"}
@@ -13,7 +13,12 @@ export function createProvider(name, options) {
13
13
  case 'local':
14
14
  return new OllamaProvider(options?.model, options?.baseUrl);
15
15
  default:
16
- throw new Error(`Unknown provider: ${name}. Supported: claude, openai, ollama`);
16
+ throw new Error(`Unknown provider: "${name}".\n` +
17
+ 'Supported providers:\n' +
18
+ ' claude — Anthropic (requires ANTHROPIC_API_KEY)\n' +
19
+ ' openai — OpenAI (requires OPENAI_API_KEY)\n' +
20
+ ' ollama — Local models (requires Ollama running)\n' +
21
+ 'Set in config.yaml: provider: claude');
17
22
  }
18
23
  }
19
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,OAA+D;IAE/D,QAAQ,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3B,KAAK,QAAQ,CAAC;QACd,KAAK,WAAW;YACd,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7D,KAAK,QAAQ,CAAC;QACd,KAAK,KAAK;YACR,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7D,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO;YACV,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9D;YACE,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,qCAAqC,CAC/D,CAAC;IACN,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,OAA+D;IAE/D,QAAQ,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3B,KAAK,QAAQ,CAAC;QACd,KAAK,WAAW;YACd,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7D,KAAK,QAAQ,CAAC;QACd,KAAK,KAAK;YACR,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7D,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO;YACV,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9D;YACE,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,MAAM;gBAChC,wBAAwB;gBACxB,uDAAuD;gBACvD,iDAAiD;gBACjD,uDAAuD;gBACvD,uCAAuC,CACxC,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnF,qBAAa,cAAe,YAAW,WAAW;IAChD,IAAI,SAAY;IAChB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAS;gBAEjB,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAKtC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAuCxE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAQtC"}
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnF,qBAAa,cAAe,YAAW,WAAW;IAChD,IAAI,SAAY;IAChB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAS;gBAEjB,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAKtC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IA0DxE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAQtC"}
@@ -10,20 +10,36 @@ export class OllamaProvider {
10
10
  const allMessages = options?.systemPrompt
11
11
  ? [{ role: 'system', content: options.systemPrompt }, ...messages.filter((m) => m.role !== 'system')]
12
12
  : messages;
13
- const response = await fetch(`${this.baseUrl}/api/chat`, {
14
- method: 'POST',
15
- headers: { 'Content-Type': 'application/json' },
16
- body: JSON.stringify({
17
- model: options?.model ?? this.defaultModel,
18
- messages: allMessages.map((m) => ({
19
- role: m.role,
20
- content: m.content,
21
- })),
22
- stream: false,
23
- }),
24
- });
13
+ let response;
14
+ try {
15
+ response = await fetch(`${this.baseUrl}/api/chat`, {
16
+ method: 'POST',
17
+ headers: { 'Content-Type': 'application/json' },
18
+ body: JSON.stringify({
19
+ model: options?.model ?? this.defaultModel,
20
+ messages: allMessages.map((m) => ({
21
+ role: m.role,
22
+ content: m.content,
23
+ })),
24
+ stream: false,
25
+ }),
26
+ });
27
+ }
28
+ catch (error) {
29
+ if (error instanceof Error && (error.message.includes('ECONNREFUSED') || error.message.includes('fetch failed'))) {
30
+ throw new Error(`Could not connect to Ollama at ${this.baseUrl}.\n` +
31
+ 'Make sure Ollama is running: ollama serve\n' +
32
+ 'Install Ollama: https://ollama.com/download');
33
+ }
34
+ throw error;
35
+ }
25
36
  if (!response.ok) {
26
- throw new Error(`Ollama API error: ${response.status} ${response.statusText}`);
37
+ const errorText = await response.text().catch(() => '');
38
+ if (response.status === 404 || errorText.includes('not found')) {
39
+ throw new Error(`Model "${options?.model ?? this.defaultModel}" not found in Ollama.\n` +
40
+ `Pull it first: ollama pull ${options?.model ?? this.defaultModel}`);
41
+ }
42
+ throw new Error(`Ollama API error: ${response.status} ${response.statusText}. ${errorText}`);
27
43
  }
28
44
  const data = (await response.json());
29
45
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAc;IACzB,IAAI,GAAG,QAAQ,CAAC;IACR,OAAO,CAAS;IAChB,YAAY,CAAS;IAE7B,YAAY,KAAc,EAAE,OAAgB;QAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,wBAAwB,CAAC;QACrF,IAAI,CAAC,YAAY,GAAG,KAAK,IAAI,UAAU,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAsB,EAAE,OAAoB;QACrD,MAAM,WAAW,GAAG,OAAO,EAAE,YAAY;YACvC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC9G,CAAC,CAAC,QAAQ,CAAC;QAEb,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,EAAE;YACvD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,YAAY;gBAC1C,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAChC,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;iBACnB,CAAC,CAAC;gBACH,MAAM,EAAE,KAAK;aACd,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAKlC,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE;gBACV,KAAK,EAAE,IAAI,CAAC,iBAAiB,IAAI,CAAC;gBAClC,MAAM,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;aAC7B;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,CAAC,CAAC;YACzD,OAAO,QAAQ,CAAC,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnF,qBAAa,cAAe,YAAW,WAAW;IAChD,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAS;gBAEjB,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAOrC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IA0BxE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnF,qBAAa,cAAe,YAAW,WAAW;IAChD,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAS;gBAEjB,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAOrC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IA2DxE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
@@ -10,26 +10,51 @@ export class OpenAIProvider {
10
10
  this.defaultModel = model ?? 'gpt-4o';
11
11
  }
12
12
  async chat(messages, options) {
13
+ if (!process.env['OPENAI_API_KEY'] && !this.client.apiKey) {
14
+ throw new Error('OpenAI API key not found.\n' +
15
+ 'Set it via: export OPENAI_API_KEY=sk-...\n' +
16
+ 'Or add to config.yaml: api_key: sk-...\n' +
17
+ 'Get a key at: https://platform.openai.com/api-keys');
18
+ }
13
19
  const allMessages = options?.systemPrompt
14
20
  ? [{ role: 'system', content: options.systemPrompt }, ...messages.filter((m) => m.role !== 'system')]
15
21
  : messages;
16
- const response = await this.client.chat.completions.create({
17
- model: options?.model ?? this.defaultModel,
18
- max_tokens: options?.maxTokens ?? 4096,
19
- messages: allMessages.map((m) => ({
20
- role: m.role,
21
- content: m.content,
22
- })),
23
- });
24
- const content = response.choices[0]?.message?.content ?? '';
25
- return {
26
- content,
27
- model: response.model,
28
- tokensUsed: {
29
- input: response.usage?.prompt_tokens ?? 0,
30
- output: response.usage?.completion_tokens ?? 0,
31
- },
32
- };
22
+ try {
23
+ const response = await this.client.chat.completions.create({
24
+ model: options?.model ?? this.defaultModel,
25
+ max_tokens: options?.maxTokens ?? 4096,
26
+ messages: allMessages.map((m) => ({
27
+ role: m.role,
28
+ content: m.content,
29
+ })),
30
+ });
31
+ const content = response.choices[0]?.message?.content ?? '';
32
+ return {
33
+ content,
34
+ model: response.model,
35
+ tokensUsed: {
36
+ input: response.usage?.prompt_tokens ?? 0,
37
+ output: response.usage?.completion_tokens ?? 0,
38
+ },
39
+ };
40
+ }
41
+ catch (error) {
42
+ if (error instanceof Error) {
43
+ if (error.message.includes('401') || error.message.includes('Incorrect API key')) {
44
+ throw new Error('OpenAI API key is invalid or expired.\n' +
45
+ 'Check your key at: https://platform.openai.com/api-keys');
46
+ }
47
+ if (error.message.includes('429')) {
48
+ throw new Error('OpenAI rate limit exceeded. Wait a moment and try again.\n' +
49
+ 'Check your usage at: https://platform.openai.com/usage');
50
+ }
51
+ if (error.message.includes('ENOTFOUND') || error.message.includes('ECONNREFUSED') || error.message.includes('fetch failed')) {
52
+ throw new Error('Network error: could not reach OpenAI API.\n' +
53
+ 'Check your internet connection and try again.');
54
+ }
55
+ }
56
+ throw error;
57
+ }
33
58
  }
34
59
  async isAvailable() {
35
60
  return !!process.env['OPENAI_API_KEY'];
@@ -1 +1 @@
1
- {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,MAAM,OAAO,cAAc;IACzB,IAAI,GAAG,QAAQ,CAAC;IACR,MAAM,CAAS;IACf,YAAY,CAAS;IAE7B,YAAY,KAAc,EAAE,MAAe;QACzC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;YACvB,MAAM,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;SAChD,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,KAAK,IAAI,QAAQ,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAsB,EAAE,OAAoB;QACrD,MAAM,WAAW,GAAG,OAAO,EAAE,YAAY;YACvC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC9G,CAAC,CAAC,QAAQ,CAAC;QAEb,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACzD,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,YAAY;YAC1C,UAAU,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI;YACtC,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;aACnB,CAAC,CAAC;SACJ,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;QAE5D,OAAO;YACL,OAAO;YACP,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,UAAU,EAAE;gBACV,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC;gBACzC,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,iBAAiB,IAAI,CAAC;aAC/C;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACzC,CAAC;CACF"}
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,10 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>llmwiki — Mission Control</title>
6
+ <title>wikimem — Mission Control</title>
7
7
  <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&family=Instrument+Serif&display=swap" rel="stylesheet">
8
8
  <script src="https://d3js.org/d3.v7.min.js"></script>
9
+ <!-- Markdown rendering is built-in, no external deps needed -->
9
10
  <style>
10
11
  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
11
12
 
@@ -424,16 +425,35 @@
424
425
  .modal-body {
425
426
  font-size: 14px;
426
427
  line-height: 1.7;
427
- white-space: pre-wrap;
428
- color: var(--text-dim);
428
+ color: var(--text);
429
429
  }
430
+ .modal-body h1 { font-family: 'Instrument Serif', serif; font-size: 24px; margin: 24px 0 12px; color: var(--text); border-bottom: 1px solid var(--border); padding-bottom: 8px; }
431
+ .modal-body h2 { font-family: 'Instrument Serif', serif; font-size: 20px; margin: 20px 0 10px; color: var(--text); }
432
+ .modal-body h3 { font-size: 16px; margin: 16px 0 8px; color: var(--text); }
433
+ .modal-body p { margin: 8px 0; color: var(--text-dim); }
434
+ .modal-body ul, .modal-body ol { margin: 8px 0 8px 24px; color: var(--text-dim); }
435
+ .modal-body li { margin: 4px 0; }
436
+ .modal-body code { background: var(--bg); padding: 2px 6px; border-radius: 4px; font-size: 13px; color: var(--purple-light); }
437
+ .modal-body pre { background: var(--bg); padding: 16px; border-radius: 8px; overflow-x: auto; margin: 12px 0; }
438
+ .modal-body pre code { padding: 0; background: none; }
439
+ .modal-body blockquote { border-left: 3px solid var(--purple); padding: 8px 16px; margin: 12px 0; background: var(--purple-glow); border-radius: 0 8px 8px 0; }
440
+ .modal-body a { color: var(--purple-light); text-decoration: none; }
441
+ .modal-body a:hover { text-decoration: underline; }
442
+ .modal-body strong { color: var(--text); }
443
+ .wikilink { color: var(--purple-light); cursor: pointer; border-bottom: 1px dashed var(--purple-light); }
444
+ .wikilink:hover { color: #a78bfa; }
445
+ .tag { background: var(--purple-glow); color: var(--purple-light); padding: 2px 8px; border-radius: 12px; font-size: 11px; }
446
+ .type-badge { background: var(--bg); color: var(--amber); padding: 2px 8px; border-radius: 12px; font-size: 11px; border: 1px solid var(--border); }
447
+ .source-badge { color: var(--text-muted); font-size: 11px; max-width: 200px; overflow: hidden; text-overflow: ellipsis; }
430
448
 
431
449
  .modal-meta {
432
450
  display: flex;
433
- gap: 16px;
451
+ flex-wrap: wrap;
452
+ gap: 8px;
434
453
  margin-bottom: 16px;
435
454
  font-size: 12px;
436
455
  color: var(--text-muted);
456
+ align-items: center;
437
457
  }
438
458
 
439
459
  /* Loading spinner */
@@ -460,7 +480,7 @@
460
480
  </head>
461
481
  <body>
462
482
  <div class="header">
463
- <h1>llm<span>wiki</span></h1>
483
+ <h1>wiki<span>mem</span></h1>
464
484
  <div class="header-status">
465
485
  <div class="status-dot"></div>
466
486
  <span id="header-page-count">Loading...</span>
@@ -647,15 +667,69 @@
647
667
 
648
668
  function esc(s) { return s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;'); }
649
669
 
650
- // ── Page Modal ──
670
+ // ── Simple Markdown Renderer (no external deps) ──
671
+ function renderMarkdown(md) {
672
+ let html = esc(md);
673
+ // Code blocks (fenced)
674
+ html = html.replace(/```(\w*)\n([\s\S]*?)```/g, '<pre><code class="lang-$1">$2</code></pre>');
675
+ // Headings
676
+ html = html.replace(/^### (.+)$/gm, '<h3>$1</h3>');
677
+ html = html.replace(/^## (.+)$/gm, '<h2>$1</h2>');
678
+ html = html.replace(/^# (.+)$/gm, '<h1>$1</h1>');
679
+ // Bold + italic
680
+ html = html.replace(/\*\*\*(.+?)\*\*\*/g, '<strong><em>$1</em></strong>');
681
+ html = html.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>');
682
+ html = html.replace(/\*(.+?)\*/g, '<em>$1</em>');
683
+ // Inline code
684
+ html = html.replace(/`([^`]+)`/g, '<code>$1</code>');
685
+ // Blockquotes
686
+ html = html.replace(/^&gt; (.+)$/gm, '<blockquote>$1</blockquote>');
687
+ // Unordered lists
688
+ html = html.replace(/^- (.+)$/gm, '<li>$1</li>');
689
+ html = html.replace(/(<li>.*<\/li>\n?)+/g, '<ul>$&</ul>');
690
+ // Ordered lists
691
+ html = html.replace(/^\d+\. (.+)$/gm, '<li>$1</li>');
692
+ // Links
693
+ html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>');
694
+ // Horizontal rules
695
+ html = html.replace(/^---$/gm, '<hr>');
696
+ // Paragraphs (double newline)
697
+ html = html.replace(/\n\n/g, '</p><p>');
698
+ html = '<p>' + html + '</p>';
699
+ // Clean up empty paragraphs
700
+ html = html.replace(/<p>\s*<\/p>/g, '');
701
+ html = html.replace(/<p>\s*(<h[123]>)/g, '$1');
702
+ html = html.replace(/(<\/h[123]>)\s*<\/p>/g, '$1');
703
+ html = html.replace(/<p>\s*(<ul>)/g, '$1');
704
+ html = html.replace(/(<\/ul>)\s*<\/p>/g, '$1');
705
+ html = html.replace(/<p>\s*(<blockquote>)/g, '$1');
706
+ html = html.replace(/<p>\s*(<pre>)/g, '$1');
707
+ html = html.replace(/<p>\s*(<hr>)/g, '$1');
708
+ return html;
709
+ }
710
+
711
+ function renderWikilinks(html) {
712
+ return html.replace(/\[\[([^\]]+)\]\]/g, (_, name) => {
713
+ return `<a href="#" class="wikilink" onclick="event.preventDefault(); openPage('${esc(name)}')">${esc(name)}</a>`;
714
+ });
715
+ }
716
+
651
717
  async function openPage(title) {
652
718
  const page = await api('/api/pages/' + encodeURIComponent(title));
653
719
  document.getElementById('modal-title').textContent = page.title;
720
+
721
+ // Show frontmatter as badges
722
+ const tags = (page.frontmatter.tags || []).map(t => `<span class="tag">${esc(t)}</span>`).join('');
654
723
  document.getElementById('modal-meta').innerHTML =
655
724
  `<span>${page.wordCount} words</span>` +
656
725
  `<span>${page.wikilinks.length} links</span>` +
657
- (page.frontmatter.category ? `<span>${page.frontmatter.category}</span>` : '');
658
- document.getElementById('modal-body').textContent = page.content;
726
+ (page.frontmatter.type ? `<span class="type-badge">${page.frontmatter.type}</span>` : '') +
727
+ (page.frontmatter.created ? `<span>${page.frontmatter.created}</span>` : '') +
728
+ tags;
729
+
730
+ // Render markdown + wikilinks
731
+ const rendered = renderMarkdown(page.content);
732
+ document.getElementById('modal-body').innerHTML = renderWikilinks(rendered);
659
733
  document.getElementById('page-modal').classList.add('visible');
660
734
  }
661
735
 
@@ -6,6 +6,7 @@
6
6
  <title>wikimem — Mission Control</title>
7
7
  <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&family=Instrument+Serif&display=swap" rel="stylesheet">
8
8
  <script src="https://d3js.org/d3.v7.min.js"></script>
9
+ <!-- Markdown rendering is built-in, no external deps needed -->
9
10
  <style>
10
11
  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
11
12
 
@@ -424,16 +425,35 @@
424
425
  .modal-body {
425
426
  font-size: 14px;
426
427
  line-height: 1.7;
427
- white-space: pre-wrap;
428
- color: var(--text-dim);
428
+ color: var(--text);
429
429
  }
430
+ .modal-body h1 { font-family: 'Instrument Serif', serif; font-size: 24px; margin: 24px 0 12px; color: var(--text); border-bottom: 1px solid var(--border); padding-bottom: 8px; }
431
+ .modal-body h2 { font-family: 'Instrument Serif', serif; font-size: 20px; margin: 20px 0 10px; color: var(--text); }
432
+ .modal-body h3 { font-size: 16px; margin: 16px 0 8px; color: var(--text); }
433
+ .modal-body p { margin: 8px 0; color: var(--text-dim); }
434
+ .modal-body ul, .modal-body ol { margin: 8px 0 8px 24px; color: var(--text-dim); }
435
+ .modal-body li { margin: 4px 0; }
436
+ .modal-body code { background: var(--bg); padding: 2px 6px; border-radius: 4px; font-size: 13px; color: var(--purple-light); }
437
+ .modal-body pre { background: var(--bg); padding: 16px; border-radius: 8px; overflow-x: auto; margin: 12px 0; }
438
+ .modal-body pre code { padding: 0; background: none; }
439
+ .modal-body blockquote { border-left: 3px solid var(--purple); padding: 8px 16px; margin: 12px 0; background: var(--purple-glow); border-radius: 0 8px 8px 0; }
440
+ .modal-body a { color: var(--purple-light); text-decoration: none; }
441
+ .modal-body a:hover { text-decoration: underline; }
442
+ .modal-body strong { color: var(--text); }
443
+ .wikilink { color: var(--purple-light); cursor: pointer; border-bottom: 1px dashed var(--purple-light); }
444
+ .wikilink:hover { color: #a78bfa; }
445
+ .tag { background: var(--purple-glow); color: var(--purple-light); padding: 2px 8px; border-radius: 12px; font-size: 11px; }
446
+ .type-badge { background: var(--bg); color: var(--amber); padding: 2px 8px; border-radius: 12px; font-size: 11px; border: 1px solid var(--border); }
447
+ .source-badge { color: var(--text-muted); font-size: 11px; max-width: 200px; overflow: hidden; text-overflow: ellipsis; }
430
448
 
431
449
  .modal-meta {
432
450
  display: flex;
433
- gap: 16px;
451
+ flex-wrap: wrap;
452
+ gap: 8px;
434
453
  margin-bottom: 16px;
435
454
  font-size: 12px;
436
455
  color: var(--text-muted);
456
+ align-items: center;
437
457
  }
438
458
 
439
459
  /* Loading spinner */
@@ -460,7 +480,7 @@
460
480
  </head>
461
481
  <body>
462
482
  <div class="header">
463
- <h1>llm<span>wiki</span></h1>
483
+ <h1>wiki<span>mem</span></h1>
464
484
  <div class="header-status">
465
485
  <div class="status-dot"></div>
466
486
  <span id="header-page-count">Loading...</span>
@@ -647,15 +667,69 @@
647
667
 
648
668
  function esc(s) { return s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;'); }
649
669
 
650
- // ── Page Modal ──
670
+ // ── Simple Markdown Renderer (no external deps) ──
671
+ function renderMarkdown(md) {
672
+ let html = esc(md);
673
+ // Code blocks (fenced)
674
+ html = html.replace(/```(\w*)\n([\s\S]*?)```/g, '<pre><code class="lang-$1">$2</code></pre>');
675
+ // Headings
676
+ html = html.replace(/^### (.+)$/gm, '<h3>$1</h3>');
677
+ html = html.replace(/^## (.+)$/gm, '<h2>$1</h2>');
678
+ html = html.replace(/^# (.+)$/gm, '<h1>$1</h1>');
679
+ // Bold + italic
680
+ html = html.replace(/\*\*\*(.+?)\*\*\*/g, '<strong><em>$1</em></strong>');
681
+ html = html.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>');
682
+ html = html.replace(/\*(.+?)\*/g, '<em>$1</em>');
683
+ // Inline code
684
+ html = html.replace(/`([^`]+)`/g, '<code>$1</code>');
685
+ // Blockquotes
686
+ html = html.replace(/^&gt; (.+)$/gm, '<blockquote>$1</blockquote>');
687
+ // Unordered lists
688
+ html = html.replace(/^- (.+)$/gm, '<li>$1</li>');
689
+ html = html.replace(/(<li>.*<\/li>\n?)+/g, '<ul>$&</ul>');
690
+ // Ordered lists
691
+ html = html.replace(/^\d+\. (.+)$/gm, '<li>$1</li>');
692
+ // Links
693
+ html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>');
694
+ // Horizontal rules
695
+ html = html.replace(/^---$/gm, '<hr>');
696
+ // Paragraphs (double newline)
697
+ html = html.replace(/\n\n/g, '</p><p>');
698
+ html = '<p>' + html + '</p>';
699
+ // Clean up empty paragraphs
700
+ html = html.replace(/<p>\s*<\/p>/g, '');
701
+ html = html.replace(/<p>\s*(<h[123]>)/g, '$1');
702
+ html = html.replace(/(<\/h[123]>)\s*<\/p>/g, '$1');
703
+ html = html.replace(/<p>\s*(<ul>)/g, '$1');
704
+ html = html.replace(/(<\/ul>)\s*<\/p>/g, '$1');
705
+ html = html.replace(/<p>\s*(<blockquote>)/g, '$1');
706
+ html = html.replace(/<p>\s*(<pre>)/g, '$1');
707
+ html = html.replace(/<p>\s*(<hr>)/g, '$1');
708
+ return html;
709
+ }
710
+
711
+ function renderWikilinks(html) {
712
+ return html.replace(/\[\[([^\]]+)\]\]/g, (_, name) => {
713
+ return `<a href="#" class="wikilink" onclick="event.preventDefault(); openPage('${esc(name)}')">${esc(name)}</a>`;
714
+ });
715
+ }
716
+
651
717
  async function openPage(title) {
652
718
  const page = await api('/api/pages/' + encodeURIComponent(title));
653
719
  document.getElementById('modal-title').textContent = page.title;
720
+
721
+ // Show frontmatter as badges
722
+ const tags = (page.frontmatter.tags || []).map(t => `<span class="tag">${esc(t)}</span>`).join('');
654
723
  document.getElementById('modal-meta').innerHTML =
655
724
  `<span>${page.wordCount} words</span>` +
656
725
  `<span>${page.wikilinks.length} links</span>` +
657
- (page.frontmatter.category ? `<span>${page.frontmatter.category}</span>` : '');
658
- document.getElementById('modal-body').textContent = page.content;
726
+ (page.frontmatter.type ? `<span class="type-badge">${page.frontmatter.type}</span>` : '') +
727
+ (page.frontmatter.created ? `<span>${page.frontmatter.created}</span>` : '') +
728
+ tags;
729
+
730
+ // Render markdown + wikilinks
731
+ const rendered = renderMarkdown(page.content);
732
+ document.getElementById('modal-body').innerHTML = renderWikilinks(rendered);
659
733
  document.getElementById('page-modal').classList.add('visible');
660
734
  }
661
735
 
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AA2GA,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAuHlE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AA2GA,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAiIlE"}
@@ -107,7 +107,21 @@ export function createServer(vaultRoot, port) {
107
107
  return;
108
108
  }
109
109
  const pages = listWikiPages(config.wikiDir);
110
- const match = pages.find((p) => basename(p, '.md') === title);
110
+ // Match by slug OR by frontmatter title (case-insensitive)
111
+ const titleLower = title.toLowerCase();
112
+ const slugified = titleLower.replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
113
+ const match = pages.find((p) => {
114
+ const fileSlug = basename(p, '.md');
115
+ if (fileSlug === title || fileSlug === slugified)
116
+ return true;
117
+ try {
118
+ const page = readWikiPage(p);
119
+ return page.title.toLowerCase() === titleLower;
120
+ }
121
+ catch {
122
+ return false;
123
+ }
124
+ });
111
125
  if (!match) {
112
126
  res.status(404).json({ error: 'Page not found' });
113
127
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}