zenn-rag 0.1.0
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/LICENSE +21 -0
- package/README.md +221 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +68 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/index.d.ts +6 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +11 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/mcp.d.ts +2 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +245 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/search.d.ts +10 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +37 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +111 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +88 -0
- package/dist/config.js.map +1 -0
- package/dist/embedder.d.ts +17 -0
- package/dist/embedder.d.ts.map +1 -0
- package/dist/embedder.js +31 -0
- package/dist/embedder.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +31 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +56 -0
- package/dist/logger.js.map +1 -0
- package/dist/parser.d.ts +56 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +214 -0
- package/dist/parser.js.map +1 -0
- package/dist/providers/base.d.ts +2 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +4 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/factory.d.ts +4 -0
- package/dist/providers/factory.d.ts.map +1 -0
- package/dist/providers/factory.js +27 -0
- package/dist/providers/factory.js.map +1 -0
- package/dist/providers/gemini.d.ts +20 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +79 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/ollama.d.ts +14 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +38 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +18 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +65 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +7 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/services/sync-service.d.ts +28 -0
- package/dist/services/sync-service.d.ts.map +1 -0
- package/dist/services/sync-service.js +310 -0
- package/dist/services/sync-service.js.map +1 -0
- package/dist/store.d.ts +35 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +180 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +49 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { getEmbedding } from "../embedder.js";
|
|
2
|
+
import { ArticleVectorStore } from "../store.js";
|
|
3
|
+
export async function searchArticles(query, options = {}) {
|
|
4
|
+
const queryVector = await getEmbedding(query);
|
|
5
|
+
const store = new ArticleVectorStore();
|
|
6
|
+
return store.search(queryVector, options);
|
|
7
|
+
}
|
|
8
|
+
export async function searchCli(query, options = {}) {
|
|
9
|
+
const limit = options.limit || 5;
|
|
10
|
+
const topic = options.topic;
|
|
11
|
+
console.log(`\n🔍 検索クエリ: "${query}"${topic ? ` (トピック: ${topic})` : ""}`);
|
|
12
|
+
console.log("ベクトル生成中...");
|
|
13
|
+
const results = await searchArticles(query, { limit, topic });
|
|
14
|
+
if (results.length === 0) {
|
|
15
|
+
console.log("\n該当する記事が見つかりませんでした。まだインデックスを作成していない場合は `zenn-rag index` を実行してください。");
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
console.log(`\n検索結果 (${results.length} 件):\n${"=".repeat(60)}`);
|
|
19
|
+
results.forEach((res, idx) => {
|
|
20
|
+
const scorePct = (res.score * 100).toFixed(1);
|
|
21
|
+
console.log(`\n[${idx + 1}] スコア: ${scorePct}% | ${res.title}`);
|
|
22
|
+
console.log(` 見出し: ${res.heading}`);
|
|
23
|
+
console.log(` URL: ${res.url}`);
|
|
24
|
+
if (res.topics.length > 0) {
|
|
25
|
+
console.log(` タグ: ${res.topics.join(", ")}`);
|
|
26
|
+
}
|
|
27
|
+
console.log(` 抜粋:`);
|
|
28
|
+
const preview = res.text
|
|
29
|
+
.split("\n")
|
|
30
|
+
.slice(0, 4)
|
|
31
|
+
.map((line) => ` ${line}`)
|
|
32
|
+
.join("\n");
|
|
33
|
+
console.log(preview);
|
|
34
|
+
});
|
|
35
|
+
console.log(`\n${"=".repeat(60)}\n`);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGjD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAa,EACb,OAAO,GAAuC,EAAE;IAEhD,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACvC,OAAO,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,KAAa,EACb,OAAO,GAAuC,EAAE;IAEhD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAE5B,OAAO,CAAC,GAAG,CACT,gBAAgB,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5D,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAE1B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAE9D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CACT,qEAAqE,CACtE,CAAC;QACF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAEhE,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,UAAU,QAAQ,OAAO,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QACtC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI;aACrB,KAAK,CAAC,IAAI,CAAC;aACX,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC;aAC9B,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAcA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAyHhD"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { getActiveModel, getContext } from "../config.js";
|
|
4
|
+
import { ArticleVectorStore } from "../store.js";
|
|
5
|
+
function renderProgressBar(current, total, width = 30) {
|
|
6
|
+
if (total === 0)
|
|
7
|
+
return `[${"-".repeat(width)}] 0.0%`;
|
|
8
|
+
const percent = Math.min(100, Math.max(0, (current / total) * 100));
|
|
9
|
+
const filled = Math.round((width * percent) / 100);
|
|
10
|
+
const empty = width - filled;
|
|
11
|
+
return `[${"█".repeat(filled)}${"░".repeat(empty)}] ${percent.toFixed(1)}%`;
|
|
12
|
+
}
|
|
13
|
+
export async function showStatus() {
|
|
14
|
+
const ctx = getContext();
|
|
15
|
+
const active = getActiveModel();
|
|
16
|
+
console.log("=== Zenn RAG インデックス状況 ===");
|
|
17
|
+
console.log(`対象フォルダ: ${ctx.rootDir}`);
|
|
18
|
+
console.log(`現在の設定: ${active.provider} (${active.model})\n`);
|
|
19
|
+
let articleFiles = [];
|
|
20
|
+
try {
|
|
21
|
+
const entries = await fs.readdir(ctx.articlesDir);
|
|
22
|
+
articleFiles = entries.filter((f) => f.endsWith(".md"));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// articlesDir未作成
|
|
26
|
+
}
|
|
27
|
+
let bookFiles = [];
|
|
28
|
+
try {
|
|
29
|
+
const bookDirs = await fs.readdir(ctx.booksDir, { withFileTypes: true });
|
|
30
|
+
for (const d of bookDirs) {
|
|
31
|
+
if (d.isDirectory()) {
|
|
32
|
+
const chFiles = await fs.readdir(path.join(ctx.booksDir, d.name));
|
|
33
|
+
for (const ch of chFiles) {
|
|
34
|
+
if (ch.endsWith(".md")) {
|
|
35
|
+
bookFiles.push(`${d.name}/${ch}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// booksDir未作成
|
|
43
|
+
}
|
|
44
|
+
const totalFiles = articleFiles.length + bookFiles.length;
|
|
45
|
+
if (totalFiles === 0) {
|
|
46
|
+
console.error("記事または本のディレクトリが見つかりません。");
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
let manifest = { version: 1, entries: {} };
|
|
50
|
+
try {
|
|
51
|
+
const raw = await fs.readFile(ctx.manifestPath, "utf-8");
|
|
52
|
+
manifest = JSON.parse(raw);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// まだ未作成
|
|
56
|
+
}
|
|
57
|
+
const indexedTargets = Object.keys(manifest.entries);
|
|
58
|
+
const indexedCount = indexedTargets.length;
|
|
59
|
+
let indexedChunks = 0;
|
|
60
|
+
for (const entry of Object.values(manifest.entries)) {
|
|
61
|
+
indexedChunks += entry.chunkIds?.length || 0;
|
|
62
|
+
}
|
|
63
|
+
const avgChunksPerItem = indexedCount > 0 ? indexedChunks / indexedCount : 5;
|
|
64
|
+
const estimatedTotalChunks = indexedCount === totalFiles
|
|
65
|
+
? indexedChunks
|
|
66
|
+
: Math.max(indexedChunks, Math.round(avgChunksPerItem * totalFiles));
|
|
67
|
+
console.log(`■ コンテンツの進捗:`);
|
|
68
|
+
console.log(` ${renderProgressBar(indexedCount, totalFiles)}`);
|
|
69
|
+
console.log(` 完了: ${indexedCount} / ${totalFiles} ファイル (記事: ${articleFiles.length}, 本チャプター: ${bookFiles.length})\n`);
|
|
70
|
+
console.log(`■ チャンクの進捗:`);
|
|
71
|
+
console.log(` ${renderProgressBar(indexedChunks, estimatedTotalChunks)}`);
|
|
72
|
+
console.log(` 完了: ${indexedChunks} / ${indexedCount === totalFiles
|
|
73
|
+
? `${indexedChunks}`
|
|
74
|
+
: `約 ${estimatedTotalChunks}`} チャンク\n`);
|
|
75
|
+
if (indexedCount > 0) {
|
|
76
|
+
const recent = Object.entries(manifest.entries)
|
|
77
|
+
.sort((a, b) => new Date(b[1].lastIndexed).getTime() -
|
|
78
|
+
new Date(a[1].lastIndexed).getTime())
|
|
79
|
+
.slice(0, 3);
|
|
80
|
+
console.log(`■ 直近にインデックスされた記事:`);
|
|
81
|
+
for (const [slug, entry] of recent) {
|
|
82
|
+
const dateStr = new Date(entry.lastIndexed).toLocaleTimeString();
|
|
83
|
+
console.log(` - [${dateStr}] ${slug} (${entry.chunkIds.length} チャンク)`);
|
|
84
|
+
}
|
|
85
|
+
console.log();
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
const store = new ArticleVectorStore();
|
|
89
|
+
const topics = await store.getAllTopics();
|
|
90
|
+
const topicEntries = Object.entries(topics).sort((a, b) => b[1] - a[1]);
|
|
91
|
+
if (topicEntries.length > 0) {
|
|
92
|
+
console.log(`■ 登録済みトピック (上位10件):`);
|
|
93
|
+
const top10 = topicEntries.slice(0, 10);
|
|
94
|
+
for (const [topic, count] of top10) {
|
|
95
|
+
console.log(` - ${topic}: ${count} 記事`);
|
|
96
|
+
}
|
|
97
|
+
console.log(` (他 全 ${topicEntries.length} トピック)`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// スキップ
|
|
102
|
+
}
|
|
103
|
+
console.log(`\n${"=".repeat(45)}`);
|
|
104
|
+
if (indexedCount < totalFiles) {
|
|
105
|
+
console.log("💡 インデックスが未完了です。`zenn-rag index` で同期できます。");
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
console.log("🎉 全コンテンツのインデックス同期が完了しています!");
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type EmbeddingProvider = "gemini" | "openai" | "ollama";
|
|
2
|
+
export interface RagContext {
|
|
3
|
+
rootDir: string;
|
|
4
|
+
articlesDir: string;
|
|
5
|
+
booksDir: string;
|
|
6
|
+
vectorDbDir: string;
|
|
7
|
+
manifestPath: string;
|
|
8
|
+
provider: EmbeddingProvider;
|
|
9
|
+
geminiApiKey: string;
|
|
10
|
+
geminiModel: string;
|
|
11
|
+
openaiApiKey: string;
|
|
12
|
+
openaiModel: string;
|
|
13
|
+
openaiBaseUrl?: string;
|
|
14
|
+
ollamaBaseUrl: string;
|
|
15
|
+
ollamaModel: string;
|
|
16
|
+
zennUsername: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function detectProvider(): EmbeddingProvider;
|
|
19
|
+
export declare function initContext(targetDir?: string): RagContext;
|
|
20
|
+
export declare function getContext(): RagContext;
|
|
21
|
+
export declare function resetContext(): void;
|
|
22
|
+
export declare function getActiveModel(): {
|
|
23
|
+
provider: EmbeddingProvider;
|
|
24
|
+
model: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function getArticleUrl(slug: string): string;
|
|
27
|
+
export declare function getBookChapterUrl(bookSlug: string, chapterSlug: string): string;
|
|
28
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/D,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,wBAAgB,cAAc,IAAI,iBAAiB,CAgBlD;AAED,wBAAgB,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,CAmD1D;AAED,wBAAgB,UAAU,IAAI,UAAU,CAKvC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,wBAAgB,cAAc,IAAI;IAChC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf,CAWA;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,MAAM,CAIR"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import dotenv from "dotenv";
|
|
3
|
+
let currentContext = null;
|
|
4
|
+
export function detectProvider() {
|
|
5
|
+
const explicit = process.env.EMBEDDING_PROVIDER?.toLowerCase();
|
|
6
|
+
if (explicit === "gemini" || explicit === "openai" || explicit === "ollama") {
|
|
7
|
+
return explicit;
|
|
8
|
+
}
|
|
9
|
+
if (process.env.OPENAI_BASE_URL ||
|
|
10
|
+
(process.env.OPENAI_API_KEY && !process.env.GEMINI_API_KEY)) {
|
|
11
|
+
return "openai";
|
|
12
|
+
}
|
|
13
|
+
if (process.env.OLLAMA_BASE_URL) {
|
|
14
|
+
return "ollama";
|
|
15
|
+
}
|
|
16
|
+
return "gemini";
|
|
17
|
+
}
|
|
18
|
+
export function initContext(targetDir) {
|
|
19
|
+
const rootDir = path.resolve(process.cwd(), targetDir || ".");
|
|
20
|
+
const envPath = path.join(rootDir, ".env");
|
|
21
|
+
// 対象プロジェクトの .env を優先ロード(quiet: true でstdout汚染を防止)
|
|
22
|
+
dotenv.config({ path: envPath, quiet: true });
|
|
23
|
+
const provider = detectProvider();
|
|
24
|
+
const vectorDbRel = process.env.VECTOR_DB_DIR || ".vectordb";
|
|
25
|
+
const vectorDbDir = path.resolve(rootDir, vectorDbRel);
|
|
26
|
+
const commonBaseUrl = process.env.BASE_URL || process.env.EMBEDDING_BASE_URL;
|
|
27
|
+
const commonModel = process.env.EMBEDDING_MODEL;
|
|
28
|
+
const commonApiKey = process.env.API_KEY || process.env.EMBEDDING_API_KEY;
|
|
29
|
+
currentContext = {
|
|
30
|
+
rootDir,
|
|
31
|
+
articlesDir: path.resolve(rootDir, "articles"),
|
|
32
|
+
booksDir: path.resolve(rootDir, "books"),
|
|
33
|
+
vectorDbDir,
|
|
34
|
+
manifestPath: path.resolve(vectorDbDir, "manifest.json"),
|
|
35
|
+
provider,
|
|
36
|
+
// Google Gemini
|
|
37
|
+
geminiApiKey: process.env.GEMINI_API_KEY || commonApiKey || "",
|
|
38
|
+
geminiModel: process.env.GEMINI_EMBEDDING_MODEL ||
|
|
39
|
+
commonModel ||
|
|
40
|
+
"gemini-embedding-001",
|
|
41
|
+
// OpenAI / OpenAI-compatible (LM Studio等)
|
|
42
|
+
openaiApiKey: process.env.OPENAI_API_KEY ||
|
|
43
|
+
commonApiKey ||
|
|
44
|
+
(process.env.OPENAI_BASE_URL || commonBaseUrl ? "lm-studio" : ""),
|
|
45
|
+
openaiModel: process.env.OPENAI_EMBEDDING_MODEL ||
|
|
46
|
+
commonModel ||
|
|
47
|
+
"text-embedding-3-small",
|
|
48
|
+
openaiBaseUrl: process.env.OPENAI_BASE_URL || commonBaseUrl || undefined,
|
|
49
|
+
// Ollama
|
|
50
|
+
ollamaBaseUrl: process.env.OLLAMA_BASE_URL || commonBaseUrl || "http://localhost:11434",
|
|
51
|
+
ollamaModel: process.env.OLLAMA_EMBEDDING_MODEL || commonModel || "bge-m3",
|
|
52
|
+
// Common
|
|
53
|
+
zennUsername: process.env.ZENN_USERNAME || "",
|
|
54
|
+
};
|
|
55
|
+
return currentContext;
|
|
56
|
+
}
|
|
57
|
+
export function getContext() {
|
|
58
|
+
if (!currentContext) {
|
|
59
|
+
return initContext();
|
|
60
|
+
}
|
|
61
|
+
return currentContext;
|
|
62
|
+
}
|
|
63
|
+
export function resetContext() {
|
|
64
|
+
currentContext = null;
|
|
65
|
+
}
|
|
66
|
+
export function getActiveModel() {
|
|
67
|
+
const ctx = getContext();
|
|
68
|
+
switch (ctx.provider) {
|
|
69
|
+
case "openai":
|
|
70
|
+
return { provider: "openai", model: ctx.openaiModel };
|
|
71
|
+
case "ollama":
|
|
72
|
+
return { provider: "ollama", model: ctx.ollamaModel };
|
|
73
|
+
case "gemini":
|
|
74
|
+
default:
|
|
75
|
+
return { provider: "gemini", model: ctx.geminiModel };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export function getArticleUrl(slug) {
|
|
79
|
+
const ctx = getContext();
|
|
80
|
+
const username = ctx.zennUsername ? `${ctx.zennUsername}/` : "";
|
|
81
|
+
return `https://zenn.dev/${username}articles/${slug}`;
|
|
82
|
+
}
|
|
83
|
+
export function getBookChapterUrl(bookSlug, chapterSlug) {
|
|
84
|
+
const ctx = getContext();
|
|
85
|
+
const username = ctx.zennUsername ? `${ctx.zennUsername}/` : "";
|
|
86
|
+
return `https://zenn.dev/${username}books/${bookSlug}/viewer/${chapterSlug}`;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAqB5B,IAAI,cAAc,GAAsB,IAAI,CAAC;AAE7C,MAAM,UAAU,cAAc;IAC5B,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,WAAW,EAAuB,CAAC;IACrE,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC5E,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IACE,OAAO,CAAC,GAAG,CAAC,eAAe;QAC3B,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAC3D,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;QAChC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,SAAkB;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,IAAI,GAAG,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAE3C,kDAAkD;IAClD,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,WAAW,CAAC;IAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAEvD,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC7E,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAChD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAE1E,cAAc,GAAG;QACf,OAAO;QACP,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;QAC9C,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;QACxC,WAAW;QACX,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,eAAe,CAAC;QACxD,QAAQ;QAER,gBAAgB;QAChB,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,YAAY,IAAI,EAAE;QAC9D,WAAW,EACT,OAAO,CAAC,GAAG,CAAC,sBAAsB;YAClC,WAAW;YACX,sBAAsB;QAExB,0CAA0C;QAC1C,YAAY,EACV,OAAO,CAAC,GAAG,CAAC,cAAc;YAC1B,YAAY;YACZ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,WAAW,EACT,OAAO,CAAC,GAAG,CAAC,sBAAsB;YAClC,WAAW;YACX,wBAAwB;QAC1B,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,aAAa,IAAI,SAAS;QAExE,SAAS;QACT,aAAa,EACX,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,aAAa,IAAI,wBAAwB;QAC1E,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,WAAW,IAAI,QAAQ;QAE1E,SAAS;QACT,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE;KAC9C,CAAC;IAEF,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,cAAc;IAI5B,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,QAAQ,GAAG,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;QACxD,KAAK,QAAQ;YACX,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;QACxD,KAAK,QAAQ,CAAC;QACd;YACE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,OAAO,oBAAoB,QAAQ,YAAY,IAAI,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,WAAmB;IAEnB,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,OAAO,oBAAoB,QAAQ,SAAS,QAAQ,WAAW,WAAW,EAAE,CAAC;AAC/E,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IEmbeddingProvider } from "./providers/types.js";
|
|
2
|
+
export * from "./providers/types.js";
|
|
3
|
+
export * from "./providers/gemini.js";
|
|
4
|
+
export * from "./providers/openai.js";
|
|
5
|
+
export * from "./providers/ollama.js";
|
|
6
|
+
export * from "./providers/factory.js";
|
|
7
|
+
export declare function getDefaultEmbeddingProvider(): IEmbeddingProvider;
|
|
8
|
+
export declare function resetDefaultEmbeddingProvider(): void;
|
|
9
|
+
/**
|
|
10
|
+
* テキストのEmbeddingベクトルを生成する(後方互換ラッパー)
|
|
11
|
+
*/
|
|
12
|
+
export declare function getEmbedding(text: string): Promise<number[]>;
|
|
13
|
+
/**
|
|
14
|
+
* 複数テキストのEmbeddingベクトルを一括生成する(後方互換ラッパー)
|
|
15
|
+
*/
|
|
16
|
+
export declare function getEmbeddings(texts: string[], onProgress?: (completed: number, total: number) => void): Promise<number[][]>;
|
|
17
|
+
//# sourceMappingURL=embedder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../src/embedder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AAIvC,wBAAgB,2BAA2B,IAAI,kBAAkB,CAKhE;AAED,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGlE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACtD,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAGrB"}
|
package/dist/embedder.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createEmbeddingProvider } from "./providers/factory.js";
|
|
2
|
+
export * from "./providers/types.js";
|
|
3
|
+
export * from "./providers/gemini.js";
|
|
4
|
+
export * from "./providers/openai.js";
|
|
5
|
+
export * from "./providers/ollama.js";
|
|
6
|
+
export * from "./providers/factory.js";
|
|
7
|
+
let defaultProvider = null;
|
|
8
|
+
export function getDefaultEmbeddingProvider() {
|
|
9
|
+
if (!defaultProvider) {
|
|
10
|
+
defaultProvider = createEmbeddingProvider();
|
|
11
|
+
}
|
|
12
|
+
return defaultProvider;
|
|
13
|
+
}
|
|
14
|
+
export function resetDefaultEmbeddingProvider() {
|
|
15
|
+
defaultProvider = null;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* テキストのEmbeddingベクトルを生成する(後方互換ラッパー)
|
|
19
|
+
*/
|
|
20
|
+
export async function getEmbedding(text) {
|
|
21
|
+
const provider = getDefaultEmbeddingProvider();
|
|
22
|
+
return provider.getEmbedding(text);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 複数テキストのEmbeddingベクトルを一括生成する(後方互換ラッパー)
|
|
26
|
+
*/
|
|
27
|
+
export async function getEmbeddings(texts, onProgress) {
|
|
28
|
+
const provider = getDefaultEmbeddingProvider();
|
|
29
|
+
return provider.getEmbeddings(texts, onProgress);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=embedder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder.js","sourceRoot":"","sources":["../src/embedder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AAEvC,IAAI,eAAe,GAA8B,IAAI,CAAC;AAEtD,MAAM,UAAU,2BAA2B;IACzC,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,eAAe,GAAG,uBAAuB,EAAE,CAAC;IAC9C,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,6BAA6B;IAC3C,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,MAAM,QAAQ,GAAG,2BAA2B,EAAE,CAAC;IAC/C,OAAO,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAe,EACf,UAAuD;IAEvD,MAAM,QAAQ,GAAG,2BAA2B,EAAE,CAAC;IAC/C,OAAO,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;AACnD,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./config.js";
|
|
3
|
+
export * from "./parser.js";
|
|
4
|
+
export * from "./embedder.js";
|
|
5
|
+
export * from "./store.js";
|
|
6
|
+
export * from "./logger.js";
|
|
7
|
+
export * from "./services/sync-service.js";
|
|
8
|
+
export { syncIndex } from "./commands/index.js";
|
|
9
|
+
export { searchArticles, searchCli } from "./commands/search.js";
|
|
10
|
+
export { showStatus } from "./commands/status.js";
|
|
11
|
+
export { runMcpServer } from "./commands/mcp.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./config.js";
|
|
3
|
+
export * from "./parser.js";
|
|
4
|
+
export * from "./embedder.js";
|
|
5
|
+
export * from "./store.js";
|
|
6
|
+
export * from "./logger.js";
|
|
7
|
+
export * from "./services/sync-service.js";
|
|
8
|
+
export { syncIndex } from "./commands/index.js";
|
|
9
|
+
export { searchArticles, searchCli } from "./commands/search.js";
|
|
10
|
+
export { showStatus } from "./commands/status.js";
|
|
11
|
+
export { runMcpServer } from "./commands/mcp.js";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface Logger {
|
|
2
|
+
info(message: string): void;
|
|
3
|
+
warn(message: string): void;
|
|
4
|
+
error(message: string, error?: unknown): void;
|
|
5
|
+
write(message: string): void;
|
|
6
|
+
}
|
|
7
|
+
export declare class ConsoleLogger implements Logger {
|
|
8
|
+
info(message: string): void;
|
|
9
|
+
warn(message: string): void;
|
|
10
|
+
error(message: string, error?: unknown): void;
|
|
11
|
+
write(message: string): void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* MCPサーバー実行時用ロガー
|
|
15
|
+
* 標準出力(stdout)は JSON-RPC 通信専用のため、ログはすべて stderr に出力する
|
|
16
|
+
*/
|
|
17
|
+
export declare class McpLogger implements Logger {
|
|
18
|
+
info(message: string): void;
|
|
19
|
+
warn(message: string): void;
|
|
20
|
+
error(message: string, error?: unknown): void;
|
|
21
|
+
write(message: string): void;
|
|
22
|
+
}
|
|
23
|
+
export declare class SilentLogger implements Logger {
|
|
24
|
+
info(): void;
|
|
25
|
+
warn(): void;
|
|
26
|
+
error(): void;
|
|
27
|
+
write(): void;
|
|
28
|
+
}
|
|
29
|
+
export declare function getLogger(): Logger;
|
|
30
|
+
export declare function setLogger(logger: Logger): void;
|
|
31
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,qBAAa,aAAc,YAAW,MAAM;IAC1C,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1B;IAED,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1B;IAED,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAM5C;IAED,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3B;CACF;AAED;;;GAGG;AACH,qBAAa,SAAU,YAAW,MAAM;IACtC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1B;IAED,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1B;IAED,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAM5C;IAED,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3B;CACF;AAED,qBAAa,YAAa,YAAW,MAAM;IACzC,IAAI,IAAI,IAAI,CAAG;IACf,IAAI,IAAI,IAAI,CAAG;IACf,KAAK,IAAI,IAAI,CAAG;IAChB,KAAK,IAAI,IAAI,CAAG;CACjB;AAID,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9C"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export class ConsoleLogger {
|
|
2
|
+
info(message) {
|
|
3
|
+
console.log(message);
|
|
4
|
+
}
|
|
5
|
+
warn(message) {
|
|
6
|
+
console.warn(message);
|
|
7
|
+
}
|
|
8
|
+
error(message, error) {
|
|
9
|
+
if (error !== undefined) {
|
|
10
|
+
console.error(message, error);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
console.error(message);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
write(message) {
|
|
17
|
+
process.stdout.write(message);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* MCPサーバー実行時用ロガー
|
|
22
|
+
* 標準出力(stdout)は JSON-RPC 通信専用のため、ログはすべて stderr に出力する
|
|
23
|
+
*/
|
|
24
|
+
export class McpLogger {
|
|
25
|
+
info(message) {
|
|
26
|
+
console.error(`[INFO] ${message}`);
|
|
27
|
+
}
|
|
28
|
+
warn(message) {
|
|
29
|
+
console.error(`[WARN] ${message}`);
|
|
30
|
+
}
|
|
31
|
+
error(message, error) {
|
|
32
|
+
if (error !== undefined) {
|
|
33
|
+
console.error(`[ERROR] ${message}`, error);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
console.error(`[ERROR] ${message}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
write(message) {
|
|
40
|
+
process.stderr.write(message);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class SilentLogger {
|
|
44
|
+
info() { }
|
|
45
|
+
warn() { }
|
|
46
|
+
error() { }
|
|
47
|
+
write() { }
|
|
48
|
+
}
|
|
49
|
+
let currentLogger = new ConsoleLogger();
|
|
50
|
+
export function getLogger() {
|
|
51
|
+
return currentLogger;
|
|
52
|
+
}
|
|
53
|
+
export function setLogger(logger) {
|
|
54
|
+
currentLogger = logger;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,aAAa;IACxB,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,KAAe;QACpC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,SAAS;IACpB,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,KAAe;QACpC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,YAAY;IACvB,IAAI,KAAU,CAAC;IACf,IAAI,KAAU,CAAC;IACf,KAAK,KAAU,CAAC;IAChB,KAAK,KAAU,CAAC;CACjB;AAED,IAAI,aAAa,GAAW,IAAI,aAAa,EAAE,CAAC;AAEhD,MAAM,UAAU,SAAS;IACvB,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,aAAa,GAAG,MAAM,CAAC;AACzB,CAAC"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ArticleChunk, ArticleFrontmatter } from "./types.js";
|
|
2
|
+
export declare function computeHash(content: string): string;
|
|
3
|
+
/**
|
|
4
|
+
* Markdownを見出し単位でセクションに分割する
|
|
5
|
+
*/
|
|
6
|
+
export declare function splitMarkdownIntoSections(markdown: string): {
|
|
7
|
+
heading: string;
|
|
8
|
+
text: string;
|
|
9
|
+
}[];
|
|
10
|
+
/**
|
|
11
|
+
* コードブロック(``` または ~~~)を保護しながら段落に分割する
|
|
12
|
+
*/
|
|
13
|
+
export declare function extractParagraphs(text: string): string[];
|
|
14
|
+
export declare function splitSectionIfLong(text: string, maxChars?: number): string[];
|
|
15
|
+
export interface ParseArticleOptions {
|
|
16
|
+
articleUrl?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Markdown文字列をパースしてArticleChunk配列に変換する純粋関数
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseArticle(rawContent: string, slug: string, options?: ParseArticleOptions): {
|
|
22
|
+
slug: string;
|
|
23
|
+
frontmatter: ArticleFrontmatter;
|
|
24
|
+
chunks: ArticleChunk[];
|
|
25
|
+
fileHash: string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* 1つの記事Markdownファイルを読み込んでパースし、複数のArticleChunkに変換する
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseArticleFile(filePath: string, options?: ParseArticleOptions): Promise<{
|
|
31
|
+
slug: string;
|
|
32
|
+
frontmatter: ArticleFrontmatter;
|
|
33
|
+
chunks: ArticleChunk[];
|
|
34
|
+
fileHash: string;
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* Zennの本(Books)の1チャプターをパースしてArticleChunk配列に変換する純粋関数
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseBookChapter(rawContent: string, bookSlug: string, chapterSlug: string, options?: ParseArticleOptions): {
|
|
40
|
+
slug: string;
|
|
41
|
+
frontmatter: ArticleFrontmatter;
|
|
42
|
+
chunks: ArticleChunk[];
|
|
43
|
+
fileHash: string;
|
|
44
|
+
bookSlug: string;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* 本のチャプターファイルを読み込んでパースする
|
|
48
|
+
*/
|
|
49
|
+
export declare function parseBookChapterFile(filePath: string, bookSlug: string, options?: ParseArticleOptions): Promise<{
|
|
50
|
+
slug: string;
|
|
51
|
+
frontmatter: ArticleFrontmatter;
|
|
52
|
+
chunks: ArticleChunk[];
|
|
53
|
+
fileHash: string;
|
|
54
|
+
bookSlug: string;
|
|
55
|
+
}>;
|
|
56
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEnE,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,GACf;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAyCrC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAqCxD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAO,GAAG,MAAM,EAAE,CAuB1E;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,mBAAmB,GAC5B;IACD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,kBAAkB,CAAC;IAChC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB,CA6CA;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,kBAAkB,CAAC;IAChC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAID;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,mBAAmB,GAC5B;IACD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,kBAAkB,CAAC;IAChC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAiDA;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,kBAAkB,CAAC;IAChC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAID"}
|