@shield-agent/kya 0.24.2 → 0.26.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/.cursor-plugin/plugin.json +1 -1
- package/.mcp.json +1 -1
- package/LIMITATIONS.md +3 -3
- package/README.md +27 -5
- package/amp/README.md +2 -2
- package/amp/settings.example.json +1 -1
- package/claude/claude_desktop_config.example.json +1 -1
- package/claude/run-stdio.mjs +1 -1
- package/cline/README.md +1 -1
- package/cline/cline_mcp_settings.example.json +1 -1
- package/copilot/README.md +1 -1
- package/copilot/mcp-config.example.json +1 -1
- package/dist/cli.d.ts +3 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +109 -9
- package/dist/cli.js.map +1 -1
- package/dist/commands/connect.d.ts +3 -0
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +16 -1
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/discover.d.ts +21 -0
- package/dist/commands/discover.d.ts.map +1 -0
- package/dist/commands/discover.js +140 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/hook.d.ts +17 -0
- package/dist/commands/hook.d.ts.map +1 -1
- package/dist/commands/hook.js +199 -6
- package/dist/commands/hook.js.map +1 -1
- package/dist/commands/hosted-hook.d.ts +164 -0
- package/dist/commands/hosted-hook.d.ts.map +1 -0
- package/dist/commands/hosted-hook.js +610 -0
- package/dist/commands/hosted-hook.js.map +1 -0
- package/dist/commands/import-traces.js +2 -2
- package/dist/commands/import-traces.js.map +1 -1
- package/dist/commands/team.d.ts +35 -0
- package/dist/commands/team.d.ts.map +1 -0
- package/dist/commands/team.js +174 -0
- package/dist/commands/team.js.map +1 -0
- package/dist/commands/wire-hooks.d.ts +9 -1
- package/dist/commands/wire-hooks.d.ts.map +1 -1
- package/dist/commands/wire-hooks.js +38 -9
- package/dist/commands/wire-hooks.js.map +1 -1
- package/dist/discover/catalog.d.ts +30 -0
- package/dist/discover/catalog.d.ts.map +1 -0
- package/dist/discover/catalog.js +166 -0
- package/dist/discover/catalog.js.map +1 -0
- package/dist/discover/push.d.ts +21 -0
- package/dist/discover/push.d.ts.map +1 -0
- package/dist/discover/push.js +40 -0
- package/dist/discover/push.js.map +1 -0
- package/dist/discover/scan.d.ts +74 -0
- package/dist/discover/scan.d.ts.map +1 -0
- package/dist/discover/scan.js +448 -0
- package/dist/discover/scan.js.map +1 -0
- package/dist/discover/snapshot.d.ts +32 -0
- package/dist/discover/snapshot.d.ts.map +1 -0
- package/dist/discover/snapshot.js +92 -0
- package/dist/discover/snapshot.js.map +1 -0
- package/dist/fs-atomic.d.ts +8 -3
- package/dist/fs-atomic.d.ts.map +1 -1
- package/dist/fs-atomic.js +42 -17
- package/dist/fs-atomic.js.map +1 -1
- package/dist/importers/adr-sensor.d.ts +12 -0
- package/dist/importers/adr-sensor.d.ts.map +1 -0
- package/dist/importers/adr-sensor.js +272 -0
- package/dist/importers/adr-sensor.js.map +1 -0
- package/dist/importers/formats.d.ts.map +1 -1
- package/dist/importers/formats.js +4 -0
- package/dist/importers/formats.js.map +1 -1
- package/dist/importers/index.d.ts.map +1 -1
- package/dist/importers/index.js +3 -0
- package/dist/importers/index.js.map +1 -1
- package/dist/parse-args.d.ts.map +1 -1
- package/dist/parse-args.js +3 -1
- package/dist/parse-args.js.map +1 -1
- package/dist/receipt/enrich.d.ts +12 -0
- package/dist/receipt/enrich.d.ts.map +1 -1
- package/dist/receipt/enrich.js +30 -0
- package/dist/receipt/enrich.js.map +1 -1
- package/dist/receipt/live-server.d.ts +2 -0
- package/dist/receipt/live-server.d.ts.map +1 -1
- package/dist/receipt/live-server.js +28 -2
- package/dist/receipt/live-server.js.map +1 -1
- package/dist/receipt/render-receipt.d.ts +3 -1
- package/dist/receipt/render-receipt.d.ts.map +1 -1
- package/dist/receipt/render-receipt.js +48 -7
- package/dist/receipt/render-receipt.js.map +1 -1
- package/dist/trail.d.ts +5 -1
- package/dist/trail.d.ts.map +1 -1
- package/dist/trail.js +3 -1
- package/dist/trail.js.map +1 -1
- package/droid/README.md +3 -3
- package/droid/mcp.example.json +1 -1
- package/gemini/settings.example.json +1 -1
- package/grok/README.md +1 -1
- package/kilo/README.md +1 -1
- package/kilo/kilo.example.json +1 -1
- package/kimi/README.md +1 -1
- package/kimi/mcp.example.json +1 -1
- package/kiro/README.md +1 -1
- package/kiro/mcp.example.json +1 -1
- package/manifest.json +1 -1
- package/mastracode/README.md +1 -1
- package/mastracode/mcp.example.json +1 -1
- package/mcp.json +1 -1
- package/openai/codex.config.example.toml +2 -2
- package/openai/responses-mcp.example.json +1 -1
- package/opencode/README.md +1 -1
- package/opencode/opencode.example.json +1 -1
- package/package.json +2 -2
- package/qwen/README.md +1 -1
- package/qwen/settings.example.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hosted sync for discovery snapshots.
|
|
3
|
+
*
|
|
4
|
+
* Pushes the local endpoint inventory to `POST /api/v1/kya/endpoints` on the
|
|
5
|
+
* hosted console. This is fire-and-forget from the scanner's perspective: it
|
|
6
|
+
* returns an outcome object so the CLI can print status, but it never throws.
|
|
7
|
+
*/
|
|
8
|
+
import { CLI_VERSION } from "../version.js";
|
|
9
|
+
function stripTrailingSlash(url) {
|
|
10
|
+
return url.endsWith("/") ? url.slice(0, -1) : url;
|
|
11
|
+
}
|
|
12
|
+
export async function pushDiscoverySnapshot(snapshot, opts) {
|
|
13
|
+
const baseUrl = stripTrailingSlash(opts.baseUrl.trim());
|
|
14
|
+
const url = `${baseUrl}/api/v1/kya/endpoints`;
|
|
15
|
+
const fetchFn = opts.fetchFn ?? globalThis.fetch;
|
|
16
|
+
const timeoutMs = opts.timeoutMs ?? 10_000;
|
|
17
|
+
try {
|
|
18
|
+
const res = await fetchFn(url, {
|
|
19
|
+
method: "POST",
|
|
20
|
+
headers: {
|
|
21
|
+
Authorization: `Bearer ${opts.apiKey.trim()}`,
|
|
22
|
+
"Content-Type": "application/json; charset=utf-8",
|
|
23
|
+
"User-Agent": `shield-agent-kya-cli/${CLI_VERSION}`,
|
|
24
|
+
},
|
|
25
|
+
body: JSON.stringify(snapshot),
|
|
26
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
27
|
+
redirect: "error",
|
|
28
|
+
});
|
|
29
|
+
if (!res.ok) {
|
|
30
|
+
const text = await res.text().catch(() => "");
|
|
31
|
+
return { ok: false, status: res.status, error: `HTTP ${res.status}${text ? ` ${text}` : ""}` };
|
|
32
|
+
}
|
|
33
|
+
return { ok: true, status: res.status };
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
37
|
+
return { ok: false, status: 0, error: message };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=push.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/discover/push.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAgB5C,SAAS,kBAAkB,CAAC,GAAW;IACrC,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAA2B,EAC3B,IAAiB;IAEjB,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,GAAG,OAAO,uBAAuB,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;YAC7B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;gBAC7C,cAAc,EAAE,iCAAiC;gBACjD,YAAY,EAAE,wBAAwB,WAAW,EAAE;aACpD;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;YAC9B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;YACtC,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;QACjG,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAClD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Endpoint discovery scanner.
|
|
3
|
+
*
|
|
4
|
+
* Collects a best-effort inventory of AI agents, IDE extensions, desktop apps,
|
|
5
|
+
* model runtimes, and MCP servers present on the local workstation. The scanner
|
|
6
|
+
* only inspects paths and config files; it never executes discovered binaries
|
|
7
|
+
* and never connects to runtime ports.
|
|
8
|
+
*/
|
|
9
|
+
import type { DiscoveryCategory } from "./catalog.js";
|
|
10
|
+
export type Confidence = "high" | "medium" | "low";
|
|
11
|
+
export interface DiscoveryEvidence {
|
|
12
|
+
readonly path?: string;
|
|
13
|
+
readonly version?: string;
|
|
14
|
+
readonly port?: number;
|
|
15
|
+
readonly command?: string;
|
|
16
|
+
readonly configPath?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface DiscoveryFinding {
|
|
19
|
+
readonly id: string;
|
|
20
|
+
readonly name: string;
|
|
21
|
+
readonly vendor: string;
|
|
22
|
+
readonly category: DiscoveryCategory;
|
|
23
|
+
readonly source: string;
|
|
24
|
+
readonly confidence: Confidence;
|
|
25
|
+
readonly evidence: DiscoveryEvidence;
|
|
26
|
+
}
|
|
27
|
+
export interface DiscoveryCoverage {
|
|
28
|
+
readonly attempted: readonly string[];
|
|
29
|
+
readonly unavailable: readonly string[];
|
|
30
|
+
readonly truncated: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface DiscoverySnapshot {
|
|
33
|
+
readonly endpointUid: string;
|
|
34
|
+
readonly hostnameHash: string;
|
|
35
|
+
readonly os: "darwin" | "linux" | "win32" | "unknown";
|
|
36
|
+
readonly capturedAt: string;
|
|
37
|
+
readonly inventory: readonly DiscoveryFinding[];
|
|
38
|
+
readonly coverage: DiscoveryCoverage;
|
|
39
|
+
}
|
|
40
|
+
export interface ScanOptions {
|
|
41
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
42
|
+
readonly cwd?: string;
|
|
43
|
+
readonly now?: Date;
|
|
44
|
+
/** Injected fs-ish object for tests. */
|
|
45
|
+
readonly fs?: ScanFs;
|
|
46
|
+
/** Override PATH directories (defaults to process.env.PATH). */
|
|
47
|
+
readonly pathDirs?: readonly string[];
|
|
48
|
+
/** Override home dir used for redaction (defaults to os.homedir()). */
|
|
49
|
+
readonly homeDir?: string;
|
|
50
|
+
/** Override OS platform (defaults to process.platform). */
|
|
51
|
+
readonly platform?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface ScanFs {
|
|
54
|
+
existsSync(path: string): boolean;
|
|
55
|
+
statSync(path: string): {
|
|
56
|
+
isFile(): boolean;
|
|
57
|
+
isDirectory(): boolean;
|
|
58
|
+
mode: number;
|
|
59
|
+
size: number;
|
|
60
|
+
};
|
|
61
|
+
readdirSync(path: string): readonly string[];
|
|
62
|
+
readFileSync(path: string, encoding: "utf8"): string;
|
|
63
|
+
}
|
|
64
|
+
export declare function buildEndpointId(os: DiscoverySnapshot["os"]): {
|
|
65
|
+
endpointUid: string;
|
|
66
|
+
hostnameHash: string;
|
|
67
|
+
};
|
|
68
|
+
export declare function scanCliBinaries(pathDirs: readonly string[], fs: ScanFs, platformName: string): DiscoveryFinding[];
|
|
69
|
+
export declare function scanIdeExtensions(extensionRoots: readonly string[], fs: ScanFs): DiscoveryFinding[];
|
|
70
|
+
export declare function scanDesktopApps(appDirs: readonly string[], fs: ScanFs, platformName: string): DiscoveryFinding[];
|
|
71
|
+
export declare function scanModelRuntimes(pathDirs: readonly string[], fs: ScanFs, platformName: string): DiscoveryFinding[];
|
|
72
|
+
export declare function scanMcpServers(configPaths: readonly string[], fs: ScanFs): DiscoveryFinding[];
|
|
73
|
+
export declare function scanEndpoint(options?: ScanOptions): DiscoverySnapshot;
|
|
74
|
+
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/discover/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Endpoint discovery scanner.
|
|
3
|
+
*
|
|
4
|
+
* Collects a best-effort inventory of AI agents, IDE extensions, desktop apps,
|
|
5
|
+
* model runtimes, and MCP servers present on the local workstation. The scanner
|
|
6
|
+
* only inspects paths and config files; it never executes discovered binaries
|
|
7
|
+
* and never connects to runtime ports.
|
|
8
|
+
*/
|
|
9
|
+
import { createHash } from "node:crypto";
|
|
10
|
+
import { constants } from "node:fs";
|
|
11
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
12
|
+
import { homedir, hostname, userInfo } from "node:os";
|
|
13
|
+
import { join, sep } from "node:path";
|
|
14
|
+
import { discoveryCatalog, knownDiscoveryVendors } from "./catalog.js";
|
|
15
|
+
const ATTEMPTED_CATEGORIES = [
|
|
16
|
+
"cli-binaries",
|
|
17
|
+
"ide-extensions",
|
|
18
|
+
"desktop-apps",
|
|
19
|
+
"model-runtimes",
|
|
20
|
+
"mcp-servers",
|
|
21
|
+
];
|
|
22
|
+
function nodeFs() {
|
|
23
|
+
return { existsSync, statSync, readdirSync, readFileSync };
|
|
24
|
+
}
|
|
25
|
+
function defaultPathDirs(env) {
|
|
26
|
+
const raw = env.PATH ?? "";
|
|
27
|
+
return raw
|
|
28
|
+
.split(process.platform === "win32" ? ";" : ":")
|
|
29
|
+
.map((p) => p.trim())
|
|
30
|
+
.filter((p) => p.length > 0);
|
|
31
|
+
}
|
|
32
|
+
function sha256(input) {
|
|
33
|
+
return createHash("sha256").update(input).digest("hex");
|
|
34
|
+
}
|
|
35
|
+
function detectOs(raw) {
|
|
36
|
+
const p = raw ?? process.platform;
|
|
37
|
+
if (p === "darwin")
|
|
38
|
+
return "darwin";
|
|
39
|
+
if (p === "linux")
|
|
40
|
+
return "linux";
|
|
41
|
+
if (p === "win32")
|
|
42
|
+
return "win32";
|
|
43
|
+
return "unknown";
|
|
44
|
+
}
|
|
45
|
+
function redactValue(value, home) {
|
|
46
|
+
if (typeof value === "string") {
|
|
47
|
+
const prefix = home.endsWith(sep) ? home : home + sep;
|
|
48
|
+
if (value === home)
|
|
49
|
+
return "~";
|
|
50
|
+
if (value.startsWith(prefix))
|
|
51
|
+
return "~" + sep + value.slice(prefix.length);
|
|
52
|
+
}
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
function redactEvidence(evidence, home) {
|
|
56
|
+
const out = {};
|
|
57
|
+
for (const [key, value] of Object.entries(evidence)) {
|
|
58
|
+
out[key] = redactValue(value, home);
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
function isExecutable(st, isWindows) {
|
|
63
|
+
if (!st.isFile())
|
|
64
|
+
return false;
|
|
65
|
+
if (isWindows)
|
|
66
|
+
return true; // extension check is done by caller
|
|
67
|
+
// eslint-disable-next-line no-bitwise
|
|
68
|
+
return (st.mode & constants.S_IXUSR) !== 0 || (st.mode & constants.S_IXOTH) !== 0;
|
|
69
|
+
}
|
|
70
|
+
function isWindowsPlatform(platformName) {
|
|
71
|
+
return platformName === "win32";
|
|
72
|
+
}
|
|
73
|
+
export function buildEndpointId(os) {
|
|
74
|
+
const host = hostname();
|
|
75
|
+
const user = userInfo().username;
|
|
76
|
+
const hostnameHash = sha256(host);
|
|
77
|
+
const userHash = sha256(user);
|
|
78
|
+
const stableId = `${os}:${hostnameHash}:${userHash}`;
|
|
79
|
+
return { endpointUid: sha256(stableId), hostnameHash };
|
|
80
|
+
}
|
|
81
|
+
function pathCandidates(pathDirs) {
|
|
82
|
+
const catalog = discoveryCatalog();
|
|
83
|
+
const candidates = [];
|
|
84
|
+
for (const [entryId, entry] of catalog) {
|
|
85
|
+
for (const binary of entry.binaries) {
|
|
86
|
+
for (const dir of pathDirs) {
|
|
87
|
+
candidates.push({ entryId, binary, path: join(dir, binary) });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return candidates;
|
|
92
|
+
}
|
|
93
|
+
function extensionRootDirs(home, platformName) {
|
|
94
|
+
if (isWindowsPlatform(platformName)) {
|
|
95
|
+
const appdata = process.env.APPDATA ?? join(home, "AppData", "Roaming");
|
|
96
|
+
return [
|
|
97
|
+
join(appdata, "Cursor", "User", "globalStorage"),
|
|
98
|
+
join(appdata, "Code", "User", "globalStorage"),
|
|
99
|
+
];
|
|
100
|
+
}
|
|
101
|
+
if (platformName === "darwin") {
|
|
102
|
+
return [
|
|
103
|
+
join(home, "Library", "Application Support", "Cursor", "User", "globalStorage"),
|
|
104
|
+
join(home, "Library", "Application Support", "Code", "User", "globalStorage"),
|
|
105
|
+
];
|
|
106
|
+
}
|
|
107
|
+
return [
|
|
108
|
+
join(home, ".config", "Cursor", "User", "globalStorage"),
|
|
109
|
+
join(home, ".config", "Code", "User", "globalStorage"),
|
|
110
|
+
];
|
|
111
|
+
}
|
|
112
|
+
function desktopAppDirs(platformName) {
|
|
113
|
+
if (platformName === "darwin")
|
|
114
|
+
return ["/Applications"];
|
|
115
|
+
if (platformName === "linux")
|
|
116
|
+
return ["/usr/share/applications", "/usr/local/share/applications"];
|
|
117
|
+
if (isWindowsPlatform(platformName)) {
|
|
118
|
+
const pf = process.env["ProgramFiles"] ?? "C:\\Program Files";
|
|
119
|
+
const pf86 = process.env["ProgramFiles(x86)"] ?? "C:\\Program Files (x86)";
|
|
120
|
+
return [pf, pf86];
|
|
121
|
+
}
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
function tryReadJsonFile(fs, path) {
|
|
125
|
+
try {
|
|
126
|
+
return JSON.parse(fs.readFileSync(path, "utf8"));
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
export function scanCliBinaries(pathDirs, fs, platformName) {
|
|
133
|
+
const findings = [];
|
|
134
|
+
const catalog = discoveryCatalog();
|
|
135
|
+
const seen = new Set();
|
|
136
|
+
const isWin = isWindowsPlatform(platformName);
|
|
137
|
+
for (const { entryId, path } of pathCandidates(pathDirs)) {
|
|
138
|
+
const key = `${entryId}:${path}`;
|
|
139
|
+
if (seen.has(key))
|
|
140
|
+
continue;
|
|
141
|
+
seen.add(key);
|
|
142
|
+
try {
|
|
143
|
+
const st = fs.statSync(path);
|
|
144
|
+
const candidatePath = isWin && !path.toLowerCase().endsWith(".exe") ? `${path}.exe` : path;
|
|
145
|
+
const candidateSt = candidatePath !== path && fs.existsSync(candidatePath)
|
|
146
|
+
? fs.statSync(candidatePath)
|
|
147
|
+
: st;
|
|
148
|
+
if (!isExecutable(candidateSt, isWin))
|
|
149
|
+
continue;
|
|
150
|
+
const entry = catalog.get(entryId);
|
|
151
|
+
findings.push({
|
|
152
|
+
id: entryId,
|
|
153
|
+
name: entry.name,
|
|
154
|
+
vendor: entry.vendor,
|
|
155
|
+
category: entry.category,
|
|
156
|
+
source: `PATH:${path}`,
|
|
157
|
+
confidence: "high",
|
|
158
|
+
evidence: { path: candidatePath },
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
/* not found or not readable */
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return findings;
|
|
166
|
+
}
|
|
167
|
+
export function scanIdeExtensions(extensionRoots, fs) {
|
|
168
|
+
const findings = [];
|
|
169
|
+
const catalog = discoveryCatalog();
|
|
170
|
+
const vendors = knownDiscoveryVendors();
|
|
171
|
+
const seen = new Set();
|
|
172
|
+
for (const root of extensionRoots) {
|
|
173
|
+
let entries = [];
|
|
174
|
+
try {
|
|
175
|
+
entries = fs.readdirSync(root);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
for (const extId of entries) {
|
|
181
|
+
const lower = extId.toLowerCase();
|
|
182
|
+
let matchedEntry;
|
|
183
|
+
let confidence = "low";
|
|
184
|
+
for (const [id, entry] of catalog) {
|
|
185
|
+
for (const marker of entry.extensionMarkers) {
|
|
186
|
+
if (lower.includes(marker.toLowerCase())) {
|
|
187
|
+
matchedEntry = { id, name: entry.name, vendor: entry.vendor, category: entry.category };
|
|
188
|
+
confidence = marker === entry.id ? "medium" : "low";
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (matchedEntry)
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
if (!matchedEntry) {
|
|
196
|
+
// Generic vendor match: still report as ide-extension with unknown id.
|
|
197
|
+
const vendor = vendors.find((v) => lower.includes(v));
|
|
198
|
+
if (vendor) {
|
|
199
|
+
matchedEntry = {
|
|
200
|
+
id: `ide-ext-${vendor}`,
|
|
201
|
+
name: `${vendor} extension`,
|
|
202
|
+
vendor,
|
|
203
|
+
category: "ide-extension",
|
|
204
|
+
};
|
|
205
|
+
confidence = "low";
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (!matchedEntry)
|
|
209
|
+
continue;
|
|
210
|
+
const key = `${matchedEntry.id}:${extId}`;
|
|
211
|
+
if (seen.has(key))
|
|
212
|
+
continue;
|
|
213
|
+
seen.add(key);
|
|
214
|
+
findings.push({
|
|
215
|
+
id: matchedEntry.id,
|
|
216
|
+
name: matchedEntry.name,
|
|
217
|
+
vendor: matchedEntry.vendor,
|
|
218
|
+
category: matchedEntry.category,
|
|
219
|
+
source: `IDE-EXT:${root}`,
|
|
220
|
+
confidence,
|
|
221
|
+
evidence: { path: join(root, extId) },
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return findings;
|
|
226
|
+
}
|
|
227
|
+
export function scanDesktopApps(appDirs, fs, platformName) {
|
|
228
|
+
const findings = [];
|
|
229
|
+
const catalog = discoveryCatalog();
|
|
230
|
+
const seen = new Set();
|
|
231
|
+
for (const dir of appDirs) {
|
|
232
|
+
let entries = [];
|
|
233
|
+
try {
|
|
234
|
+
entries = fs.readdirSync(dir);
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
for (const name of entries) {
|
|
240
|
+
const lower = name.toLowerCase();
|
|
241
|
+
let matchedEntry;
|
|
242
|
+
for (const [id, entry] of catalog) {
|
|
243
|
+
for (const appName of entry.appNames) {
|
|
244
|
+
if (lower.includes(appName.toLowerCase())) {
|
|
245
|
+
matchedEntry = { id, name: entry.name, vendor: entry.vendor, category: "desktop-app" };
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (matchedEntry)
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
if (!matchedEntry)
|
|
253
|
+
continue;
|
|
254
|
+
const key = `${matchedEntry.id}:${name}`;
|
|
255
|
+
if (seen.has(key))
|
|
256
|
+
continue;
|
|
257
|
+
seen.add(key);
|
|
258
|
+
findings.push({
|
|
259
|
+
id: matchedEntry.id,
|
|
260
|
+
name: matchedEntry.name,
|
|
261
|
+
vendor: matchedEntry.vendor,
|
|
262
|
+
category: "desktop-app",
|
|
263
|
+
source: `APP:${dir}`,
|
|
264
|
+
confidence: platformName === "darwin" ? "high" : "medium",
|
|
265
|
+
evidence: { path: join(dir, name) },
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return findings;
|
|
270
|
+
}
|
|
271
|
+
export function scanModelRuntimes(pathDirs, fs, platformName) {
|
|
272
|
+
const findings = [];
|
|
273
|
+
const catalog = discoveryCatalog();
|
|
274
|
+
const seen = new Set();
|
|
275
|
+
const isWin = isWindowsPlatform(platformName);
|
|
276
|
+
for (const [entryId, entry] of catalog) {
|
|
277
|
+
if (entry.category !== "model-runtime")
|
|
278
|
+
continue;
|
|
279
|
+
let foundPath;
|
|
280
|
+
for (const binary of entry.binaries) {
|
|
281
|
+
for (const dir of pathDirs) {
|
|
282
|
+
const p = join(dir, binary);
|
|
283
|
+
try {
|
|
284
|
+
const st = fs.statSync(p);
|
|
285
|
+
if (isExecutable(st, isWin)) {
|
|
286
|
+
foundPath = p;
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
// Try .exe on Windows.
|
|
292
|
+
if (isWin) {
|
|
293
|
+
const pe = `${p}.exe`;
|
|
294
|
+
try {
|
|
295
|
+
const st = fs.statSync(pe);
|
|
296
|
+
if (isExecutable(st, isWin)) {
|
|
297
|
+
foundPath = pe;
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
/* ignore */
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (foundPath)
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
if (foundPath) {
|
|
311
|
+
for (const port of entry.defaultPorts) {
|
|
312
|
+
const key = `${entryId}:${port}`;
|
|
313
|
+
if (seen.has(key))
|
|
314
|
+
continue;
|
|
315
|
+
seen.add(key);
|
|
316
|
+
findings.push({
|
|
317
|
+
id: entryId,
|
|
318
|
+
name: entry.name,
|
|
319
|
+
vendor: entry.vendor,
|
|
320
|
+
category: "model-runtime",
|
|
321
|
+
source: `RUNTIME:${foundPath}`,
|
|
322
|
+
confidence: "medium",
|
|
323
|
+
evidence: { path: foundPath, port },
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
if (entry.defaultPorts.length === 0) {
|
|
327
|
+
const key = `${entryId}:${foundPath}`;
|
|
328
|
+
if (!seen.has(key)) {
|
|
329
|
+
seen.add(key);
|
|
330
|
+
findings.push({
|
|
331
|
+
id: entryId,
|
|
332
|
+
name: entry.name,
|
|
333
|
+
vendor: entry.vendor,
|
|
334
|
+
category: "model-runtime",
|
|
335
|
+
source: `RUNTIME:${foundPath}`,
|
|
336
|
+
confidence: "medium",
|
|
337
|
+
evidence: { path: foundPath },
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return findings;
|
|
344
|
+
}
|
|
345
|
+
function collectMcpServersFromObject(obj) {
|
|
346
|
+
if (!obj || typeof obj !== "object")
|
|
347
|
+
return [];
|
|
348
|
+
const servers = obj["mcpServers"] ?? obj["servers"];
|
|
349
|
+
if (!servers || typeof servers !== "object" || Array.isArray(servers))
|
|
350
|
+
return [];
|
|
351
|
+
const out = [];
|
|
352
|
+
for (const [name, value] of Object.entries(servers)) {
|
|
353
|
+
if (!value || typeof value !== "object")
|
|
354
|
+
continue;
|
|
355
|
+
const v = value;
|
|
356
|
+
const command = typeof v.command === "string" ? v.command : undefined;
|
|
357
|
+
const url = typeof v.url === "string" ? v.url : undefined;
|
|
358
|
+
const args = Array.isArray(v.args)
|
|
359
|
+
? v.args.filter((a) => typeof a === "string")
|
|
360
|
+
: undefined;
|
|
361
|
+
out.push({ name, command, args, url });
|
|
362
|
+
}
|
|
363
|
+
return out;
|
|
364
|
+
}
|
|
365
|
+
export function scanMcpServers(configPaths, fs) {
|
|
366
|
+
const findings = [];
|
|
367
|
+
const seen = new Set();
|
|
368
|
+
for (const configPath of configPaths) {
|
|
369
|
+
const raw = tryReadJsonFile(fs, configPath);
|
|
370
|
+
const servers = collectMcpServersFromObject(raw);
|
|
371
|
+
for (const server of servers) {
|
|
372
|
+
const key = `${server.name}:${configPath}`;
|
|
373
|
+
if (seen.has(key))
|
|
374
|
+
continue;
|
|
375
|
+
seen.add(key);
|
|
376
|
+
const command = server.command ?? server.url ?? "unknown";
|
|
377
|
+
findings.push({
|
|
378
|
+
id: "mcpserver",
|
|
379
|
+
name: server.name,
|
|
380
|
+
vendor: "unknown",
|
|
381
|
+
category: "mcp-server",
|
|
382
|
+
source: `MCP:${configPath}`,
|
|
383
|
+
confidence: "high",
|
|
384
|
+
evidence: {
|
|
385
|
+
configPath,
|
|
386
|
+
command,
|
|
387
|
+
...(server.args ? { args: server.args.join(" ") } : {}),
|
|
388
|
+
},
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return findings;
|
|
393
|
+
}
|
|
394
|
+
function mcpConfigPaths(home, cwd) {
|
|
395
|
+
return [
|
|
396
|
+
join(cwd, ".mcp.json"),
|
|
397
|
+
join(cwd, "mcp.json"),
|
|
398
|
+
join(cwd, ".cursor", "mcp.json"),
|
|
399
|
+
join(home, ".mcp.json"),
|
|
400
|
+
join(home, "mcp.json"),
|
|
401
|
+
join(home, ".cursor", "mcp.json"),
|
|
402
|
+
];
|
|
403
|
+
}
|
|
404
|
+
export function scanEndpoint(options = {}) {
|
|
405
|
+
const env = options.env ?? process.env;
|
|
406
|
+
const cwd = options.cwd ?? process.cwd();
|
|
407
|
+
const platformName = options.platform ?? process.platform;
|
|
408
|
+
const fs = options.fs ?? nodeFs();
|
|
409
|
+
const home = options.homeDir ?? homedir();
|
|
410
|
+
const os = detectOs(platformName);
|
|
411
|
+
const { endpointUid, hostnameHash } = buildEndpointId(os);
|
|
412
|
+
const pathDirs = options.pathDirs ?? defaultPathDirs(env);
|
|
413
|
+
const extensionRoots = extensionRootDirs(home, platformName);
|
|
414
|
+
const appDirs = desktopAppDirs(platformName);
|
|
415
|
+
const mcpPaths = mcpConfigPaths(home, cwd);
|
|
416
|
+
const unavailable = [];
|
|
417
|
+
if (pathDirs.length === 0)
|
|
418
|
+
unavailable.push("cli-binaries");
|
|
419
|
+
const cliFindings = scanCliBinaries(pathDirs, fs, platformName);
|
|
420
|
+
const extFindings = scanIdeExtensions(extensionRoots, fs);
|
|
421
|
+
const appFindings = scanDesktopApps(appDirs, fs, platformName);
|
|
422
|
+
const runtimeFindings = scanModelRuntimes(pathDirs, fs, platformName);
|
|
423
|
+
const mcpFindings = scanMcpServers(mcpPaths, fs);
|
|
424
|
+
const all = [
|
|
425
|
+
...cliFindings,
|
|
426
|
+
...extFindings,
|
|
427
|
+
...appFindings,
|
|
428
|
+
...runtimeFindings,
|
|
429
|
+
...mcpFindings,
|
|
430
|
+
];
|
|
431
|
+
const inventory = all.map((f) => ({
|
|
432
|
+
...f,
|
|
433
|
+
evidence: redactEvidence(f.evidence, home),
|
|
434
|
+
}));
|
|
435
|
+
return {
|
|
436
|
+
endpointUid,
|
|
437
|
+
hostnameHash,
|
|
438
|
+
os,
|
|
439
|
+
capturedAt: (options.now ?? new Date()).toISOString(),
|
|
440
|
+
inventory,
|
|
441
|
+
coverage: {
|
|
442
|
+
attempted: [...ATTEMPTED_CATEGORIES],
|
|
443
|
+
unavailable,
|
|
444
|
+
truncated: false,
|
|
445
|
+
},
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/discover/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local snapshot persistence for endpoint discovery.
|
|
3
|
+
*
|
|
4
|
+
* Writes timestamped discovery JSON under ~/.kya/discovery/ and keeps a
|
|
5
|
+
* `latest.json` copy for the receipt card and diff comparisons.
|
|
6
|
+
*/
|
|
7
|
+
import type { DiscoveryFinding, DiscoverySnapshot } from "./scan.js";
|
|
8
|
+
export interface SnapshotFs {
|
|
9
|
+
mkdirSync(path: string, options: {
|
|
10
|
+
recursive: boolean;
|
|
11
|
+
}): void;
|
|
12
|
+
writeFileSync(path: string, data: string, encoding: "utf8"): void;
|
|
13
|
+
readFileSync(path: string, encoding: "utf8"): string;
|
|
14
|
+
existsSync(path: string): boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function snapshotDir(env?: NodeJS.ProcessEnv): string;
|
|
17
|
+
export declare function writeDiscoverySnapshot(snapshot: DiscoverySnapshot, env?: NodeJS.ProcessEnv, fs?: SnapshotFs): {
|
|
18
|
+
path: string;
|
|
19
|
+
latestPath: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function loadDiscoverySnapshot(path: string, fs?: Pick<SnapshotFs, "existsSync" | "readFileSync">): DiscoverySnapshot | undefined;
|
|
22
|
+
export declare function loadLatestDiscoverySnapshot(env?: NodeJS.ProcessEnv, fs?: Pick<SnapshotFs, "existsSync" | "readFileSync">): DiscoverySnapshot | undefined;
|
|
23
|
+
export interface DiscoveryDiff {
|
|
24
|
+
readonly added: readonly DiscoveryFinding[];
|
|
25
|
+
readonly removed: readonly DiscoveryFinding[];
|
|
26
|
+
readonly changed: readonly {
|
|
27
|
+
current: DiscoveryFinding;
|
|
28
|
+
previous: DiscoveryFinding;
|
|
29
|
+
}[];
|
|
30
|
+
}
|
|
31
|
+
export declare function diffDiscoverySnapshots(current: DiscoverySnapshot, previous: DiscoverySnapshot): DiscoveryDiff;
|
|
32
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/discover/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAErE,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/D,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAClE,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IACrD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC;AAED,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAExE;AAMD,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,iBAAiB,EAC3B,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,EAAE,GAAE,UAAgC,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAStC;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,EAAE,GAAE,IAAI,CAAC,UAAU,EAAE,YAAY,GAAG,cAAc,CAAuB,GACxE,iBAAiB,GAAG,SAAS,CAW/B;AAED,wBAAgB,2BAA2B,CACzC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,EAAE,GAAE,IAAI,CAAC,UAAU,EAAE,YAAY,GAAG,cAAc,CAAuB,GACxE,iBAAiB,GAAG,SAAS,CAE/B;AAUD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,OAAO,EAAE,gBAAgB,CAAC;QAAC,QAAQ,EAAE,gBAAgB,CAAA;KAAE,EAAE,CAAC;CACxF;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,iBAAiB,GAC1B,aAAa,CAwCf"}
|