@search-docs/mcp-server 1.0.13 → 1.0.15
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/__tests__/helpers/test-setup.d.ts +33 -0
- package/dist/__tests__/helpers/test-setup.d.ts.map +1 -0
- package/dist/__tests__/helpers/test-setup.js +106 -0
- package/dist/__tests__/helpers/test-setup.js.map +1 -0
- package/dist/__tests__/helpers/types.d.ts +22 -0
- package/dist/__tests__/helpers/types.d.ts.map +1 -0
- package/dist/__tests__/helpers/types.js +5 -0
- package/dist/__tests__/helpers/types.js.map +1 -0
- package/dist/__tests__/mcp-server-basic.test.d.ts +16 -0
- package/dist/__tests__/mcp-server-basic.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-server-basic.test.js +113 -0
- package/dist/__tests__/mcp-server-basic.test.js.map +1 -0
- package/dist/__tests__/server-lifecycle.test.d.ts +15 -0
- package/dist/__tests__/server-lifecycle.test.d.ts.map +1 -0
- package/dist/__tests__/server-lifecycle.test.js +171 -0
- package/dist/__tests__/server-lifecycle.test.js.map +1 -0
- package/dist/__tests__/server-state-transition-v2.test.d.ts +7 -0
- package/dist/__tests__/server-state-transition-v2.test.d.ts.map +1 -0
- package/dist/__tests__/server-state-transition-v2.test.js +182 -0
- package/dist/__tests__/server-state-transition-v2.test.js.map +1 -0
- package/dist/__tests__/server-state.test.d.ts +11 -0
- package/dist/__tests__/server-state.test.d.ts.map +1 -0
- package/dist/__tests__/server-state.test.js +123 -0
- package/dist/__tests__/server-state.test.js.map +1 -0
- package/dist/__tests__/state.test.d.ts +5 -0
- package/dist/__tests__/state.test.d.ts.map +1 -0
- package/dist/__tests__/state.test.js +114 -0
- package/dist/__tests__/state.test.js.map +1 -0
- package/dist/server-manager.d.ts +1 -1
- package/dist/server-manager.d.ts.map +1 -1
- package/dist/server-manager.js +68 -15
- package/dist/server-manager.js.map +1 -1
- package/dist/server-state-transition.test.d.ts +9 -0
- package/dist/server-state-transition.test.d.ts.map +1 -0
- package/dist/server-state-transition.test.js +267 -0
- package/dist/server-state-transition.test.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +91 -243
- package/dist/server.js.map +1 -1
- package/dist/server.test.js +32 -1
- package/dist/server.test.js.map +1 -1
- package/dist/state.d.ts +42 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +96 -0
- package/dist/state.js.map +1 -0
- package/dist/tools/__tests__/index-status.test.d.ts +5 -0
- package/dist/tools/__tests__/index-status.test.d.ts.map +1 -0
- package/dist/tools/__tests__/index-status.test.js +123 -0
- package/dist/tools/__tests__/index-status.test.js.map +1 -0
- package/dist/tools/get-document.d.ts +10 -0
- package/dist/tools/get-document.d.ts.map +1 -0
- package/dist/tools/get-document.js +73 -0
- package/dist/tools/get-document.js.map +1 -0
- package/dist/tools/index-status.d.ts +10 -0
- package/dist/tools/index-status.d.ts.map +1 -0
- package/dist/tools/index-status.js +51 -0
- package/dist/tools/index-status.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +12 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/init.d.ts +10 -0
- package/dist/tools/init.d.ts.map +1 -0
- package/dist/tools/init.js +71 -0
- package/dist/tools/init.js.map +1 -0
- package/dist/tools/search.d.ts +10 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +92 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/server-control.d.ts +14 -0
- package/dist/tools/server-control.d.ts.map +1 -0
- package/dist/tools/server-control.js +121 -0
- package/dist/tools/server-control.js.map +1 -0
- package/dist/tools/system-status.d.ts +10 -0
- package/dist/tools/system-status.d.ts.map +1 -0
- package/dist/tools/system-status.js +68 -0
- package/dist/tools/system-status.js.map +1 -0
- package/dist/tools/types.d.ts +17 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +5 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/utils.d.ts +19 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +36 -0
- package/dist/utils.js.map +1 -0
- package/package.json +3 -3
package/dist/state.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* システム状態管理
|
|
3
|
+
*/
|
|
4
|
+
import { SearchDocsClient } from '@search-docs/client';
|
|
5
|
+
import { ConfigLoader } from '@search-docs/types';
|
|
6
|
+
/**
|
|
7
|
+
* システム状態を判定
|
|
8
|
+
*
|
|
9
|
+
* @param cwd - カレントワーキングディレクトリ
|
|
10
|
+
* @returns システム状態情報
|
|
11
|
+
*/
|
|
12
|
+
export async function detectSystemState(cwd) {
|
|
13
|
+
// 1. 設定ファイルの存在確認
|
|
14
|
+
let config;
|
|
15
|
+
let configPath;
|
|
16
|
+
let projectRoot;
|
|
17
|
+
try {
|
|
18
|
+
const result = await ConfigLoader.resolve({
|
|
19
|
+
cwd,
|
|
20
|
+
requireConfig: false, // エラーで終了しない
|
|
21
|
+
traverseUp: false, // 上位ディレクトリを遡らない(テスト時の意図しない設定読み込みを防ぐ)
|
|
22
|
+
});
|
|
23
|
+
// 設定ファイルが見つからない場合(configPath === null)は未設定状態
|
|
24
|
+
// ConfigLoader.resolve()はデフォルト設定を返すが、設定ファイルが存在しない場合は
|
|
25
|
+
// NOT_CONFIGURED状態として扱う
|
|
26
|
+
if (!result.config || result.configPath === null) {
|
|
27
|
+
// 設定ファイルなし
|
|
28
|
+
return {
|
|
29
|
+
state: 'NOT_CONFIGURED',
|
|
30
|
+
projectRoot: cwd,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
config = result.config;
|
|
34
|
+
configPath = result.configPath ?? undefined;
|
|
35
|
+
projectRoot = result.projectRoot;
|
|
36
|
+
}
|
|
37
|
+
catch (_error) {
|
|
38
|
+
// 設定ファイル読み込みエラー
|
|
39
|
+
return {
|
|
40
|
+
state: 'NOT_CONFIGURED',
|
|
41
|
+
projectRoot: cwd,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// 2. サーバのヘルスチェック
|
|
45
|
+
const serverUrl = `http://${config.server.host}:${config.server.port}`;
|
|
46
|
+
const client = new SearchDocsClient({ baseUrl: serverUrl });
|
|
47
|
+
try {
|
|
48
|
+
await client.healthCheck();
|
|
49
|
+
// サーバ稼働中
|
|
50
|
+
return {
|
|
51
|
+
state: 'RUNNING',
|
|
52
|
+
config,
|
|
53
|
+
configPath,
|
|
54
|
+
projectRoot,
|
|
55
|
+
serverUrl,
|
|
56
|
+
client,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (_error) {
|
|
60
|
+
// サーバ停止中
|
|
61
|
+
return {
|
|
62
|
+
state: 'CONFIGURED_SERVER_DOWN',
|
|
63
|
+
config,
|
|
64
|
+
configPath,
|
|
65
|
+
projectRoot,
|
|
66
|
+
serverUrl,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* システム状態に応じたエラーメッセージを生成
|
|
72
|
+
*
|
|
73
|
+
* @param state - システム状態
|
|
74
|
+
* @param action - 実行しようとしたアクション名
|
|
75
|
+
* @returns エラーメッセージ
|
|
76
|
+
*/
|
|
77
|
+
export function getStateErrorMessage(state, action) {
|
|
78
|
+
switch (state) {
|
|
79
|
+
case 'NOT_CONFIGURED':
|
|
80
|
+
return (`${action}を実行できません。search-docsがまだセットアップされていません。\n\n` +
|
|
81
|
+
'まず、設定ファイルを作成してください:\n' +
|
|
82
|
+
' ツール: init\n\n' +
|
|
83
|
+
'設定作成後、サーバを起動してください:\n' +
|
|
84
|
+
' ツール: server_start');
|
|
85
|
+
case 'CONFIGURED_SERVER_DOWN':
|
|
86
|
+
return (`${action}を実行できません。search-docsサーバが起動していません。\n\n` +
|
|
87
|
+
'サーバを起動してください:\n' +
|
|
88
|
+
' ツール: server_start\n\n' +
|
|
89
|
+
'または、設定を再作成する場合:\n' +
|
|
90
|
+
' ツール: init (--force オプション付き)');
|
|
91
|
+
case 'RUNNING':
|
|
92
|
+
// サーバ稼働中は通常エラーにならないが、念のため
|
|
93
|
+
return `${action}を実行できません。予期しないエラーが発生しました。`;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAyB,MAAM,oBAAoB,CAAC;AAyBzE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW;IACjD,iBAAiB;IACjB,IAAI,MAAoC,CAAC;IACzC,IAAI,UAA8B,CAAC;IACnC,IAAI,WAAmB,CAAC;IAExB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC;YACxC,GAAG;YACH,aAAa,EAAE,KAAK,EAAE,YAAY;YAClC,UAAU,EAAE,KAAK,EAAE,qCAAqC;SACzD,CAAC,CAAC;QAEH,6CAA6C;QAC7C,qDAAqD;QACrD,wBAAwB;QACxB,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YACjD,WAAW;YACX,OAAO;gBACL,KAAK,EAAE,gBAAgB;gBACvB,WAAW,EAAE,GAAG;aACjB,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACvB,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,SAAS,CAAC;QAC5C,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACnC,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,gBAAgB;QAChB,OAAO;YACL,KAAK,EAAE,gBAAgB;YACvB,WAAW,EAAE,GAAG;SACjB,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,MAAM,SAAS,GAAG,UAAU,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QAE3B,SAAS;QACT,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,MAAM;YACN,UAAU;YACV,WAAW;YACX,SAAS;YACT,MAAM;SACP,CAAC;IACJ,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,SAAS;QACT,OAAO;YACL,KAAK,EAAE,wBAAwB;YAC/B,MAAM;YACN,UAAU;YACV,WAAW;YACX,SAAS;SACV,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAkB,EAAE,MAAc;IACrE,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,gBAAgB;YACnB,OAAO,CACL,GAAG,MAAM,2CAA2C;gBACpD,uBAAuB;gBACvB,iBAAiB;gBACjB,uBAAuB;gBACvB,qBAAqB,CACtB,CAAC;QAEJ,KAAK,wBAAwB;YAC3B,OAAO,CACL,GAAG,MAAM,uCAAuC;gBAChD,iBAAiB;gBACjB,yBAAyB;gBACzB,mBAAmB;gBACnB,+BAA+B,CAChC,CAAC;QAEJ,KAAK,SAAS;YACZ,0BAA0B;YAC1B,OAAO,GAAG,MAAM,2BAA2B,CAAC;IAChD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-status.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/index-status.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* index_statusツールのテスト
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
5
|
+
import { registerIndexStatusTool } from '../index-status.js';
|
|
6
|
+
describe('index_status tool', () => {
|
|
7
|
+
let mockServer;
|
|
8
|
+
let registeredTool;
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
vi.clearAllMocks();
|
|
11
|
+
// MCPサーバのモック
|
|
12
|
+
mockServer = {
|
|
13
|
+
registerTool: vi.fn((name, schema, handler) => {
|
|
14
|
+
registeredTool = { name, schema, handler };
|
|
15
|
+
}),
|
|
16
|
+
};
|
|
17
|
+
});
|
|
18
|
+
it('RUNNING状態の場合、正常に動作する', async () => {
|
|
19
|
+
const mockResponse = {
|
|
20
|
+
server: {
|
|
21
|
+
version: '1.0.0',
|
|
22
|
+
uptime: 123456,
|
|
23
|
+
pid: 12345,
|
|
24
|
+
},
|
|
25
|
+
index: {
|
|
26
|
+
totalDocuments: 10,
|
|
27
|
+
totalSections: 50,
|
|
28
|
+
dirtyCount: 2,
|
|
29
|
+
},
|
|
30
|
+
worker: {
|
|
31
|
+
running: true,
|
|
32
|
+
processing: 1,
|
|
33
|
+
queue: 3,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
const mockClient = {
|
|
37
|
+
getStatus: vi.fn().mockResolvedValue(mockResponse),
|
|
38
|
+
};
|
|
39
|
+
const systemState = {
|
|
40
|
+
state: 'RUNNING',
|
|
41
|
+
config: {},
|
|
42
|
+
configPath: '/test/.search-docs.json',
|
|
43
|
+
projectRoot: '/test',
|
|
44
|
+
serverUrl: 'http://localhost:24280',
|
|
45
|
+
client: mockClient,
|
|
46
|
+
};
|
|
47
|
+
const context = {
|
|
48
|
+
server: mockServer,
|
|
49
|
+
systemState,
|
|
50
|
+
refreshSystemState: async () => { },
|
|
51
|
+
};
|
|
52
|
+
// ツール登録
|
|
53
|
+
registerIndexStatusTool(context);
|
|
54
|
+
expect(mockServer.registerTool).toHaveBeenCalledWith('index_status', expect.objectContaining({
|
|
55
|
+
description: expect.stringContaining('インデックスの状態'),
|
|
56
|
+
}), expect.any(Function));
|
|
57
|
+
// ツールハンドラを実行
|
|
58
|
+
const result = await registeredTool.handler();
|
|
59
|
+
expect(mockClient.getStatus).toHaveBeenCalled();
|
|
60
|
+
expect(result.content[0].text).toContain('📊 インデックス状態');
|
|
61
|
+
expect(result.content[0].text).toContain('バージョン: 1.0.0');
|
|
62
|
+
expect(result.content[0].text).toContain('総文書数: 10件');
|
|
63
|
+
expect(result.content[0].text).toContain('総セクション数: 50件');
|
|
64
|
+
expect(result.content[0].text).toContain('Dirtyセクション: 2件');
|
|
65
|
+
expect(result.content[0].text).toContain('実行中: Yes');
|
|
66
|
+
});
|
|
67
|
+
it('NOT_CONFIGURED状態の場合、エラーを返す', async () => {
|
|
68
|
+
const systemState = {
|
|
69
|
+
state: 'NOT_CONFIGURED',
|
|
70
|
+
projectRoot: '/test',
|
|
71
|
+
};
|
|
72
|
+
const context = {
|
|
73
|
+
server: mockServer,
|
|
74
|
+
systemState,
|
|
75
|
+
refreshSystemState: async () => { },
|
|
76
|
+
};
|
|
77
|
+
// ツール登録
|
|
78
|
+
registerIndexStatusTool(context);
|
|
79
|
+
// ツールハンドラを実行
|
|
80
|
+
await expect(registeredTool.handler()).rejects.toThrow('セットアップされていません');
|
|
81
|
+
});
|
|
82
|
+
it('CONFIGURED_SERVER_DOWN状態の場合、エラーを返す', async () => {
|
|
83
|
+
const systemState = {
|
|
84
|
+
state: 'CONFIGURED_SERVER_DOWN',
|
|
85
|
+
config: {},
|
|
86
|
+
configPath: '/test/.search-docs.json',
|
|
87
|
+
projectRoot: '/test',
|
|
88
|
+
serverUrl: 'http://localhost:24280',
|
|
89
|
+
};
|
|
90
|
+
const context = {
|
|
91
|
+
server: mockServer,
|
|
92
|
+
systemState,
|
|
93
|
+
refreshSystemState: async () => { },
|
|
94
|
+
};
|
|
95
|
+
// ツール登録
|
|
96
|
+
registerIndexStatusTool(context);
|
|
97
|
+
// ツールハンドラを実行
|
|
98
|
+
await expect(registeredTool.handler()).rejects.toThrow('起動していません');
|
|
99
|
+
});
|
|
100
|
+
it('client.getStatus()がエラーの場合、エラーを返す', async () => {
|
|
101
|
+
const mockClient = {
|
|
102
|
+
getStatus: vi.fn().mockRejectedValue(new Error('Connection error')),
|
|
103
|
+
};
|
|
104
|
+
const systemState = {
|
|
105
|
+
state: 'RUNNING',
|
|
106
|
+
config: {},
|
|
107
|
+
configPath: '/test/.search-docs.json',
|
|
108
|
+
projectRoot: '/test',
|
|
109
|
+
serverUrl: 'http://localhost:24280',
|
|
110
|
+
client: mockClient,
|
|
111
|
+
};
|
|
112
|
+
const context = {
|
|
113
|
+
server: mockServer,
|
|
114
|
+
systemState,
|
|
115
|
+
refreshSystemState: async () => { },
|
|
116
|
+
};
|
|
117
|
+
// ツール登録
|
|
118
|
+
registerIndexStatusTool(context);
|
|
119
|
+
// ツールハンドラを実行
|
|
120
|
+
await expect(registeredTool.handler()).rejects.toThrow('ステータス取得エラー');
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
//# sourceMappingURL=index-status.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-status.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/index-status.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_document ツール
|
|
3
|
+
* 文書の内容を取得する
|
|
4
|
+
*/
|
|
5
|
+
import type { ToolRegistrationContext } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* get_document ツールを登録
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerGetDocumentTool(context: ToolRegistrationContext): void;
|
|
10
|
+
//# sourceMappingURL=get-document.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-document.d.ts","sourceRoot":"","sources":["../../src/tools/get-document.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAwE9E"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_document ツール
|
|
3
|
+
* 文書の内容を取得する
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { getStateErrorMessage } from '../state.js';
|
|
7
|
+
import { getDepthLabel } from '../utils.js';
|
|
8
|
+
/**
|
|
9
|
+
* get_document ツールを登録
|
|
10
|
+
*/
|
|
11
|
+
export function registerGetDocumentTool(context) {
|
|
12
|
+
const { server, systemState } = context;
|
|
13
|
+
server.registerTool('get_document', {
|
|
14
|
+
description: '文書の内容を取得します。パス指定で文書全体、またはセクションIDで特定セクションを取得できます。pathとsectionIdのどちらか一方は必須です。',
|
|
15
|
+
inputSchema: {
|
|
16
|
+
path: z.string().optional().describe('文書パス(sectionIdを指定しない場合は必須)'),
|
|
17
|
+
sectionId: z.string().optional().describe('セクションID(検索結果から取得。pathを指定しない場合は必須)'),
|
|
18
|
+
},
|
|
19
|
+
}, async (args) => {
|
|
20
|
+
// 状態チェック
|
|
21
|
+
if (systemState.state !== 'RUNNING') {
|
|
22
|
+
throw new Error(getStateErrorMessage(systemState.state, '文書の取得'));
|
|
23
|
+
}
|
|
24
|
+
const { path: documentPath, sectionId } = args;
|
|
25
|
+
// どちらか一方は必須
|
|
26
|
+
if (!documentPath && !sectionId) {
|
|
27
|
+
throw new Error('pathまたはsectionIdのどちらか一方を指定してください');
|
|
28
|
+
}
|
|
29
|
+
const client = systemState.client;
|
|
30
|
+
try {
|
|
31
|
+
const response = await client.getDocument({ path: documentPath, sectionId });
|
|
32
|
+
if (!response.document && !response.section) {
|
|
33
|
+
throw new Error(`Document or section not found`);
|
|
34
|
+
}
|
|
35
|
+
let resultText = '';
|
|
36
|
+
// セクション取得の場合
|
|
37
|
+
if (sectionId && response.section) {
|
|
38
|
+
resultText += `セクション: ${response.section.heading || '(no heading)'}\n`;
|
|
39
|
+
resultText += `文書: ${response.section.documentPath}\n`;
|
|
40
|
+
const depthLabel = getDepthLabel(response.section.depth);
|
|
41
|
+
const sectionPath = response.section.sectionNumber.join('-');
|
|
42
|
+
resultText += `Level: ${depthLabel} | Section: ${sectionPath} | Line: ${response.section.startLine}-${response.section.endLine}\n\n`;
|
|
43
|
+
resultText += `内容:\n${'='.repeat(60)}\n`;
|
|
44
|
+
resultText += response.section.content;
|
|
45
|
+
resultText += `\n${'='.repeat(60)}`;
|
|
46
|
+
}
|
|
47
|
+
else if (response.document) {
|
|
48
|
+
// 文書全体取得の場合
|
|
49
|
+
resultText += `文書: ${response.document.path}\n`;
|
|
50
|
+
if (response.document.metadata.title) {
|
|
51
|
+
resultText += `タイトル: ${response.document.metadata.title}\n`;
|
|
52
|
+
}
|
|
53
|
+
resultText += `作成日: ${new Date(response.document.metadata.createdAt).toLocaleString()}\n`;
|
|
54
|
+
resultText += `更新日: ${new Date(response.document.metadata.updatedAt).toLocaleString()}\n\n`;
|
|
55
|
+
resultText += `内容:\n${'='.repeat(60)}\n`;
|
|
56
|
+
resultText += response.document.content;
|
|
57
|
+
resultText += `\n${'='.repeat(60)}`;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
content: [
|
|
61
|
+
{
|
|
62
|
+
type: 'text',
|
|
63
|
+
text: resultText,
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
throw new Error(`文書取得エラー: ${error.message}`);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=get-document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-document.js","sourceRoot":"","sources":["../../src/tools/get-document.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* index_status ツール
|
|
3
|
+
* インデックスの状態を確認する
|
|
4
|
+
*/
|
|
5
|
+
import type { ToolRegistrationContext } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* index_status ツールを登録
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerIndexStatusTool(context: ToolRegistrationContext): void;
|
|
10
|
+
//# sourceMappingURL=index-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-status.d.ts","sourceRoot":"","sources":["../../src/tools/index-status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAmD9E"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* index_status ツール
|
|
3
|
+
* インデックスの状態を確認する
|
|
4
|
+
*/
|
|
5
|
+
import { getStateErrorMessage } from '../state.js';
|
|
6
|
+
/**
|
|
7
|
+
* index_status ツールを登録
|
|
8
|
+
*/
|
|
9
|
+
export function registerIndexStatusTool(context) {
|
|
10
|
+
const { server, systemState } = context;
|
|
11
|
+
server.registerTool('index_status', {
|
|
12
|
+
description: 'インデックスの状態を確認します。総文書数、セクション数、Dirtyセクション数などを表示します。',
|
|
13
|
+
inputSchema: {},
|
|
14
|
+
}, async () => {
|
|
15
|
+
// 状態チェック
|
|
16
|
+
if (systemState.state !== 'RUNNING') {
|
|
17
|
+
throw new Error(getStateErrorMessage(systemState.state, 'インデックス状態の確認'));
|
|
18
|
+
}
|
|
19
|
+
const client = systemState.client;
|
|
20
|
+
try {
|
|
21
|
+
const response = await client.getStatus();
|
|
22
|
+
let statusText = '📊 インデックス状態\n\n';
|
|
23
|
+
statusText += `サーバ情報:\n`;
|
|
24
|
+
statusText += ` バージョン: ${response.server.version}\n`;
|
|
25
|
+
statusText += ` 起動時間: ${(response.server.uptime / 1000).toFixed(1)}秒\n`;
|
|
26
|
+
statusText += ` PID: ${response.server.pid}\n\n`;
|
|
27
|
+
statusText += `インデックス情報:\n`;
|
|
28
|
+
statusText += ` 総文書数: ${response.index.totalDocuments}件\n`;
|
|
29
|
+
statusText += ` 総セクション数: ${response.index.totalSections}件\n`;
|
|
30
|
+
statusText += ` Dirtyセクション: ${response.index.dirtyCount}件\n`;
|
|
31
|
+
if (response.worker) {
|
|
32
|
+
statusText += `\nワーカー情報:\n`;
|
|
33
|
+
statusText += ` 実行中: ${response.worker.running ? 'Yes' : 'No'}\n`;
|
|
34
|
+
statusText += ` 処理中: ${response.worker.processing}件\n`;
|
|
35
|
+
statusText += ` キュー: ${response.worker.queue}件\n`;
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
content: [
|
|
39
|
+
{
|
|
40
|
+
type: 'text',
|
|
41
|
+
text: statusText,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
throw new Error(`ステータス取得エラー: ${error.message}`);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=index-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-status.js","sourceRoot":"","sources":["../../src/tools/index-status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnD;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAgC;IACtE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAExC,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,WAAW,EAAE,kDAAkD;QAC/D,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,IAAI,EAAE;QACT,SAAS;QACT,IAAI,WAAW,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,CAAC,MAAO,CAAC;QAEnC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;YAE1C,IAAI,UAAU,GAAG,iBAAiB,CAAC;YACnC,UAAU,IAAI,UAAU,CAAC;YACzB,UAAU,IAAI,YAAY,QAAQ,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC;YACtD,UAAU,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;YACzE,UAAU,IAAI,UAAU,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;YAElD,UAAU,IAAI,aAAa,CAAC;YAC5B,UAAU,IAAI,WAAW,QAAQ,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC;YAC5D,UAAU,IAAI,cAAc,QAAQ,CAAC,KAAK,CAAC,aAAa,KAAK,CAAC;YAC9D,UAAU,IAAI,iBAAiB,QAAQ,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC;YAE9D,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACpB,UAAU,IAAI,aAAa,CAAC;gBAC5B,UAAU,IAAI,UAAU,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;gBACnE,UAAU,IAAI,UAAU,QAAQ,CAAC,MAAM,CAAC,UAAU,KAAK,CAAC;gBACxD,UAAU,IAAI,UAAU,QAAQ,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC;YACrD,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAU;qBACjB;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,eAAgB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ツール登録のエクスポート
|
|
3
|
+
*/
|
|
4
|
+
export { registerSearchTool } from './search.js';
|
|
5
|
+
export { registerGetDocumentTool } from './get-document.js';
|
|
6
|
+
export { registerIndexStatusTool } from './index-status.js';
|
|
7
|
+
export { registerInitTool } from './init.js';
|
|
8
|
+
export { registerServerStartTool, registerServerStopTool } from './server-control.js';
|
|
9
|
+
export { registerSystemStatusTool } from './system-status.js';
|
|
10
|
+
export type { ToolRegistrationContext } from './types.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,YAAY,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ツール登録のエクスポート
|
|
3
|
+
*/
|
|
4
|
+
// 既存ツール
|
|
5
|
+
export { registerSearchTool } from './search.js';
|
|
6
|
+
export { registerGetDocumentTool } from './get-document.js';
|
|
7
|
+
export { registerIndexStatusTool } from './index-status.js';
|
|
8
|
+
// 新規ツール
|
|
9
|
+
export { registerInitTool } from './init.js';
|
|
10
|
+
export { registerServerStartTool, registerServerStopTool } from './server-control.js';
|
|
11
|
+
export { registerSystemStatusTool } from './system-status.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,QAAQ;AACR,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/tools/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAsEvE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* init ツール
|
|
3
|
+
* search-docsの設定ファイルを初期化する
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { initConfig } from '@search-docs/cli/commands/config/init';
|
|
7
|
+
/**
|
|
8
|
+
* init ツールを登録
|
|
9
|
+
*/
|
|
10
|
+
export function registerInitTool(context) {
|
|
11
|
+
const { server, systemState } = context;
|
|
12
|
+
server.registerTool('init', {
|
|
13
|
+
description: 'search-docsの設定ファイルを初期化します。プロジェクトで初めてsearch-docsを使用する場合に実行してください。既存の設定ファイルがある場合、forceオプションを指定しない限り上書きしません。',
|
|
14
|
+
inputSchema: {
|
|
15
|
+
port: z
|
|
16
|
+
.number()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe('サーバポート番号(省略時はランダムなポート番号が割り当てられます)'),
|
|
19
|
+
force: z
|
|
20
|
+
.boolean()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe('既存設定を上書き(デフォルト: false)'),
|
|
23
|
+
},
|
|
24
|
+
}, async (args) => {
|
|
25
|
+
const { port, force } = args;
|
|
26
|
+
try {
|
|
27
|
+
// CLIのinitConfig関数を呼び出し
|
|
28
|
+
await initConfig({
|
|
29
|
+
port,
|
|
30
|
+
force,
|
|
31
|
+
cwd: systemState.projectRoot,
|
|
32
|
+
});
|
|
33
|
+
let resultText = '✅ 設定ファイルの初期化が完了しました。\n\n';
|
|
34
|
+
if (force) {
|
|
35
|
+
resultText += '既存の設定ファイルを上書きしました。\n\n';
|
|
36
|
+
}
|
|
37
|
+
resultText += '📝 設定ファイルの重要な項目:\n\n';
|
|
38
|
+
resultText += '**files.include**: インデックス対象ファイルのパターン\n';
|
|
39
|
+
resultText += ' - デフォルト: ["**/*.md", "docs/**/*.txt"]\n';
|
|
40
|
+
resultText += ' - プロジェクトに応じてパターンを調整してください\n\n';
|
|
41
|
+
resultText += '**files.exclude**: 除外するファイルパターン\n';
|
|
42
|
+
resultText += ' - デフォルト: node_modules, .git, dist, buildを除外\n';
|
|
43
|
+
resultText += ' - 必要に応じて追加してください\n\n';
|
|
44
|
+
resultText += '**indexing.maxDepth**: セクション分割の最大深度(0-3)\n';
|
|
45
|
+
resultText += ' - 0: 文書全体のみ\n';
|
|
46
|
+
resultText += ' - 1: 章レベルまで分割\n';
|
|
47
|
+
resultText += ' - 2: 節レベルまで分割\n';
|
|
48
|
+
resultText += ' - 3: 項レベルまで分割(デフォルト)\n\n';
|
|
49
|
+
resultText += '**indexing.maxTokensPerSection**: セクションの最大トークン数\n';
|
|
50
|
+
resultText += ' - デフォルト: 2000トークン\n';
|
|
51
|
+
resultText += ' - 大きくすると粗い分割、小さくすると細かい分割になります\n\n';
|
|
52
|
+
resultText += '次のステップ:\n';
|
|
53
|
+
resultText += ' 1. 設定を調整(必要に応じて): .search-docs.jsonを編集\n';
|
|
54
|
+
resultText += ' 2. サーバを起動: server_start\n';
|
|
55
|
+
resultText += ' 3. システム状態を確認: get_system_status\n';
|
|
56
|
+
resultText += ' 4. 文書を検索: search\n';
|
|
57
|
+
return {
|
|
58
|
+
content: [
|
|
59
|
+
{
|
|
60
|
+
type: 'text',
|
|
61
|
+
text: resultText,
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
throw new Error(`設定ファイルの初期化に失敗しました: ${error.message}`);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/tools/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAGnE;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgC;IAC/D,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAExC,MAAM,CAAC,YAAY,CACjB,MAAM,EACN;QACE,WAAW,EACT,2GAA2G;QAC7G,WAAW,EAAE;YACX,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,mCAAmC,CAAC;YAChD,KAAK,EAAE,CAAC;iBACL,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,wBAAwB,CAAC;SACtC;KACF,EACD,KAAK,EAAE,IAAwC,EAAE,EAAE;QACjD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAE7B,IAAI,CAAC;YACH,wBAAwB;YACxB,MAAM,UAAU,CAAC;gBACf,IAAI;gBACJ,KAAK;gBACL,GAAG,EAAE,WAAW,CAAC,WAAW;aAC7B,CAAC,CAAC;YAEH,IAAI,UAAU,GAAG,0BAA0B,CAAC;YAE5C,IAAI,KAAK,EAAE,CAAC;gBACV,UAAU,IAAI,wBAAwB,CAAC;YACzC,CAAC;YAED,UAAU,IAAI,sBAAsB,CAAC;YACrC,UAAU,IAAI,wCAAwC,CAAC;YACvD,UAAU,IAAI,2CAA2C,CAAC;YAC1D,UAAU,IAAI,iCAAiC,CAAC;YAChD,UAAU,IAAI,mCAAmC,CAAC;YAClD,UAAU,IAAI,iDAAiD,CAAC;YAChE,UAAU,IAAI,wBAAwB,CAAC;YACvC,UAAU,IAAI,4CAA4C,CAAC;YAC3D,UAAU,IAAI,iBAAiB,CAAC;YAChC,UAAU,IAAI,mBAAmB,CAAC;YAClC,UAAU,IAAI,mBAAmB,CAAC;YAClC,UAAU,IAAI,4BAA4B,CAAC;YAC3C,UAAU,IAAI,mDAAmD,CAAC;YAClE,UAAU,IAAI,uBAAuB,CAAC;YACtC,UAAU,IAAI,qCAAqC,CAAC;YACpD,UAAU,IAAI,WAAW,CAAC;YAC1B,UAAU,IAAI,4CAA4C,CAAC;YAC3D,UAAU,IAAI,6BAA6B,CAAC;YAC5C,UAAU,IAAI,qCAAqC,CAAC;YACpD,UAAU,IAAI,sBAAsB,CAAC;YAErC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAU;qBACjB;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,sBAAuB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAmGzE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* search ツール
|
|
3
|
+
* 文書を検索する
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { getStateErrorMessage } from '../state.js';
|
|
7
|
+
import { getDepthLabel, getPreviewContent } from '../utils.js';
|
|
8
|
+
/**
|
|
9
|
+
* search ツールを登録
|
|
10
|
+
*/
|
|
11
|
+
export function registerSearchTool(context) {
|
|
12
|
+
const { server, systemState } = context;
|
|
13
|
+
server.registerTool('search', {
|
|
14
|
+
description: '文書を検索します。クエリに基づいてVector検索を実行し、関連する文書セクションを返します。検索結果には行番号(startLine-endLine)とセクションIDが含まれるため、Readツールで該当箇所を直接参照したり、get_documentでセクション全体を取得できます。',
|
|
15
|
+
inputSchema: {
|
|
16
|
+
query: z.string().describe('検索クエリ'),
|
|
17
|
+
depth: z
|
|
18
|
+
.number()
|
|
19
|
+
.optional()
|
|
20
|
+
.describe('最大深度(0-3)。この深度まで検索します。0=文書全体のみ、1=章まで、2=節まで、3=項まで。省略時は全階層を検索'),
|
|
21
|
+
limit: z.number().optional().describe('結果数制限(デフォルト: 10)'),
|
|
22
|
+
includeCleanOnly: z
|
|
23
|
+
.boolean()
|
|
24
|
+
.optional()
|
|
25
|
+
.describe('最新の文書内容のみを検索対象とする。falseの場合、文書が更新されていても古いインデックスも含めて検索します(デフォルト: false)'),
|
|
26
|
+
previewLines: z.number().optional().describe('プレビュー行数(デフォルト: 5)'),
|
|
27
|
+
},
|
|
28
|
+
}, async (args) => {
|
|
29
|
+
// 状態チェック
|
|
30
|
+
if (systemState.state !== 'RUNNING') {
|
|
31
|
+
throw new Error(getStateErrorMessage(systemState.state, '文書の検索'));
|
|
32
|
+
}
|
|
33
|
+
const { query, depth, limit, includeCleanOnly, previewLines = 5 } = args;
|
|
34
|
+
const client = systemState.client;
|
|
35
|
+
try {
|
|
36
|
+
const response = await client.search({
|
|
37
|
+
query,
|
|
38
|
+
options: {
|
|
39
|
+
depth,
|
|
40
|
+
limit,
|
|
41
|
+
includeCleanOnly,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
// 結果を整形
|
|
45
|
+
let resultText = `検索結果: ${response.total}件\n`;
|
|
46
|
+
resultText += `処理時間: ${response.took}ms\n\n`;
|
|
47
|
+
if (response.results.length === 0) {
|
|
48
|
+
resultText += '該当する結果が見つかりませんでした。';
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
response.results.forEach((result, index) => {
|
|
52
|
+
// ヘッダー行
|
|
53
|
+
const heading = result.heading || '(no heading)';
|
|
54
|
+
resultText += `${index + 1}. ${result.documentPath} > ${heading}\n`;
|
|
55
|
+
// メタデータ(1行にまとめる)
|
|
56
|
+
const depthLabel = getDepthLabel(result.depth);
|
|
57
|
+
const sectionPath = result.sectionNumber.join('-');
|
|
58
|
+
const metaParts = [
|
|
59
|
+
`Level: ${depthLabel}`,
|
|
60
|
+
`Section: ${sectionPath}`,
|
|
61
|
+
`Line: ${result.startLine}-${result.endLine}`,
|
|
62
|
+
`Score: ${result.score.toFixed(4)}`,
|
|
63
|
+
];
|
|
64
|
+
// indexStatusが'updating'または'outdated'の場合のみ表示
|
|
65
|
+
if (result.indexStatus === 'updating' || result.indexStatus === 'outdated') {
|
|
66
|
+
metaParts.push(`Status: ${result.indexStatus}`);
|
|
67
|
+
}
|
|
68
|
+
resultText += metaParts.join(' | ') + '\n\n';
|
|
69
|
+
// コンテンツ(引用として明確に)
|
|
70
|
+
resultText += '```markdown\n';
|
|
71
|
+
const preview = getPreviewContent(result.content, previewLines);
|
|
72
|
+
resultText += preview + '\n';
|
|
73
|
+
resultText += '```\n\n';
|
|
74
|
+
// セクションID(get_documentで取得するため)
|
|
75
|
+
resultText += `(セクションID: ${result.id})\n\n`;
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
content: [
|
|
80
|
+
{
|
|
81
|
+
type: 'text',
|
|
82
|
+
text: resultText,
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
throw new Error(`検索エラー: ${error.message}`);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=search.js.map
|