proofscan 0.4.1 → 0.5.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/README.ja.md +167 -0
- package/README.md +2 -0
- package/dist/cli.js +5 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +2 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/summary.d.ts +61 -0
- package/dist/commands/summary.d.ts.map +1 -0
- package/dist/commands/summary.js +389 -0
- package/dist/commands/summary.js.map +1 -0
- package/package.json +1 -1
package/README.ja.md
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# ProofScan(日本語)
|
|
2
|
+
|
|
3
|
+
> **Languages:** [English](README.md) | 日本語
|
|
4
|
+
|
|
5
|
+
MCPサーバースキャナー - JSON-RPC通信を記録し、ブラックボックスを可視化します。
|
|
6
|
+
|
|
7
|
+
## 概要
|
|
8
|
+
|
|
9
|
+
proofscanは、MCP(Model Context Protocol)サーバーとの通信を可視化するツールです。
|
|
10
|
+
|
|
11
|
+
- MCPサーバーへのstdio接続を確立
|
|
12
|
+
- すべてのJSON-RPCメッセージ(リクエスト、レスポンス、通知)を記録
|
|
13
|
+
- SQLiteに保存し、効率的なクエリと分析が可能
|
|
14
|
+
- mcp.so / Claude Desktop形式からの設定インポートに対応
|
|
15
|
+
- 直感的なCLIコマンドでデータを確認・探索
|
|
16
|
+
|
|
17
|
+
## インストール
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install -g proofscan
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
またはインストールせずに実行:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npx proofscan --help
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## クイックスタート
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# 1. 設定を初期化
|
|
33
|
+
pfscan config init
|
|
34
|
+
|
|
35
|
+
# 2. MCPサーバーをインポート
|
|
36
|
+
echo '{"mcpServers":{"time":{"command":"uvx","args":["mcp-server-time"]}}}' \
|
|
37
|
+
| pfscan connectors import --from mcpServers --stdin
|
|
38
|
+
|
|
39
|
+
# 3. スキャンして確認
|
|
40
|
+
pfscan scan start --id time # スキャン実行
|
|
41
|
+
pfscan # 最近のイベントを表示
|
|
42
|
+
pfscan tree # 構造を表示
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Phase 3 コンセプト
|
|
46
|
+
|
|
47
|
+
### 設計思想:すべてを残す → 意味のあるものを残す
|
|
48
|
+
|
|
49
|
+
Phase 3では、「すべてのJSON-RPCを記録する」から「セキュリティ上意味のあるものを効率的に残す」へと進化します。
|
|
50
|
+
|
|
51
|
+
### 用語定義
|
|
52
|
+
|
|
53
|
+
| 日本語 | 英語 | 意味 |
|
|
54
|
+
|--------|------|------|
|
|
55
|
+
| **できること** | capability | サーバーが提供する機能(tools/list で取得) |
|
|
56
|
+
| **やったこと** | tool call | 実際に実行されたツール呼び出し(tools/call) |
|
|
57
|
+
|
|
58
|
+
### 操作カテゴリ
|
|
59
|
+
|
|
60
|
+
ツールの操作は以下のカテゴリに分類されます:
|
|
61
|
+
|
|
62
|
+
- **読み取り** - ファイルやデータの読み込み
|
|
63
|
+
- **書き込み** - ファイルやデータの変更
|
|
64
|
+
- **ネット接続** - 外部ネットワークへのアクセス
|
|
65
|
+
- **コマンド実行** - シェルコマンドの実行
|
|
66
|
+
- **その他操作** - 上記以外の操作
|
|
67
|
+
|
|
68
|
+
### CLIコマンド
|
|
69
|
+
|
|
70
|
+
#### pfscan summary
|
|
71
|
+
|
|
72
|
+
サマリー表示。**注意点**(セキュリティ上の懸念)も含めて表示します。
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
$ pfscan summary --session abc123
|
|
76
|
+
|
|
77
|
+
time (1 session)
|
|
78
|
+
├── できること: read_file, write_file, execute_command
|
|
79
|
+
├── やったこと: read_file (3回), write_file (1回)
|
|
80
|
+
└── 注意点: コマンド実行可能、書き込み操作あり
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
#### pfscan permissions
|
|
84
|
+
|
|
85
|
+
詳細なパーミッション情報を表示します。**注意点は表示しません**(詳細確認用のため)。
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
$ pfscan permissions --session abc123
|
|
89
|
+
|
|
90
|
+
time
|
|
91
|
+
├── 読み取り: read_file
|
|
92
|
+
├── 書き込み: write_file
|
|
93
|
+
├── コマンド実行: execute_command
|
|
94
|
+
└── その他操作: (なし)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### record dry-run
|
|
98
|
+
|
|
99
|
+
スキャン候補の記録をプレビューします。
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
# デフォルト: tools/call のみ候補化
|
|
103
|
+
$ pfscan record dry-run --session abc123
|
|
104
|
+
|
|
105
|
+
記録候補:
|
|
106
|
+
[1] tools/call: read_file (2025-12-28 12:00:00)
|
|
107
|
+
[2] tools/call: write_file (2025-12-28 12:00:05)
|
|
108
|
+
|
|
109
|
+
# --include-capabilities: tools/list も候補に追加
|
|
110
|
+
$ pfscan record dry-run --session abc123 --include-capabilities
|
|
111
|
+
|
|
112
|
+
記録候補:
|
|
113
|
+
[0] tools/list (2025-12-28 11:59:55) ← 1回のみ
|
|
114
|
+
[1] tools/call: read_file (2025-12-28 12:00:00)
|
|
115
|
+
[2] tools/call: write_file (2025-12-28 12:00:05)
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### セキュリティデフォルト
|
|
119
|
+
|
|
120
|
+
安全を優先した設計:
|
|
121
|
+
|
|
122
|
+
| 設定 | デフォルト | 説明 |
|
|
123
|
+
|------|-----------|------|
|
|
124
|
+
| input/output | `digest_only` | 生データではなくハッシュのみ保存 |
|
|
125
|
+
| canonicalize | `sha256` | 正規化後にSHA-256ハッシュ化 |
|
|
126
|
+
|
|
127
|
+
これにより、機密データの漏洩リスクを最小化しながら、操作の証跡を残すことができます。
|
|
128
|
+
|
|
129
|
+
## 主要コマンド
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
共通コマンド:
|
|
133
|
+
view, v 最近のイベントタイムラインを表示(デフォルト)
|
|
134
|
+
tree, t connector → session → rpc の構造を表示
|
|
135
|
+
explore, e インタラクティブなデータブラウザ
|
|
136
|
+
scan, s 新しいスキャンを実行
|
|
137
|
+
status, st システム状態を表示
|
|
138
|
+
rpc RPC呼び出しの詳細を表示
|
|
139
|
+
|
|
140
|
+
管理:
|
|
141
|
+
archive, a 古いデータのアーカイブと削除
|
|
142
|
+
config, c 設定管理
|
|
143
|
+
connectors コネクタ管理
|
|
144
|
+
|
|
145
|
+
ショートカット:
|
|
146
|
+
v=view t=tree e=explore s=scan st=status a=archive c=config
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## 設定ファイルの場所
|
|
150
|
+
|
|
151
|
+
OSごとの標準的な場所に保存されます:
|
|
152
|
+
|
|
153
|
+
- **Windows**: `%APPDATA%\proofscan\config.json`
|
|
154
|
+
- **macOS**: `~/Library/Application Support/proofscan/config.json`
|
|
155
|
+
- **Linux**: `~/.config/proofscan/config.json`
|
|
156
|
+
|
|
157
|
+
## グローバルオプション
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
-c, --config <path> 設定ファイルのパス
|
|
161
|
+
--json JSON形式で出力
|
|
162
|
+
-v, --verbose 詳細出力
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## ライセンス
|
|
166
|
+
|
|
167
|
+
MIT
|
package/README.md
CHANGED
package/dist/cli.js
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
import { Command } from 'commander';
|
|
21
21
|
import { resolveConfigPath } from './utils/config-path.js';
|
|
22
22
|
import { setOutputOptions } from './utils/output.js';
|
|
23
|
-
import { createConfigCommand, createConnectorsCommand, createScanCommand, createMonitorCommand, createSessionsCommand, createArchiveCommand, createViewCommand, createTreeCommand, createExploreCommand, createStatusCommand, createEventsCommand, createRpcCommand, } from './commands/index.js';
|
|
23
|
+
import { createConfigCommand, createConnectorsCommand, createScanCommand, createMonitorCommand, createSessionsCommand, createArchiveCommand, createViewCommand, createTreeCommand, createExploreCommand, createStatusCommand, createEventsCommand, createRpcCommand, createSummaryCommand, } from './commands/index.js';
|
|
24
24
|
const program = new Command();
|
|
25
25
|
// Global state for config path
|
|
26
26
|
let globalConfigPath;
|
|
@@ -39,6 +39,7 @@ Common Commands:
|
|
|
39
39
|
scan, s Run a new scan
|
|
40
40
|
status, st Show system status
|
|
41
41
|
rpc View RPC call details (list, show)
|
|
42
|
+
summary Show session summary (Phase 3)
|
|
42
43
|
|
|
43
44
|
Management:
|
|
44
45
|
archive, a Archive and prune old data
|
|
@@ -138,6 +139,8 @@ program.addCommand(createMonitorCommand(getConfigPath));
|
|
|
138
139
|
program.addCommand(createEventsCommand(getConfigPath));
|
|
139
140
|
// rpc (Phase 2.2: rpc list, rpc show)
|
|
140
141
|
program.addCommand(createRpcCommand(getConfigPath));
|
|
142
|
+
// summary (Phase 3: capabilities, tool calls, concerns)
|
|
143
|
+
program.addCommand(createSummaryCommand(getConfigPath));
|
|
141
144
|
// ============================================================
|
|
142
145
|
// Default action: pfscan → pfscan view
|
|
143
146
|
// ============================================================
|
|
@@ -150,7 +153,7 @@ function hasSubcommand() {
|
|
|
150
153
|
const knownCommands = new Set([
|
|
151
154
|
'view', 'v', 'tree', 't', 'explore', 'e', 'status', 'st',
|
|
152
155
|
'scan', 's', 'archive', 'a', 'config', 'c',
|
|
153
|
-
'connectors', 'sessions', 'monitor', 'events', 'rpc', 'help'
|
|
156
|
+
'connectors', 'sessions', 'monitor', 'events', 'rpc', 'summary', 'help'
|
|
154
157
|
]);
|
|
155
158
|
for (let i = 2; i < process.argv.length; i++) {
|
|
156
159
|
const arg = process.argv[i];
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAG7B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAG5B,cAAc,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAG7B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAG5B,cAAc,UAAU,CAAC;AAGzB,cAAc,cAAc,CAAC"}
|
package/dist/commands/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAE7B,yBAAyB;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAE5B,yBAAyB;AACzB,cAAc,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAE7B,yBAAyB;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAE5B,yBAAyB;AACzB,cAAc,UAAU,CAAC;AAEzB,uBAAuB;AACvB,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Summary command - Phase 3
|
|
3
|
+
*
|
|
4
|
+
* pfscan summary [--session <sid>] [--latest] [--connector <id>]
|
|
5
|
+
*
|
|
6
|
+
* Shows:
|
|
7
|
+
* - できること(capability): tools from tools/list
|
|
8
|
+
* - やったこと(tool call): tools/call invocations
|
|
9
|
+
* - 注意点: security concerns (max 3 lines)
|
|
10
|
+
*
|
|
11
|
+
* Categories:
|
|
12
|
+
* - 読み取り (read)
|
|
13
|
+
* - 書き込み (write)
|
|
14
|
+
* - ネット接続 (network)
|
|
15
|
+
* - コマンド実行 (exec)
|
|
16
|
+
* - その他操作 (other)
|
|
17
|
+
*/
|
|
18
|
+
import { Command } from 'commander';
|
|
19
|
+
/** Operation category */
|
|
20
|
+
export type OperationCategory = 'read' | 'write' | 'network' | 'exec' | 'other';
|
|
21
|
+
/** Tool info extracted from tools/list response */
|
|
22
|
+
export interface ToolInfo {
|
|
23
|
+
name: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
category: OperationCategory;
|
|
26
|
+
}
|
|
27
|
+
/** Tool call record */
|
|
28
|
+
export interface ToolCallRecord {
|
|
29
|
+
name: string;
|
|
30
|
+
count: number;
|
|
31
|
+
category: OperationCategory;
|
|
32
|
+
}
|
|
33
|
+
/** Summary data structure */
|
|
34
|
+
export interface SummaryData {
|
|
35
|
+
schema_version: string;
|
|
36
|
+
session_id: string;
|
|
37
|
+
connector_id: string;
|
|
38
|
+
resolved_by: 'option' | 'latest' | 'current';
|
|
39
|
+
/** Capabilities from tools/list */
|
|
40
|
+
capabilities: {
|
|
41
|
+
tools: ToolInfo[];
|
|
42
|
+
by_category: Record<OperationCategory, string[]>;
|
|
43
|
+
};
|
|
44
|
+
/** Tool calls from tools/call */
|
|
45
|
+
tool_calls: {
|
|
46
|
+
records: ToolCallRecord[];
|
|
47
|
+
by_category: Record<OperationCategory, {
|
|
48
|
+
name: string;
|
|
49
|
+
count: number;
|
|
50
|
+
}[]>;
|
|
51
|
+
total_count: number;
|
|
52
|
+
};
|
|
53
|
+
/** Security concerns (max 3) */
|
|
54
|
+
concerns: string[];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Classify a tool into a category based on name and description
|
|
58
|
+
*/
|
|
59
|
+
export declare function classifyTool(name: string, description?: string): OperationCategory;
|
|
60
|
+
export declare function createSummaryCommand(getConfigPath: () => string): Command;
|
|
61
|
+
//# sourceMappingURL=summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/commands/summary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,yBAAyB;AACzB,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAWhF,mDAAmD;AACnD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED,uBAAuB;AACvB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED,6BAA6B;AAC7B,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAE7C,mCAAmC;IACnC,YAAY,EAAE;QACZ,KAAK,EAAE,QAAQ,EAAE,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC,CAAC;KAClD,CAAC;IAEF,iCAAiC;IACjC,UAAU,EAAE;QACV,OAAO,EAAE,cAAc,EAAE,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC,iBAAiB,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC,CAAC;QAC1E,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,gCAAgC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAyED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAwBlF;AAwRD,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,MAAM,GAAG,OAAO,CAkDzE"}
|
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Summary command - Phase 3
|
|
3
|
+
*
|
|
4
|
+
* pfscan summary [--session <sid>] [--latest] [--connector <id>]
|
|
5
|
+
*
|
|
6
|
+
* Shows:
|
|
7
|
+
* - できること(capability): tools from tools/list
|
|
8
|
+
* - やったこと(tool call): tools/call invocations
|
|
9
|
+
* - 注意点: security concerns (max 3 lines)
|
|
10
|
+
*
|
|
11
|
+
* Categories:
|
|
12
|
+
* - 読み取り (read)
|
|
13
|
+
* - 書き込み (write)
|
|
14
|
+
* - ネット接続 (network)
|
|
15
|
+
* - コマンド実行 (exec)
|
|
16
|
+
* - その他操作 (other)
|
|
17
|
+
*/
|
|
18
|
+
import { Command } from 'commander';
|
|
19
|
+
import { ConfigManager } from '../config/index.js';
|
|
20
|
+
import { getEventsDb } from '../db/connection.js';
|
|
21
|
+
import { output, getOutputOptions } from '../utils/output.js';
|
|
22
|
+
import { resolveSession, isSessionError, formatSessionError, } from '../utils/session-resolver.js';
|
|
23
|
+
import { shortenId } from '../eventline/types.js';
|
|
24
|
+
/** Japanese labels for categories */
|
|
25
|
+
const CATEGORY_LABELS = {
|
|
26
|
+
read: '読み取り (read)',
|
|
27
|
+
write: '書き込み (write)',
|
|
28
|
+
network: 'ネット接続 (network)',
|
|
29
|
+
exec: 'コマンド実行 (exec)',
|
|
30
|
+
other: 'その他操作 (other)',
|
|
31
|
+
};
|
|
32
|
+
// ============================================================
|
|
33
|
+
// Category Classification
|
|
34
|
+
// ============================================================
|
|
35
|
+
/** Keywords for category classification */
|
|
36
|
+
const CATEGORY_KEYWORDS = {
|
|
37
|
+
read: [
|
|
38
|
+
/read/i,
|
|
39
|
+
/get/i,
|
|
40
|
+
/list/i,
|
|
41
|
+
/search/i,
|
|
42
|
+
/query/i,
|
|
43
|
+
/fetch/i,
|
|
44
|
+
/find/i,
|
|
45
|
+
/show/i,
|
|
46
|
+
/view/i,
|
|
47
|
+
/cat/i,
|
|
48
|
+
/head/i,
|
|
49
|
+
/tail/i,
|
|
50
|
+
/ls/i,
|
|
51
|
+
/dir/i,
|
|
52
|
+
],
|
|
53
|
+
write: [
|
|
54
|
+
/write/i,
|
|
55
|
+
/create/i,
|
|
56
|
+
/update/i,
|
|
57
|
+
/delete/i,
|
|
58
|
+
/remove/i,
|
|
59
|
+
/edit/i,
|
|
60
|
+
/modify/i,
|
|
61
|
+
/set/i,
|
|
62
|
+
/put/i,
|
|
63
|
+
/post/i,
|
|
64
|
+
/save/i,
|
|
65
|
+
/mkdir/i,
|
|
66
|
+
/touch/i,
|
|
67
|
+
/mv/i,
|
|
68
|
+
/cp/i,
|
|
69
|
+
/rm/i,
|
|
70
|
+
],
|
|
71
|
+
network: [
|
|
72
|
+
/http/i,
|
|
73
|
+
/https/i,
|
|
74
|
+
/fetch/i,
|
|
75
|
+
/request/i,
|
|
76
|
+
/api/i,
|
|
77
|
+
/url/i,
|
|
78
|
+
/web/i,
|
|
79
|
+
/net/i,
|
|
80
|
+
/socket/i,
|
|
81
|
+
/connect/i,
|
|
82
|
+
/download/i,
|
|
83
|
+
/upload/i,
|
|
84
|
+
/curl/i,
|
|
85
|
+
/wget/i,
|
|
86
|
+
],
|
|
87
|
+
exec: [
|
|
88
|
+
/exec/i,
|
|
89
|
+
/run/i,
|
|
90
|
+
/shell/i,
|
|
91
|
+
/bash/i,
|
|
92
|
+
/cmd/i,
|
|
93
|
+
/command/i,
|
|
94
|
+
/spawn/i,
|
|
95
|
+
/process/i,
|
|
96
|
+
/script/i,
|
|
97
|
+
/terminal/i,
|
|
98
|
+
],
|
|
99
|
+
other: [],
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Classify a tool into a category based on name and description
|
|
103
|
+
*/
|
|
104
|
+
export function classifyTool(name, description) {
|
|
105
|
+
const text = `${name} ${description || ''}`.toLowerCase();
|
|
106
|
+
// Check exec first (highest risk)
|
|
107
|
+
for (const pattern of CATEGORY_KEYWORDS.exec) {
|
|
108
|
+
if (pattern.test(text))
|
|
109
|
+
return 'exec';
|
|
110
|
+
}
|
|
111
|
+
// Check network
|
|
112
|
+
for (const pattern of CATEGORY_KEYWORDS.network) {
|
|
113
|
+
if (pattern.test(text))
|
|
114
|
+
return 'network';
|
|
115
|
+
}
|
|
116
|
+
// Check write
|
|
117
|
+
for (const pattern of CATEGORY_KEYWORDS.write) {
|
|
118
|
+
if (pattern.test(text))
|
|
119
|
+
return 'write';
|
|
120
|
+
}
|
|
121
|
+
// Check read
|
|
122
|
+
for (const pattern of CATEGORY_KEYWORDS.read) {
|
|
123
|
+
if (pattern.test(text))
|
|
124
|
+
return 'read';
|
|
125
|
+
}
|
|
126
|
+
return 'other';
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Extract tools from tools/list response
|
|
130
|
+
*/
|
|
131
|
+
function extractToolsFromSession(configDir, sessionId) {
|
|
132
|
+
const db = getEventsDb(configDir);
|
|
133
|
+
// Find tools/list response
|
|
134
|
+
const toolsListRpc = db.prepare(`
|
|
135
|
+
SELECT rpc_id FROM rpc_calls
|
|
136
|
+
WHERE session_id = ? AND method = 'tools/list'
|
|
137
|
+
ORDER BY request_ts ASC
|
|
138
|
+
LIMIT 1
|
|
139
|
+
`).get(sessionId);
|
|
140
|
+
if (!toolsListRpc) {
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
// Get the response event
|
|
144
|
+
const responseEvent = db.prepare(`
|
|
145
|
+
SELECT raw_json FROM events
|
|
146
|
+
WHERE session_id = ? AND rpc_id = ? AND kind = 'response'
|
|
147
|
+
LIMIT 1
|
|
148
|
+
`).get(sessionId, toolsListRpc.rpc_id);
|
|
149
|
+
if (!responseEvent?.raw_json) {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
const response = JSON.parse(responseEvent.raw_json);
|
|
154
|
+
const result = response.result;
|
|
155
|
+
if (!result?.tools || !Array.isArray(result.tools)) {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
return result.tools.map(tool => ({
|
|
159
|
+
name: tool.name,
|
|
160
|
+
description: tool.description,
|
|
161
|
+
category: classifyTool(tool.name, tool.description),
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return [];
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Extract tool calls from tools/call requests
|
|
170
|
+
*/
|
|
171
|
+
function extractToolCalls(configDir, sessionId) {
|
|
172
|
+
const db = getEventsDb(configDir);
|
|
173
|
+
// Find all tools/call requests
|
|
174
|
+
const toolCalls = db.prepare(`
|
|
175
|
+
SELECT rc.rpc_id, e.raw_json
|
|
176
|
+
FROM rpc_calls rc
|
|
177
|
+
JOIN events e ON rc.session_id = e.session_id AND rc.rpc_id = e.rpc_id
|
|
178
|
+
WHERE rc.session_id = ? AND rc.method = 'tools/call' AND e.kind = 'request'
|
|
179
|
+
`).all(sessionId);
|
|
180
|
+
// Count by tool name
|
|
181
|
+
const counts = new Map();
|
|
182
|
+
for (const call of toolCalls) {
|
|
183
|
+
if (!call.raw_json)
|
|
184
|
+
continue;
|
|
185
|
+
try {
|
|
186
|
+
const request = JSON.parse(call.raw_json);
|
|
187
|
+
const params = request.params;
|
|
188
|
+
const toolName = params?.name || 'unknown';
|
|
189
|
+
counts.set(toolName, (counts.get(toolName) || 0) + 1);
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// Ignore parse errors
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Convert to records
|
|
196
|
+
return Array.from(counts.entries()).map(([name, count]) => ({
|
|
197
|
+
name,
|
|
198
|
+
count,
|
|
199
|
+
category: classifyTool(name),
|
|
200
|
+
}));
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Generate concerns based on capabilities and tool calls
|
|
204
|
+
*/
|
|
205
|
+
function generateConcerns(capabilities, toolCalls) {
|
|
206
|
+
const concerns = [];
|
|
207
|
+
// Check for exec capability
|
|
208
|
+
const hasExecCapability = capabilities.some(t => t.category === 'exec');
|
|
209
|
+
const hasExecCall = toolCalls.some(t => t.category === 'exec');
|
|
210
|
+
if (hasExecCall) {
|
|
211
|
+
concerns.push('コマンド実行が行われました');
|
|
212
|
+
}
|
|
213
|
+
else if (hasExecCapability) {
|
|
214
|
+
concerns.push('コマンド実行可能');
|
|
215
|
+
}
|
|
216
|
+
// Check for write
|
|
217
|
+
const hasWriteCall = toolCalls.some(t => t.category === 'write');
|
|
218
|
+
if (hasWriteCall) {
|
|
219
|
+
concerns.push('書き込み操作あり');
|
|
220
|
+
}
|
|
221
|
+
// Check for network
|
|
222
|
+
const hasNetworkCall = toolCalls.some(t => t.category === 'network');
|
|
223
|
+
if (hasNetworkCall) {
|
|
224
|
+
concerns.push('外部ネットワーク接続あり');
|
|
225
|
+
}
|
|
226
|
+
// Limit to 3 concerns
|
|
227
|
+
return concerns.slice(0, 3);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Group items by category
|
|
231
|
+
*/
|
|
232
|
+
function groupByCategory(items) {
|
|
233
|
+
const result = {
|
|
234
|
+
read: [],
|
|
235
|
+
write: [],
|
|
236
|
+
network: [],
|
|
237
|
+
exec: [],
|
|
238
|
+
other: [],
|
|
239
|
+
};
|
|
240
|
+
for (const item of items) {
|
|
241
|
+
result[item.category].push(item);
|
|
242
|
+
}
|
|
243
|
+
return result;
|
|
244
|
+
}
|
|
245
|
+
// ============================================================
|
|
246
|
+
// Summary Generation
|
|
247
|
+
// ============================================================
|
|
248
|
+
/**
|
|
249
|
+
* Generate summary data for a session
|
|
250
|
+
*/
|
|
251
|
+
function generateSummary(configDir, sessionId, connectorId, resolvedBy) {
|
|
252
|
+
const capabilities = extractToolsFromSession(configDir, sessionId);
|
|
253
|
+
const toolCalls = extractToolCalls(configDir, sessionId);
|
|
254
|
+
const concerns = generateConcerns(capabilities, toolCalls);
|
|
255
|
+
// Group capabilities by category
|
|
256
|
+
const capabilitiesByCategory = groupByCategory(capabilities);
|
|
257
|
+
const capabilitiesSimple = {
|
|
258
|
+
read: capabilitiesByCategory.read.map(t => t.name),
|
|
259
|
+
write: capabilitiesByCategory.write.map(t => t.name),
|
|
260
|
+
network: capabilitiesByCategory.network.map(t => t.name),
|
|
261
|
+
exec: capabilitiesByCategory.exec.map(t => t.name),
|
|
262
|
+
other: capabilitiesByCategory.other.map(t => t.name),
|
|
263
|
+
};
|
|
264
|
+
// Group tool calls by category
|
|
265
|
+
const toolCallsByCategory = groupByCategory(toolCalls);
|
|
266
|
+
const toolCallsSimple = {
|
|
267
|
+
read: toolCallsByCategory.read.map(t => ({ name: t.name, count: t.count })),
|
|
268
|
+
write: toolCallsByCategory.write.map(t => ({ name: t.name, count: t.count })),
|
|
269
|
+
network: toolCallsByCategory.network.map(t => ({ name: t.name, count: t.count })),
|
|
270
|
+
exec: toolCallsByCategory.exec.map(t => ({ name: t.name, count: t.count })),
|
|
271
|
+
other: toolCallsByCategory.other.map(t => ({ name: t.name, count: t.count })),
|
|
272
|
+
};
|
|
273
|
+
return {
|
|
274
|
+
schema_version: 'phase3.summary.v1',
|
|
275
|
+
session_id: sessionId,
|
|
276
|
+
connector_id: connectorId,
|
|
277
|
+
resolved_by: resolvedBy,
|
|
278
|
+
capabilities: {
|
|
279
|
+
tools: capabilities,
|
|
280
|
+
by_category: capabilitiesSimple,
|
|
281
|
+
},
|
|
282
|
+
tool_calls: {
|
|
283
|
+
records: toolCalls,
|
|
284
|
+
by_category: toolCallsSimple,
|
|
285
|
+
total_count: toolCalls.reduce((sum, t) => sum + t.count, 0),
|
|
286
|
+
},
|
|
287
|
+
concerns,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
// ============================================================
|
|
291
|
+
// Rendering
|
|
292
|
+
// ============================================================
|
|
293
|
+
/**
|
|
294
|
+
* Render summary to terminal
|
|
295
|
+
*/
|
|
296
|
+
function renderSummary(data) {
|
|
297
|
+
console.log(`${data.connector_id} (session: ${shortenId(data.session_id, 8)}...)`);
|
|
298
|
+
console.log();
|
|
299
|
+
// できること (capabilities)
|
|
300
|
+
console.log('├── できること(capability):');
|
|
301
|
+
const capabilityNames = data.capabilities.tools.map(t => t.name);
|
|
302
|
+
if (capabilityNames.length > 0) {
|
|
303
|
+
// Show up to 5 tools, then "..." if more
|
|
304
|
+
const shown = capabilityNames.slice(0, 5);
|
|
305
|
+
const extra = capabilityNames.length - shown.length;
|
|
306
|
+
const suffix = extra > 0 ? ` (+${extra} more)` : '';
|
|
307
|
+
console.log(`│ ${shown.join(', ')}${suffix}`);
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
console.log('│ (なし)');
|
|
311
|
+
}
|
|
312
|
+
// Show by category if verbose or many tools
|
|
313
|
+
if (data.capabilities.tools.length > 3) {
|
|
314
|
+
for (const [cat, label] of Object.entries(CATEGORY_LABELS)) {
|
|
315
|
+
const tools = data.capabilities.by_category[cat];
|
|
316
|
+
if (tools.length > 0) {
|
|
317
|
+
console.log(`│ - ${label}: ${tools.join(', ')}`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// やったこと (tool calls)
|
|
322
|
+
console.log('├── やったこと(tool call):');
|
|
323
|
+
if (data.tool_calls.total_count > 0) {
|
|
324
|
+
const callStrings = data.tool_calls.records.map(t => t.count > 1 ? `${t.name} (${t.count}回)` : t.name);
|
|
325
|
+
// Show up to 5 calls, then "..." if more
|
|
326
|
+
const shown = callStrings.slice(0, 5);
|
|
327
|
+
const extra = callStrings.length - shown.length;
|
|
328
|
+
const suffix = extra > 0 ? ` (+${extra} more)` : '';
|
|
329
|
+
console.log(`│ ${shown.join(', ')}${suffix}`);
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
console.log('│ (なし)');
|
|
333
|
+
}
|
|
334
|
+
// 注意点 (concerns)
|
|
335
|
+
if (data.concerns.length > 0) {
|
|
336
|
+
console.log('└── 注意点:');
|
|
337
|
+
for (let i = 0; i < data.concerns.length; i++) {
|
|
338
|
+
const prefix = i === data.concerns.length - 1 ? ' ' : '│ ';
|
|
339
|
+
console.log(`${prefix}⚠ ${data.concerns[i]}`);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
console.log('└── 注意点: (なし)');
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// ============================================================
|
|
347
|
+
// Command
|
|
348
|
+
// ============================================================
|
|
349
|
+
export function createSummaryCommand(getConfigPath) {
|
|
350
|
+
const cmd = new Command('summary')
|
|
351
|
+
.description('Show session summary with capabilities and tool calls')
|
|
352
|
+
.option('--session <id>', 'Session ID (partial match supported)')
|
|
353
|
+
.option('--latest', 'Use the latest session')
|
|
354
|
+
.option('--connector <id>', 'Filter by connector (with --latest)')
|
|
355
|
+
.action(async (options) => {
|
|
356
|
+
try {
|
|
357
|
+
const manager = new ConfigManager(getConfigPath());
|
|
358
|
+
const configDir = manager.getConfigDir();
|
|
359
|
+
// Resolve session
|
|
360
|
+
const result = resolveSession({
|
|
361
|
+
sessionId: options.session,
|
|
362
|
+
latest: options.latest,
|
|
363
|
+
connectorId: options.connector,
|
|
364
|
+
configDir,
|
|
365
|
+
});
|
|
366
|
+
if (isSessionError(result)) {
|
|
367
|
+
console.error(formatSessionError(result));
|
|
368
|
+
process.exit(1);
|
|
369
|
+
}
|
|
370
|
+
// Generate summary
|
|
371
|
+
const summary = generateSummary(configDir, result.sessionId, result.connectorId, result.resolvedBy);
|
|
372
|
+
if (getOutputOptions().json) {
|
|
373
|
+
output(summary);
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
renderSummary(summary);
|
|
377
|
+
}
|
|
378
|
+
catch (error) {
|
|
379
|
+
if (error instanceof Error && error.message.includes('no such table')) {
|
|
380
|
+
console.log('No data yet. Run a scan first:');
|
|
381
|
+
console.log(' pfscan scan start --id <connector>');
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
throw error;
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
return cmd;
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/commands/summary.ts"],"names":[],"mappings":"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"}
|