@shield-agent/kya 0.1.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/LICENSE +21 -0
- package/README.md +108 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +207 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +111 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +143 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/eval-tool.d.ts +27 -0
- package/dist/commands/eval-tool.d.ts.map +1 -0
- package/dist/commands/eval-tool.js +87 -0
- package/dist/commands/eval-tool.js.map +1 -0
- package/dist/commands/init.d.ts +19 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +69 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/orr.d.ts +81 -0
- package/dist/commands/orr.d.ts.map +1 -0
- package/dist/commands/orr.js +468 -0
- package/dist/commands/orr.js.map +1 -0
- package/dist/commands/register-agent.d.ts +17 -0
- package/dist/commands/register-agent.d.ts.map +1 -0
- package/dist/commands/register-agent.js +39 -0
- package/dist/commands/register-agent.js.map +1 -0
- package/dist/commands/serve-mcp.d.ts +19 -0
- package/dist/commands/serve-mcp.d.ts.map +1 -0
- package/dist/commands/serve-mcp.js +40 -0
- package/dist/commands/serve-mcp.js.map +1 -0
- package/dist/config.d.ts +45 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +105 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +18 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +34 -0
- package/dist/errors.js.map +1 -0
- package/dist/hash.d.ts +5 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +25 -0
- package/dist/hash.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/http.d.ts +26 -0
- package/dist/mcp/http.d.ts.map +1 -0
- package/dist/mcp/http.js +118 -0
- package/dist/mcp/http.js.map +1 -0
- package/dist/mcp/protocol.d.ts +53 -0
- package/dist/mcp/protocol.d.ts.map +1 -0
- package/dist/mcp/protocol.js +282 -0
- package/dist/mcp/protocol.js.map +1 -0
- package/dist/mcp/stdio.d.ts +22 -0
- package/dist/mcp/stdio.d.ts.map +1 -0
- package/dist/mcp/stdio.js +67 -0
- package/dist/mcp/stdio.js.map +1 -0
- package/dist/offline-evaluate.d.ts +23 -0
- package/dist/offline-evaluate.d.ts.map +1 -0
- package/dist/offline-evaluate.js +68 -0
- package/dist/offline-evaluate.js.map +1 -0
- package/dist/parse-args.d.ts +14 -0
- package/dist/parse-args.d.ts.map +1 -0
- package/dist/parse-args.js +86 -0
- package/dist/parse-args.js.map +1 -0
- package/dist/sample-tools.d.ts +19 -0
- package/dist/sample-tools.d.ts.map +1 -0
- package/dist/sample-tools.js +37 -0
- package/dist/sample-tools.js.map +1 -0
- package/package.json +65 -0
- package/server.json +59 -0
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export type Host = "ide" | "runtime";
|
|
2
|
+
export interface KyaFileConfig {
|
|
3
|
+
readonly baseUrl?: string;
|
|
4
|
+
readonly host?: Host;
|
|
5
|
+
readonly agentId?: string;
|
|
6
|
+
readonly agentName?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ResolvedConfig {
|
|
9
|
+
readonly baseUrl: string;
|
|
10
|
+
readonly apiKey: string;
|
|
11
|
+
readonly host: Host;
|
|
12
|
+
readonly agentId: string | undefined;
|
|
13
|
+
readonly mcpPort: number;
|
|
14
|
+
readonly tenantHint: string | undefined;
|
|
15
|
+
readonly cwd: string;
|
|
16
|
+
readonly configPath: string;
|
|
17
|
+
readonly json: boolean;
|
|
18
|
+
/** When true, empty api key is allowed only for pure local file ops (init). */
|
|
19
|
+
readonly allowMissingApiKey: boolean;
|
|
20
|
+
/** Offline sample evaluate (demo / CT) — no network, no paid cloud. */
|
|
21
|
+
readonly offline: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface ResolveOptions {
|
|
24
|
+
readonly cwd?: string;
|
|
25
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
26
|
+
readonly flags?: Readonly<Record<string, string | boolean>>;
|
|
27
|
+
/** Skip auth requirement (init, --help). Default false. */
|
|
28
|
+
readonly allowMissingApiKey?: boolean;
|
|
29
|
+
/** When true, require non-empty API key (authenticated plane). Default true for network cmds. */
|
|
30
|
+
readonly requireApiKey?: boolean;
|
|
31
|
+
/** Force offline evaluate path (no API key required). */
|
|
32
|
+
readonly offline?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export declare function configDir(cwd: string): string;
|
|
35
|
+
export declare function configFilePath(cwd: string): string;
|
|
36
|
+
export declare function readFileConfig(cwd: string): KyaFileConfig;
|
|
37
|
+
export declare function writeFileConfig(cwd: string, patch: KyaFileConfig): KyaFileConfig;
|
|
38
|
+
/**
|
|
39
|
+
* Resolve runtime config from flags > env > .kya/config.json.
|
|
40
|
+
* Fail-closed: empty API key against network commands exits non-zero.
|
|
41
|
+
*/
|
|
42
|
+
export declare function resolveConfig(options?: ResolveOptions): ResolvedConfig;
|
|
43
|
+
/** Ensure parent dir exists for a path. */
|
|
44
|
+
export declare function ensureParentDir(filePath: string): void;
|
|
45
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,IAAI,GAAG,KAAK,GAAG,SAAS,CAAC;AAErC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAC5D,2DAA2D;IAC3D,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IACtC,iGAAiG;IACjG,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,yDAAyD;IACzD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAKD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CASzD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,aAAa,CAahF;AAaD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,cAAmB,GAAG,cAAc,CAiE1E;AAOD,2CAA2C;AAC3C,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEtD"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { AuthRequiredError, UsageError } from "./errors.js";
|
|
4
|
+
const DEFAULT_HOST = "ide";
|
|
5
|
+
const DEFAULT_MCP_PORT = 3920;
|
|
6
|
+
export function configDir(cwd) {
|
|
7
|
+
return join(cwd, ".kya");
|
|
8
|
+
}
|
|
9
|
+
export function configFilePath(cwd) {
|
|
10
|
+
return join(configDir(cwd), "config.json");
|
|
11
|
+
}
|
|
12
|
+
export function readFileConfig(cwd) {
|
|
13
|
+
const path = configFilePath(cwd);
|
|
14
|
+
if (!existsSync(path))
|
|
15
|
+
return {};
|
|
16
|
+
try {
|
|
17
|
+
const raw = JSON.parse(readFileSync(path, "utf8"));
|
|
18
|
+
return raw ?? {};
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return {};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function writeFileConfig(cwd, patch) {
|
|
25
|
+
const dir = configDir(cwd);
|
|
26
|
+
mkdirSync(dir, { recursive: true });
|
|
27
|
+
const path = configFilePath(cwd);
|
|
28
|
+
const prev = readFileConfig(cwd);
|
|
29
|
+
const next = {
|
|
30
|
+
...prev,
|
|
31
|
+
...Object.fromEntries(Object.entries(patch).filter(([, v]) => v !== undefined)),
|
|
32
|
+
};
|
|
33
|
+
writeFileSync(path, `${JSON.stringify(next, null, 2)}\n`, "utf8");
|
|
34
|
+
return next;
|
|
35
|
+
}
|
|
36
|
+
function parseHost(raw) {
|
|
37
|
+
if (raw === undefined || raw === "")
|
|
38
|
+
return DEFAULT_HOST;
|
|
39
|
+
const h = raw.trim().toLowerCase();
|
|
40
|
+
if (h === "ide" || h === "runtime")
|
|
41
|
+
return h;
|
|
42
|
+
throw new UsageError(`invalid host "${raw}" (expected ide|runtime)`);
|
|
43
|
+
}
|
|
44
|
+
function stripTrailingSlash(url) {
|
|
45
|
+
return url.endsWith("/") ? url.slice(0, -1) : url;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolve runtime config from flags > env > .kya/config.json.
|
|
49
|
+
* Fail-closed: empty API key against network commands exits non-zero.
|
|
50
|
+
*/
|
|
51
|
+
export function resolveConfig(options = {}) {
|
|
52
|
+
const cwd = options.cwd ?? process.cwd();
|
|
53
|
+
const env = options.env ?? process.env;
|
|
54
|
+
const flags = options.flags ?? {};
|
|
55
|
+
const file = readFileConfig(cwd);
|
|
56
|
+
const baseUrlRaw = str(flags["base-url"]) ??
|
|
57
|
+
env.KYA_BASE_URL ??
|
|
58
|
+
file.baseUrl ??
|
|
59
|
+
"http://127.0.0.1:8090";
|
|
60
|
+
const baseUrl = stripTrailingSlash(baseUrlRaw.trim());
|
|
61
|
+
const apiKey = str(flags["api-key"]) ?? env.KYA_API_KEY ?? env.SHIELD_API_KEY ?? "";
|
|
62
|
+
const host = parseHost(str(flags["host"]) ?? env.KYA_HOST ?? file.host ?? DEFAULT_HOST);
|
|
63
|
+
const agentId = str(flags["agent-id"]) ?? env.KYA_AGENT_ID ?? file.agentId ?? undefined;
|
|
64
|
+
const mcpPort = Number.parseInt(str(flags["port"]) ?? env.KYA_MCP_PORT ?? String(DEFAULT_MCP_PORT), 10);
|
|
65
|
+
const tenantHint = env.KYA_TENANT_HINT;
|
|
66
|
+
const json = flags["json"] === true || flags["json"] === "true";
|
|
67
|
+
const offline = options.offline === true ||
|
|
68
|
+
flags["offline"] === true ||
|
|
69
|
+
flags["offline"] === "true" ||
|
|
70
|
+
env.KYA_OFFLINE === "1" ||
|
|
71
|
+
env.KYA_OFFLINE === "true";
|
|
72
|
+
// Offline sample evaluate never hits the control plane — no API key required.
|
|
73
|
+
const requireApiKey = offline
|
|
74
|
+
? false
|
|
75
|
+
: (options.requireApiKey ?? !options.allowMissingApiKey);
|
|
76
|
+
if (requireApiKey && (!apiKey || apiKey.trim() === "")) {
|
|
77
|
+
throw new AuthRequiredError("KYA_API_KEY is empty or missing — refuse silent allow-all against control plane (use --offline for local sample evaluate)");
|
|
78
|
+
}
|
|
79
|
+
if (!baseUrl && !offline) {
|
|
80
|
+
throw new UsageError("KYA_BASE_URL is required");
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
baseUrl: baseUrl || "http://127.0.0.1:8090",
|
|
84
|
+
apiKey: apiKey.trim(),
|
|
85
|
+
host,
|
|
86
|
+
agentId: agentId?.trim() || undefined,
|
|
87
|
+
mcpPort: Number.isFinite(mcpPort) ? mcpPort : DEFAULT_MCP_PORT,
|
|
88
|
+
tenantHint,
|
|
89
|
+
cwd,
|
|
90
|
+
configPath: configFilePath(cwd),
|
|
91
|
+
json,
|
|
92
|
+
allowMissingApiKey: !requireApiKey,
|
|
93
|
+
offline,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function str(v) {
|
|
97
|
+
if (typeof v === "string" && v.length > 0)
|
|
98
|
+
return v;
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
/** Ensure parent dir exists for a path. */
|
|
102
|
+
export function ensureParentDir(filePath) {
|
|
103
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Fail-closed CLI / client errors — never silent allow-all. */
|
|
2
|
+
export declare class KyaError extends Error {
|
|
3
|
+
readonly code: string;
|
|
4
|
+
readonly exitCode: number;
|
|
5
|
+
constructor(message: string, code?: string, exitCode?: number);
|
|
6
|
+
}
|
|
7
|
+
export declare class AuthRequiredError extends KyaError {
|
|
8
|
+
constructor(message?: string);
|
|
9
|
+
}
|
|
10
|
+
export declare class HttpError extends KyaError {
|
|
11
|
+
readonly status: number;
|
|
12
|
+
readonly body: unknown;
|
|
13
|
+
constructor(status: number, message: string, body?: unknown);
|
|
14
|
+
}
|
|
15
|
+
export declare class UsageError extends KyaError {
|
|
16
|
+
constructor(message: string);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,OAAO,EAAE,MAAM,EAAE,IAAI,SAAc,EAAE,QAAQ,SAAI;CAM9D;AAED,qBAAa,iBAAkB,SAAQ,QAAQ;gBACjC,OAAO,SAAmE;CAIvF;AAED,qBAAa,SAAU,SAAQ,QAAQ;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;gBAEX,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;CAM5D;AAED,qBAAa,UAAW,SAAQ,QAAQ;gBAC1B,OAAO,EAAE,MAAM;CAI5B"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Fail-closed CLI / client errors — never silent allow-all. */
|
|
2
|
+
export class KyaError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
exitCode;
|
|
5
|
+
constructor(message, code = "KYA_ERROR", exitCode = 1) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "KyaError";
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.exitCode = exitCode;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class AuthRequiredError extends KyaError {
|
|
13
|
+
constructor(message = "KYA_API_KEY is required against an authenticated control plane") {
|
|
14
|
+
super(message, "AUTH_REQUIRED", 1);
|
|
15
|
+
this.name = "AuthRequiredError";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class HttpError extends KyaError {
|
|
19
|
+
status;
|
|
20
|
+
body;
|
|
21
|
+
constructor(status, message, body) {
|
|
22
|
+
super(message, `HTTP_${status}`, 1);
|
|
23
|
+
this.name = "HttpError";
|
|
24
|
+
this.status = status;
|
|
25
|
+
this.body = body;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export class UsageError extends KyaError {
|
|
29
|
+
constructor(message) {
|
|
30
|
+
super(message, "USAGE", 2);
|
|
31
|
+
this.name = "UsageError";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,IAAI,CAAS;IACb,QAAQ,CAAS;IAE1B,YAAY,OAAe,EAAE,IAAI,GAAG,WAAW,EAAE,QAAQ,GAAG,CAAC;QAC3D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,QAAQ;IAC7C,YAAY,OAAO,GAAG,gEAAgE;QACpF,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,QAAQ;IAC5B,MAAM,CAAS;IACf,IAAI,CAAU;IAEvB,YAAY,MAAc,EAAE,OAAe,EAAE,IAAc;QACzD,KAAK,CAAC,OAAO,EAAE,QAAQ,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,QAAQ;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF"}
|
package/dist/hash.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Canonical JSON: sorted keys, no insignificant whitespace (tool-wrap §1.2). */
|
|
2
|
+
export declare function canonicalJson(value: unknown): string;
|
|
3
|
+
/** argsHash = hex(sha256(canonical_json(args))) */
|
|
4
|
+
export declare function computeArgsHash(args: unknown): string;
|
|
5
|
+
//# sourceMappingURL=hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAEA,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEpD;AAiBD,mDAAmD;AACnD,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAGrD"}
|
package/dist/hash.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
/** Canonical JSON: sorted keys, no insignificant whitespace (tool-wrap §1.2). */
|
|
3
|
+
export function canonicalJson(value) {
|
|
4
|
+
return JSON.stringify(sortKeys(value));
|
|
5
|
+
}
|
|
6
|
+
function sortKeys(value) {
|
|
7
|
+
if (value === null || typeof value !== "object") {
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
if (Array.isArray(value)) {
|
|
11
|
+
return value.map(sortKeys);
|
|
12
|
+
}
|
|
13
|
+
const obj = value;
|
|
14
|
+
const out = {};
|
|
15
|
+
for (const key of Object.keys(obj).sort()) {
|
|
16
|
+
out[key] = sortKeys(obj[key]);
|
|
17
|
+
}
|
|
18
|
+
return out;
|
|
19
|
+
}
|
|
20
|
+
/** argsHash = hex(sha256(canonical_json(args))) */
|
|
21
|
+
export function computeArgsHash(args) {
|
|
22
|
+
const payload = canonicalJson(args === undefined ? {} : args);
|
|
23
|
+
return createHash("sha256").update(payload, "utf8").digest("hex");
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=hash.js.map
|
package/dist/hash.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,iFAAiF;AACjF,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1C,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,eAAe,CAAC,IAAa;IAC3C,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9D,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @shield-agent/kya — light install library surface + CLI helpers.
|
|
3
|
+
* Zero vertical packs required (R8). Provider-agnostic MCP / HTTP path.
|
|
4
|
+
*/
|
|
5
|
+
export { runCli, type CliIo } from "./cli.js";
|
|
6
|
+
export { parseArgs, flagString, flagBool, flagInt, type ParsedArgs } from "./parse-args.js";
|
|
7
|
+
export { resolveConfig, readFileConfig, writeFileConfig, configDir, configFilePath, type Host, type KyaFileConfig, type ResolvedConfig, type ResolveOptions, } from "./config.js";
|
|
8
|
+
export { KyaHttpClient, buildEvaluateFromToolArgs, type KyaClientOptions, type PolicyEvaluateRequest, type PolicyEvaluateResponse, type RegisterAgentRequest, type AgentResponse, type SessionIngestRequest, type CreateApprovalRequest, type FetchLike, } from "./client.js";
|
|
9
|
+
export { computeArgsHash, canonicalJson } from "./hash.js";
|
|
10
|
+
export { SAMPLE_TOOLS, findSampleTool, type SampleToolDescriptor } from "./sample-tools.js";
|
|
11
|
+
export { KyaError, AuthRequiredError, HttpError, UsageError } from "./errors.js";
|
|
12
|
+
export { runInit, initFromArgs, type InitResult } from "./commands/init.js";
|
|
13
|
+
export { runRegisterAgent, registerAgentInputFromArgs, type RegisterAgentResult, } from "./commands/register-agent.js";
|
|
14
|
+
export { runEvalTool, evalToolInputFromArgs, formatEvalHuman, type EvalToolResult, } from "./commands/eval-tool.js";
|
|
15
|
+
export { runServeMcp, serveMcpOptionsFromArgs, type ServeMcpOptions, type ServeMcpResult, } from "./commands/serve-mcp.js";
|
|
16
|
+
export { runOrr, orrRunOptionsFromArgs, runSaFirstPartyProbes, formatOrrMarkdown, type OrrReport, type OrrRunOptions, type OrrRunResult, } from "./commands/orr.js";
|
|
17
|
+
export { evaluateOffline, applySessionRisk, type SessionRisk, } from "./offline-evaluate.js";
|
|
18
|
+
export { MCP_TOOLS, MCP_SERVER_INFO, handleMcpToolCall, handleJsonRpc, type McpHandlerContext, type McpCallResult, } from "./mcp/protocol.js";
|
|
19
|
+
export { startHttpMcp, type HttpMcpServer } from "./mcp/http.js";
|
|
20
|
+
export { startStdioMcp } from "./mcp/stdio.js";
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EACL,aAAa,EACb,cAAc,EACd,eAAe,EACf,SAAS,EACT,cAAc,EACd,KAAK,IAAI,EACT,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,SAAS,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EACL,gBAAgB,EAChB,0BAA0B,EAC1B,KAAK,mBAAmB,GACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,eAAe,EACf,KAAK,cAAc,GACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,MAAM,EACN,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,KAAK,WAAW,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @shield-agent/kya — light install library surface + CLI helpers.
|
|
3
|
+
* Zero vertical packs required (R8). Provider-agnostic MCP / HTTP path.
|
|
4
|
+
*/
|
|
5
|
+
export { runCli } from "./cli.js";
|
|
6
|
+
export { parseArgs, flagString, flagBool, flagInt } from "./parse-args.js";
|
|
7
|
+
export { resolveConfig, readFileConfig, writeFileConfig, configDir, configFilePath, } from "./config.js";
|
|
8
|
+
export { KyaHttpClient, buildEvaluateFromToolArgs, } from "./client.js";
|
|
9
|
+
export { computeArgsHash, canonicalJson } from "./hash.js";
|
|
10
|
+
export { SAMPLE_TOOLS, findSampleTool } from "./sample-tools.js";
|
|
11
|
+
export { KyaError, AuthRequiredError, HttpError, UsageError } from "./errors.js";
|
|
12
|
+
export { runInit, initFromArgs } from "./commands/init.js";
|
|
13
|
+
export { runRegisterAgent, registerAgentInputFromArgs, } from "./commands/register-agent.js";
|
|
14
|
+
export { runEvalTool, evalToolInputFromArgs, formatEvalHuman, } from "./commands/eval-tool.js";
|
|
15
|
+
export { runServeMcp, serveMcpOptionsFromArgs, } from "./commands/serve-mcp.js";
|
|
16
|
+
export { runOrr, orrRunOptionsFromArgs, runSaFirstPartyProbes, formatOrrMarkdown, } from "./commands/orr.js";
|
|
17
|
+
export { evaluateOffline, applySessionRisk, } from "./offline-evaluate.js";
|
|
18
|
+
export { MCP_TOOLS, MCP_SERVER_INFO, handleMcpToolCall, handleJsonRpc, } from "./mcp/protocol.js";
|
|
19
|
+
export { startHttpMcp } from "./mcp/http.js";
|
|
20
|
+
export { startStdioMcp } from "./mcp/stdio.js";
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAc,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAmB,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EACL,aAAa,EACb,cAAc,EACd,eAAe,EACf,SAAS,EACT,cAAc,GAKf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,aAAa,EACb,yBAAyB,GAS1B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,cAAc,EAA6B,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,YAAY,EAAmB,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EACL,gBAAgB,EAChB,0BAA0B,GAE3B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,eAAe,GAEhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,WAAW,EACX,uBAAuB,GAGxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,MAAM,EACN,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,GAIlB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,eAAe,EACf,gBAAgB,GAEjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,aAAa,GAGd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAsB,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type Server } from "node:http";
|
|
2
|
+
import type { KyaHttpClient } from "../client.js";
|
|
3
|
+
import type { Host } from "../config.js";
|
|
4
|
+
export interface HttpMcpOptions {
|
|
5
|
+
readonly host?: string;
|
|
6
|
+
readonly port: number;
|
|
7
|
+
readonly client: KyaHttpClient;
|
|
8
|
+
readonly kyaHost: Host;
|
|
9
|
+
readonly agentId?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface HttpMcpServer {
|
|
12
|
+
readonly server: Server;
|
|
13
|
+
readonly port: number;
|
|
14
|
+
readonly url: string;
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Lightweight HTTP MCP gate for local smoke / non-stdio hosts.
|
|
19
|
+
* - GET /health
|
|
20
|
+
* - GET /connectors/mcp.json (descriptor)
|
|
21
|
+
* - GET /mcp/tools
|
|
22
|
+
* - POST /mcp (JSON-RPC)
|
|
23
|
+
* - POST /mcp/tools/:name (direct tool call)
|
|
24
|
+
*/
|
|
25
|
+
export declare function startHttpMcp(options: HttpMcpOptions): Promise<HttpMcpServer>;
|
|
26
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/mcp/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AACjG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAUzC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA6B5E"}
|
package/dist/mcp/http.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { createServer } from "node:http";
|
|
2
|
+
import { handleJsonRpc, handleMcpToolCall, MCP_SERVER_INFO, MCP_TOOLS, } from "./protocol.js";
|
|
3
|
+
/**
|
|
4
|
+
* Lightweight HTTP MCP gate for local smoke / non-stdio hosts.
|
|
5
|
+
* - GET /health
|
|
6
|
+
* - GET /connectors/mcp.json (descriptor)
|
|
7
|
+
* - GET /mcp/tools
|
|
8
|
+
* - POST /mcp (JSON-RPC)
|
|
9
|
+
* - POST /mcp/tools/:name (direct tool call)
|
|
10
|
+
*/
|
|
11
|
+
export function startHttpMcp(options) {
|
|
12
|
+
const listenHost = options.host ?? "127.0.0.1";
|
|
13
|
+
const ctx = {
|
|
14
|
+
client: options.client,
|
|
15
|
+
host: options.kyaHost,
|
|
16
|
+
agentId: options.agentId,
|
|
17
|
+
};
|
|
18
|
+
const server = createServer((req, res) => {
|
|
19
|
+
void handleHttp(req, res, ctx);
|
|
20
|
+
});
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
server.once("error", reject);
|
|
23
|
+
server.listen(options.port, listenHost, () => {
|
|
24
|
+
const addr = server.address();
|
|
25
|
+
const port = typeof addr === "object" && addr ? addr.port : options.port;
|
|
26
|
+
resolve({
|
|
27
|
+
server,
|
|
28
|
+
port,
|
|
29
|
+
url: `http://${listenHost}:${port}`,
|
|
30
|
+
close: () => new Promise((resClose, rejClose) => {
|
|
31
|
+
server.close((err) => (err ? rejClose(err) : resClose()));
|
|
32
|
+
}),
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async function handleHttp(req, res, ctx) {
|
|
38
|
+
const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
|
|
39
|
+
const path = url.pathname;
|
|
40
|
+
const method = req.method ?? "GET";
|
|
41
|
+
try {
|
|
42
|
+
if (method === "GET" && (path === "/health" || path === "/")) {
|
|
43
|
+
return json(res, 200, {
|
|
44
|
+
ok: true,
|
|
45
|
+
server: MCP_SERVER_INFO.name,
|
|
46
|
+
version: MCP_SERVER_INFO.version,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (method === "GET" && path === "/connectors/mcp.json") {
|
|
50
|
+
return json(res, 200, {
|
|
51
|
+
name: MCP_SERVER_INFO.name,
|
|
52
|
+
title: MCP_SERVER_INFO.title,
|
|
53
|
+
description: MCP_SERVER_INFO.description,
|
|
54
|
+
protocol: "mcp",
|
|
55
|
+
tools: MCP_TOOLS.map((t) => ({
|
|
56
|
+
name: t.name,
|
|
57
|
+
description: t.description,
|
|
58
|
+
inputSchema: t.inputSchema,
|
|
59
|
+
})),
|
|
60
|
+
http: {
|
|
61
|
+
policyEvaluate: "/api/v1/kya/policy/evaluate",
|
|
62
|
+
sessionIngest: "/api/v1/kya/sessions/ingest",
|
|
63
|
+
mcp: "/mcp",
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
if (method === "GET" && path === "/mcp/tools") {
|
|
68
|
+
return json(res, 200, {
|
|
69
|
+
tools: MCP_TOOLS.map((t) => ({
|
|
70
|
+
name: t.name,
|
|
71
|
+
description: t.description,
|
|
72
|
+
inputSchema: t.inputSchema,
|
|
73
|
+
})),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
if (method === "POST" && path === "/mcp") {
|
|
77
|
+
const body = await readBody(req);
|
|
78
|
+
const msg = JSON.parse(body || "{}");
|
|
79
|
+
const response = await handleJsonRpc(msg, ctx);
|
|
80
|
+
if (response === null) {
|
|
81
|
+
res.writeHead(204);
|
|
82
|
+
res.end();
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
return json(res, 200, response);
|
|
86
|
+
}
|
|
87
|
+
const toolMatch = path.match(/^\/mcp\/tools\/([^/]+)$/);
|
|
88
|
+
if (method === "POST" && toolMatch) {
|
|
89
|
+
const name = decodeURIComponent(toolMatch[1]);
|
|
90
|
+
const body = await readBody(req);
|
|
91
|
+
const args = body ? JSON.parse(body) : {};
|
|
92
|
+
const result = await handleMcpToolCall(name, args, ctx);
|
|
93
|
+
return json(res, result.isError ? 400 : 200, result);
|
|
94
|
+
}
|
|
95
|
+
json(res, 404, { error: "not found" });
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
99
|
+
json(res, 500, { error: message });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function json(res, status, body) {
|
|
103
|
+
const payload = JSON.stringify(body);
|
|
104
|
+
res.writeHead(status, {
|
|
105
|
+
"Content-Type": "application/json; charset=utf-8",
|
|
106
|
+
"Content-Length": Buffer.byteLength(payload),
|
|
107
|
+
});
|
|
108
|
+
res.end(payload);
|
|
109
|
+
}
|
|
110
|
+
function readBody(req) {
|
|
111
|
+
return new Promise((resolve, reject) => {
|
|
112
|
+
const chunks = [];
|
|
113
|
+
req.on("data", (c) => chunks.push(c));
|
|
114
|
+
req.on("end", () => resolve(Buffer.concat(chunks).toString("utf8")));
|
|
115
|
+
req.on("error", reject);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/mcp/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool surface for local gate — proxies to Shield KYA (sole PEP).
|
|
3
|
+
* Does not execute irreversible side effects; only evaluate / ingest / request approval.
|
|
4
|
+
* Host-agnostic: stdio or HTTP transport.
|
|
5
|
+
*/
|
|
6
|
+
import type { KyaHttpClient } from "../client.js";
|
|
7
|
+
import type { Host } from "../config.js";
|
|
8
|
+
export declare const MCP_SERVER_INFO: {
|
|
9
|
+
readonly name: "shield-kya";
|
|
10
|
+
readonly version: "0.1.0";
|
|
11
|
+
readonly title: "Shield Agent AI (KYA)";
|
|
12
|
+
readonly description: "Know Your Agent control plane: policy evaluate, session observe, and high-stakes gates. Standard MCP tools; no proprietary client protocol.";
|
|
13
|
+
};
|
|
14
|
+
export interface McpToolDef {
|
|
15
|
+
readonly name: string;
|
|
16
|
+
readonly description: string;
|
|
17
|
+
readonly inputSchema: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
export declare const MCP_TOOLS: readonly McpToolDef[];
|
|
20
|
+
export interface McpCallResult {
|
|
21
|
+
readonly content: readonly {
|
|
22
|
+
type: "text";
|
|
23
|
+
text: string;
|
|
24
|
+
}[];
|
|
25
|
+
readonly isError?: boolean;
|
|
26
|
+
readonly structuredContent?: unknown;
|
|
27
|
+
}
|
|
28
|
+
export interface McpHandlerContext {
|
|
29
|
+
readonly client: KyaHttpClient;
|
|
30
|
+
readonly host: Host;
|
|
31
|
+
readonly agentId?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare function handleMcpToolCall(name: string, args: Record<string, unknown> | undefined, ctx: McpHandlerContext): Promise<McpCallResult>;
|
|
34
|
+
/** JSON-RPC 2.0 helpers for MCP stdio. */
|
|
35
|
+
export type JsonRpcId = string | number | null;
|
|
36
|
+
export interface JsonRpcRequest {
|
|
37
|
+
jsonrpc: "2.0";
|
|
38
|
+
id?: JsonRpcId;
|
|
39
|
+
method: string;
|
|
40
|
+
params?: unknown;
|
|
41
|
+
}
|
|
42
|
+
export interface JsonRpcResponse {
|
|
43
|
+
jsonrpc: "2.0";
|
|
44
|
+
id: JsonRpcId;
|
|
45
|
+
result?: unknown;
|
|
46
|
+
error?: {
|
|
47
|
+
code: number;
|
|
48
|
+
message: string;
|
|
49
|
+
data?: unknown;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export declare function handleJsonRpc(msg: JsonRpcRequest, ctx: McpHandlerContext): Promise<JsonRpcResponse | null>;
|
|
53
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/mcp/protocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAIzC,eAAO,MAAM,eAAe;;;;;CAMlB,CAAC;AAEX,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/C;AAED,eAAO,MAAM,SAAS,EAAE,SAAS,UAAU,EAgEjC,CAAC;AAEX,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5D,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACzC,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,aAAa,CAAC,CAiBxB;AAkJD,0CAA0C;AAC1C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAE/C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3D;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA0EjC"}
|