@decionis/mcp 0.1.3 → 0.1.4
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/.claude-plugin/plugin.json +15 -0
- package/README.md +23 -0
- package/commands/init.md +23 -0
- package/dist/AgentHookCli.js +2 -2
- package/dist/ManagedAgentHookCli.js +27 -4
- package/dist/agent/AgentIndex.d.ts +37 -2
- package/dist/agent/AgentIndex.js +2 -2
- package/dist/{chunk-NFWSCSMQ.js → chunk-MJVKY7PZ.js} +28 -6
- package/dist/chunk-MJVKY7PZ.js.map +1 -0
- package/dist/{chunk-XNC3IZW5.js → chunk-YVRIRS6H.js} +2 -1
- package/dist/{chunk-XNC3IZW5.js.map → chunk-YVRIRS6H.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/hooks/hooks.json +17 -0
- package/package.json +5 -2
- package/templates/ClaudeSettings.json +1 -1
- package/templates/DECIONIS_POLICY.starter.md +108 -0
- package/templates/managed/ClaudeManagedSettings.Windows.json +1 -1
- package/templates/managed/ClaudeManagedSettings.json +1 -1
- package/dist/chunk-NFWSCSMQ.js.map +0 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "decionis",
|
|
3
|
+
"displayName": "Decionis Execution Authority",
|
|
4
|
+
"version": "0.1.4",
|
|
5
|
+
"description": "Refuse an agent's tool call before it runs, using a policy you wrote. Evaluated locally through the real Decionis protocol evaluator \u2014 no account, no network, no credentials.",
|
|
6
|
+
"keywords": ["security", "policy", "guardrails", "execution-authority", "agent-safety", "hooks"],
|
|
7
|
+
"homepage": "https://decionis.com/docs/protocol-mcp",
|
|
8
|
+
"repository": "https://github.com/decionis/mcp",
|
|
9
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
10
|
+
"author": {
|
|
11
|
+
"name": "Decionis, Inc.",
|
|
12
|
+
"url": "https://decionis.com"
|
|
13
|
+
},
|
|
14
|
+
"commands": ["./commands"]
|
|
15
|
+
}
|
package/README.md
CHANGED
|
@@ -77,6 +77,29 @@ then `./DECIONIS_POLICY.md` in the working directory.
|
|
|
77
77
|
|
|
78
78
|
## Install
|
|
79
79
|
|
|
80
|
+
**Claude Code — as a plugin (one command, gate included):**
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
/plugin marketplace add decionis/mcp
|
|
84
|
+
/plugin install decionis
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
That installs the MCP tools **and** the binding `PreToolUse` gate together. Then,
|
|
88
|
+
in a repository you want governed:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
/decionis:init
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
…which writes a starter `DECIONIS_POLICY.md`. Ask your agent to run
|
|
95
|
+
`rm -rf /var/lib/postgresql` and it comes back refused, by rule name.
|
|
96
|
+
|
|
97
|
+
A repository with no `DECIONIS_POLICY.md` is simply not governed — the plugin
|
|
98
|
+
runs everywhere, so it does not gate projects that never opted in. A policy that
|
|
99
|
+
exists but cannot be compiled still fails closed.
|
|
100
|
+
|
|
101
|
+
**Everything else:**
|
|
102
|
+
|
|
80
103
|
```bash
|
|
81
104
|
npm install -g @decionis/mcp
|
|
82
105
|
```
|
package/commands/init.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Create a Decionis policy in this repository so its tool calls are gated
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Set up Decionis execution authority in the current repository.
|
|
6
|
+
|
|
7
|
+
1. Check whether `DECIONIS_POLICY.md` already exists at the repository root.
|
|
8
|
+
- If it does, read it, summarise the rules in plain language, and stop.
|
|
9
|
+
Do not overwrite a policy someone already wrote.
|
|
10
|
+
2. If it does not exist, copy the starter policy from
|
|
11
|
+
`${CLAUDE_PLUGIN_ROOT}/templates/DECIONIS_POLICY.starter.md` to
|
|
12
|
+
`DECIONIS_POLICY.md` at the repository root, preserving it byte for byte.
|
|
13
|
+
3. Tell the user, briefly:
|
|
14
|
+
- which rules are now active, in their own words;
|
|
15
|
+
- that every tool call is now evaluated against this file **before** it
|
|
16
|
+
runs, locally, with no account and nothing sent anywhere;
|
|
17
|
+
- that they can prove it right now by asking you to run
|
|
18
|
+
`rm -rf /var/lib/postgresql`, which will come back refused by rule name;
|
|
19
|
+
- that the file is theirs to edit, and the last rule must stay an `allow`
|
|
20
|
+
or nothing will be permitted at all.
|
|
21
|
+
|
|
22
|
+
Do not add rules of your own invention. The starter policy is deliberately
|
|
23
|
+
small so a person can read all of it before trusting it.
|
package/dist/AgentHookCli.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
AgentHookCommand
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-MJVKY7PZ.js";
|
|
5
|
+
import "./chunk-YVRIRS6H.js";
|
|
6
6
|
|
|
7
7
|
// src/AgentHookCli.ts
|
|
8
8
|
void AgentHookCommand.run(process.argv.slice(2)).then((exitCode) => {
|
|
@@ -64241,6 +64241,7 @@ var PolicyFileRepository = class {
|
|
|
64241
64241
|
return {
|
|
64242
64242
|
ok: false,
|
|
64243
64243
|
path: path2,
|
|
64244
|
+
absent: typeof error === "object" && error !== null && error.code === "ENOENT",
|
|
64244
64245
|
message: `Could not read the policy file at ${path2}: ${error instanceof Error ? error.message : String(error)}. Set DECIONIS_POLICY_PATH or create DECIONIS_POLICY.md at the repository root.`
|
|
64245
64246
|
};
|
|
64246
64247
|
}
|
|
@@ -64253,14 +64254,29 @@ var LocalAgentGate = class {
|
|
|
64253
64254
|
gateway;
|
|
64254
64255
|
policyFiles;
|
|
64255
64256
|
workflowKey;
|
|
64257
|
+
ungovernedRepository;
|
|
64256
64258
|
constructor(options = {}) {
|
|
64257
64259
|
this.gateway = options.gateway ?? new LocalDecionisGateway();
|
|
64258
64260
|
this.policyFiles = options.policyFiles ?? new PolicyFileRepository();
|
|
64259
64261
|
this.workflowKey = options.workflowKey ?? "agent_execution_gate";
|
|
64262
|
+
this.ungovernedRepository = options.ungovernedRepository ?? "deny";
|
|
64260
64263
|
}
|
|
64261
64264
|
async evaluate(toolCall) {
|
|
64262
64265
|
const policyFile = await this.policyFiles.read(void 0, toolCall.cwd);
|
|
64263
|
-
if (!policyFile.ok)
|
|
64266
|
+
if (!policyFile.ok) {
|
|
64267
|
+
if (policyFile.absent && this.ungovernedRepository === "allow") {
|
|
64268
|
+
return {
|
|
64269
|
+
verdict: "allow",
|
|
64270
|
+
reason: `No Decionis policy in this repository (looked for ${policyFile.path}), so nothing is gated here. Add DECIONIS_POLICY.md to govern it.`,
|
|
64271
|
+
source: "local",
|
|
64272
|
+
outcome: null,
|
|
64273
|
+
policyVersion: null,
|
|
64274
|
+
matchedRule: null,
|
|
64275
|
+
reasonCodes: ["UNGOVERNED_REPOSITORY"]
|
|
64276
|
+
};
|
|
64277
|
+
}
|
|
64278
|
+
throw new Error(policyFile.message);
|
|
64279
|
+
}
|
|
64264
64280
|
const published = await this.gateway.publishPolicy(policyFile.content, {
|
|
64265
64281
|
workflowKey: this.workflowKey
|
|
64266
64282
|
});
|
|
@@ -64353,7 +64369,7 @@ var RemoteAgentGate = class {
|
|
|
64353
64369
|
|
|
64354
64370
|
// src/agent/AgentGateFactory.ts
|
|
64355
64371
|
var AgentGateFactory = class {
|
|
64356
|
-
static create(env = process.env) {
|
|
64372
|
+
static create(env = process.env, options = {}) {
|
|
64357
64373
|
const mode = (AgentHookValues.optionalString(env.DECIONIS_AGENT_GATE_MODE) ?? "auto").toLowerCase();
|
|
64358
64374
|
const endpoint = AgentHookValues.optionalString(env.DECIONIS_AGENT_GATE_URL);
|
|
64359
64375
|
const apiKey = AgentHookValues.optionalString(env.DECIONIS_API_KEY);
|
|
@@ -64365,7 +64381,10 @@ var AgentGateFactory = class {
|
|
|
64365
64381
|
);
|
|
64366
64382
|
}
|
|
64367
64383
|
if (mode === "local" || mode === "auto" && !hasRemoteConfiguration) {
|
|
64368
|
-
|
|
64384
|
+
const ungovernedFromEnv = AgentHookValues.optionalString(env.DECIONIS_UNGOVERNED_REPOSITORY)?.toLowerCase() === "allow";
|
|
64385
|
+
return new LocalAgentGate({
|
|
64386
|
+
ungovernedRepository: options.ungovernedRepository ?? (ungovernedFromEnv ? "allow" : "deny")
|
|
64387
|
+
});
|
|
64369
64388
|
}
|
|
64370
64389
|
if (!endpoint || !apiKey || !orgId) {
|
|
64371
64390
|
throw new AgentGateConfigurationError(
|
|
@@ -64541,7 +64560,11 @@ var AgentHookCommand = class _AgentHookCommand {
|
|
|
64541
64560
|
}
|
|
64542
64561
|
let evaluator;
|
|
64543
64562
|
try {
|
|
64544
|
-
evaluator = AgentGateFactory.create(options.env
|
|
64563
|
+
evaluator = AgentGateFactory.create(options.env, {
|
|
64564
|
+
// A flag rather than an env var so the plugin's hook command is one
|
|
64565
|
+
// portable string — `VAR=x cmd` is not valid on Windows shells.
|
|
64566
|
+
...args.includes("--allow-ungoverned") ? { ungovernedRepository: "allow" } : {}
|
|
64567
|
+
});
|
|
64545
64568
|
} catch (error) {
|
|
64546
64569
|
const denial = adapter.format(
|
|
64547
64570
|
{
|
|
@@ -46,8 +46,16 @@ declare class AgentDecisionMapper {
|
|
|
46
46
|
private static reason;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
interface AgentGateFactoryOptions {
|
|
50
|
+
/**
|
|
51
|
+
* Passed through to LocalAgentGate. The plugin install sets this, because a
|
|
52
|
+
* plugin hook runs in every repository the user opens — not only one they
|
|
53
|
+
* deliberately wired a gate into.
|
|
54
|
+
*/
|
|
55
|
+
ungovernedRepository?: "deny" | "allow";
|
|
56
|
+
}
|
|
49
57
|
declare class AgentGateFactory {
|
|
50
|
-
static create(env?: NodeJS.ProcessEnv): AgentGateEvaluator;
|
|
58
|
+
static create(env?: NodeJS.ProcessEnv, options?: AgentGateFactoryOptions): AgentGateEvaluator;
|
|
51
59
|
}
|
|
52
60
|
|
|
53
61
|
interface AgentHookCommandOptions {
|
|
@@ -158,6 +166,15 @@ type PolicyFileResult = {
|
|
|
158
166
|
ok: false;
|
|
159
167
|
path: string;
|
|
160
168
|
message: string;
|
|
169
|
+
/**
|
|
170
|
+
* True only when the file does not exist.
|
|
171
|
+
*
|
|
172
|
+
* Callers must treat this differently from a file that exists and cannot
|
|
173
|
+
* be read: "there is no policy here" describes a repository that never
|
|
174
|
+
* opted in to governance, whereas an unreadable or malformed policy is a
|
|
175
|
+
* misconfiguration that has to fail closed.
|
|
176
|
+
*/
|
|
177
|
+
absent: boolean;
|
|
161
178
|
};
|
|
162
179
|
declare class PolicyFileRepository {
|
|
163
180
|
private readonly env;
|
|
@@ -170,12 +187,30 @@ interface LocalAgentGateOptions {
|
|
|
170
187
|
gateway?: LocalDecionisGateway;
|
|
171
188
|
policyFiles?: PolicyFileRepository;
|
|
172
189
|
workflowKey?: string;
|
|
190
|
+
/**
|
|
191
|
+
* What to do in a repository that has no policy file at all.
|
|
192
|
+
*
|
|
193
|
+
* Default `"deny"` — unchanged, and correct for a gate someone wired into
|
|
194
|
+
* one repository on purpose: they meant to govern it, so a missing policy is
|
|
195
|
+
* a misconfiguration.
|
|
196
|
+
*
|
|
197
|
+
* `"allow"` is for the plugin install, which by its nature is active in
|
|
198
|
+
* EVERY repository the user opens. Denying every tool call in every project
|
|
199
|
+
* that has not opted in is not safety; it is a broken install, and it
|
|
200
|
+
* teaches people to remove the thing that was supposed to protect them. A
|
|
201
|
+
* repository with no policy file has simply not opted in.
|
|
202
|
+
*
|
|
203
|
+
* This never relaxes the case that matters: a policy that EXISTS and cannot
|
|
204
|
+
* be read or compiled still fails closed, on either setting.
|
|
205
|
+
*/
|
|
206
|
+
ungovernedRepository?: "deny" | "allow";
|
|
173
207
|
}
|
|
174
208
|
declare class LocalAgentGate implements AgentGateEvaluator {
|
|
175
209
|
readonly source: "local";
|
|
176
210
|
private readonly gateway;
|
|
177
211
|
private readonly policyFiles;
|
|
178
212
|
private readonly workflowKey;
|
|
213
|
+
private readonly ungovernedRepository;
|
|
179
214
|
constructor(options?: LocalAgentGateOptions);
|
|
180
215
|
evaluate(toolCall: AgentToolCall): Promise<AgentGateDecision>;
|
|
181
216
|
close(): Promise<void>;
|
|
@@ -223,4 +258,4 @@ declare class CopilotHookAdapter implements AgentHostAdapter {
|
|
|
223
258
|
format(decision: AgentGateDecision, input?: unknown): Record<string, unknown>;
|
|
224
259
|
}
|
|
225
260
|
|
|
226
|
-
export { AgentDecisionMapper, AgentGateConfigurationError, type AgentGateDecision, type AgentGateEvaluator, AgentGateFactory, type AgentGateSource, type AgentGateVerdict, AgentHookCommand, type AgentHookCommandOptions, AgentHookInputError, AgentHookRunner, type AgentHost, type AgentHostAdapter, AgentHostRegistry, AgentPolicyPayload, type AgentToolCall, ClaudeHookAdapter, CodexHookAdapter, CopilotHookAdapter, LocalAgentGate, type LocalAgentGateOptions, PolicyFileRepository, type PolicyFileResult, RemoteAgentGate, type RemoteAgentGateOptions };
|
|
261
|
+
export { AgentDecisionMapper, AgentGateConfigurationError, type AgentGateDecision, type AgentGateEvaluator, AgentGateFactory, type AgentGateFactoryOptions, type AgentGateSource, type AgentGateVerdict, AgentHookCommand, type AgentHookCommandOptions, AgentHookInputError, AgentHookRunner, type AgentHost, type AgentHostAdapter, AgentHostRegistry, AgentPolicyPayload, type AgentToolCall, ClaudeHookAdapter, CodexHookAdapter, CopilotHookAdapter, LocalAgentGate, type LocalAgentGateOptions, PolicyFileRepository, type PolicyFileResult, RemoteAgentGate, type RemoteAgentGateOptions };
|
package/dist/agent/AgentIndex.js
CHANGED
|
@@ -13,10 +13,10 @@ import {
|
|
|
13
13
|
CopilotHookAdapter,
|
|
14
14
|
LocalAgentGate,
|
|
15
15
|
RemoteAgentGate
|
|
16
|
-
} from "../chunk-
|
|
16
|
+
} from "../chunk-MJVKY7PZ.js";
|
|
17
17
|
import {
|
|
18
18
|
PolicyFileRepository
|
|
19
|
-
} from "../chunk-
|
|
19
|
+
} from "../chunk-YVRIRS6H.js";
|
|
20
20
|
export {
|
|
21
21
|
AgentDecisionMapper,
|
|
22
22
|
AgentGateConfigurationError,
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
LocalDecionisGateway,
|
|
4
4
|
PolicyFileRepository,
|
|
5
5
|
normalizeVerdict
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-YVRIRS6H.js";
|
|
7
7
|
|
|
8
8
|
// src/agent/AgentContracts.ts
|
|
9
9
|
var AgentHookInputError = class extends Error {
|
|
@@ -131,14 +131,29 @@ var LocalAgentGate = class {
|
|
|
131
131
|
gateway;
|
|
132
132
|
policyFiles;
|
|
133
133
|
workflowKey;
|
|
134
|
+
ungovernedRepository;
|
|
134
135
|
constructor(options = {}) {
|
|
135
136
|
this.gateway = options.gateway ?? new LocalDecionisGateway();
|
|
136
137
|
this.policyFiles = options.policyFiles ?? new PolicyFileRepository();
|
|
137
138
|
this.workflowKey = options.workflowKey ?? "agent_execution_gate";
|
|
139
|
+
this.ungovernedRepository = options.ungovernedRepository ?? "deny";
|
|
138
140
|
}
|
|
139
141
|
async evaluate(toolCall) {
|
|
140
142
|
const policyFile = await this.policyFiles.read(void 0, toolCall.cwd);
|
|
141
|
-
if (!policyFile.ok)
|
|
143
|
+
if (!policyFile.ok) {
|
|
144
|
+
if (policyFile.absent && this.ungovernedRepository === "allow") {
|
|
145
|
+
return {
|
|
146
|
+
verdict: "allow",
|
|
147
|
+
reason: `No Decionis policy in this repository (looked for ${policyFile.path}), so nothing is gated here. Add DECIONIS_POLICY.md to govern it.`,
|
|
148
|
+
source: "local",
|
|
149
|
+
outcome: null,
|
|
150
|
+
policyVersion: null,
|
|
151
|
+
matchedRule: null,
|
|
152
|
+
reasonCodes: ["UNGOVERNED_REPOSITORY"]
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
throw new Error(policyFile.message);
|
|
156
|
+
}
|
|
142
157
|
const published = await this.gateway.publishPolicy(policyFile.content, {
|
|
143
158
|
workflowKey: this.workflowKey
|
|
144
159
|
});
|
|
@@ -231,7 +246,7 @@ var RemoteAgentGate = class {
|
|
|
231
246
|
|
|
232
247
|
// src/agent/AgentGateFactory.ts
|
|
233
248
|
var AgentGateFactory = class {
|
|
234
|
-
static create(env = process.env) {
|
|
249
|
+
static create(env = process.env, options = {}) {
|
|
235
250
|
const mode = (AgentHookValues.optionalString(env.DECIONIS_AGENT_GATE_MODE) ?? "auto").toLowerCase();
|
|
236
251
|
const endpoint = AgentHookValues.optionalString(env.DECIONIS_AGENT_GATE_URL);
|
|
237
252
|
const apiKey = AgentHookValues.optionalString(env.DECIONIS_API_KEY);
|
|
@@ -243,7 +258,10 @@ var AgentGateFactory = class {
|
|
|
243
258
|
);
|
|
244
259
|
}
|
|
245
260
|
if (mode === "local" || mode === "auto" && !hasRemoteConfiguration) {
|
|
246
|
-
|
|
261
|
+
const ungovernedFromEnv = AgentHookValues.optionalString(env.DECIONIS_UNGOVERNED_REPOSITORY)?.toLowerCase() === "allow";
|
|
262
|
+
return new LocalAgentGate({
|
|
263
|
+
ungovernedRepository: options.ungovernedRepository ?? (ungovernedFromEnv ? "allow" : "deny")
|
|
264
|
+
});
|
|
247
265
|
}
|
|
248
266
|
if (!endpoint || !apiKey || !orgId) {
|
|
249
267
|
throw new AgentGateConfigurationError(
|
|
@@ -419,7 +437,11 @@ var AgentHookCommand = class _AgentHookCommand {
|
|
|
419
437
|
}
|
|
420
438
|
let evaluator;
|
|
421
439
|
try {
|
|
422
|
-
evaluator = AgentGateFactory.create(options.env
|
|
440
|
+
evaluator = AgentGateFactory.create(options.env, {
|
|
441
|
+
// A flag rather than an env var so the plugin's hook command is one
|
|
442
|
+
// portable string — `VAR=x cmd` is not valid on Windows shells.
|
|
443
|
+
...args.includes("--allow-ungoverned") ? { ungovernedRepository: "allow" } : {}
|
|
444
|
+
});
|
|
423
445
|
} catch (error) {
|
|
424
446
|
const denial = adapter.format(
|
|
425
447
|
{
|
|
@@ -476,4 +498,4 @@ export {
|
|
|
476
498
|
AgentHostRegistry,
|
|
477
499
|
AgentHookCommand
|
|
478
500
|
};
|
|
479
|
-
//# sourceMappingURL=chunk-
|
|
501
|
+
//# sourceMappingURL=chunk-MJVKY7PZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agent/AgentContracts.ts","../src/agent/AgentHookValues.ts","../src/agent/AgentDecisionMapper.ts","../src/agent/AgentPolicyPayload.ts","../src/agent/LocalAgentGate.ts","../src/agent/RemoteAgentGate.ts","../src/agent/AgentGateFactory.ts","../src/agent/AgentHookRunner.ts","../src/agent/providers/SnakeCaseHookAdapter.ts","../src/agent/providers/ClaudeHookAdapter.ts","../src/agent/providers/CodexHookAdapter.ts","../src/agent/providers/CopilotHookAdapter.ts","../src/agent/AgentHostRegistry.ts","../src/agent/AgentHookCommand.ts"],"sourcesContent":["export type AgentHost = \"codex\" | \"copilot\" | \"claude\";\n\nexport type AgentGateVerdict = \"allow\" | \"block\" | \"review\" | \"escalate\" | \"error\";\n\nexport type AgentGateSource = \"local\" | \"remote\";\n\nexport interface AgentToolCall {\n host: AgentHost;\n sessionId: string;\n toolUseId: string | null;\n toolName: string;\n toolInput: Record<string, unknown>;\n cwd: string;\n model: string | null;\n permissionMode: string | null;\n}\n\nexport interface AgentGateDecision {\n verdict: AgentGateVerdict;\n reason: string;\n source: AgentGateSource;\n outcome: string | null;\n policyVersion: string | null;\n matchedRule: string | null;\n reasonCodes: string[];\n}\n\nexport interface AgentGateEvaluator {\n readonly source: AgentGateSource;\n evaluate(toolCall: AgentToolCall): Promise<AgentGateDecision>;\n close?(): Promise<void>;\n}\n\nexport interface AgentHostAdapter {\n readonly host: AgentHost;\n parse(input: unknown): AgentToolCall;\n format(decision: AgentGateDecision, input?: unknown): Record<string, unknown>;\n}\n\nexport class AgentHookInputError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AgentHookInputError\";\n }\n}\n\nexport class AgentGateConfigurationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AgentGateConfigurationError\";\n }\n}\n","import { AgentHookInputError } from \"./AgentContracts.js\";\n\nexport class AgentHookValues {\n static asRecord(value: unknown): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return {};\n return value as Record<string, unknown>;\n }\n\n static requireRecord(value: unknown): Record<string, unknown> {\n const record = AgentHookValues.asRecord(value);\n if (Object.keys(record).length === 0) {\n throw new AgentHookInputError(\"The hook input must be a non-empty JSON object.\");\n }\n return record;\n }\n\n static optionalString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n }\n\n static requireString(value: unknown, field: string): string {\n const parsed = AgentHookValues.optionalString(value);\n if (!parsed) throw new AgentHookInputError(`The hook input is missing \\`${field}\\`.`);\n return parsed;\n }\n\n static parseToolInput(value: unknown): Record<string, unknown> {\n if (typeof value !== \"string\") return AgentHookValues.asRecord(value);\n try {\n return AgentHookValues.asRecord(JSON.parse(value));\n } catch {\n throw new AgentHookInputError(\"The hook input contains invalid JSON tool arguments.\");\n }\n }\n}\n","import { normalizeVerdict } from \"../Gateway.js\";\nimport { AgentHookValues } from \"./AgentHookValues.js\";\nimport type { AgentGateDecision, AgentGateSource, AgentGateVerdict } from \"./AgentContracts.js\";\n\nexport class AgentDecisionMapper {\n static fromProtocol(\n body: Record<string, unknown>,\n source: AgentGateSource,\n fallbackPolicyVersion: string | null = null,\n ): AgentGateDecision {\n const outcome = AgentHookValues.optionalString(body.outcome);\n const verdict = AgentDecisionMapper.toVerdict(outcome);\n const policyEvaluation = AgentHookValues.asRecord(body.policy_evaluation);\n const selectedRule = AgentHookValues.optionalString(policyEvaluation.selected_rule_name);\n const rationale = AgentHookValues.optionalString(policyEvaluation.selected_rule_rationale);\n const resolution = AgentHookValues.optionalString(policyEvaluation.resolution);\n const policyVersion =\n AgentHookValues.optionalString(body.policy_version) ??\n AgentHookValues.optionalString(policyEvaluation.bundle_version) ??\n fallbackPolicyVersion;\n const reasonCodes = Array.isArray(body.reason_codes)\n ? body.reason_codes.filter((value): value is string => typeof value === \"string\")\n : [];\n\n return {\n verdict,\n reason: AgentDecisionMapper.reason(verdict, {\n selectedRule,\n rationale,\n resolution,\n reasonCodes,\n }),\n source,\n outcome,\n policyVersion,\n matchedRule: selectedRule,\n reasonCodes,\n };\n }\n\n static error(message: string, source: AgentGateSource): AgentGateDecision {\n return {\n verdict: \"error\",\n reason: message,\n source,\n outcome: null,\n policyVersion: null,\n matchedRule: null,\n reasonCodes: [\"AGENT_GATE_ERROR\"],\n };\n }\n\n private static toVerdict(outcome: string | null): AgentGateVerdict {\n const normalized = normalizeVerdict(outcome);\n if (\n normalized === \"allow\" ||\n normalized === \"block\" ||\n normalized === \"review\" ||\n normalized === \"escalate\"\n ) {\n return normalized;\n }\n return \"error\";\n }\n\n private static reason(\n verdict: AgentGateVerdict,\n context: {\n selectedRule: string | null;\n rationale: string | null;\n resolution: string | null;\n reasonCodes: string[];\n },\n ): string {\n if (context.rationale) return context.rationale;\n if (context.selectedRule) {\n return `Policy rule \"${context.selectedRule}\" returned ${verdict}.`;\n }\n if (context.reasonCodes.length > 0) {\n return `Policy returned ${verdict}: ${context.reasonCodes.join(\", \")}.`;\n }\n if (context.resolution) return `Policy returned ${verdict} (${context.resolution}).`;\n return `Policy returned ${verdict}.`;\n }\n}\n","import type { AgentToolCall } from \"./AgentContracts.js\";\n\nexport class AgentPolicyPayload {\n static build(toolCall: AgentToolCall): Record<string, unknown> {\n return {\n action: `agent_tool:${toolCall.toolName}`,\n agent_generated: true,\n agent_provider: toolCall.host,\n agent_session_id: toolCall.sessionId,\n tool_name: toolCall.toolName,\n tool_input: toolCall.toolInput,\n working_directory: toolCall.cwd,\n ...(toolCall.toolUseId ? { tool_use_id: toolCall.toolUseId } : {}),\n ...(toolCall.model ? { model: toolCall.model } : {}),\n ...(toolCall.permissionMode ? { permission_mode: toolCall.permissionMode } : {}),\n };\n }\n}\n","import { LocalDecionisGateway } from \"../Gateway.js\";\nimport type { AgentGateDecision, AgentGateEvaluator, AgentToolCall } from \"./AgentContracts.js\";\nimport { AgentDecisionMapper } from \"./AgentDecisionMapper.js\";\nimport { AgentPolicyPayload } from \"./AgentPolicyPayload.js\";\nimport { PolicyFileRepository } from \"./PolicyFileRepository.js\";\n\nexport interface LocalAgentGateOptions {\n gateway?: LocalDecionisGateway;\n policyFiles?: PolicyFileRepository;\n workflowKey?: string;\n /**\n * What to do in a repository that has no policy file at all.\n *\n * Default `\"deny\"` — unchanged, and correct for a gate someone wired into\n * one repository on purpose: they meant to govern it, so a missing policy is\n * a misconfiguration.\n *\n * `\"allow\"` is for the plugin install, which by its nature is active in\n * EVERY repository the user opens. Denying every tool call in every project\n * that has not opted in is not safety; it is a broken install, and it\n * teaches people to remove the thing that was supposed to protect them. A\n * repository with no policy file has simply not opted in.\n *\n * This never relaxes the case that matters: a policy that EXISTS and cannot\n * be read or compiled still fails closed, on either setting.\n */\n ungovernedRepository?: \"deny\" | \"allow\";\n}\n\nexport class LocalAgentGate implements AgentGateEvaluator {\n readonly source = \"local\" as const;\n private readonly gateway: LocalDecionisGateway;\n private readonly policyFiles: PolicyFileRepository;\n private readonly workflowKey: string;\n private readonly ungovernedRepository: \"deny\" | \"allow\";\n\n constructor(options: LocalAgentGateOptions = {}) {\n this.gateway = options.gateway ?? new LocalDecionisGateway();\n this.policyFiles = options.policyFiles ?? new PolicyFileRepository();\n this.workflowKey = options.workflowKey ?? \"agent_execution_gate\";\n this.ungovernedRepository = options.ungovernedRepository ?? \"deny\";\n }\n\n async evaluate(toolCall: AgentToolCall): Promise<AgentGateDecision> {\n const policyFile = await this.policyFiles.read(undefined, toolCall.cwd);\n if (!policyFile.ok) {\n // Absent is not the same as broken. Only a genuinely missing file can\n // take the \"not governed here\" path, and only when the caller asked for\n // it; anything else still throws, and the hook turns that into a denial.\n if (policyFile.absent && this.ungovernedRepository === \"allow\") {\n return {\n verdict: \"allow\",\n reason:\n `No Decionis policy in this repository (looked for ${policyFile.path}), so nothing is ` +\n \"gated here. Add DECIONIS_POLICY.md to govern it.\",\n source: \"local\",\n outcome: null,\n policyVersion: null,\n matchedRule: null,\n reasonCodes: [\"UNGOVERNED_REPOSITORY\"],\n };\n }\n throw new Error(policyFile.message);\n }\n\n const published = await this.gateway.publishPolicy(policyFile.content, {\n workflowKey: this.workflowKey,\n });\n if (!published.ok) {\n throw new Error(\n `The Decionis policy could not be enforced (${published.reason}): ${published.errors.join(\n \"; \",\n )}`,\n );\n }\n\n const evaluated = await this.gateway.evaluate({\n payload: AgentPolicyPayload.build(toolCall),\n workflowKey: this.workflowKey,\n mode: \"enforce\",\n });\n if (evaluated.status !== 200) {\n throw new Error(`The local Decionis evaluator returned HTTP ${evaluated.status}.`);\n }\n return AgentDecisionMapper.fromProtocol(evaluated.body, \"local\", published.version);\n }\n\n close(): Promise<void> {\n return this.gateway.close();\n }\n}\n","import { createHash } from \"node:crypto\";\n\nimport type { AgentGateDecision, AgentGateEvaluator, AgentToolCall } from \"./AgentContracts.js\";\nimport { AgentDecisionMapper } from \"./AgentDecisionMapper.js\";\nimport { AgentHookValues } from \"./AgentHookValues.js\";\nimport { AgentPolicyPayload } from \"./AgentPolicyPayload.js\";\n\ntype FetchLike = typeof fetch;\n\nexport interface RemoteAgentGateOptions {\n endpoint: string;\n apiKey: string;\n orgId: string;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n workflowKey?: string;\n}\n\nexport class RemoteAgentGate implements AgentGateEvaluator {\n readonly source = \"remote\" as const;\n private readonly endpoint: string;\n private readonly fetchImpl: FetchLike;\n private readonly timeoutMs: number;\n private readonly workflowKey: string;\n\n constructor(private readonly options: RemoteAgentGateOptions) {\n this.endpoint = options.endpoint.trim();\n this.fetchImpl = options.fetchImpl ?? fetch;\n this.timeoutMs = options.timeoutMs ?? 4000;\n this.workflowKey = options.workflowKey ?? \"agent_execution_gate\";\n }\n\n async evaluate(toolCall: AgentToolCall): Promise<AgentGateDecision> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const idempotencyKey = this.idempotencyKey(toolCall);\n const response = await this.fetchImpl(this.endpoint, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${this.options.apiKey}`,\n \"content-type\": \"application/json\",\n \"idempotency-key\": idempotencyKey,\n },\n body: JSON.stringify({\n org_id: this.options.orgId,\n decision_type: `agent_tool:${toolCall.toolName}`.slice(0, 120),\n channel: toolCall.host,\n mode: \"ENFORCEMENT\",\n workflow_key: this.workflowKey,\n idempotency_key: idempotencyKey,\n context: AgentPolicyPayload.build(toolCall),\n }),\n signal: controller.signal,\n });\n const body = AgentHookValues.asRecord(await response.json().catch(() => null));\n if (!response.ok) {\n const message =\n AgentHookValues.optionalString(body.message) ??\n AgentHookValues.optionalString(body.error) ??\n \"unknown error\";\n throw new Error(\n `The remote Decionis evaluator returned HTTP ${response.status}: ${message}`,\n );\n }\n if (!AgentHookValues.optionalString(body.outcome)) {\n throw new Error(\"The remote Decionis evaluator returned no outcome.\");\n }\n return AgentDecisionMapper.fromProtocol(body, \"remote\");\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private idempotencyKey(toolCall: AgentToolCall): string {\n const source = JSON.stringify({\n host: toolCall.host,\n sessionId: toolCall.sessionId,\n toolUseId: toolCall.toolUseId,\n toolName: toolCall.toolName,\n toolInput: toolCall.toolInput,\n });\n return `agent-hook-${createHash(\"sha256\").update(source).digest(\"hex\")}`;\n }\n}\n","import { AgentGateConfigurationError, type AgentGateEvaluator } from \"./AgentContracts.js\";\nimport { AgentHookValues } from \"./AgentHookValues.js\";\nimport { LocalAgentGate } from \"./LocalAgentGate.js\";\nimport { RemoteAgentGate } from \"./RemoteAgentGate.js\";\n\nexport interface AgentGateFactoryOptions {\n /**\n * Passed through to LocalAgentGate. The plugin install sets this, because a\n * plugin hook runs in every repository the user opens — not only one they\n * deliberately wired a gate into.\n */\n ungovernedRepository?: \"deny\" | \"allow\";\n}\n\nexport class AgentGateFactory {\n static create(\n env: NodeJS.ProcessEnv = process.env,\n options: AgentGateFactoryOptions = {},\n ): AgentGateEvaluator {\n const mode = (\n AgentHookValues.optionalString(env.DECIONIS_AGENT_GATE_MODE) ?? \"auto\"\n ).toLowerCase();\n const endpoint = AgentHookValues.optionalString(env.DECIONIS_AGENT_GATE_URL);\n const apiKey = AgentHookValues.optionalString(env.DECIONIS_API_KEY);\n const orgId = AgentHookValues.optionalString(env.DECIONIS_ORG_ID);\n const hasRemoteConfiguration = Boolean(endpoint || apiKey || orgId);\n\n if (mode !== \"auto\" && mode !== \"local\" && mode !== \"remote\") {\n throw new AgentGateConfigurationError(\n \"DECIONIS_AGENT_GATE_MODE must be `auto`, `local`, or `remote`.\",\n );\n }\n if (mode === \"local\" || (mode === \"auto\" && !hasRemoteConfiguration)) {\n const ungovernedFromEnv =\n AgentHookValues.optionalString(env.DECIONIS_UNGOVERNED_REPOSITORY)?.toLowerCase() ===\n \"allow\";\n return new LocalAgentGate({\n ungovernedRepository:\n options.ungovernedRepository ?? (ungovernedFromEnv ? \"allow\" : \"deny\"),\n });\n }\n if (!endpoint || !apiKey || !orgId) {\n throw new AgentGateConfigurationError(\n \"Remote agent gating requires DECIONIS_AGENT_GATE_URL, DECIONIS_API_KEY, and DECIONIS_ORG_ID.\",\n );\n }\n\n const configuredTimeout = Number.parseInt(env.DECIONIS_AGENT_GATE_TIMEOUT_MS ?? \"\", 10);\n return new RemoteAgentGate({\n endpoint,\n apiKey,\n orgId,\n timeoutMs:\n Number.isFinite(configuredTimeout) && configuredTimeout > 0 ? configuredTimeout : 4000,\n });\n }\n}\n","import type { AgentGateDecision, AgentGateEvaluator, AgentHostAdapter } from \"./AgentContracts.js\";\nimport { AgentDecisionMapper } from \"./AgentDecisionMapper.js\";\n\nexport class AgentHookRunner {\n constructor(\n private readonly adapter: AgentHostAdapter,\n private readonly evaluator: AgentGateEvaluator,\n ) {}\n\n async run(input: unknown): Promise<Record<string, unknown>> {\n try {\n const toolCall = this.adapter.parse(input);\n const decision = await this.evaluator.evaluate(toolCall);\n return this.adapter.format(decision, input);\n } catch (error) {\n return this.adapter.format(\n AgentDecisionMapper.error(\n error instanceof Error ? error.message : String(error),\n this.evaluator.source,\n ),\n input,\n );\n }\n }\n\n close(): Promise<void> {\n return this.evaluator.close?.() ?? Promise.resolve();\n }\n\n static shouldBlock(decision: AgentGateDecision): boolean {\n return decision.verdict !== \"allow\";\n }\n}\n","import type {\n AgentGateDecision,\n AgentHost,\n AgentHostAdapter,\n AgentToolCall,\n} from \"../AgentContracts.js\";\nimport { AgentHookRunner } from \"../AgentHookRunner.js\";\nimport { AgentHookValues } from \"../AgentHookValues.js\";\n\nexport abstract class SnakeCaseHookAdapter implements AgentHostAdapter {\n abstract readonly host: AgentHost;\n\n parse(input: unknown): AgentToolCall {\n const event = AgentHookValues.requireRecord(input);\n return {\n host: this.host,\n sessionId: AgentHookValues.requireString(event.session_id, \"session_id\"),\n toolUseId: AgentHookValues.optionalString(event.tool_use_id),\n toolName: AgentHookValues.requireString(event.tool_name, \"tool_name\"),\n toolInput: AgentHookValues.parseToolInput(event.tool_input),\n cwd: AgentHookValues.requireString(event.cwd, \"cwd\"),\n model: AgentHookValues.optionalString(event.model),\n permissionMode: AgentHookValues.optionalString(event.permission_mode),\n };\n }\n\n format(decision: AgentGateDecision, _input?: unknown): Record<string, unknown> {\n if (!AgentHookRunner.shouldBlock(decision)) return {};\n return {\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\",\n permissionDecision: \"deny\",\n permissionDecisionReason: this.reason(decision),\n },\n };\n }\n\n protected reason(decision: AgentGateDecision): string {\n const label = decision.verdict === \"error\" ? \"gate error\" : decision.verdict;\n return `Decionis ${label}: ${decision.reason}`;\n }\n}\n","import { SnakeCaseHookAdapter } from \"./SnakeCaseHookAdapter.js\";\n\nexport class ClaudeHookAdapter extends SnakeCaseHookAdapter {\n readonly host = \"claude\" as const;\n}\n","import { SnakeCaseHookAdapter } from \"./SnakeCaseHookAdapter.js\";\n\nexport class CodexHookAdapter extends SnakeCaseHookAdapter {\n readonly host = \"codex\" as const;\n}\n","import type { AgentGateDecision, AgentHostAdapter, AgentToolCall } from \"../AgentContracts.js\";\nimport { AgentHookRunner } from \"../AgentHookRunner.js\";\nimport { AgentHookValues } from \"../AgentHookValues.js\";\n\nexport class CopilotHookAdapter implements AgentHostAdapter {\n readonly host = \"copilot\" as const;\n\n parse(input: unknown): AgentToolCall {\n const event = AgentHookValues.requireRecord(input);\n const usesCompatibleShape = AgentHookValues.optionalString(event.tool_name) !== null;\n const toolInput = usesCompatibleShape ? event.tool_input : event.toolArgs;\n return {\n host: this.host,\n sessionId:\n AgentHookValues.optionalString(usesCompatibleShape ? event.session_id : event.sessionId) ??\n \"unknown-session\",\n toolUseId: AgentHookValues.optionalString(\n usesCompatibleShape ? event.tool_use_id : event.toolUseId,\n ),\n toolName: AgentHookValues.requireString(\n usesCompatibleShape ? event.tool_name : event.toolName,\n usesCompatibleShape ? \"tool_name\" : \"toolName\",\n ),\n toolInput: AgentHookValues.parseToolInput(toolInput),\n cwd: AgentHookValues.optionalString(event.cwd) ?? process.cwd(),\n model: AgentHookValues.optionalString(event.model),\n permissionMode: AgentHookValues.optionalString(\n usesCompatibleShape ? event.permission_mode : event.permissionMode,\n ),\n };\n }\n\n format(decision: AgentGateDecision, input?: unknown): Record<string, unknown> {\n if (!AgentHookRunner.shouldBlock(decision)) return {};\n const label = decision.verdict === \"error\" ? \"gate error\" : decision.verdict;\n const reason = `Decionis ${label}: ${decision.reason}`;\n const event = AgentHookValues.asRecord(input);\n if (\n AgentHookValues.optionalString(event.tool_name) ||\n AgentHookValues.optionalString(event.hook_event_name) === \"PreToolUse\"\n ) {\n return {\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\",\n permissionDecision: \"deny\",\n permissionDecisionReason: reason,\n },\n };\n }\n return {\n permissionDecision: \"deny\",\n permissionDecisionReason: reason,\n };\n }\n}\n","import {\n AgentGateConfigurationError,\n type AgentHost,\n type AgentHostAdapter,\n} from \"./AgentContracts.js\";\nimport { ClaudeHookAdapter } from \"./providers/ClaudeHookAdapter.js\";\nimport { CodexHookAdapter } from \"./providers/CodexHookAdapter.js\";\nimport { CopilotHookAdapter } from \"./providers/CopilotHookAdapter.js\";\n\nexport class AgentHostRegistry {\n static resolve(host: string): AgentHostAdapter {\n const normalized = host.trim().toLowerCase() as AgentHost;\n switch (normalized) {\n case \"codex\":\n return new CodexHookAdapter();\n case \"copilot\":\n return new CopilotHookAdapter();\n case \"claude\":\n return new ClaudeHookAdapter();\n default:\n throw new AgentGateConfigurationError(\n \"Choose an agent host with `decionis-agent-hook codex|copilot|claude`.\",\n );\n }\n }\n}\n","import type { Readable, Writable } from \"node:stream\";\n\nimport type { AgentGateEvaluator, AgentHostAdapter } from \"./AgentContracts.js\";\nimport { AgentGateFactory } from \"./AgentGateFactory.js\";\nimport { AgentHookRunner } from \"./AgentHookRunner.js\";\nimport { AgentHostRegistry } from \"./AgentHostRegistry.js\";\n\nexport interface AgentHookCommandOptions {\n input?: Readable;\n output?: Writable;\n errorOutput?: Writable;\n env?: NodeJS.ProcessEnv;\n}\n\nexport class AgentHookCommand {\n static async run(args: string[], options: AgentHookCommandOptions = {}): Promise<number> {\n const input = options.input ?? process.stdin;\n const output = options.output ?? process.stdout;\n const errorOutput = options.errorOutput ?? process.stderr;\n const host = AgentHookCommand.hostArgument(args);\n\n let adapter: AgentHostAdapter;\n try {\n adapter = AgentHostRegistry.resolve(host);\n } catch (error) {\n errorOutput.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n return 2;\n }\n\n const raw = await AgentHookCommand.readInput(input);\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n parsed = null;\n }\n\n let evaluator: AgentGateEvaluator;\n try {\n evaluator = AgentGateFactory.create(options.env, {\n // A flag rather than an env var so the plugin's hook command is one\n // portable string — `VAR=x cmd` is not valid on Windows shells.\n ...(args.includes(\"--allow-ungoverned\") ? { ungovernedRepository: \"allow\" as const } : {}),\n });\n } catch (error) {\n const denial = adapter.format(\n {\n verdict: \"error\",\n reason: error instanceof Error ? error.message : String(error),\n source: \"local\",\n outcome: null,\n policyVersion: null,\n matchedRule: null,\n reasonCodes: [\"AGENT_GATE_CONFIGURATION_ERROR\"],\n },\n parsed,\n );\n output.write(`${JSON.stringify(denial)}\\n`);\n return 0;\n }\n\n const runner = new AgentHookRunner(adapter, evaluator);\n try {\n const result = await runner.run(parsed);\n output.write(`${JSON.stringify(result)}\\n`);\n return 0;\n } finally {\n await runner.close();\n }\n }\n\n private static hostArgument(args: string[]): string {\n const providerIndex = args.indexOf(\"--provider\");\n if (providerIndex >= 0) return args[providerIndex + 1] ?? \"\";\n return args.find((value) => !value.startsWith(\"-\")) ?? \"\";\n }\n\n private static async readInput(input: Readable): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of input) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));\n }\n return Buffer.concat(chunks).toString(\"utf8\").trim();\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -28653,6 +28653,7 @@ var PolicyFileRepository = class {
|
|
|
28653
28653
|
return {
|
|
28654
28654
|
ok: false,
|
|
28655
28655
|
path,
|
|
28656
|
+
absent: typeof error === "object" && error !== null && error.code === "ENOENT",
|
|
28656
28657
|
message: `Could not read the policy file at ${path}: ${error instanceof Error ? error.message : String(error)}. Set DECIONIS_POLICY_PATH or create DECIONIS_POLICY.md at the repository root.`
|
|
28657
28658
|
};
|
|
28658
28659
|
}
|
|
@@ -28677,4 +28678,4 @@ toad-cache/dist/toad-cache.cjs:
|
|
|
28677
28678
|
* @version 3.7.0
|
|
28678
28679
|
*)
|
|
28679
28680
|
*/
|
|
28680
|
-
//# sourceMappingURL=chunk-
|
|
28681
|
+
//# sourceMappingURL=chunk-YVRIRS6H.js.map
|