opena2a-cli 0.1.1 → 0.2.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.md +227 -3
- package/dist/adapters/registry.js +1 -1
- package/dist/adapters/registry.js.map +1 -1
- package/dist/commands/guard-hooks.d.ts +27 -0
- package/dist/commands/guard-hooks.d.ts.map +1 -0
- package/dist/commands/guard-hooks.js +207 -0
- package/dist/commands/guard-hooks.js.map +1 -0
- package/dist/commands/guard-policy.d.ts +54 -0
- package/dist/commands/guard-policy.d.ts.map +1 -0
- package/dist/commands/guard-policy.js +251 -0
- package/dist/commands/guard-policy.js.map +1 -0
- package/dist/commands/guard-signing.d.ts +52 -0
- package/dist/commands/guard-signing.d.ts.map +1 -0
- package/dist/commands/guard-signing.js +185 -0
- package/dist/commands/guard-signing.js.map +1 -0
- package/dist/commands/guard-snapshots.d.ts +54 -0
- package/dist/commands/guard-snapshots.d.ts.map +1 -0
- package/dist/commands/guard-snapshots.js +346 -0
- package/dist/commands/guard-snapshots.js.map +1 -0
- package/dist/commands/guard.d.ts +60 -4
- package/dist/commands/guard.d.ts.map +1 -1
- package/dist/commands/guard.js +475 -95
- package/dist/commands/guard.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +77 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/protect.d.ts +2 -0
- package/dist/commands/protect.d.ts.map +1 -1
- package/dist/commands/protect.js +56 -10
- package/dist/commands/protect.js.map +1 -1
- package/dist/commands/runtime.d.ts +1 -1
- package/dist/commands/runtime.js +5 -5
- package/dist/commands/runtime.js.map +1 -1
- package/dist/commands/self-register.js +6 -6
- package/dist/commands/self-register.js.map +1 -1
- package/dist/commands/shield.d.ts +39 -0
- package/dist/commands/shield.d.ts.map +1 -0
- package/dist/commands/shield.js +1262 -0
- package/dist/commands/shield.js.map +1 -0
- package/dist/commands/verify.js +1 -1
- package/dist/commands/verify.js.map +1 -1
- package/dist/index.js +41 -3
- package/dist/index.js.map +1 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +1 -0
- package/dist/router.js.map +1 -1
- package/dist/shield/arp-bridge.d.ts +62 -0
- package/dist/shield/arp-bridge.d.ts.map +1 -0
- package/dist/shield/arp-bridge.js +198 -0
- package/dist/shield/arp-bridge.js.map +1 -0
- package/dist/shield/baselines.d.ts +58 -0
- package/dist/shield/baselines.d.ts.map +1 -0
- package/dist/shield/baselines.js +371 -0
- package/dist/shield/baselines.js.map +1 -0
- package/dist/shield/detect.d.ts +18 -0
- package/dist/shield/detect.d.ts.map +1 -0
- package/dist/shield/detect.js +402 -0
- package/dist/shield/detect.js.map +1 -0
- package/dist/shield/events.d.ts +65 -0
- package/dist/shield/events.d.ts.map +1 -0
- package/dist/shield/events.js +342 -0
- package/dist/shield/events.js.map +1 -0
- package/dist/shield/findings.d.ts +52 -0
- package/dist/shield/findings.d.ts.map +1 -0
- package/dist/shield/findings.js +336 -0
- package/dist/shield/findings.js.map +1 -0
- package/dist/shield/init.d.ts +22 -0
- package/dist/shield/init.d.ts.map +1 -0
- package/dist/shield/init.js +290 -0
- package/dist/shield/init.js.map +1 -0
- package/dist/shield/integrity.d.ts +75 -0
- package/dist/shield/integrity.d.ts.map +1 -0
- package/dist/shield/integrity.js +439 -0
- package/dist/shield/integrity.js.map +1 -0
- package/dist/shield/llm-backend.d.ts +36 -0
- package/dist/shield/llm-backend.d.ts.map +1 -0
- package/dist/shield/llm-backend.js +145 -0
- package/dist/shield/llm-backend.js.map +1 -0
- package/dist/shield/llm.d.ts +116 -0
- package/dist/shield/llm.d.ts.map +1 -0
- package/dist/shield/llm.js +536 -0
- package/dist/shield/llm.js.map +1 -0
- package/dist/shield/policy.d.ts +70 -0
- package/dist/shield/policy.d.ts.map +1 -0
- package/dist/shield/policy.js +399 -0
- package/dist/shield/policy.js.map +1 -0
- package/dist/shield/report-html.d.ts +29 -0
- package/dist/shield/report-html.d.ts.map +1 -0
- package/dist/shield/report-html.js +596 -0
- package/dist/shield/report-html.js.map +1 -0
- package/dist/shield/sarif.d.ts +65 -0
- package/dist/shield/sarif.d.ts.map +1 -0
- package/dist/shield/sarif.js +108 -0
- package/dist/shield/sarif.js.map +1 -0
- package/dist/shield/session.d.ts +63 -0
- package/dist/shield/session.d.ts.map +1 -0
- package/dist/shield/session.js +242 -0
- package/dist/shield/session.js.map +1 -0
- package/dist/shield/signing.d.ts +41 -0
- package/dist/shield/signing.d.ts.map +1 -0
- package/dist/shield/signing.js +161 -0
- package/dist/shield/signing.js.map +1 -0
- package/dist/shield/status.d.ts +4 -0
- package/dist/shield/status.d.ts.map +1 -0
- package/dist/shield/status.js +241 -0
- package/dist/shield/status.js.map +1 -0
- package/dist/shield/types.d.ts +416 -0
- package/dist/shield/types.d.ts.map +1 -0
- package/dist/shield/types.js +32 -0
- package/dist/shield/types.js.map +1 -0
- package/dist/util/drift-liveness.d.ts +37 -0
- package/dist/util/drift-liveness.d.ts.map +1 -0
- package/dist/util/drift-liveness.js +114 -0
- package/dist/util/drift-liveness.js.map +1 -0
- package/dist/util/drift-verification.d.ts +60 -0
- package/dist/util/drift-verification.d.ts.map +1 -0
- package/dist/util/drift-verification.js +457 -0
- package/dist/util/drift-verification.js.map +1 -0
- package/package.json +4 -2
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shield environment detection.
|
|
4
|
+
*
|
|
5
|
+
* Scans the developer workstation for CLIs, AI coding assistants,
|
|
6
|
+
* MCP server configurations, and active OAuth sessions. All detection
|
|
7
|
+
* is synchronous so the result can be used during CLI startup without
|
|
8
|
+
* awaiting promises.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.detectEnvironment = detectEnvironment;
|
|
12
|
+
const node_fs_1 = require("node:fs");
|
|
13
|
+
const node_child_process_1 = require("node:child_process");
|
|
14
|
+
const node_os_1 = require("node:os");
|
|
15
|
+
const node_path_1 = require("node:path");
|
|
16
|
+
const detect_js_1 = require("../util/detect.js");
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Helpers
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/** Run a command silently and return trimmed stdout, or null on failure. */
|
|
21
|
+
function tryExec(cmd) {
|
|
22
|
+
try {
|
|
23
|
+
return (0, node_child_process_1.execSync)(cmd, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Run a binary with args without shell interpretation (safe from injection). */
|
|
30
|
+
function tryExecFile(binary, args) {
|
|
31
|
+
try {
|
|
32
|
+
return (0, node_child_process_1.execFileSync)(binary, args, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Read a JSON file and return the parsed object, or null on failure. */
|
|
39
|
+
function readJson(filePath) {
|
|
40
|
+
try {
|
|
41
|
+
if (!(0, node_fs_1.existsSync)(filePath))
|
|
42
|
+
return null;
|
|
43
|
+
const raw = (0, node_fs_1.readFileSync)(filePath, 'utf-8');
|
|
44
|
+
return JSON.parse(raw);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Return ISO-8601 mtime string for a file, or null if unreadable. */
|
|
51
|
+
function fileMtime(filePath) {
|
|
52
|
+
try {
|
|
53
|
+
return (0, node_fs_1.statSync)(filePath).mtime.toISOString();
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const CLI_SPECS = [
|
|
60
|
+
{
|
|
61
|
+
name: 'aws',
|
|
62
|
+
binary: 'aws',
|
|
63
|
+
versionFlag: '--version',
|
|
64
|
+
configDir: (0, node_path_1.join)((0, node_os_1.homedir)(), '.aws'),
|
|
65
|
+
credentialFiles: ['credentials', 'sso/cache'],
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: 'az',
|
|
69
|
+
binary: 'az',
|
|
70
|
+
versionFlag: '--version',
|
|
71
|
+
configDir: (0, node_path_1.join)((0, node_os_1.homedir)(), '.azure'),
|
|
72
|
+
credentialFiles: ['msal_token_cache.json', 'accessTokens.json'],
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: 'gcloud',
|
|
76
|
+
binary: 'gcloud',
|
|
77
|
+
versionFlag: '--version',
|
|
78
|
+
configDir: (0, node_path_1.join)((0, node_os_1.homedir)(), '.config', 'gcloud'),
|
|
79
|
+
credentialFiles: ['application_default_credentials.json', 'credentials.db'],
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: 'vercel',
|
|
83
|
+
binary: 'vercel',
|
|
84
|
+
versionFlag: '--version',
|
|
85
|
+
configDir: (0, node_path_1.join)((0, node_os_1.homedir)(), '.vercel'),
|
|
86
|
+
credentialFiles: ['auth.json'],
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: 'gh',
|
|
90
|
+
binary: 'gh',
|
|
91
|
+
versionFlag: '--version',
|
|
92
|
+
configDir: (0, node_path_1.join)((0, node_os_1.homedir)(), '.config', 'gh'),
|
|
93
|
+
credentialFiles: ['hosts.yml'],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'kubectl',
|
|
97
|
+
binary: 'kubectl',
|
|
98
|
+
versionFlag: 'version --client --short',
|
|
99
|
+
configDir: (0, node_path_1.join)((0, node_os_1.homedir)(), '.kube'),
|
|
100
|
+
credentialFiles: ['config'],
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'terraform',
|
|
104
|
+
binary: 'terraform',
|
|
105
|
+
versionFlag: '--version',
|
|
106
|
+
configDir: (0, node_path_1.join)((0, node_os_1.homedir)(), '.terraform.d'),
|
|
107
|
+
credentialFiles: ['credentials.tfrc.json'],
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
function detectClis() {
|
|
111
|
+
const results = [];
|
|
112
|
+
for (const spec of CLI_SPECS) {
|
|
113
|
+
const binaryPath = tryExecFile('which', [spec.binary]);
|
|
114
|
+
if (!binaryPath)
|
|
115
|
+
continue;
|
|
116
|
+
// Extract version string -- take only the first line to keep it concise
|
|
117
|
+
let version = null;
|
|
118
|
+
const rawVersion = tryExecFile(spec.binary, spec.versionFlag.split(/\s+/));
|
|
119
|
+
if (rawVersion) {
|
|
120
|
+
version = rawVersion.split('\n')[0].trim();
|
|
121
|
+
}
|
|
122
|
+
const configDirExists = (0, node_fs_1.existsSync)(spec.configDir);
|
|
123
|
+
const hasCredentials = configDirExists && spec.credentialFiles.some(f => (0, node_fs_1.existsSync)((0, node_path_1.join)(spec.configDir, f)));
|
|
124
|
+
results.push({
|
|
125
|
+
name: spec.name,
|
|
126
|
+
path: binaryPath,
|
|
127
|
+
version,
|
|
128
|
+
configDir: configDirExists ? spec.configDir : null,
|
|
129
|
+
hasCredentials,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
return results;
|
|
133
|
+
}
|
|
134
|
+
const ASSISTANT_SPECS = [
|
|
135
|
+
{
|
|
136
|
+
name: 'Claude Code',
|
|
137
|
+
envVars: ['CLAUDE_CODE'],
|
|
138
|
+
configDirs: [(0, node_path_1.join)((0, node_os_1.homedir)(), '.claude')],
|
|
139
|
+
processEnv: 'TERM_PROGRAM',
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: 'Cursor',
|
|
143
|
+
envVars: ['CURSOR'],
|
|
144
|
+
configDirs: [(0, node_path_1.join)((0, node_os_1.homedir)(), '.cursor')],
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: 'GitHub Copilot',
|
|
148
|
+
envVars: ['GITHUB_COPILOT'],
|
|
149
|
+
configDirs: [(0, node_path_1.join)((0, node_os_1.homedir)(), '.config', 'github-copilot')],
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
name: 'Windsurf',
|
|
153
|
+
envVars: [],
|
|
154
|
+
configDirs: [(0, node_path_1.join)((0, node_os_1.homedir)(), '.windsurf')],
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
name: 'Aider',
|
|
158
|
+
envVars: ['AIDER'],
|
|
159
|
+
configDirs: [],
|
|
160
|
+
},
|
|
161
|
+
];
|
|
162
|
+
function detectAssistants(targetDir) {
|
|
163
|
+
const results = [];
|
|
164
|
+
for (const spec of ASSISTANT_SPECS) {
|
|
165
|
+
let detected = false;
|
|
166
|
+
let method = 'config';
|
|
167
|
+
let detail = '';
|
|
168
|
+
const configPaths = [];
|
|
169
|
+
// Check process-level env (TERM_PROGRAM for Claude Code)
|
|
170
|
+
if (spec.name === 'Claude Code' && process.env['TERM_PROGRAM'] === 'claude') {
|
|
171
|
+
detected = true;
|
|
172
|
+
method = 'process';
|
|
173
|
+
detail = 'TERM_PROGRAM=claude';
|
|
174
|
+
}
|
|
175
|
+
// Check env vars
|
|
176
|
+
if (!detected) {
|
|
177
|
+
for (const envVar of spec.envVars) {
|
|
178
|
+
if (process.env[envVar]) {
|
|
179
|
+
detected = true;
|
|
180
|
+
method = 'env';
|
|
181
|
+
detail = `${envVar} is set`;
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Check config directories
|
|
187
|
+
for (const dir of spec.configDirs) {
|
|
188
|
+
if ((0, node_fs_1.existsSync)(dir)) {
|
|
189
|
+
if (!detected) {
|
|
190
|
+
detected = true;
|
|
191
|
+
method = 'config';
|
|
192
|
+
detail = `Config directory found: ${dir}`;
|
|
193
|
+
}
|
|
194
|
+
configPaths.push(dir);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// Aider: also check for .aider* files in the target directory
|
|
198
|
+
if (spec.name === 'Aider') {
|
|
199
|
+
const aiderConfFiles = ['.aider.conf.yml', '.aider.model.settings.yml', '.aider.input.history'];
|
|
200
|
+
for (const f of aiderConfFiles) {
|
|
201
|
+
const p = (0, node_path_1.join)(targetDir, f);
|
|
202
|
+
if ((0, node_fs_1.existsSync)(p)) {
|
|
203
|
+
if (!detected) {
|
|
204
|
+
detected = true;
|
|
205
|
+
method = 'config';
|
|
206
|
+
detail = `Aider config found: ${f}`;
|
|
207
|
+
}
|
|
208
|
+
configPaths.push(p);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (detected) {
|
|
213
|
+
results.push({ name: spec.name, detected, method, detail, configPaths });
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return results;
|
|
217
|
+
}
|
|
218
|
+
// ---------------------------------------------------------------------------
|
|
219
|
+
// MCP server detection
|
|
220
|
+
// ---------------------------------------------------------------------------
|
|
221
|
+
/** Paths (relative to project and home) that may contain mcpServers config. */
|
|
222
|
+
function mcpConfigPaths(targetDir) {
|
|
223
|
+
return [
|
|
224
|
+
{ label: 'mcp.json', path: (0, node_path_1.join)(targetDir, 'mcp.json') },
|
|
225
|
+
{ label: '.mcp.json', path: (0, node_path_1.join)(targetDir, '.mcp.json') },
|
|
226
|
+
{ label: '.claude/settings.json', path: (0, node_path_1.join)(targetDir, '.claude', 'settings.json') },
|
|
227
|
+
{ label: '.cursor/mcp.json', path: (0, node_path_1.join)(targetDir, '.cursor', 'mcp.json') },
|
|
228
|
+
{ label: '~/.claude/settings.json', path: (0, node_path_1.join)((0, node_os_1.homedir)(), '.claude', 'settings.json') },
|
|
229
|
+
];
|
|
230
|
+
}
|
|
231
|
+
/** Redact values that look like environment variable references or secrets. */
|
|
232
|
+
function redactEnv(env) {
|
|
233
|
+
const redacted = {};
|
|
234
|
+
for (const [key, value] of Object.entries(env)) {
|
|
235
|
+
if (typeof value === 'string' && value.length > 0) {
|
|
236
|
+
redacted[key] = '[REDACTED]';
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
redacted[key] = String(value ?? '');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return redacted;
|
|
243
|
+
}
|
|
244
|
+
function detectMcpServers(targetDir) {
|
|
245
|
+
const results = [];
|
|
246
|
+
const seen = new Set();
|
|
247
|
+
for (const { label, path: cfgPath } of mcpConfigPaths(targetDir)) {
|
|
248
|
+
const data = readJson(cfgPath);
|
|
249
|
+
if (!data)
|
|
250
|
+
continue;
|
|
251
|
+
const servers = data['mcpServers'];
|
|
252
|
+
if (!servers || typeof servers !== 'object')
|
|
253
|
+
continue;
|
|
254
|
+
for (const [name, raw] of Object.entries(servers)) {
|
|
255
|
+
// Deduplicate by server name per source file
|
|
256
|
+
const dedupeKey = `${label}:${name}`;
|
|
257
|
+
if (seen.has(dedupeKey))
|
|
258
|
+
continue;
|
|
259
|
+
seen.add(dedupeKey);
|
|
260
|
+
if (!raw || typeof raw !== 'object')
|
|
261
|
+
continue;
|
|
262
|
+
const entry = raw;
|
|
263
|
+
const command = typeof entry['command'] === 'string' ? entry['command'] : '';
|
|
264
|
+
const args = Array.isArray(entry['args'])
|
|
265
|
+
? entry['args'].map(a => String(a))
|
|
266
|
+
: [];
|
|
267
|
+
const env = entry['env'] && typeof entry['env'] === 'object'
|
|
268
|
+
? redactEnv(entry['env'])
|
|
269
|
+
: {};
|
|
270
|
+
results.push({
|
|
271
|
+
name,
|
|
272
|
+
source: label,
|
|
273
|
+
command,
|
|
274
|
+
args,
|
|
275
|
+
env,
|
|
276
|
+
tools: [], // Tool enumeration requires MCP handshake; left empty during static scan
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return results;
|
|
281
|
+
}
|
|
282
|
+
function buildOAuthSpecs(detectedClis) {
|
|
283
|
+
const specs = [];
|
|
284
|
+
for (const cli of detectedClis) {
|
|
285
|
+
if (!cli.configDir)
|
|
286
|
+
continue;
|
|
287
|
+
switch (cli.name) {
|
|
288
|
+
case 'aws':
|
|
289
|
+
specs.push({
|
|
290
|
+
provider: 'aws',
|
|
291
|
+
configDir: cli.configDir,
|
|
292
|
+
credentialFiles: ['credentials', 'sso/cache'],
|
|
293
|
+
});
|
|
294
|
+
break;
|
|
295
|
+
case 'az':
|
|
296
|
+
specs.push({
|
|
297
|
+
provider: 'azure',
|
|
298
|
+
configDir: cli.configDir,
|
|
299
|
+
credentialFiles: ['msal_token_cache.json', 'accessTokens.json'],
|
|
300
|
+
});
|
|
301
|
+
break;
|
|
302
|
+
case 'gcloud':
|
|
303
|
+
specs.push({
|
|
304
|
+
provider: 'gcp',
|
|
305
|
+
configDir: cli.configDir,
|
|
306
|
+
credentialFiles: ['application_default_credentials.json', 'credentials.db'],
|
|
307
|
+
});
|
|
308
|
+
break;
|
|
309
|
+
case 'gh':
|
|
310
|
+
specs.push({
|
|
311
|
+
provider: 'github',
|
|
312
|
+
configDir: cli.configDir,
|
|
313
|
+
credentialFiles: ['hosts.yml'],
|
|
314
|
+
});
|
|
315
|
+
break;
|
|
316
|
+
case 'vercel':
|
|
317
|
+
specs.push({
|
|
318
|
+
provider: 'vercel',
|
|
319
|
+
configDir: cli.configDir,
|
|
320
|
+
credentialFiles: ['auth.json'],
|
|
321
|
+
});
|
|
322
|
+
break;
|
|
323
|
+
case 'kubectl':
|
|
324
|
+
specs.push({
|
|
325
|
+
provider: 'kubernetes',
|
|
326
|
+
configDir: cli.configDir,
|
|
327
|
+
credentialFiles: ['config'],
|
|
328
|
+
});
|
|
329
|
+
break;
|
|
330
|
+
case 'terraform':
|
|
331
|
+
specs.push({
|
|
332
|
+
provider: 'terraform',
|
|
333
|
+
configDir: cli.configDir,
|
|
334
|
+
credentialFiles: ['credentials.tfrc.json'],
|
|
335
|
+
});
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return specs;
|
|
340
|
+
}
|
|
341
|
+
function detectOAuthSessions(detectedClis) {
|
|
342
|
+
const results = [];
|
|
343
|
+
const specs = buildOAuthSpecs(detectedClis);
|
|
344
|
+
for (const spec of specs) {
|
|
345
|
+
let hasActiveSession = false;
|
|
346
|
+
let latestMtime = null;
|
|
347
|
+
for (const credFile of spec.credentialFiles) {
|
|
348
|
+
const fullPath = (0, node_path_1.join)(spec.configDir, credFile);
|
|
349
|
+
if (!(0, node_fs_1.existsSync)(fullPath))
|
|
350
|
+
continue;
|
|
351
|
+
hasActiveSession = true;
|
|
352
|
+
const mtime = fileMtime(fullPath);
|
|
353
|
+
if (mtime && (!latestMtime || mtime > latestMtime)) {
|
|
354
|
+
latestMtime = mtime;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
results.push({
|
|
358
|
+
provider: spec.provider,
|
|
359
|
+
configDir: spec.configDir,
|
|
360
|
+
hasActiveSession,
|
|
361
|
+
lastModified: latestMtime,
|
|
362
|
+
scopes: [], // Scope extraction would require parsing provider-specific token formats
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
return results;
|
|
366
|
+
}
|
|
367
|
+
// ---------------------------------------------------------------------------
|
|
368
|
+
// Public API
|
|
369
|
+
// ---------------------------------------------------------------------------
|
|
370
|
+
/**
|
|
371
|
+
* Scan the current developer workstation and project directory for
|
|
372
|
+
* CLIs, AI assistants, MCP servers, and OAuth sessions.
|
|
373
|
+
*
|
|
374
|
+
* @param targetDir - Directory to scan for project-level artifacts.
|
|
375
|
+
* Defaults to `process.cwd()`.
|
|
376
|
+
*/
|
|
377
|
+
function detectEnvironment(targetDir) {
|
|
378
|
+
const dir = (0, node_path_1.resolve)(targetDir ?? process.cwd());
|
|
379
|
+
// CLI detection
|
|
380
|
+
const clis = detectClis();
|
|
381
|
+
// Assistant detection
|
|
382
|
+
const assistants = detectAssistants(dir);
|
|
383
|
+
// MCP server detection
|
|
384
|
+
const mcpServers = detectMcpServers(dir);
|
|
385
|
+
// OAuth session detection (depends on detected CLIs)
|
|
386
|
+
const oauthSessions = detectOAuthSessions(clis);
|
|
387
|
+
// Project detection (reuse existing utility)
|
|
388
|
+
const project = (0, detect_js_1.detectProject)(dir);
|
|
389
|
+
return {
|
|
390
|
+
timestamp: new Date().toISOString(),
|
|
391
|
+
hostname: (0, node_os_1.hostname)(),
|
|
392
|
+
platform: (0, node_os_1.platform)(),
|
|
393
|
+
shell: process.env['SHELL'] ?? 'unknown',
|
|
394
|
+
clis,
|
|
395
|
+
assistants,
|
|
396
|
+
mcpServers,
|
|
397
|
+
oauthSessions,
|
|
398
|
+
projectType: project.type,
|
|
399
|
+
projectName: project.name,
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/shield/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shield tamper-evident event system.
|
|
3
|
+
*
|
|
4
|
+
* Events are stored as newline-delimited JSON (JSONL) with SHA-256 hash
|
|
5
|
+
* chains. Each event references the hash of the previous event, forming
|
|
6
|
+
* an append-only tamper-evident log. The very first event in the chain
|
|
7
|
+
* uses SHA-256("genesis") as its prevHash.
|
|
8
|
+
*/
|
|
9
|
+
import type { ShieldEvent } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Generate a UUIDv7 (time-sortable) per RFC 9562.
|
|
12
|
+
*
|
|
13
|
+
* Layout (128 bits):
|
|
14
|
+
* 48 bits - unix_ts_ms
|
|
15
|
+
* 4 bits - version (0b0111)
|
|
16
|
+
* 12 bits - rand_a
|
|
17
|
+
* 2 bits - variant (0b10)
|
|
18
|
+
* 62 bits - rand_b
|
|
19
|
+
*/
|
|
20
|
+
export declare function uuidv7(): string;
|
|
21
|
+
/** Return the absolute path to the Shield data directory (~/.opena2a/shield). */
|
|
22
|
+
export declare function getShieldDir(): string;
|
|
23
|
+
/** Return the absolute path to the events JSONL file. */
|
|
24
|
+
export declare function getEventsPath(): string;
|
|
25
|
+
export declare const GENESIS_HASH: string;
|
|
26
|
+
/** Fields that writeEvent generates automatically. */
|
|
27
|
+
type GeneratedFields = 'id' | 'timestamp' | 'version' | 'prevHash' | 'eventHash';
|
|
28
|
+
/**
|
|
29
|
+
* Write a new event to the tamper-evident log.
|
|
30
|
+
*
|
|
31
|
+
* The caller provides all event fields except id, timestamp, version,
|
|
32
|
+
* prevHash, and eventHash -- those are generated automatically.
|
|
33
|
+
*/
|
|
34
|
+
export declare function writeEvent(partial: Omit<ShieldEvent, GeneratedFields>): ShieldEvent;
|
|
35
|
+
export interface EventFilters {
|
|
36
|
+
count?: number;
|
|
37
|
+
source?: string;
|
|
38
|
+
severity?: string;
|
|
39
|
+
agent?: string;
|
|
40
|
+
since?: string;
|
|
41
|
+
category?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Read events from the JSONL log file, applying optional filters.
|
|
45
|
+
*
|
|
46
|
+
* Returns events in newest-first order. Corrupted JSON lines are
|
|
47
|
+
* silently skipped.
|
|
48
|
+
*/
|
|
49
|
+
export declare function readEvents(filters?: EventFilters): ShieldEvent[];
|
|
50
|
+
/**
|
|
51
|
+
* Verify the integrity of a hash chain.
|
|
52
|
+
*
|
|
53
|
+
* Events must be provided in chronological order (oldest first).
|
|
54
|
+
* The first event's prevHash must equal SHA-256("genesis").
|
|
55
|
+
*
|
|
56
|
+
* Returns { valid: true, brokenAt: null } if the chain is intact,
|
|
57
|
+
* or { valid: false, brokenAt: <index> } pointing to the first
|
|
58
|
+
* event where the chain breaks.
|
|
59
|
+
*/
|
|
60
|
+
export declare function verifyEventChain(events: ShieldEvent[]): {
|
|
61
|
+
valid: boolean;
|
|
62
|
+
brokenAt: number | null;
|
|
63
|
+
};
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/shield/events.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAO9C;;;;;;;;;GASG;AACH,wBAAgB,MAAM,IAAI,MAAM,CAmC/B;AAMD,iFAAiF;AACjF,wBAAgB,YAAY,IAAI,MAAM,CAMrC;AAED,yDAAyD;AACzD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAMD,eAAO,MAAM,YAAY,QAAuD,CAAC;AA6EjF,sDAAsD;AACtD,KAAK,eAAe,GAAG,IAAI,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;AAEjF;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,GAAG,WAAW,CAuCnF;AAMD,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA8CD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,YAAiB,GAAG,WAAW,EAAE,CAuEpE;AAMD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EAAE,GACpB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CA6B7C"}
|