@shield-agent/kya 0.1.18 → 0.1.20
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/.mcp.json +1 -1
- package/LIMITATIONS.md +1 -0
- package/README.md +15 -3
- package/claude/claude_desktop_config.example.json +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +1 -0
- package/dist/client.js.map +1 -1
- package/dist/commands/eval-tool.d.ts +2 -0
- package/dist/commands/eval-tool.d.ts.map +1 -1
- package/dist/commands/eval-tool.js +12 -2
- package/dist/commands/eval-tool.js.map +1 -1
- package/dist/commands/orr.d.ts +3 -0
- package/dist/commands/orr.d.ts.map +1 -1
- package/dist/commands/orr.js +23 -51
- package/dist/commands/orr.js.map +1 -1
- package/dist/commands/sandbox.d.ts +3 -0
- package/dist/commands/sandbox.d.ts.map +1 -0
- package/dist/commands/sandbox.js +82 -0
- package/dist/commands/sandbox.js.map +1 -0
- package/dist/commands/wrap.d.ts +1 -0
- package/dist/commands/wrap.d.ts.map +1 -1
- package/dist/offline-evaluate.d.ts.map +1 -1
- package/dist/offline-evaluate.js +15 -0
- package/dist/offline-evaluate.js.map +1 -1
- package/dist/orr/scorecard.d.ts +30 -0
- package/dist/orr/scorecard.d.ts.map +1 -0
- package/dist/orr/scorecard.js +107 -0
- package/dist/orr/scorecard.js.map +1 -0
- package/dist/sample-tools.d.ts +2 -0
- package/dist/sample-tools.d.ts.map +1 -1
- package/dist/sample-tools.js +38 -0
- package/dist/sample-tools.js.map +1 -1
- package/dist/sandbox/firecracker-driver.d.ts +7 -0
- package/dist/sandbox/firecracker-driver.d.ts.map +1 -0
- package/dist/sandbox/firecracker-driver.js +99 -0
- package/dist/sandbox/firecracker-driver.js.map +1 -0
- package/dist/sandbox/id.d.ts +4 -0
- package/dist/sandbox/id.d.ts.map +1 -0
- package/dist/sandbox/id.js +11 -0
- package/dist/sandbox/id.js.map +1 -0
- package/dist/sandbox/mock-driver.d.ts +6 -0
- package/dist/sandbox/mock-driver.d.ts.map +1 -0
- package/dist/sandbox/mock-driver.js +25 -0
- package/dist/sandbox/mock-driver.js.map +1 -0
- package/dist/sandbox/path-jail.d.ts +4 -0
- package/dist/sandbox/path-jail.d.ts.map +1 -0
- package/dist/sandbox/path-jail.js +22 -0
- package/dist/sandbox/path-jail.js.map +1 -0
- package/dist/sandbox/runtime.d.ts +18 -0
- package/dist/sandbox/runtime.d.ts.map +1 -0
- package/dist/sandbox/runtime.js +71 -0
- package/dist/sandbox/runtime.js.map +1 -0
- package/dist/sandbox/types.d.ts +26 -0
- package/dist/sandbox/types.d.ts.map +1 -0
- package/dist/sandbox/types.js +2 -0
- package/dist/sandbox/types.js.map +1 -0
- package/gemini/settings.example.json +1 -1
- package/grok/README.md +1 -1
- package/manifest.json +1 -1
- package/mcp.json +1 -1
- package/openai/codex.config.example.toml +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { mkdirSync, readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { UsageError } from "../errors.js";
|
|
5
|
+
import { createFirecrackerDriver } from "./firecracker-driver.js";
|
|
6
|
+
import { createMockDriver } from "./mock-driver.js";
|
|
7
|
+
import { assertSandboxId } from "./id.js";
|
|
8
|
+
import { assertInsideRoot, jailRoot } from "./path-jail.js";
|
|
9
|
+
export function resolveSandboxDriver(backend) {
|
|
10
|
+
const b = (backend ?? process.env.KYA_SANDBOX ?? "").trim().toLowerCase();
|
|
11
|
+
if (!b) {
|
|
12
|
+
throw new UsageError("sandbox is opt-in: set KYA_SANDBOX=firecracker or KYA_SANDBOX=mock");
|
|
13
|
+
}
|
|
14
|
+
if (b === "mock")
|
|
15
|
+
return createMockDriver();
|
|
16
|
+
if (b === "firecracker")
|
|
17
|
+
return createFirecrackerDriver();
|
|
18
|
+
throw new UsageError(`unknown sandbox backend: ${b}`);
|
|
19
|
+
}
|
|
20
|
+
export function sandboxStatePath(root) {
|
|
21
|
+
return join(root, ".kya", "sandboxes.json");
|
|
22
|
+
}
|
|
23
|
+
export function loadSandboxState(root) {
|
|
24
|
+
const jailed = jailRoot(root);
|
|
25
|
+
const path = sandboxStatePath(jailed);
|
|
26
|
+
assertInsideRoot(path, jailed, "sandbox state");
|
|
27
|
+
if (!existsSync(path))
|
|
28
|
+
return [];
|
|
29
|
+
try {
|
|
30
|
+
const raw = JSON.parse(readFileSync(path, "utf8"));
|
|
31
|
+
return Array.isArray(raw) ? raw : [];
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function saveSandboxState(root, rows) {
|
|
38
|
+
const jailed = jailRoot(root);
|
|
39
|
+
const dir = join(jailed, ".kya");
|
|
40
|
+
mkdirSync(dir, { recursive: true });
|
|
41
|
+
const path = sandboxStatePath(jailed);
|
|
42
|
+
assertInsideRoot(path, jailed, "sandbox state");
|
|
43
|
+
writeFileSync(path, JSON.stringify(rows, null, 2) + "\n");
|
|
44
|
+
}
|
|
45
|
+
export async function spawnSandbox(input) {
|
|
46
|
+
const sandboxId = `sbx-${randomUUID()}`;
|
|
47
|
+
assertSandboxId(sandboxId);
|
|
48
|
+
await input.driver.spawn({
|
|
49
|
+
sandboxId,
|
|
50
|
+
kernelPath: input.kernelPath ?? process.env.KYA_SANDBOX_KERNEL ?? "",
|
|
51
|
+
rootfsPath: input.rootfsPath ?? process.env.KYA_SANDBOX_ROOTFS ?? "",
|
|
52
|
+
});
|
|
53
|
+
const row = {
|
|
54
|
+
sandboxId,
|
|
55
|
+
backend: input.driver.backend,
|
|
56
|
+
createdAt: new Date().toISOString(),
|
|
57
|
+
status: "running",
|
|
58
|
+
agentId: input.agentId,
|
|
59
|
+
};
|
|
60
|
+
const rows = loadSandboxState(input.root).filter((r) => r.status === "running");
|
|
61
|
+
rows.push(row);
|
|
62
|
+
saveSandboxState(input.root, rows);
|
|
63
|
+
return row;
|
|
64
|
+
}
|
|
65
|
+
export async function killSandbox(input) {
|
|
66
|
+
const id = assertSandboxId(input.sandboxId);
|
|
67
|
+
await input.driver.kill(id);
|
|
68
|
+
const rows = loadSandboxState(input.root).map((r) => r.sandboxId === id ? { ...r, status: "killed" } : r);
|
|
69
|
+
saveSandboxState(input.root, rows);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/sandbox/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type SandboxBackend = "firecracker";
|
|
2
|
+
export interface SandboxRecord {
|
|
3
|
+
readonly sandboxId: string;
|
|
4
|
+
readonly backend: SandboxBackend;
|
|
5
|
+
readonly createdAt: string;
|
|
6
|
+
readonly status: "running" | "killed";
|
|
7
|
+
readonly agentId?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface SandboxDriver {
|
|
10
|
+
readonly backend: SandboxBackend;
|
|
11
|
+
spawn(input: {
|
|
12
|
+
sandboxId: string;
|
|
13
|
+
kernelPath: string;
|
|
14
|
+
rootfsPath: string;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
exec(input: {
|
|
17
|
+
sandboxId: string;
|
|
18
|
+
command: string[];
|
|
19
|
+
}): Promise<{
|
|
20
|
+
exitCode: number;
|
|
21
|
+
stdout: string;
|
|
22
|
+
stderr: string;
|
|
23
|
+
}>;
|
|
24
|
+
kill(sandboxId: string): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sandbox/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,aAAa,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,KAAK,CAAC,KAAK,EAAE;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,IAAI,CAAC,KAAK,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sandbox/types.ts"],"names":[],"mappings":""}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"mcpServers": {
|
|
3
3
|
"shield-kya": {
|
|
4
4
|
"command": "npx",
|
|
5
|
-
"args": ["--no-install", "@shield-agent/kya@0.1.
|
|
5
|
+
"args": ["--no-install", "@shield-agent/kya@0.1.20", "serve-mcp", "--stdio"],
|
|
6
6
|
"env": {
|
|
7
7
|
"KYA_BASE_URL": "https://shield-agent.com",
|
|
8
8
|
"KYA_API_KEY": "${KYA_API_KEY}",
|
package/grok/README.md
CHANGED
|
@@ -40,7 +40,7 @@ chat = client.chat.create(
|
|
|
40
40
|
There is no grok.com stdio path. For a local agent host use the same stdio launch as Claude:
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
|
-
npx --no-install @shield-agent/kya@0.1.
|
|
43
|
+
npx --no-install @shield-agent/kya@0.1.20 serve-mcp --stdio
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
Env: `KYA_BASE_URL`, `KYA_API_KEY`, `KYA_HOST`. Codex and Gemini example configs in this package show the full snippets.
|
package/manifest.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"manifest_version": "0.3",
|
|
3
3
|
"name": "shield-kya",
|
|
4
4
|
"display_name": "Shield KYA",
|
|
5
|
-
"version": "0.1.
|
|
5
|
+
"version": "0.1.20",
|
|
6
6
|
"description": "Know Your Agent MCP gate: ALLOW / DENY / REQUIRE_APPROVE. Sole PEP is Shield.",
|
|
7
7
|
"long_description": "Local Claude Desktop extension that runs the packaged `dist/cli.js serve-mcp --stdio` against your Shield control plane (local or https://shield-agent.com). Tools evaluate policy, ingest session risk, and open Hold tickets. They never execute irreversible side effects.",
|
|
8
8
|
"author": {
|
package/mcp.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"shield-kya": {
|
|
4
4
|
"description": "Know Your Agent local MCP gate: wrap-before-write, named-agent registry, Hold/Clear.",
|
|
5
5
|
"command": "npx",
|
|
6
|
-
"args": ["--no-install", "@shield-agent/kya@0.1.
|
|
6
|
+
"args": ["--no-install", "@shield-agent/kya@0.1.20", "serve-mcp", "--stdio"],
|
|
7
7
|
"env": {
|
|
8
8
|
"KYA_BASE_URL": "${KYA_BASE_URL}",
|
|
9
9
|
"KYA_API_KEY": "${KYA_API_KEY}",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
# --- Local stdio (OSS) ---
|
|
12
12
|
[mcp_servers.shield-kya]
|
|
13
13
|
command = "npx"
|
|
14
|
-
args = ["--no-install", "@shield-agent/kya@0.1.
|
|
14
|
+
args = ["--no-install", "@shield-agent/kya@0.1.20", "serve-mcp", "--stdio"]
|
|
15
15
|
startup_timeout_sec = 20
|
|
16
16
|
env_vars = ["KYA_BASE_URL", "KYA_API_KEY", "KYA_HOST", "KYA_AGENT_ID"]
|
|
17
17
|
|
package/package.json
CHANGED
package/server.json
CHANGED
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
"url": "https://github.com/The-Pixel-Boys/shield-kya",
|
|
8
8
|
"source": "github"
|
|
9
9
|
},
|
|
10
|
-
"version": "0.1.
|
|
10
|
+
"version": "0.1.20",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "@shield-agent/kya",
|
|
15
|
-
"version": "0.1.
|
|
15
|
+
"version": "0.1.20",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
},
|