proofscan 0.5.5 → 0.5.6
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/cli.js +4 -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 +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/record.d.ts +88 -0
- package/dist/commands/record.d.ts.map +1 -0
- package/dist/commands/record.js +394 -0
- package/dist/commands/record.js.map +1 -0
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -25,7 +25,7 @@ import { setOutputOptions } from './utils/output.js';
|
|
|
25
25
|
const require = createRequire(import.meta.url);
|
|
26
26
|
const packageJson = require('../package.json');
|
|
27
27
|
const VERSION = packageJson.version;
|
|
28
|
-
import { createConfigCommand, createConnectorsCommand, createScanCommand, createMonitorCommand, createSessionsCommand, createArchiveCommand, createViewCommand, createTreeCommand, createExploreCommand, createStatusCommand, createEventsCommand, createRpcCommand, createSummaryCommand, createPermissionsCommand, } from './commands/index.js';
|
|
28
|
+
import { createConfigCommand, createConnectorsCommand, createScanCommand, createMonitorCommand, createSessionsCommand, createArchiveCommand, createViewCommand, createTreeCommand, createExploreCommand, createStatusCommand, createEventsCommand, createRpcCommand, createSummaryCommand, createPermissionsCommand, createRecordCommand, } from './commands/index.js';
|
|
29
29
|
const program = new Command();
|
|
30
30
|
// Global state for config path
|
|
31
31
|
let globalConfigPath;
|
|
@@ -149,6 +149,8 @@ program.addCommand(createRpcCommand(getConfigPath));
|
|
|
149
149
|
program.addCommand(createSummaryCommand(getConfigPath));
|
|
150
150
|
// permissions (Phase 3: detailed permission stats)
|
|
151
151
|
program.addCommand(createPermissionsCommand(getConfigPath));
|
|
152
|
+
// record (Phase 3: record dry-run)
|
|
153
|
+
program.addCommand(createRecordCommand(getConfigPath));
|
|
152
154
|
// ============================================================
|
|
153
155
|
// Default action: pfscan → pfscan view
|
|
154
156
|
// ============================================================
|
|
@@ -161,7 +163,7 @@ function hasSubcommand() {
|
|
|
161
163
|
const knownCommands = new Set([
|
|
162
164
|
'view', 'v', 'tree', 't', 'explore', 'e', 'status', 'st',
|
|
163
165
|
'scan', 's', 'archive', 'a', 'config', 'c',
|
|
164
|
-
'connectors', 'sessions', 'monitor', 'events', 'rpc', 'summary', 'permissions', 'help'
|
|
166
|
+
'connectors', 'sessions', 'monitor', 'events', 'rpc', 'summary', 'permissions', 'record', 'help'
|
|
165
167
|
]);
|
|
166
168
|
for (let i = 2; i < process.argv.length; i++) {
|
|
167
169
|
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,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,iCAAiC;AACjC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAC/C,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;AACpC,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,EAChB,oBAAoB,EACpB,wBAAwB,
|
|
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;AAGzB,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,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;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,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;AAEzB,uBAAuB;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,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;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Record command - Phase 3
|
|
3
|
+
*
|
|
4
|
+
* pfscan record dry-run [connector]
|
|
5
|
+
*
|
|
6
|
+
* Produces "inscribe candidates" from recorded RPCs without actually inscribing.
|
|
7
|
+
* Default: select only tool calls (tools/call).
|
|
8
|
+
* Security default: digest_only (do not emit raw input/output).
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
import { OperationCategory } from './summary.js';
|
|
12
|
+
/** Note attached to a candidate */
|
|
13
|
+
export interface CandidateNote {
|
|
14
|
+
code: string;
|
|
15
|
+
severity: 'info' | 'warning' | 'error';
|
|
16
|
+
message: string;
|
|
17
|
+
}
|
|
18
|
+
/** Source info for a candidate */
|
|
19
|
+
export interface CandidateSource {
|
|
20
|
+
rpc_id: string;
|
|
21
|
+
method: string;
|
|
22
|
+
tool?: string;
|
|
23
|
+
}
|
|
24
|
+
/** Payload for tool_call candidate (digest_only mode) */
|
|
25
|
+
export interface ToolCallPayload {
|
|
26
|
+
tool: string;
|
|
27
|
+
result: 'success' | 'error';
|
|
28
|
+
input_digest: string | null;
|
|
29
|
+
output_digest: string | null;
|
|
30
|
+
}
|
|
31
|
+
/** Payload for capability_catalog candidate */
|
|
32
|
+
export interface CapabilityCatalogPayload {
|
|
33
|
+
tool_count: number;
|
|
34
|
+
tools: string[];
|
|
35
|
+
}
|
|
36
|
+
/** Timing info */
|
|
37
|
+
export interface CandidateTiming {
|
|
38
|
+
started_at: string;
|
|
39
|
+
duration_ms: number | null;
|
|
40
|
+
}
|
|
41
|
+
/** Single candidate */
|
|
42
|
+
export interface Candidate {
|
|
43
|
+
id: string;
|
|
44
|
+
type: 'tool_call' | 'capability_catalog';
|
|
45
|
+
importance: number;
|
|
46
|
+
category: OperationCategory;
|
|
47
|
+
source: CandidateSource;
|
|
48
|
+
payload: ToolCallPayload | CapabilityCatalogPayload;
|
|
49
|
+
digests: {
|
|
50
|
+
payload_digest: string;
|
|
51
|
+
};
|
|
52
|
+
notes: CandidateNote[];
|
|
53
|
+
timing?: CandidateTiming;
|
|
54
|
+
}
|
|
55
|
+
/** Dry-run output structure */
|
|
56
|
+
export interface DryRunData {
|
|
57
|
+
schema_version: string;
|
|
58
|
+
options: {
|
|
59
|
+
include_capabilities: boolean;
|
|
60
|
+
redaction_mode: 'digest_only';
|
|
61
|
+
};
|
|
62
|
+
session: {
|
|
63
|
+
id: string;
|
|
64
|
+
connector_id: string;
|
|
65
|
+
resolved_by: 'option' | 'latest' | 'current';
|
|
66
|
+
};
|
|
67
|
+
candidates: Candidate[];
|
|
68
|
+
summary: {
|
|
69
|
+
candidate_count: number;
|
|
70
|
+
importance_max: number;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Canonicalize JSON: stable key ordering, no whitespace
|
|
75
|
+
*/
|
|
76
|
+
export declare function canonicalizeJson(value: unknown): string;
|
|
77
|
+
/**
|
|
78
|
+
* Compute SHA256 hex digest of canonicalized JSON
|
|
79
|
+
*/
|
|
80
|
+
export declare function computeDigest(value: unknown): string;
|
|
81
|
+
/**
|
|
82
|
+
* Calculate importance score for a tool call
|
|
83
|
+
* Base 80, adjust by category: exec +30, network +15, write +15, read +0, other +5
|
|
84
|
+
* Error result +10
|
|
85
|
+
*/
|
|
86
|
+
export declare function calculateImportance(category: OperationCategory, isError: boolean): number;
|
|
87
|
+
export declare function createRecordCommand(getConfigPath: () => string): Command;
|
|
88
|
+
//# sourceMappingURL=record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/commands/record.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,OAAO,EAAgB,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAM/D,mCAAmC;AACnC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,yDAAyD;AACzD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,+CAA+C;AAC/C,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,kBAAkB;AAClB,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,uBAAuB;AACvB,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,GAAG,oBAAoB,CAAC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,eAAe,GAAG,wBAAwB,CAAC;IACpD,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,+BAA+B;AAC/B,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE;QACP,oBAAoB,EAAE,OAAO,CAAC;QAC9B,cAAc,EAAE,aAAa,CAAC;KAC/B,CAAC;IACF,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;KAC9C,CAAC;IACF,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,OAAO,EAAE;QACP,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CA6BvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGpD;AAMD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,OAAO,GACf,MAAM,CAgBR;AAwVD,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,MAAM,GAAG,OAAO,CAqExE"}
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Record command - Phase 3
|
|
3
|
+
*
|
|
4
|
+
* pfscan record dry-run [connector]
|
|
5
|
+
*
|
|
6
|
+
* Produces "inscribe candidates" from recorded RPCs without actually inscribing.
|
|
7
|
+
* Default: select only tool calls (tools/call).
|
|
8
|
+
* Security default: digest_only (do not emit raw input/output).
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
import { createHash } from 'crypto';
|
|
12
|
+
import { ConfigManager } from '../config/index.js';
|
|
13
|
+
import { getEventsDb } from '../db/connection.js';
|
|
14
|
+
import { output, getOutputOptions } from '../utils/output.js';
|
|
15
|
+
import { resolveSession, isSessionError, formatSessionError, } from '../utils/session-resolver.js';
|
|
16
|
+
import { shortenId } from '../eventline/types.js';
|
|
17
|
+
import { classifyTool } from './summary.js';
|
|
18
|
+
// ============================================================
|
|
19
|
+
// Digest Computation
|
|
20
|
+
// ============================================================
|
|
21
|
+
/**
|
|
22
|
+
* Canonicalize JSON: stable key ordering, no whitespace
|
|
23
|
+
*/
|
|
24
|
+
export function canonicalizeJson(value) {
|
|
25
|
+
if (value === null || value === undefined) {
|
|
26
|
+
return 'null';
|
|
27
|
+
}
|
|
28
|
+
if (typeof value === 'string') {
|
|
29
|
+
return JSON.stringify(value);
|
|
30
|
+
}
|
|
31
|
+
if (typeof value === 'number' || typeof value === 'boolean') {
|
|
32
|
+
return String(value);
|
|
33
|
+
}
|
|
34
|
+
if (Array.isArray(value)) {
|
|
35
|
+
const items = value.map(item => canonicalizeJson(item));
|
|
36
|
+
return '[' + items.join(',') + ']';
|
|
37
|
+
}
|
|
38
|
+
if (typeof value === 'object') {
|
|
39
|
+
const keys = Object.keys(value).sort();
|
|
40
|
+
const pairs = keys.map(key => {
|
|
41
|
+
const k = JSON.stringify(key);
|
|
42
|
+
const v = canonicalizeJson(value[key]);
|
|
43
|
+
return k + ':' + v;
|
|
44
|
+
});
|
|
45
|
+
return '{' + pairs.join(',') + '}';
|
|
46
|
+
}
|
|
47
|
+
return 'null';
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Compute SHA256 hex digest of canonicalized JSON
|
|
51
|
+
*/
|
|
52
|
+
export function computeDigest(value) {
|
|
53
|
+
const canonical = canonicalizeJson(value);
|
|
54
|
+
return createHash('sha256').update(canonical).digest('hex');
|
|
55
|
+
}
|
|
56
|
+
// ============================================================
|
|
57
|
+
// Importance Scoring
|
|
58
|
+
// ============================================================
|
|
59
|
+
/**
|
|
60
|
+
* Calculate importance score for a tool call
|
|
61
|
+
* Base 80, adjust by category: exec +30, network +15, write +15, read +0, other +5
|
|
62
|
+
* Error result +10
|
|
63
|
+
*/
|
|
64
|
+
export function calculateImportance(category, isError) {
|
|
65
|
+
const BASE = 80;
|
|
66
|
+
const categoryBonus = {
|
|
67
|
+
exec: 30,
|
|
68
|
+
network: 15,
|
|
69
|
+
write: 15,
|
|
70
|
+
read: 0,
|
|
71
|
+
other: 5,
|
|
72
|
+
};
|
|
73
|
+
let score = BASE + categoryBonus[category];
|
|
74
|
+
if (isError) {
|
|
75
|
+
score += 10;
|
|
76
|
+
}
|
|
77
|
+
return score;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Extract tool call candidates from session
|
|
81
|
+
*/
|
|
82
|
+
function extractToolCallCandidates(configDir, sessionId) {
|
|
83
|
+
const db = getEventsDb(configDir);
|
|
84
|
+
const candidates = [];
|
|
85
|
+
// Find all tools/call RPCs
|
|
86
|
+
const toolCalls = db.prepare(`
|
|
87
|
+
SELECT rpc_id, method, request_ts, response_ts
|
|
88
|
+
FROM rpc_calls
|
|
89
|
+
WHERE session_id = ? AND method = 'tools/call'
|
|
90
|
+
ORDER BY request_ts ASC
|
|
91
|
+
`).all(sessionId);
|
|
92
|
+
for (const rpc of toolCalls) {
|
|
93
|
+
// Get request event
|
|
94
|
+
const requestEvent = db.prepare(`
|
|
95
|
+
SELECT raw_json, kind FROM events
|
|
96
|
+
WHERE session_id = ? AND rpc_id = ? AND kind = 'request'
|
|
97
|
+
LIMIT 1
|
|
98
|
+
`).get(sessionId, rpc.rpc_id);
|
|
99
|
+
// Get response event
|
|
100
|
+
const responseEvent = db.prepare(`
|
|
101
|
+
SELECT raw_json, kind FROM events
|
|
102
|
+
WHERE session_id = ? AND rpc_id = ? AND kind = 'response'
|
|
103
|
+
LIMIT 1
|
|
104
|
+
`).get(sessionId, rpc.rpc_id);
|
|
105
|
+
// Parse request to get tool name and input
|
|
106
|
+
let toolName = 'unknown';
|
|
107
|
+
let inputValue = null;
|
|
108
|
+
if (requestEvent?.raw_json) {
|
|
109
|
+
try {
|
|
110
|
+
const request = JSON.parse(requestEvent.raw_json);
|
|
111
|
+
const params = request.params;
|
|
112
|
+
toolName = params?.name || 'unknown';
|
|
113
|
+
inputValue = params?.arguments ?? null;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Ignore parse errors
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Parse response to get output and error status
|
|
120
|
+
let outputValue = null;
|
|
121
|
+
let isError = false;
|
|
122
|
+
if (responseEvent?.raw_json) {
|
|
123
|
+
try {
|
|
124
|
+
const response = JSON.parse(responseEvent.raw_json);
|
|
125
|
+
if (response.error) {
|
|
126
|
+
isError = true;
|
|
127
|
+
outputValue = response.error;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
const result = response.result;
|
|
131
|
+
isError = result?.isError ?? false;
|
|
132
|
+
outputValue = result?.content ?? result ?? null;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// Ignore parse errors
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Classify tool
|
|
140
|
+
const category = classifyTool(toolName);
|
|
141
|
+
// Calculate importance
|
|
142
|
+
const importance = calculateImportance(category, isError);
|
|
143
|
+
// Build payload with digests only
|
|
144
|
+
const payload = {
|
|
145
|
+
tool: toolName,
|
|
146
|
+
result: isError ? 'error' : 'success',
|
|
147
|
+
input_digest: inputValue !== null ? computeDigest(inputValue) : null,
|
|
148
|
+
output_digest: outputValue !== null ? computeDigest(outputValue) : null,
|
|
149
|
+
};
|
|
150
|
+
// Calculate payload digest
|
|
151
|
+
const payloadDigest = computeDigest(payload);
|
|
152
|
+
// Build timing
|
|
153
|
+
const timing = rpc.request_ts ? {
|
|
154
|
+
started_at: rpc.request_ts,
|
|
155
|
+
duration_ms: rpc.response_ts
|
|
156
|
+
? new Date(rpc.response_ts).getTime() - new Date(rpc.request_ts).getTime()
|
|
157
|
+
: null,
|
|
158
|
+
} : undefined;
|
|
159
|
+
// Build candidate
|
|
160
|
+
const candidate = {
|
|
161
|
+
id: `tc-${rpc.rpc_id.slice(0, 8)}`,
|
|
162
|
+
type: 'tool_call',
|
|
163
|
+
importance,
|
|
164
|
+
category,
|
|
165
|
+
source: {
|
|
166
|
+
rpc_id: rpc.rpc_id,
|
|
167
|
+
method: rpc.method,
|
|
168
|
+
tool: toolName,
|
|
169
|
+
},
|
|
170
|
+
payload,
|
|
171
|
+
digests: {
|
|
172
|
+
payload_digest: payloadDigest,
|
|
173
|
+
},
|
|
174
|
+
notes: [],
|
|
175
|
+
timing,
|
|
176
|
+
};
|
|
177
|
+
candidates.push(candidate);
|
|
178
|
+
}
|
|
179
|
+
return candidates;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Extract capability catalog candidate from session (first tools/list)
|
|
183
|
+
*/
|
|
184
|
+
function extractCapabilityCatalog(configDir, sessionId) {
|
|
185
|
+
const db = getEventsDb(configDir);
|
|
186
|
+
// Find first tools/list RPC with a successful response
|
|
187
|
+
const toolsList = db.prepare(`
|
|
188
|
+
SELECT rc.rpc_id, rc.method, rc.request_ts, rc.response_ts
|
|
189
|
+
FROM rpc_calls rc
|
|
190
|
+
JOIN events e ON rc.session_id = e.session_id AND rc.rpc_id = e.rpc_id
|
|
191
|
+
WHERE rc.session_id = ? AND rc.method = 'tools/list' AND e.kind = 'response'
|
|
192
|
+
ORDER BY rc.request_ts ASC
|
|
193
|
+
LIMIT 1
|
|
194
|
+
`).get(sessionId);
|
|
195
|
+
if (!toolsList) {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
// Get response event
|
|
199
|
+
const responseEvent = db.prepare(`
|
|
200
|
+
SELECT raw_json FROM events
|
|
201
|
+
WHERE session_id = ? AND rpc_id = ? AND kind = 'response'
|
|
202
|
+
LIMIT 1
|
|
203
|
+
`).get(sessionId, toolsList.rpc_id);
|
|
204
|
+
if (!responseEvent?.raw_json) {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
let tools = [];
|
|
208
|
+
try {
|
|
209
|
+
const response = JSON.parse(responseEvent.raw_json);
|
|
210
|
+
const result = response.result;
|
|
211
|
+
if (result?.tools && Array.isArray(result.tools)) {
|
|
212
|
+
tools = result.tools.map(t => t.name);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
// Build payload
|
|
219
|
+
const payload = {
|
|
220
|
+
tool_count: tools.length,
|
|
221
|
+
tools,
|
|
222
|
+
};
|
|
223
|
+
// Calculate payload digest
|
|
224
|
+
const payloadDigest = computeDigest(payload);
|
|
225
|
+
// Timing
|
|
226
|
+
const timing = toolsList.request_ts ? {
|
|
227
|
+
started_at: toolsList.request_ts,
|
|
228
|
+
duration_ms: toolsList.response_ts
|
|
229
|
+
? new Date(toolsList.response_ts).getTime() - new Date(toolsList.request_ts).getTime()
|
|
230
|
+
: null,
|
|
231
|
+
} : undefined;
|
|
232
|
+
const candidate = {
|
|
233
|
+
id: `cap-${toolsList.rpc_id.slice(0, 8)}`,
|
|
234
|
+
type: 'capability_catalog',
|
|
235
|
+
importance: 50, // Lower importance for catalog
|
|
236
|
+
category: 'other',
|
|
237
|
+
source: {
|
|
238
|
+
rpc_id: toolsList.rpc_id,
|
|
239
|
+
method: toolsList.method,
|
|
240
|
+
},
|
|
241
|
+
payload,
|
|
242
|
+
digests: {
|
|
243
|
+
payload_digest: payloadDigest,
|
|
244
|
+
},
|
|
245
|
+
notes: [],
|
|
246
|
+
timing,
|
|
247
|
+
};
|
|
248
|
+
return candidate;
|
|
249
|
+
}
|
|
250
|
+
// ============================================================
|
|
251
|
+
// Dry-Run Generation
|
|
252
|
+
// ============================================================
|
|
253
|
+
/**
|
|
254
|
+
* Generate dry-run data for a session
|
|
255
|
+
*/
|
|
256
|
+
function generateDryRun(configDir, sessionId, connectorId, resolvedBy, includeCapabilities) {
|
|
257
|
+
const candidates = [];
|
|
258
|
+
// Add capability catalog if requested
|
|
259
|
+
if (includeCapabilities) {
|
|
260
|
+
const catalog = extractCapabilityCatalog(configDir, sessionId);
|
|
261
|
+
if (catalog) {
|
|
262
|
+
candidates.push(catalog);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Add tool call candidates
|
|
266
|
+
const toolCalls = extractToolCallCandidates(configDir, sessionId);
|
|
267
|
+
candidates.push(...toolCalls);
|
|
268
|
+
// Calculate summary
|
|
269
|
+
const importanceMax = candidates.length > 0
|
|
270
|
+
? Math.max(...candidates.map(c => c.importance))
|
|
271
|
+
: 0;
|
|
272
|
+
return {
|
|
273
|
+
schema_version: 'phase3.record_dry_run.v1',
|
|
274
|
+
options: {
|
|
275
|
+
include_capabilities: includeCapabilities,
|
|
276
|
+
redaction_mode: 'digest_only',
|
|
277
|
+
},
|
|
278
|
+
session: {
|
|
279
|
+
id: sessionId,
|
|
280
|
+
connector_id: connectorId,
|
|
281
|
+
resolved_by: resolvedBy,
|
|
282
|
+
},
|
|
283
|
+
candidates,
|
|
284
|
+
summary: {
|
|
285
|
+
candidate_count: candidates.length,
|
|
286
|
+
importance_max: importanceMax,
|
|
287
|
+
},
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
// ============================================================
|
|
291
|
+
// Rendering
|
|
292
|
+
// ============================================================
|
|
293
|
+
/** Japanese type labels */
|
|
294
|
+
const TYPE_LABELS = {
|
|
295
|
+
tool_call: 'やったこと(tool call)',
|
|
296
|
+
capability_catalog: '能力一覧(capability catalog)',
|
|
297
|
+
};
|
|
298
|
+
/** Japanese category labels */
|
|
299
|
+
const CATEGORY_LABELS = {
|
|
300
|
+
read: '読取',
|
|
301
|
+
write: '書込',
|
|
302
|
+
network: '通信',
|
|
303
|
+
exec: '実行',
|
|
304
|
+
other: 'その他',
|
|
305
|
+
};
|
|
306
|
+
/**
|
|
307
|
+
* Render dry-run to terminal
|
|
308
|
+
*/
|
|
309
|
+
function renderDryRun(data) {
|
|
310
|
+
console.log(`dry-run: ${data.session.connector_id} (session: ${shortenId(data.session.id, 8)}...)`);
|
|
311
|
+
console.log(`redaction: ${data.options.redaction_mode}`);
|
|
312
|
+
console.log();
|
|
313
|
+
if (data.candidates.length === 0) {
|
|
314
|
+
console.log('候補なし(No candidates)');
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
console.log(`候補数: ${data.summary.candidate_count}`);
|
|
318
|
+
console.log();
|
|
319
|
+
for (const candidate of data.candidates) {
|
|
320
|
+
const typeLabel = TYPE_LABELS[candidate.type] || candidate.type;
|
|
321
|
+
const catLabel = CATEGORY_LABELS[candidate.category];
|
|
322
|
+
const rpcShort = shortenId(candidate.source.rpc_id, 8);
|
|
323
|
+
if (candidate.type === 'tool_call') {
|
|
324
|
+
const payload = candidate.payload;
|
|
325
|
+
const resultMark = payload.result === 'error' ? '✗' : '✓';
|
|
326
|
+
console.log(` [${candidate.importance}] ${typeLabel} ${payload.tool} (${catLabel}) ${resultMark} rpc:${rpcShort}`);
|
|
327
|
+
}
|
|
328
|
+
else if (candidate.type === 'capability_catalog') {
|
|
329
|
+
const payload = candidate.payload;
|
|
330
|
+
console.log(` [${candidate.importance}] ${typeLabel} ${payload.tool_count}ツール rpc:${rpcShort}`);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
console.log();
|
|
334
|
+
console.log(`importance_max: ${data.summary.importance_max}`);
|
|
335
|
+
}
|
|
336
|
+
// ============================================================
|
|
337
|
+
// Command
|
|
338
|
+
// ============================================================
|
|
339
|
+
export function createRecordCommand(getConfigPath) {
|
|
340
|
+
const cmd = new Command('record')
|
|
341
|
+
.description('Record management commands');
|
|
342
|
+
// dry-run subcommand
|
|
343
|
+
const dryRunCmd = new Command('dry-run')
|
|
344
|
+
.description('Preview inscribe candidates without inscribing')
|
|
345
|
+
.addHelpText('after', `
|
|
346
|
+
Examples:
|
|
347
|
+
pfscan record dry-run time # Preview for 'time' connector
|
|
348
|
+
pfscan record dry-run --session abc123 # Preview for specific session
|
|
349
|
+
pfscan record dry-run --include-capabilities # Include tools/list snapshot
|
|
350
|
+
`)
|
|
351
|
+
.argument('[connector]', 'Connector ID (uses latest session for connector)')
|
|
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
|
+
.option('--id <id>', 'Alias for --connector')
|
|
356
|
+
.option('--include-capabilities', 'Include tools/list capability snapshot')
|
|
357
|
+
.action(async (connectorArg, options) => {
|
|
358
|
+
try {
|
|
359
|
+
const manager = new ConfigManager(getConfigPath());
|
|
360
|
+
const configDir = manager.getConfigDir();
|
|
361
|
+
// Resolve connector from positional arg, --connector, or --id
|
|
362
|
+
const connectorId = connectorArg || options.connector || options.id;
|
|
363
|
+
// Resolve session
|
|
364
|
+
const result = resolveSession({
|
|
365
|
+
sessionId: options.session,
|
|
366
|
+
latest: options.latest || !!connectorId,
|
|
367
|
+
connectorId,
|
|
368
|
+
configDir,
|
|
369
|
+
});
|
|
370
|
+
if (isSessionError(result)) {
|
|
371
|
+
console.error(formatSessionError(result));
|
|
372
|
+
process.exit(1);
|
|
373
|
+
}
|
|
374
|
+
// Generate dry-run
|
|
375
|
+
const dryRun = generateDryRun(configDir, result.sessionId, result.connectorId, result.resolvedBy, options.includeCapabilities || false);
|
|
376
|
+
if (getOutputOptions().json) {
|
|
377
|
+
output(dryRun);
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
renderDryRun(dryRun);
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
if (error instanceof Error && error.message.includes('no such table')) {
|
|
384
|
+
console.log('No data yet. Run a scan first:');
|
|
385
|
+
console.log(' pfscan scan start --id <connector>');
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
throw error;
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
cmd.addCommand(dryRunCmd);
|
|
392
|
+
return cmd;
|
|
393
|
+
}
|
|
394
|
+
//# sourceMappingURL=record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/commands/record.ts"],"names":[],"mappings":"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"}
|