@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.
Files changed (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +108 -0
  3. package/dist/cli.d.ts +15 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +207 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/client.d.ts +111 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +143 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/commands/eval-tool.d.ts +27 -0
  12. package/dist/commands/eval-tool.d.ts.map +1 -0
  13. package/dist/commands/eval-tool.js +87 -0
  14. package/dist/commands/eval-tool.js.map +1 -0
  15. package/dist/commands/init.d.ts +19 -0
  16. package/dist/commands/init.d.ts.map +1 -0
  17. package/dist/commands/init.js +69 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/orr.d.ts +81 -0
  20. package/dist/commands/orr.d.ts.map +1 -0
  21. package/dist/commands/orr.js +468 -0
  22. package/dist/commands/orr.js.map +1 -0
  23. package/dist/commands/register-agent.d.ts +17 -0
  24. package/dist/commands/register-agent.d.ts.map +1 -0
  25. package/dist/commands/register-agent.js +39 -0
  26. package/dist/commands/register-agent.js.map +1 -0
  27. package/dist/commands/serve-mcp.d.ts +19 -0
  28. package/dist/commands/serve-mcp.d.ts.map +1 -0
  29. package/dist/commands/serve-mcp.js +40 -0
  30. package/dist/commands/serve-mcp.js.map +1 -0
  31. package/dist/config.d.ts +45 -0
  32. package/dist/config.d.ts.map +1 -0
  33. package/dist/config.js +105 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/errors.d.ts +18 -0
  36. package/dist/errors.d.ts.map +1 -0
  37. package/dist/errors.js +34 -0
  38. package/dist/errors.js.map +1 -0
  39. package/dist/hash.d.ts +5 -0
  40. package/dist/hash.d.ts.map +1 -0
  41. package/dist/hash.js +25 -0
  42. package/dist/hash.js.map +1 -0
  43. package/dist/index.d.ts +21 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +21 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/mcp/http.d.ts +26 -0
  48. package/dist/mcp/http.d.ts.map +1 -0
  49. package/dist/mcp/http.js +118 -0
  50. package/dist/mcp/http.js.map +1 -0
  51. package/dist/mcp/protocol.d.ts +53 -0
  52. package/dist/mcp/protocol.d.ts.map +1 -0
  53. package/dist/mcp/protocol.js +282 -0
  54. package/dist/mcp/protocol.js.map +1 -0
  55. package/dist/mcp/stdio.d.ts +22 -0
  56. package/dist/mcp/stdio.d.ts.map +1 -0
  57. package/dist/mcp/stdio.js +67 -0
  58. package/dist/mcp/stdio.js.map +1 -0
  59. package/dist/offline-evaluate.d.ts +23 -0
  60. package/dist/offline-evaluate.d.ts.map +1 -0
  61. package/dist/offline-evaluate.js +68 -0
  62. package/dist/offline-evaluate.js.map +1 -0
  63. package/dist/parse-args.d.ts +14 -0
  64. package/dist/parse-args.d.ts.map +1 -0
  65. package/dist/parse-args.js +86 -0
  66. package/dist/parse-args.js.map +1 -0
  67. package/dist/sample-tools.d.ts +19 -0
  68. package/dist/sample-tools.d.ts.map +1 -0
  69. package/dist/sample-tools.js +37 -0
  70. package/dist/sample-tools.js.map +1 -0
  71. package/package.json +65 -0
  72. package/server.json +59 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 The Pixel Boys / Shield Agent
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,108 @@
1
+ # `@shield-agent/kya`
2
+
3
+ Light install CLI and local MCP gate for **Know Your Agent** (Shield KYA).
4
+
5
+ ```bash
6
+ npx @shield-agent/kya@latest --help
7
+ ```
8
+
9
+ - **Provider-agnostic** — no core lock to a single collab host, cloud, or LLM.
10
+ - **Zero vertical packs required** (R8) — disputes is optional.
11
+ - **Sole PEP** — Shield evaluates; this gate never auto-approves irreversible side effects.
12
+ - **Fail-closed** — empty `KYA_API_KEY` against an authenticated plane → non-zero exit.
13
+ - **Offline demo** — `--offline` sample evaluate (DENY → REQUIRE_APPROVE) without paid cloud.
14
+
15
+ ## 15-minute path
16
+
17
+ ```bash
18
+ # Offline demo (no account, no monorepo)
19
+ npx @shield-agent/kya eval-tool --offline --tool-id org.sample.never.event --irreversible
20
+ # → verdict: DENY
21
+ npx @shield-agent/kya eval-tool --offline --tool-id org.sample.data.write --irreversible
22
+ # → verdict: REQUIRE_APPROVE
23
+
24
+ # Scaffold + local plane
25
+ npx @shield-agent/kya init
26
+ npx @shield-agent/kya register-agent --name solo-builder --version-hash dev-local
27
+ npx @shield-agent/kya eval-tool --tool-id org.sample.never.event --irreversible
28
+ npx @shield-agent/kya serve-mcp --stdio
29
+ ```
30
+
31
+ Install hub: [https://shield-agent.com/install](https://shield-agent.com/install)
32
+
33
+ ## Dual plane
34
+
35
+ ```
36
+ host=ide (authoring) host=runtime (production)
37
+ │ │
38
+ └────────── same agent ────────┘
39
+ identity
40
+ policy evaluate → ALLOW | DENY | REQUIRE_APPROVE
41
+ approval + trail
42
+ ```
43
+
44
+ Tag sessions with `KYA_HOST=ide` or `KYA_HOST=runtime`. Same sole PEP either way.
45
+
46
+ ## Environment
47
+
48
+ | Variable | Required | Meaning |
49
+ |----------|----------|---------|
50
+ | `KYA_BASE_URL` | Yes (network cmds) | Control plane origin |
51
+ | `KYA_API_KEY` | When auth is on | Bearer token |
52
+ | `KYA_HOST` | No (default `ide`) | `ide` \| `runtime` |
53
+ | `KYA_AGENT_ID` | After register | Agent principal id |
54
+ | `KYA_MCP_PORT` | No (default `3920`) | HTTP MCP listen port |
55
+ | `KYA_OFFLINE` | No | `1`/`true` for sample evaluate |
56
+
57
+ ## MCP tools
58
+
59
+ | Tool | Role |
60
+ |------|------|
61
+ | `kya.policy_evaluate` | `ALLOW` \| `DENY` \| `REQUIRE_APPROVE` |
62
+ | `kya.session_ingest` | Observe / raise-only risk |
63
+ | `kya.request_approval` | Open human gate — **does not** execute side effect |
64
+
65
+ MCP Registry: `server.json` + package `mcpName` `io.github.the-pixel-boys/shield-kya`.
66
+
67
+ ```json
68
+ {
69
+ "mcpServers": {
70
+ "shield-kya": {
71
+ "command": "npx",
72
+ "args": ["-y", "@shield-agent/kya", "serve-mcp", "--stdio"],
73
+ "env": {
74
+ "KYA_BASE_URL": "http://127.0.0.1:8090",
75
+ "KYA_API_KEY": "${KYA_API_KEY}",
76
+ "KYA_HOST": "ide"
77
+ }
78
+ }
79
+ }
80
+ }
81
+ ```
82
+
83
+ ## ORR (reporting only)
84
+
85
+ ```bash
86
+ npx @shield-agent/kya orr run --path . --out ./orr-report --skip-optional-producers
87
+ ```
88
+
89
+ ORR is a **reporting orchestrator**. Scanners are evidence. They never ALLOW high-stakes side effects (no dual PEP).
90
+
91
+ ## Enterprise (distinct tier)
92
+
93
+ Pin private registry builds, multi-tenant density, ORR board ops, and support — **never** required for the day-1 npx path above.
94
+
95
+ ## Develop
96
+
97
+ ```bash
98
+ pnpm install
99
+ pnpm test
100
+ pnpm build
101
+ ```
102
+
103
+ ## Docs
104
+
105
+ - [Light install](../../docs/guides/kya-light-install.md)
106
+ - [MCP snippets](../../docs/guides/kya-mcp-snippet.md)
107
+ - [Local free console](../../docs/guides/kya-local-free.md)
108
+ - [Public baseline](../../public/kya-baseline/README.md)
package/dist/cli.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @shield-agent/kya — light install CLI
4
+ * Commands: init | register-agent | eval-tool | serve-mcp | orr run
5
+ * Fail-closed: empty KYA_API_KEY against auth plane → non-zero exit.
6
+ * Offline sample: eval-tool --offline (demo only; not production PEP).
7
+ */
8
+ export interface CliIo {
9
+ readonly log: (msg: string) => void;
10
+ readonly error: (msg: string) => void;
11
+ readonly exit: (code: number) => void;
12
+ }
13
+ /** Testable entry — does not call process.exit when custom io.exit is provided that throws. */
14
+ export declare function runCli(argv: readonly string[], io?: CliIo, env?: NodeJS.ProcessEnv, cwd?: string): Promise<number>;
15
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AA0DH,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAQD,+FAA+F;AAC/F,wBAAsB,MAAM,CAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,GAAE,KAAiB,EACrB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAqJjB"}
package/dist/cli.js ADDED
@@ -0,0 +1,207 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @shield-agent/kya — light install CLI
4
+ * Commands: init | register-agent | eval-tool | serve-mcp | orr run
5
+ * Fail-closed: empty KYA_API_KEY against auth plane → non-zero exit.
6
+ * Offline sample: eval-tool --offline (demo only; not production PEP).
7
+ */
8
+ import { realpathSync } from "node:fs";
9
+ import { fileURLToPath } from "node:url";
10
+ import { resolveConfig } from "./config.js";
11
+ import { KyaError } from "./errors.js";
12
+ import { parseArgs } from "./parse-args.js";
13
+ import { initFromArgs } from "./commands/init.js";
14
+ import { registerAgentInputFromArgs, runRegisterAgent, } from "./commands/register-agent.js";
15
+ import { evalToolInputFromArgs, formatEvalHuman, runEvalTool, } from "./commands/eval-tool.js";
16
+ import { runServeMcp, serveMcpOptionsFromArgs, } from "./commands/serve-mcp.js";
17
+ import { orrRunOptionsFromArgs, runOrr, } from "./commands/orr.js";
18
+ const HELP = `Shield KYA light CLI — Know Your Agent (provider-agnostic)
19
+
20
+ Usage:
21
+ kya <command> [options]
22
+
23
+ Commands:
24
+ init Scaffold .kya/ config + sample tools + .env.example
25
+ register-agent POST /api/v1/kya/agents (stores agentId in .kya/config.json)
26
+ eval-tool Policy evaluate (HTTP plane or --offline sample)
27
+ serve-mcp Local MCP gate (HTTP default; --stdio for hosts)
28
+ orr run Read-only ORR board (reporting only — not a second PEP)
29
+
30
+ Options (shared):
31
+ --base-url <url> Control plane origin (or KYA_BASE_URL)
32
+ --api-key <key> API key (or KYA_API_KEY) — required for network commands
33
+ --host <ide|runtime> Dual-plane host (or KYA_HOST, default ide)
34
+ --offline Sample evaluate without network (eval-tool only)
35
+ --json Machine-readable output
36
+ --help, -h Show help
37
+
38
+ Examples:
39
+ npx @shield-agent/kya init --base-url http://127.0.0.1:8090 --host ide
40
+ npx @shield-agent/kya eval-tool --offline --tool-id org.sample.never.event --irreversible
41
+ npx @shield-agent/kya eval-tool --offline --tool-id org.sample.data.write --irreversible
42
+ npx @shield-agent/kya register-agent --name solo-builder --version-hash dev-local
43
+ npx @shield-agent/kya serve-mcp --stdio
44
+ npx @shield-agent/kya orr run --path . --out ./orr-report --skip-optional-producers
45
+
46
+ Docs: https://shield-agent.com/install · docs/guides/kya-light-install.md
47
+ Doctrine: sole PEP is Shield; DENY is hard; missing APPROVED ⇒ no irreversible side effect.
48
+ `;
49
+ const defaultIo = {
50
+ log: (m) => console.log(m),
51
+ error: (m) => console.error(m),
52
+ exit: (c) => process.exit(c),
53
+ };
54
+ /** Testable entry — does not call process.exit when custom io.exit is provided that throws. */
55
+ export async function runCli(argv, io = defaultIo, env = process.env, cwd = process.cwd()) {
56
+ const parsed = parseArgs(argv);
57
+ if (!parsed.command ||
58
+ parsed.command === "help" ||
59
+ parsed.flags["help"] === true ||
60
+ parsed.flags["h"] === true) {
61
+ io.log(HELP);
62
+ return 0;
63
+ }
64
+ try {
65
+ switch (parsed.command) {
66
+ case "init": {
67
+ const result = initFromArgs(parsed, cwd);
68
+ if (parsed.flags["json"] === true || parsed.flags["json"] === "true") {
69
+ io.log(JSON.stringify(result, null, 2));
70
+ }
71
+ else {
72
+ io.log("KYA light scaffold ready (zero vertical packs required)");
73
+ for (const p of result.created)
74
+ io.log(` created: ${p}`);
75
+ for (const p of result.skipped)
76
+ io.log(` exists: ${p}`);
77
+ io.log("Next: offline demo → npx @shield-agent/kya eval-tool --offline --tool-id org.sample.never.event --irreversible");
78
+ io.log("Or: cp .env.example .env && set KYA_API_KEY, then register-agent");
79
+ }
80
+ return 0;
81
+ }
82
+ case "register-agent": {
83
+ const config = resolveConfig({
84
+ cwd,
85
+ env,
86
+ flags: parsed.flags,
87
+ requireApiKey: true,
88
+ });
89
+ const input = registerAgentInputFromArgs(parsed);
90
+ const result = await runRegisterAgent(config, input);
91
+ if (config.json) {
92
+ io.log(JSON.stringify(result, null, 2));
93
+ }
94
+ else {
95
+ io.log(`agentId: ${result.agentId}`);
96
+ io.log(`name: ${result.agent.name}`);
97
+ io.log(`stored: ${result.configPath}`);
98
+ }
99
+ return 0;
100
+ }
101
+ case "eval-tool": {
102
+ const input = evalToolInputFromArgs(parsed);
103
+ const config = resolveConfig({
104
+ cwd,
105
+ env,
106
+ flags: parsed.flags,
107
+ requireApiKey: !input.offline,
108
+ offline: input.offline,
109
+ });
110
+ const result = await runEvalTool(config, input);
111
+ if (config.json) {
112
+ io.log(JSON.stringify({ ...result.response, offline: result.offline }, null, 2));
113
+ }
114
+ else {
115
+ io.log(formatEvalHuman(result));
116
+ }
117
+ return 0;
118
+ }
119
+ case "serve-mcp": {
120
+ const config = resolveConfig({
121
+ cwd,
122
+ env,
123
+ flags: parsed.flags,
124
+ requireApiKey: true,
125
+ });
126
+ const opts = serveMcpOptionsFromArgs(parsed);
127
+ const result = await runServeMcp(config, opts);
128
+ if (result.mode === "http" && result.http) {
129
+ io.log(`KYA MCP gate listening on ${result.http.url} (host=${config.host})`);
130
+ io.log(" GET /health");
131
+ io.log(" GET /connectors/mcp.json");
132
+ io.log(" GET /mcp/tools");
133
+ io.log(" POST /mcp (JSON-RPC)");
134
+ io.log(" tools: kya.policy_evaluate | kya.session_ingest | kya.request_approval");
135
+ io.log(" fail-closed: evaluate/request only — no irreversible side effects without APPROVED");
136
+ await new Promise((resolve) => {
137
+ const stop = () => {
138
+ void result.http?.close().finally(resolve);
139
+ };
140
+ process.once("SIGINT", stop);
141
+ process.once("SIGTERM", stop);
142
+ });
143
+ }
144
+ else if (result.mode === "stdio" && result.stdio) {
145
+ await result.stdio.done;
146
+ }
147
+ return 0;
148
+ }
149
+ case "orr": {
150
+ const sub = parsed.positionals[0];
151
+ if (sub !== "run") {
152
+ io.error('Usage: kya orr run --path <dir> [options]');
153
+ io.log("ORR is a reporting orchestrator only (not a second PEP). See docs/dev/kya-orr-cli.md");
154
+ return 1;
155
+ }
156
+ // Re-parse with flags after "orr run" — positionals after subcommand already in flags from original parse
157
+ const opts = orrRunOptionsFromArgs(parsed);
158
+ const result = runOrr(opts);
159
+ if (opts.jsonStdout || parsed.flags["json"] === true) {
160
+ io.log(JSON.stringify(result.report, null, 2));
161
+ }
162
+ else if (!opts.quiet) {
163
+ io.log(`ORR ${result.report.overall} / ${result.report.disposition} → ${result.reportJsonPath ?? result.reportMdPath ?? opts.out}`);
164
+ io.log(`(reporting only — sole PEP remains Shield KYA; scanners are evidence)`);
165
+ }
166
+ return result.exitCode;
167
+ }
168
+ default:
169
+ io.error(`Unknown command: ${parsed.command}`);
170
+ io.log(HELP);
171
+ return 2;
172
+ }
173
+ }
174
+ catch (err) {
175
+ if (err instanceof KyaError) {
176
+ io.error(`error: ${err.message} [${err.code}]`);
177
+ return err.exitCode;
178
+ }
179
+ const message = err instanceof Error ? err.message : String(err);
180
+ io.error(`error: ${message}`);
181
+ return 1;
182
+ }
183
+ }
184
+ // Only auto-run when executed as CLI entry (not when imported by tests).
185
+ // Bin links resolve as ".../bin/kya" not ".../cli.js" — compare realpaths.
186
+ function isCliEntry() {
187
+ if (typeof process.argv[1] !== "string")
188
+ return false;
189
+ try {
190
+ return realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url));
191
+ }
192
+ catch {
193
+ const a = process.argv[1];
194
+ return (a.endsWith("/cli.js") ||
195
+ a.endsWith("/cli.ts") ||
196
+ a.endsWith("/kya") ||
197
+ a.endsWith("/shield-kya") ||
198
+ a.includes("@shield-agent/kya"));
199
+ }
200
+ }
201
+ if (isCliEntry()) {
202
+ void runCli(process.argv.slice(2)).then((code) => {
203
+ if (code !== 0)
204
+ process.exit(code);
205
+ });
206
+ }
207
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import type { Host } from "./config.js";
2
+ export type FetchLike = typeof fetch;
3
+ export interface KyaClientOptions {
4
+ readonly baseUrl: string;
5
+ readonly apiKey: string;
6
+ readonly fetch?: FetchLike;
7
+ readonly host?: Host;
8
+ readonly agentId?: string;
9
+ /** When false, skip auth check (tests only). Default true. */
10
+ readonly requireApiKey?: boolean;
11
+ }
12
+ export interface PolicyEvaluateRequest {
13
+ readonly toolId: string;
14
+ readonly action?: string;
15
+ readonly argsHash?: string;
16
+ readonly irreversible?: boolean;
17
+ readonly actionClass?: string;
18
+ readonly dataClass?: string;
19
+ readonly sessionRisk?: string;
20
+ readonly approvalStatus?: string;
21
+ readonly packId?: string | null;
22
+ readonly env?: {
23
+ readonly host: Host;
24
+ readonly sessionId?: string;
25
+ readonly agentId?: string;
26
+ readonly correlationId?: string;
27
+ };
28
+ }
29
+ export interface PolicyEvaluateResponse {
30
+ readonly verdict: string;
31
+ readonly reasonCode: string;
32
+ readonly toolId?: string;
33
+ readonly argsHash?: string;
34
+ readonly localVerdict?: string;
35
+ readonly sessionRisk?: string;
36
+ readonly host?: string;
37
+ readonly opaAllow?: boolean;
38
+ readonly opaReason?: string;
39
+ }
40
+ export interface RegisterAgentRequest {
41
+ readonly name: string;
42
+ readonly versionHash: string;
43
+ }
44
+ export interface AgentResponse {
45
+ readonly id: string;
46
+ readonly orgId?: string;
47
+ readonly name: string;
48
+ readonly status?: string;
49
+ readonly versionHash?: string;
50
+ readonly createdAt?: string;
51
+ }
52
+ export interface SessionIngestRequest {
53
+ readonly sessionId: string;
54
+ readonly source?: string;
55
+ readonly model?: string;
56
+ readonly hostname?: string;
57
+ readonly projectPath?: string;
58
+ readonly riskLevel?: string;
59
+ readonly hitCodes?: readonly string[];
60
+ readonly payload?: Readonly<Record<string, unknown>>;
61
+ readonly host?: Host;
62
+ }
63
+ export interface SessionIngestResponse {
64
+ readonly id: string;
65
+ readonly riskLevel: string;
66
+ readonly host?: string;
67
+ }
68
+ export interface CreateApprovalRequest {
69
+ readonly agentId: string;
70
+ readonly disputeId: string;
71
+ readonly packVersion?: string;
72
+ readonly action?: string;
73
+ readonly toolId?: string;
74
+ }
75
+ export interface ApprovalResponse {
76
+ readonly id: string;
77
+ readonly status: string;
78
+ readonly [key: string]: unknown;
79
+ }
80
+ /**
81
+ * Minimal HTTP client for light CLI / MCP gate.
82
+ * Base URL is control-plane origin (e.g. http://127.0.0.1:8090).
83
+ * Paths are absolute under /api/v1/kya/*.
84
+ */
85
+ export declare class KyaHttpClient {
86
+ readonly baseUrl: string;
87
+ readonly host: Host;
88
+ readonly agentId: string | undefined;
89
+ private readonly apiKey;
90
+ private readonly fetchImpl;
91
+ constructor(options: KyaClientOptions);
92
+ registerAgent(body: RegisterAgentRequest): Promise<AgentResponse>;
93
+ evaluatePolicy(req: PolicyEvaluateRequest): Promise<PolicyEvaluateResponse>;
94
+ ingestSession(req: SessionIngestRequest): Promise<SessionIngestResponse>;
95
+ requestApproval(req: CreateApprovalRequest): Promise<ApprovalResponse>;
96
+ request<T>(path: string, options?: {
97
+ method?: "GET" | "POST" | "PUT" | "DELETE";
98
+ body?: unknown;
99
+ headers?: Record<string, string>;
100
+ }): Promise<T>;
101
+ }
102
+ export declare function buildEvaluateFromToolArgs(input: {
103
+ toolId: string;
104
+ args?: unknown;
105
+ irreversible?: boolean;
106
+ host: Host;
107
+ agentId?: string;
108
+ sessionRisk?: string;
109
+ approvalStatus?: string;
110
+ }): PolicyEvaluateRequest;
111
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js ADDED
@@ -0,0 +1,143 @@
1
+ import { AuthRequiredError, HttpError, KyaError } from "./errors.js";
2
+ import { computeArgsHash } from "./hash.js";
3
+ import { findSampleTool } from "./sample-tools.js";
4
+ /**
5
+ * Minimal HTTP client for light CLI / MCP gate.
6
+ * Base URL is control-plane origin (e.g. http://127.0.0.1:8090).
7
+ * Paths are absolute under /api/v1/kya/*.
8
+ */
9
+ export class KyaHttpClient {
10
+ baseUrl;
11
+ host;
12
+ agentId;
13
+ apiKey;
14
+ fetchImpl;
15
+ constructor(options) {
16
+ const requireKey = options.requireApiKey !== false;
17
+ if (requireKey && (!options.apiKey || options.apiKey.trim() === "")) {
18
+ throw new AuthRequiredError();
19
+ }
20
+ this.baseUrl = stripTrailingSlash(options.baseUrl);
21
+ this.apiKey = options.apiKey.trim();
22
+ this.host = options.host ?? "ide";
23
+ this.agentId = options.agentId;
24
+ const fetchImpl = options.fetch ?? globalThis.fetch;
25
+ if (typeof fetchImpl !== "function") {
26
+ throw new KyaError("global fetch unavailable; Node 20+ required", "NO_FETCH");
27
+ }
28
+ this.fetchImpl = fetchImpl;
29
+ }
30
+ async registerAgent(body) {
31
+ return this.request("/api/v1/kya/agents", {
32
+ method: "POST",
33
+ body,
34
+ });
35
+ }
36
+ async evaluatePolicy(req) {
37
+ const toolId = req.toolId;
38
+ const sample = findSampleTool(toolId);
39
+ const body = {
40
+ toolId,
41
+ action: req.action ?? toolId,
42
+ argsHash: req.argsHash,
43
+ irreversible: req.irreversible ?? sample?.irreversible ?? false,
44
+ actionClass: req.actionClass ?? sample?.actionClass,
45
+ dataClass: req.dataClass ?? sample?.dataClass,
46
+ sessionRisk: req.sessionRisk ?? "LOW",
47
+ approvalStatus: req.approvalStatus ?? "NONE",
48
+ packId: req.packId === undefined ? "generic" : req.packId,
49
+ env: req.env ?? {
50
+ host: this.host,
51
+ agentId: this.agentId,
52
+ },
53
+ };
54
+ return this.request("/api/v1/kya/policy/evaluate", {
55
+ method: "POST",
56
+ body,
57
+ });
58
+ }
59
+ async ingestSession(req) {
60
+ return this.request("/api/v1/kya/sessions/ingest", {
61
+ method: "POST",
62
+ body: {
63
+ ...req,
64
+ host: req.host ?? this.host,
65
+ },
66
+ });
67
+ }
68
+ async requestApproval(req) {
69
+ return this.request("/api/v1/kya/approvals", {
70
+ method: "POST",
71
+ body: {
72
+ agentId: req.agentId,
73
+ disputeId: req.disputeId,
74
+ packVersion: req.packVersion ?? "generic",
75
+ action: req.action ?? req.toolId,
76
+ toolId: req.toolId ?? req.action,
77
+ },
78
+ });
79
+ }
80
+ async request(path, options = {}) {
81
+ const method = options.method ?? "GET";
82
+ const url = `${this.baseUrl}${path.startsWith("/") ? path : `/${path}`}`;
83
+ const headers = {
84
+ Accept: "application/json",
85
+ "User-Agent": "shield-agent-kya-cli/0.1.0",
86
+ ...(options.headers ?? {}),
87
+ };
88
+ if (this.apiKey) {
89
+ headers.Authorization = `Bearer ${this.apiKey}`;
90
+ }
91
+ let body;
92
+ if (options.body !== undefined) {
93
+ headers["Content-Type"] = "application/json; charset=utf-8";
94
+ body = JSON.stringify(options.body);
95
+ }
96
+ const response = await this.fetchImpl(url, { method, headers, body });
97
+ const text = await response.text();
98
+ const parsed = parseJsonSafe(text);
99
+ if (!response.ok) {
100
+ if (response.status === 401 || response.status === 403) {
101
+ throw new AuthRequiredError(`control plane rejected credentials (HTTP ${response.status})`);
102
+ }
103
+ let msg = `HTTP ${response.status} ${method} ${path}`;
104
+ if (parsed &&
105
+ typeof parsed === "object" &&
106
+ "message" in parsed &&
107
+ typeof parsed.message === "string") {
108
+ msg = parsed.message;
109
+ }
110
+ throw new HttpError(response.status, msg, parsed);
111
+ }
112
+ return parsed;
113
+ }
114
+ }
115
+ export function buildEvaluateFromToolArgs(input) {
116
+ const args = input.args ?? {};
117
+ return {
118
+ toolId: input.toolId,
119
+ action: input.toolId,
120
+ argsHash: computeArgsHash(args),
121
+ irreversible: input.irreversible,
122
+ sessionRisk: input.sessionRisk ?? "LOW",
123
+ approvalStatus: input.approvalStatus ?? "NONE",
124
+ env: {
125
+ host: input.host,
126
+ agentId: input.agentId,
127
+ },
128
+ };
129
+ }
130
+ function stripTrailingSlash(url) {
131
+ return url.endsWith("/") ? url.slice(0, -1) : url;
132
+ }
133
+ function parseJsonSafe(text) {
134
+ if (!text || text.length === 0)
135
+ return undefined;
136
+ try {
137
+ return JSON.parse(text);
138
+ }
139
+ catch {
140
+ return undefined;
141
+ }
142
+ }
143
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAErE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA0FnD;;;;GAIG;AACH,MAAM,OAAO,aAAa;IACf,OAAO,CAAS;IAChB,IAAI,CAAO;IACX,OAAO,CAAqB;IACpB,MAAM,CAAS;IACf,SAAS,CAAY;IAEtC,YAAY,OAAyB;QACnC,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,KAAK,KAAK,CAAC;QACnD,IAAI,UAAU,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,iBAAiB,EAAE,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;QACpD,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;YACpC,MAAM,IAAI,QAAQ,CAAC,6CAA6C,EAAE,UAAU,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAA0B;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAgB,oBAAoB,EAAE;YACvD,MAAM,EAAE,MAAM;YACd,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAA0B;QAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QAC1B,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG;YACX,MAAM;YACN,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,MAAM;YAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,MAAM,EAAE,YAAY,IAAI,KAAK;YAC/D,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,MAAM,EAAE,WAAW;YACnD,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,MAAM,EAAE,SAAS;YAC7C,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,KAAK;YACrC,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,MAAM;YAC5C,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM;YACzD,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI;gBACd,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB;SACF,CAAC;QACF,OAAO,IAAI,CAAC,OAAO,CAAyB,6BAA6B,EAAE;YACzE,MAAM,EAAE,MAAM;YACd,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAyB;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAwB,6BAA6B,EAAE;YACxE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACJ,GAAG,GAAG;gBACN,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI;aAC5B;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAA0B;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAmB,uBAAuB,EAAE;YAC7D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACJ,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS;gBACzC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM;gBAChC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM;aACjC;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CACX,IAAY,EACZ,UAII,EAAE;QAEN,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;QACvC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QACzE,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,kBAAkB;YAC1B,YAAY,EAAE,4BAA4B;YAC1C,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;SAC3B,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,aAAa,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QAClD,CAAC;QACD,IAAI,IAAwB,CAAC;QAC7B,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,CAAC,cAAc,CAAC,GAAG,iCAAiC,CAAC;YAC5D,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAEnC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvD,MAAM,IAAI,iBAAiB,CACzB,4CAA4C,QAAQ,CAAC,MAAM,GAAG,CAC/D,CAAC;YACJ,CAAC;YACD,IAAI,GAAG,GAAG,QAAQ,QAAQ,CAAC,MAAM,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACtD,IACE,MAAM;gBACN,OAAO,MAAM,KAAK,QAAQ;gBAC1B,SAAS,IAAI,MAAM;gBACnB,OAAQ,MAA+B,CAAC,OAAO,KAAK,QAAQ,EAC5D,CAAC;gBACD,GAAG,GAAI,MAA8B,CAAC,OAAO,CAAC;YAChD,CAAC;YACD,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,MAAW,CAAC;IACrB,CAAC;CACF;AAED,MAAM,UAAU,yBAAyB,CAAC,KAQzC;IACC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;IAC9B,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC;QAC/B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,KAAK;QACvC,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,MAAM;QAC9C,GAAG,EAAE;YACH,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB;KACF,CAAC;AACJ,CAAC;AAED,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,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACjD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { ResolvedConfig } from "../config.js";
2
+ import { KyaHttpClient, type PolicyEvaluateResponse } from "../client.js";
3
+ import type { ParsedArgs } from "../parse-args.js";
4
+ export interface EvalToolResult {
5
+ readonly response: PolicyEvaluateResponse;
6
+ readonly toolId: string;
7
+ readonly argsHash: string | undefined;
8
+ readonly offline: boolean;
9
+ }
10
+ export declare function runEvalTool(config: ResolvedConfig, input: {
11
+ toolId: string;
12
+ args?: unknown;
13
+ irreversible?: boolean;
14
+ sessionRisk?: string;
15
+ approvalStatus?: string;
16
+ offline?: boolean;
17
+ }, client?: KyaHttpClient): Promise<EvalToolResult>;
18
+ export declare function evalToolInputFromArgs(parsed: ParsedArgs): {
19
+ toolId: string;
20
+ args: unknown;
21
+ irreversible: boolean;
22
+ sessionRisk?: string;
23
+ approvalStatus?: string;
24
+ offline: boolean;
25
+ };
26
+ export declare function formatEvalHuman(result: EvalToolResult): string;
27
+ //# sourceMappingURL=eval-tool.d.ts.map