proofscan 0.5.3 → 0.5.4
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 +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 +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/permissions.d.ts +44 -0
- package/dist/commands/permissions.d.ts.map +1 -0
- package/dist/commands/permissions.js +244 -0
- package/dist/commands/permissions.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, } from './commands/index.js';
|
|
28
|
+
import { createConfigCommand, createConnectorsCommand, createScanCommand, createMonitorCommand, createSessionsCommand, createArchiveCommand, createViewCommand, createTreeCommand, createExploreCommand, createStatusCommand, createEventsCommand, createRpcCommand, createSummaryCommand, createPermissionsCommand, } from './commands/index.js';
|
|
29
29
|
const program = new Command();
|
|
30
30
|
// Global state for config path
|
|
31
31
|
let globalConfigPath;
|
|
@@ -45,6 +45,7 @@ Common Commands:
|
|
|
45
45
|
status, st Show system status
|
|
46
46
|
rpc View RPC call details (list, show)
|
|
47
47
|
summary Show session summary (Phase 3)
|
|
48
|
+
permissions Show permission stats per category (Phase 3)
|
|
48
49
|
|
|
49
50
|
Management:
|
|
50
51
|
archive, a Archive and prune old data
|
|
@@ -146,6 +147,8 @@ program.addCommand(createEventsCommand(getConfigPath));
|
|
|
146
147
|
program.addCommand(createRpcCommand(getConfigPath));
|
|
147
148
|
// summary (Phase 3: capabilities, tool calls, concerns)
|
|
148
149
|
program.addCommand(createSummaryCommand(getConfigPath));
|
|
150
|
+
// permissions (Phase 3: detailed permission stats)
|
|
151
|
+
program.addCommand(createPermissionsCommand(getConfigPath));
|
|
149
152
|
// ============================================================
|
|
150
153
|
// Default action: pfscan → pfscan view
|
|
151
154
|
// ============================================================
|
|
@@ -158,7 +161,7 @@ function hasSubcommand() {
|
|
|
158
161
|
const knownCommands = new Set([
|
|
159
162
|
'view', 'v', 'tree', 't', 'explore', 'e', 'status', 'st',
|
|
160
163
|
'scan', 's', 'archive', 'a', 'config', 'c',
|
|
161
|
-
'connectors', 'sessions', 'monitor', 'events', 'rpc', 'summary', 'help'
|
|
164
|
+
'connectors', 'sessions', 'monitor', 'events', 'rpc', 'summary', 'permissions', 'help'
|
|
162
165
|
]);
|
|
163
166
|
for (let i = 2; i < process.argv.length; i++) {
|
|
164
167
|
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,
|
|
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"}
|
|
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"}
|
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"}
|
|
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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permissions command - Phase 3
|
|
3
|
+
*
|
|
4
|
+
* pfscan permissions [--session <sid>] [--latest] [--connector <id>]
|
|
5
|
+
*
|
|
6
|
+
* Shows detailed allowed/used stats per category and per tool.
|
|
7
|
+
*
|
|
8
|
+
* Categories (in display order):
|
|
9
|
+
* - 読み取り(Read)
|
|
10
|
+
* - 書き込み(Write)
|
|
11
|
+
* - ネット接続(Network)
|
|
12
|
+
* - コマンド実行(Exec)
|
|
13
|
+
* - その他操作(Other)
|
|
14
|
+
*/
|
|
15
|
+
import { Command } from 'commander';
|
|
16
|
+
import { OperationCategory } from './summary.js';
|
|
17
|
+
/** Tool permission info */
|
|
18
|
+
export interface ToolPermission {
|
|
19
|
+
name: string;
|
|
20
|
+
allowed: boolean;
|
|
21
|
+
called: number;
|
|
22
|
+
}
|
|
23
|
+
/** Category stats */
|
|
24
|
+
export interface CategoryStats {
|
|
25
|
+
allowed_tool_count: number;
|
|
26
|
+
called_count: number;
|
|
27
|
+
tools: ToolPermission[];
|
|
28
|
+
}
|
|
29
|
+
/** Permissions data structure */
|
|
30
|
+
export interface PermissionsData {
|
|
31
|
+
schema_version: string;
|
|
32
|
+
session_id: string;
|
|
33
|
+
connector_id: string;
|
|
34
|
+
resolved_by: 'option' | 'latest' | 'current';
|
|
35
|
+
/** Stats per category */
|
|
36
|
+
categories: Record<OperationCategory, CategoryStats>;
|
|
37
|
+
/** Totals across all categories */
|
|
38
|
+
totals: {
|
|
39
|
+
allowed_tool_count: number;
|
|
40
|
+
called_count: number;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export declare function createPermissionsCommand(getConfigPath: () => string): Command;
|
|
44
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/commands/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,OAAO,EAAgB,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAkB/D,2BAA2B;AAC3B,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAqB;AACrB,MAAM,WAAW,aAAa;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,iCAAiC;AACjC,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAE7C,yBAAyB;IACzB,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;IAErD,mCAAmC;IACnC,MAAM,EAAE;QACN,kBAAkB,EAAE,MAAM,CAAC;QAC3B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAoOD,wBAAgB,wBAAwB,CAAC,aAAa,EAAE,MAAM,MAAM,GAAG,OAAO,CAkD7E"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permissions command - Phase 3
|
|
3
|
+
*
|
|
4
|
+
* pfscan permissions [--session <sid>] [--latest] [--connector <id>]
|
|
5
|
+
*
|
|
6
|
+
* Shows detailed allowed/used stats per category and per tool.
|
|
7
|
+
*
|
|
8
|
+
* Categories (in display order):
|
|
9
|
+
* - 読み取り(Read)
|
|
10
|
+
* - 書き込み(Write)
|
|
11
|
+
* - ネット接続(Network)
|
|
12
|
+
* - コマンド実行(Exec)
|
|
13
|
+
* - その他操作(Other)
|
|
14
|
+
*/
|
|
15
|
+
import { Command } from 'commander';
|
|
16
|
+
import { ConfigManager } from '../config/index.js';
|
|
17
|
+
import { getEventsDb } from '../db/connection.js';
|
|
18
|
+
import { output, getOutputOptions } from '../utils/output.js';
|
|
19
|
+
import { resolveSession, isSessionError, formatSessionError, } from '../utils/session-resolver.js';
|
|
20
|
+
import { shortenId } from '../eventline/types.js';
|
|
21
|
+
import { classifyTool } from './summary.js';
|
|
22
|
+
// ============================================================
|
|
23
|
+
// Types
|
|
24
|
+
// ============================================================
|
|
25
|
+
/** Japanese labels for categories (Phase 3 UX format) */
|
|
26
|
+
const CATEGORY_LABELS = {
|
|
27
|
+
read: '読み取り(Read)',
|
|
28
|
+
write: '書き込み(Write)',
|
|
29
|
+
network: 'ネット接続(Network)',
|
|
30
|
+
exec: 'コマンド実行(Exec)',
|
|
31
|
+
other: 'その他操作(Other)',
|
|
32
|
+
};
|
|
33
|
+
/** Display order for categories */
|
|
34
|
+
const CATEGORY_ORDER = ['read', 'write', 'network', 'exec', 'other'];
|
|
35
|
+
/**
|
|
36
|
+
* Extract tools from tools/list response
|
|
37
|
+
*/
|
|
38
|
+
function extractToolsFromSession(configDir, sessionId) {
|
|
39
|
+
const db = getEventsDb(configDir);
|
|
40
|
+
// Find tools/list response
|
|
41
|
+
const toolsListRpc = db.prepare(`
|
|
42
|
+
SELECT rpc_id FROM rpc_calls
|
|
43
|
+
WHERE session_id = ? AND method = 'tools/list'
|
|
44
|
+
ORDER BY request_ts ASC
|
|
45
|
+
LIMIT 1
|
|
46
|
+
`).get(sessionId);
|
|
47
|
+
if (!toolsListRpc) {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
// Get the response event
|
|
51
|
+
const responseEvent = db.prepare(`
|
|
52
|
+
SELECT raw_json FROM events
|
|
53
|
+
WHERE session_id = ? AND rpc_id = ? AND kind = 'response'
|
|
54
|
+
LIMIT 1
|
|
55
|
+
`).get(sessionId, toolsListRpc.rpc_id);
|
|
56
|
+
if (!responseEvent?.raw_json) {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const response = JSON.parse(responseEvent.raw_json);
|
|
61
|
+
const result = response.result;
|
|
62
|
+
if (!result?.tools || !Array.isArray(result.tools)) {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
return result.tools.map(tool => ({
|
|
66
|
+
name: tool.name,
|
|
67
|
+
description: tool.description,
|
|
68
|
+
category: classifyTool(tool.name, tool.description),
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Extract tool call counts from tools/call requests
|
|
77
|
+
*/
|
|
78
|
+
function extractToolCallCounts(configDir, sessionId) {
|
|
79
|
+
const db = getEventsDb(configDir);
|
|
80
|
+
// Find all tools/call requests
|
|
81
|
+
const toolCalls = db.prepare(`
|
|
82
|
+
SELECT rc.rpc_id, e.raw_json
|
|
83
|
+
FROM rpc_calls rc
|
|
84
|
+
JOIN events e ON rc.session_id = e.session_id AND rc.rpc_id = e.rpc_id
|
|
85
|
+
WHERE rc.session_id = ? AND rc.method = 'tools/call' AND e.kind = 'request'
|
|
86
|
+
`).all(sessionId);
|
|
87
|
+
// Count by tool name
|
|
88
|
+
const counts = new Map();
|
|
89
|
+
for (const call of toolCalls) {
|
|
90
|
+
if (!call.raw_json)
|
|
91
|
+
continue;
|
|
92
|
+
try {
|
|
93
|
+
const request = JSON.parse(call.raw_json);
|
|
94
|
+
const params = request.params;
|
|
95
|
+
const toolName = params?.name || 'unknown';
|
|
96
|
+
counts.set(toolName, (counts.get(toolName) || 0) + 1);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Ignore parse errors
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return counts;
|
|
103
|
+
}
|
|
104
|
+
// ============================================================
|
|
105
|
+
// Permissions Generation
|
|
106
|
+
// ============================================================
|
|
107
|
+
/**
|
|
108
|
+
* Generate permissions data for a session
|
|
109
|
+
*/
|
|
110
|
+
function generatePermissions(configDir, sessionId, connectorId, resolvedBy) {
|
|
111
|
+
const allowedTools = extractToolsFromSession(configDir, sessionId);
|
|
112
|
+
const callCounts = extractToolCallCounts(configDir, sessionId);
|
|
113
|
+
// Initialize categories
|
|
114
|
+
const categories = {
|
|
115
|
+
read: { allowed_tool_count: 0, called_count: 0, tools: [] },
|
|
116
|
+
write: { allowed_tool_count: 0, called_count: 0, tools: [] },
|
|
117
|
+
network: { allowed_tool_count: 0, called_count: 0, tools: [] },
|
|
118
|
+
exec: { allowed_tool_count: 0, called_count: 0, tools: [] },
|
|
119
|
+
other: { allowed_tool_count: 0, called_count: 0, tools: [] },
|
|
120
|
+
};
|
|
121
|
+
// Track which tools are allowed
|
|
122
|
+
const allowedToolNames = new Set(allowedTools.map(t => t.name));
|
|
123
|
+
// Add allowed tools to their categories
|
|
124
|
+
for (const tool of allowedTools) {
|
|
125
|
+
const called = callCounts.get(tool.name) || 0;
|
|
126
|
+
categories[tool.category].tools.push({
|
|
127
|
+
name: tool.name,
|
|
128
|
+
allowed: true,
|
|
129
|
+
called,
|
|
130
|
+
});
|
|
131
|
+
categories[tool.category].allowed_tool_count++;
|
|
132
|
+
categories[tool.category].called_count += called;
|
|
133
|
+
}
|
|
134
|
+
// Add tools that were called but not in allowed list (shouldn't happen normally)
|
|
135
|
+
for (const [toolName, count] of callCounts) {
|
|
136
|
+
if (!allowedToolNames.has(toolName)) {
|
|
137
|
+
const category = classifyTool(toolName);
|
|
138
|
+
categories[category].tools.push({
|
|
139
|
+
name: toolName,
|
|
140
|
+
allowed: false,
|
|
141
|
+
called: count,
|
|
142
|
+
});
|
|
143
|
+
categories[category].called_count += count;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Sort tools: called desc, then name asc
|
|
147
|
+
for (const cat of CATEGORY_ORDER) {
|
|
148
|
+
categories[cat].tools.sort((a, b) => {
|
|
149
|
+
if (b.called !== a.called) {
|
|
150
|
+
return b.called - a.called;
|
|
151
|
+
}
|
|
152
|
+
return a.name.localeCompare(b.name);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
// Calculate totals
|
|
156
|
+
const totals = {
|
|
157
|
+
allowed_tool_count: allowedTools.length,
|
|
158
|
+
called_count: Array.from(callCounts.values()).reduce((sum, c) => sum + c, 0),
|
|
159
|
+
};
|
|
160
|
+
return {
|
|
161
|
+
schema_version: 'phase3.permissions.v1',
|
|
162
|
+
session_id: sessionId,
|
|
163
|
+
connector_id: connectorId,
|
|
164
|
+
resolved_by: resolvedBy,
|
|
165
|
+
categories,
|
|
166
|
+
totals,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
// ============================================================
|
|
170
|
+
// Rendering
|
|
171
|
+
// ============================================================
|
|
172
|
+
/**
|
|
173
|
+
* Render permissions to terminal
|
|
174
|
+
*/
|
|
175
|
+
function renderPermissions(data) {
|
|
176
|
+
console.log(`${data.connector_id} (session: ${shortenId(data.session_id, 8)}...)`);
|
|
177
|
+
console.log();
|
|
178
|
+
for (const cat of CATEGORY_ORDER) {
|
|
179
|
+
const stats = data.categories[cat];
|
|
180
|
+
const label = CATEGORY_LABELS[cat];
|
|
181
|
+
// Category header
|
|
182
|
+
console.log(`【${label}】`);
|
|
183
|
+
// 許可/使用
|
|
184
|
+
const hasPermission = stats.allowed_tool_count > 0;
|
|
185
|
+
console.log(` 許可: ${hasPermission ? 'あり' : 'なし'}`);
|
|
186
|
+
console.log(` 使用: ${stats.called_count} 回`);
|
|
187
|
+
// Tool list
|
|
188
|
+
if (stats.tools.length > 0) {
|
|
189
|
+
console.log();
|
|
190
|
+
for (const tool of stats.tools) {
|
|
191
|
+
const allowedMark = tool.allowed ? '' : ' (未許可)';
|
|
192
|
+
console.log(` ${tool.name}: ${tool.called} 回${allowedMark}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
console.log();
|
|
196
|
+
}
|
|
197
|
+
// Totals
|
|
198
|
+
console.log('─'.repeat(40));
|
|
199
|
+
console.log(`合計: ${data.totals.allowed_tool_count} ツール許可, ${data.totals.called_count} 回使用`);
|
|
200
|
+
}
|
|
201
|
+
// ============================================================
|
|
202
|
+
// Command
|
|
203
|
+
// ============================================================
|
|
204
|
+
export function createPermissionsCommand(getConfigPath) {
|
|
205
|
+
const cmd = new Command('permissions')
|
|
206
|
+
.description('Show detailed permission stats per category and tool')
|
|
207
|
+
.option('--session <id>', 'Session ID (partial match supported)')
|
|
208
|
+
.option('--latest', 'Use the latest session')
|
|
209
|
+
.option('--connector <id>', 'Filter by connector (with --latest)')
|
|
210
|
+
.action(async (options) => {
|
|
211
|
+
try {
|
|
212
|
+
const manager = new ConfigManager(getConfigPath());
|
|
213
|
+
const configDir = manager.getConfigDir();
|
|
214
|
+
// Resolve session
|
|
215
|
+
const result = resolveSession({
|
|
216
|
+
sessionId: options.session,
|
|
217
|
+
latest: options.latest,
|
|
218
|
+
connectorId: options.connector,
|
|
219
|
+
configDir,
|
|
220
|
+
});
|
|
221
|
+
if (isSessionError(result)) {
|
|
222
|
+
console.error(formatSessionError(result));
|
|
223
|
+
process.exit(1);
|
|
224
|
+
}
|
|
225
|
+
// Generate permissions
|
|
226
|
+
const permissions = generatePermissions(configDir, result.sessionId, result.connectorId, result.resolvedBy);
|
|
227
|
+
if (getOutputOptions().json) {
|
|
228
|
+
output(permissions);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
renderPermissions(permissions);
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
if (error instanceof Error && error.message.includes('no such table')) {
|
|
235
|
+
console.log('No data yet. Run a scan first:');
|
|
236
|
+
console.log(' pfscan scan start --id <connector>');
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
throw error;
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
return cmd;
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/commands/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EACL,cAAc,EACd,cAAc,EACd,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAqB,MAAM,cAAc,CAAC;AAE/D,+DAA+D;AAC/D,QAAQ;AACR,+DAA+D;AAE/D,yDAAyD;AACzD,MAAM,eAAe,GAAsC;IACzD,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,aAAa;IACpB,OAAO,EAAE,gBAAgB;IACzB,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,cAAc;CACtB,CAAC;AAEF,mCAAmC;AACnC,MAAM,cAAc,GAAwB,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAiD1F;;GAEG;AACH,SAAS,uBAAuB,CAC9B,SAAiB,EACjB,SAAiB;IAEjB,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAElC,2BAA2B;IAC3B,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;GAK/B,CAAC,CAAC,GAAG,CAAC,SAAS,CAAmC,CAAC;IAEpD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,yBAAyB;IACzB,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC;;;;GAIhC,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,MAAM,CAA4C,CAAC;IAElF,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAqC,CAAC;QAE9D,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC;SACpD,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAC5B,SAAiB,EACjB,SAAiB;IAEjB,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAElC,+BAA+B;IAC/B,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;GAK5B,CAAC,CAAC,GAAG,CAAC,SAAS,CAAuD,CAAC;IAExE,qBAAqB;IACrB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,SAAS;QAE7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAqC,CAAC;YAC7D,MAAM,QAAQ,GAAG,MAAM,EAAE,IAAI,IAAI,SAAS,CAAC;YAE3C,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+DAA+D;AAC/D,yBAAyB;AACzB,+DAA+D;AAE/D;;GAEG;AACH,SAAS,mBAAmB,CAC1B,SAAiB,EACjB,SAAiB,EACjB,WAAmB,EACnB,UAA2C;IAE3C,MAAM,YAAY,GAAG,uBAAuB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,qBAAqB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAE/D,wBAAwB;IACxB,MAAM,UAAU,GAA6C;QAC3D,IAAI,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QAC3D,KAAK,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QAC5D,OAAO,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QAC9D,IAAI,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QAC3D,KAAK,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;KAC7D,CAAC;IAEF,gCAAgC;IAChC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhE,wCAAwC;IACxC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YACnC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI;YACb,MAAM;SACP,CAAC,CAAC;QACH,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,kBAAkB,EAAE,CAAC;QAC/C,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,YAAY,IAAI,MAAM,CAAC;IACnD,CAAC;IAED,iFAAiF;IACjF,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACxC,UAAU,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC9B,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,KAAK;aACd,CAAC,CAAC;YACH,UAAU,CAAC,QAAQ,CAAC,CAAC,YAAY,IAAI,KAAK,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAClC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;gBAC1B,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;YAC7B,CAAC;YACD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB;IACnB,MAAM,MAAM,GAAG;QACb,kBAAkB,EAAE,YAAY,CAAC,MAAM;QACvC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;KAC7E,CAAC;IAEF,OAAO;QACL,cAAc,EAAE,uBAAuB;QACvC,UAAU,EAAE,SAAS;QACrB,YAAY,EAAE,WAAW;QACzB,WAAW,EAAE,UAAU;QACvB,UAAU;QACV,MAAM;KACP,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,YAAY;AACZ,+DAA+D;AAE/D;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAqB;IAC9C,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,cAAc,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QAEnC,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;QAE1B,QAAQ;QACR,MAAM,aAAa,GAAG,KAAK,CAAC,kBAAkB,GAAG,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,SAAS,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;QAE7C,YAAY;QACZ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,SAAS;IACT,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,WAAW,IAAI,CAAC,MAAM,CAAC,YAAY,MAAM,CAAC,CAAC;AAC9F,CAAC;AAED,+DAA+D;AAC/D,UAAU;AACV,+DAA+D;AAE/D,MAAM,UAAU,wBAAwB,CAAC,aAA2B;IAClE,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC;SACnC,WAAW,CAAC,sDAAsD,CAAC;SACnE,MAAM,CAAC,gBAAgB,EAAE,sCAAsC,CAAC;SAChE,MAAM,CAAC,UAAU,EAAE,wBAAwB,CAAC;SAC5C,MAAM,CAAC,kBAAkB,EAAE,qCAAqC,CAAC;SACjE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,aAAa,EAAE,CAAC,CAAC;YACnD,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YAEzC,kBAAkB;YAClB,MAAM,MAAM,GAAG,cAAc,CAAC;gBAC5B,SAAS,EAAE,OAAO,CAAC,OAAO;gBAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,WAAW,EAAE,OAAO,CAAC,SAAS;gBAC9B,SAAS;aACV,CAAC,CAAC;YAEH,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,uBAAuB;YACvB,MAAM,WAAW,GAAG,mBAAmB,CACrC,SAAS,EACT,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,UAAU,CAClB,CAAC;YAEF,IAAI,gBAAgB,EAAE,CAAC,IAAI,EAAE,CAAC;gBAC5B,MAAM,CAAC,WAAW,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YAED,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAEjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBACtE,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|