@aimarket/warden 0.15.0 → 0.17.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/CHANGELOG.md +39 -1
- package/README-es.md +20 -13
- package/README-fr.md +20 -13
- package/README-ru.md +20 -13
- package/README-zh.md +20 -13
- package/README.md +20 -13
- package/dist/claude-hook.d.ts +4 -0
- package/dist/claude-hook.d.ts.map +1 -1
- package/dist/claude-hook.js +42 -18
- package/dist/claude-hook.js.map +1 -1
- package/dist/declare.d.ts +80 -0
- package/dist/declare.d.ts.map +1 -0
- package/dist/declare.js +449 -0
- package/dist/declare.js.map +1 -0
- package/dist/flow-guard.d.ts +133 -0
- package/dist/flow-guard.d.ts.map +1 -0
- package/dist/flow-guard.js +1062 -0
- package/dist/flow-guard.js.map +1 -0
- package/dist/histor.d.ts +3 -0
- package/dist/histor.d.ts.map +1 -1
- package/dist/histor.js.map +1 -1
- package/dist/mcp-server.js +6 -0
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp-tools.d.ts.map +1 -1
- package/dist/mcp-tools.js +95 -25
- package/dist/mcp-tools.js.map +1 -1
- package/dist/scan.d.ts +2 -0
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +7 -2
- package/dist/scan.js.map +1 -1
- package/dist/static-scan.d.ts +1 -1
- package/dist/static-scan.d.ts.map +1 -1
- package/dist/static-scan.js +78 -2
- package/dist/static-scan.js.map +1 -1
- package/dist/wrap-cli.d.ts +3 -0
- package/dist/wrap-cli.d.ts.map +1 -1
- package/dist/wrap-cli.js +8 -2
- package/dist/wrap-cli.js.map +1 -1
- package/dist/wrap.d.ts.map +1 -1
- package/dist/wrap.js +28 -1
- package/dist/wrap.js.map +1 -1
- package/docs/flow-guard.es.md +214 -0
- package/docs/flow-guard.fr.md +220 -0
- package/docs/flow-guard.md +224 -0
- package/docs/flow-guard.ru.md +210 -0
- package/docs/flow-guard.zh.md +159 -0
- package/docs/gates.es.md +27 -3
- package/docs/gates.fr.md +28 -2
- package/docs/gates.md +26 -3
- package/docs/gates.ru.md +26 -3
- package/docs/gates.zh.md +15 -2
- package/docs/scan.es.md +46 -28
- package/docs/scan.fr.md +46 -28
- package/docs/scan.md +46 -28
- package/docs/scan.ru.md +46 -28
- package/docs/scan.zh.md +46 -28
- package/docs/scanner-comparison.es.md +289 -174
- package/docs/scanner-comparison.fr.md +292 -178
- package/docs/scanner-comparison.md +234 -140
- package/docs/scanner-comparison.ru.md +279 -165
- package/docs/scanner-comparison.zh.md +237 -90
- package/package.json +4 -3
package/dist/declare.js
ADDED
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `warden-mcp declare` — for a server's publisher: the tool sets it lists under conditions HISTOR's
|
|
3
|
+
* sandbox does not have (a launcher's runner installed, one runner per operating system, a real
|
|
4
|
+
* key), written the way HISTOR reads them.
|
|
5
|
+
*
|
|
6
|
+
* A declaration goes in the server.json published to the official MCP registry
|
|
7
|
+
* (`_meta` → `io.modelcontextprotocol.registry/publisher-provided` → `dev.modelmarket.histor/tool-sets`),
|
|
8
|
+
* or in a file on the publisher's own domain that the entry points at with `url`. The file changes
|
|
9
|
+
* with every runner release without a new registry entry; HISTOR reads it every hour.
|
|
10
|
+
*
|
|
11
|
+
* warden-mcp declare --when "runner 1.4, macOS" --out mcp-tool-sets.json -- npx -y @acme/launcher
|
|
12
|
+
* warden-mcp declare --server-json --link https://acme.dev/.well-known/mcp-tool-sets.json
|
|
13
|
+
* warden-mcp declare --check https://acme.dev/.well-known/mcp-tool-sets.json --name dev.acme/launcher
|
|
14
|
+
*
|
|
15
|
+
* The rules here are HISTOR's (histor/histor/declared.py), so what this command accepts HISTOR takes.
|
|
16
|
+
*/
|
|
17
|
+
import { readFile, writeFile, rename } from 'node:fs/promises';
|
|
18
|
+
import { fetchServer, McpClientError } from './mcp-client.js';
|
|
19
|
+
import { mtlToolSetDigest, MtlError } from './mtl.js';
|
|
20
|
+
import { packageVersion } from './mcp-rpc.js';
|
|
21
|
+
import { displaySafe } from './sanitize.js';
|
|
22
|
+
export const PUBLISHER_PROVIDED = 'io.modelcontextprotocol.registry/publisher-provided';
|
|
23
|
+
export const DECLARATION_FIELD = 'dev.modelmarket.histor/tool-sets';
|
|
24
|
+
/** In the registry entry: the registry keeps ~4 KB of publisher-provided metadata. */
|
|
25
|
+
export const MAX_ENTRY_SETS = 8;
|
|
26
|
+
/** In a file on the publisher's domain: runner versions × operating systems. */
|
|
27
|
+
export const MAX_FILE_SETS = 64;
|
|
28
|
+
export const MAX_WHEN = 200;
|
|
29
|
+
export const MAX_FILE_BYTES = 64 * 1024;
|
|
30
|
+
const MAX_TOOLS = 5000;
|
|
31
|
+
const SRI = /^sha256-[A-Za-z0-9+/]{43}=$/;
|
|
32
|
+
const GITHUB_USER = /^[a-z0-9](?:[a-z0-9-]{0,38})$/;
|
|
33
|
+
export class DeclareError extends Error {
|
|
34
|
+
constructor(message) { super(message); this.name = 'DeclareError'; }
|
|
35
|
+
}
|
|
36
|
+
/** The condition as one line of visible text: control and format characters (zero-width, bidi overrides) dropped. */
|
|
37
|
+
export function cleanWhen(value) {
|
|
38
|
+
if (typeof value !== 'string')
|
|
39
|
+
return undefined;
|
|
40
|
+
const text = value.replace(/[\t\r\n]/g, ' ').replace(/[\p{Cc}\p{Cf}\p{Cs}\p{Co}\p{Cn}]/gu, '').split(/\s+/).filter(Boolean).join(' ');
|
|
41
|
+
return text ? [...text].slice(0, MAX_WHEN).join('') : undefined;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Why HISTOR will not read a declaration file at `url` for `serverName`, or undefined. The file must
|
|
45
|
+
* be on the domain the registry verified for the server's namespace or a subdomain (`ai.acme/x` →
|
|
46
|
+
* acme.ai); for `io.github.<user>/x`, on `<user>.github.io` or under `/<user>/` on raw or gist files.
|
|
47
|
+
*/
|
|
48
|
+
export function urlRefusal(url, serverName) {
|
|
49
|
+
if (typeof url !== 'string' || !url || url.length > 2000)
|
|
50
|
+
return '"url" must be an https URL';
|
|
51
|
+
// Scheme first, as HISTOR's urlsplit does: "not a url" is an answer about https, not about parsing.
|
|
52
|
+
if (!/^https:/i.test(url))
|
|
53
|
+
return '"url" must be https';
|
|
54
|
+
let parts;
|
|
55
|
+
try {
|
|
56
|
+
parts = new URL(url);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return '"url" does not parse';
|
|
60
|
+
}
|
|
61
|
+
if (parts.username || parts.password)
|
|
62
|
+
return '"url" must not carry credentials';
|
|
63
|
+
if (parts.port && parts.port !== '443')
|
|
64
|
+
return '"url" must use the default https port';
|
|
65
|
+
const host = parts.hostname.toLowerCase().replace(/\.$/, '');
|
|
66
|
+
const namespace = serverName.split('/', 1)[0].trim().toLowerCase();
|
|
67
|
+
if (namespace.startsWith('io.github.')) {
|
|
68
|
+
const user = namespace.slice('io.github.'.length);
|
|
69
|
+
if (!GITHUB_USER.test(user))
|
|
70
|
+
return 'the server name has no GitHub user HISTOR can bind the file to';
|
|
71
|
+
const path = parts.pathname.toLowerCase();
|
|
72
|
+
if (host === `${user}.github.io` || (['raw.githubusercontent.com', 'gist.githubusercontent.com'].includes(host) && path.startsWith(`/${user}/`)))
|
|
73
|
+
return undefined;
|
|
74
|
+
return `"url" must be on ${user}.github.io or under /${user}/ on raw.githubusercontent.com, the account the registry verified`;
|
|
75
|
+
}
|
|
76
|
+
const labels = namespace.split('.').filter(Boolean);
|
|
77
|
+
if (labels.length < 2)
|
|
78
|
+
return 'the server name has no domain HISTOR can bind the file to';
|
|
79
|
+
const domain = [...labels].reverse().join('.');
|
|
80
|
+
if (host === domain || host.endsWith(`.${domain}`))
|
|
81
|
+
return undefined;
|
|
82
|
+
return `"url" must be on ${domain} or a subdomain, the domain the registry verified for ${namespace}`;
|
|
83
|
+
}
|
|
84
|
+
/** Validated sets from a `sets` list, and why any entry was skipped — HISTOR's rules. */
|
|
85
|
+
export function parseSets(entries, limit) {
|
|
86
|
+
if (!Array.isArray(entries) || !entries.length)
|
|
87
|
+
return { sets: [], ignored: ['"sets" must be a non-empty list'] };
|
|
88
|
+
const sets = [], ignored = [], seen = new Set();
|
|
89
|
+
for (let i = 0; i < entries.length; i++) {
|
|
90
|
+
if (sets.length === limit) {
|
|
91
|
+
ignored.push(`sets[${i}:]: more than ${limit} sets`);
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
const e = entries[i];
|
|
95
|
+
if (!e || typeof e !== 'object' || Array.isArray(e)) {
|
|
96
|
+
ignored.push(`sets[${i}]: not an object`);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (typeof e.digest !== 'string' || !SRI.test(e.digest)) {
|
|
100
|
+
ignored.push(`sets[${i}]: digest is not an MTL/1 tool-set digest (sha256-<base64>)`);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (seen.has(e.digest)) {
|
|
104
|
+
ignored.push(`sets[${i}]: the same digest twice`);
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (e.count !== undefined && e.count !== null && (typeof e.count !== 'number' || !Number.isInteger(e.count) || e.count < 0 || e.count > MAX_TOOLS)) {
|
|
108
|
+
ignored.push(`sets[${i}]: count must be an integer from 0 to ${MAX_TOOLS}`);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
seen.add(e.digest);
|
|
112
|
+
const out = { digest: e.digest };
|
|
113
|
+
if (typeof e.count === 'number')
|
|
114
|
+
out.count = e.count;
|
|
115
|
+
const when = cleanWhen(e.when);
|
|
116
|
+
if (when)
|
|
117
|
+
out.when = when;
|
|
118
|
+
sets.push(out);
|
|
119
|
+
}
|
|
120
|
+
return { sets, ignored };
|
|
121
|
+
}
|
|
122
|
+
/** A declaration file, read the way HISTOR reads it. Throws when HISTOR would take nothing from it. */
|
|
123
|
+
export function parseDeclarationFile(text) {
|
|
124
|
+
let doc;
|
|
125
|
+
try {
|
|
126
|
+
doc = JSON.parse(text);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
throw new DeclareError('the file is not JSON');
|
|
130
|
+
}
|
|
131
|
+
if (!doc || typeof doc !== 'object' || Array.isArray(doc))
|
|
132
|
+
throw new DeclareError('the file is not a JSON object');
|
|
133
|
+
const d = doc;
|
|
134
|
+
if (d.mtl !== '1')
|
|
135
|
+
throw new DeclareError('"mtl" must be "1"');
|
|
136
|
+
if (Array.isArray(d.sets) && d.sets.length === 0)
|
|
137
|
+
return { sets: [], ignored: [] };
|
|
138
|
+
const parsed = parseSets(d.sets, MAX_FILE_SETS);
|
|
139
|
+
if (!parsed.sets.length)
|
|
140
|
+
throw new DeclareError(parsed.ignored.slice(0, 3).join('; ') || 'no valid sets');
|
|
141
|
+
return parsed;
|
|
142
|
+
}
|
|
143
|
+
/** `file` with `set` in it: a set with the same digest is replaced, the others are kept in order. */
|
|
144
|
+
export function withSet(file, set, limit = MAX_FILE_SETS) {
|
|
145
|
+
const sets = (file?.sets ?? []).filter(s => s.digest !== set.digest);
|
|
146
|
+
const at = (file?.sets ?? []).findIndex(s => s.digest === set.digest);
|
|
147
|
+
if (at >= 0)
|
|
148
|
+
sets.splice(at, 0, set);
|
|
149
|
+
else
|
|
150
|
+
sets.push(set);
|
|
151
|
+
if (sets.length > limit)
|
|
152
|
+
throw new DeclareError(`the file would hold ${sets.length} sets; HISTOR reads at most ${limit}. Remove sets for runners nobody uses any more.`);
|
|
153
|
+
return { mtl: '1', sets };
|
|
154
|
+
}
|
|
155
|
+
/** The server.json `_meta` block for the registry entry. */
|
|
156
|
+
export function serverJsonBlock(sets, url) {
|
|
157
|
+
if (sets.length > MAX_ENTRY_SETS)
|
|
158
|
+
throw new DeclareError(`a registry entry holds at most ${MAX_ENTRY_SETS} sets; put them in a file and link it with --link`);
|
|
159
|
+
const block = { mtl: '1' };
|
|
160
|
+
if (sets.length)
|
|
161
|
+
block.sets = sets;
|
|
162
|
+
if (url)
|
|
163
|
+
block.url = url;
|
|
164
|
+
return { _meta: { [PUBLISHER_PROVIDED]: { [DECLARATION_FIELD]: block } } };
|
|
165
|
+
}
|
|
166
|
+
/** The set this machine gets from a server, ready to declare. */
|
|
167
|
+
export function setFrom(fetched, when) {
|
|
168
|
+
let digest;
|
|
169
|
+
try {
|
|
170
|
+
digest = mtlToolSetDigest(fetched.tools);
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
throw new DeclareError(`the tool set has no MTL/1 digest (${err instanceof MtlError ? err.code : String(err)}), so it cannot be declared or compared`);
|
|
174
|
+
}
|
|
175
|
+
const set = { digest, count: fetched.tools.length };
|
|
176
|
+
const w = cleanWhen(when);
|
|
177
|
+
if (w)
|
|
178
|
+
set.when = w;
|
|
179
|
+
return set;
|
|
180
|
+
}
|
|
181
|
+
export const DECLARE_USAGE = `Usage:
|
|
182
|
+
warden-mcp declare [--when TEXT] [--out FILE] -- COMMAND [ARGS...]
|
|
183
|
+
warden-mcp declare [--when TEXT] [--out FILE] --url URL
|
|
184
|
+
warden-mcp declare --server-json [--link URL] [--when TEXT] [-- COMMAND ... | --url URL]
|
|
185
|
+
warden-mcp declare --check URL --name SERVER_NAME
|
|
186
|
+
warden-mcp declare --check FILE
|
|
187
|
+
|
|
188
|
+
Starts the server the way a client would, digests its tools/list (MTL/1) and prints the set to
|
|
189
|
+
declare, so HISTOR and WARDEN can tell it apart from a set nobody has seen.
|
|
190
|
+
|
|
191
|
+
--when TEXT the condition this set needs, in your words (at most ${MAX_WHEN} characters),
|
|
192
|
+
e.g. "runner 1.4, macOS"
|
|
193
|
+
--out FILE add the set to this declaration file (created if missing; other sets kept,
|
|
194
|
+
the same digest replaced). Publish it on your own domain and link it from
|
|
195
|
+
server.json with "url" (--server-json --link prints that block)
|
|
196
|
+
--server-json print the server.json _meta block instead (sets inline, at most ${MAX_ENTRY_SETS})
|
|
197
|
+
--link URL with --server-json: point the entry at your declaration file
|
|
198
|
+
--check URL --name SERVER_NAME
|
|
199
|
+
read a published declaration file the way HISTOR will: the domain must be the
|
|
200
|
+
one the registry verified for SERVER_NAME, https, no redirects, at most 64 KiB
|
|
201
|
+
--check FILE check a local declaration file's format
|
|
202
|
+
--timeout MS how long to wait for the server (default 60000)
|
|
203
|
+
|
|
204
|
+
Details: https://github.com/alexar76/histor/blob/main/docs/api.md#declaring-tool-sets-publishers`;
|
|
205
|
+
export class DeclareUsage extends Error {
|
|
206
|
+
}
|
|
207
|
+
export function parseDeclareArgs(argv) {
|
|
208
|
+
const opts = { mode: 'set', timeoutMs: 60_000 };
|
|
209
|
+
const dash = argv.indexOf('--');
|
|
210
|
+
const own = dash >= 0 ? argv.slice(0, dash) : argv;
|
|
211
|
+
const command = dash >= 0 ? argv.slice(dash + 1) : [];
|
|
212
|
+
let url;
|
|
213
|
+
for (let i = 0; i < own.length; i++) {
|
|
214
|
+
const a = own[i];
|
|
215
|
+
const value = () => { const v = own[++i]; if (v === undefined || v.startsWith('--'))
|
|
216
|
+
throw new DeclareError(`${a} needs a value`); return v; };
|
|
217
|
+
switch (a) {
|
|
218
|
+
case '-h':
|
|
219
|
+
case '--help': throw new DeclareUsage();
|
|
220
|
+
case '--when':
|
|
221
|
+
opts.when = value();
|
|
222
|
+
break;
|
|
223
|
+
case '--out':
|
|
224
|
+
opts.out = value();
|
|
225
|
+
break;
|
|
226
|
+
case '--server-json':
|
|
227
|
+
opts.serverJson = true;
|
|
228
|
+
break;
|
|
229
|
+
case '--link':
|
|
230
|
+
opts.link = value();
|
|
231
|
+
break;
|
|
232
|
+
case '--url':
|
|
233
|
+
url = value();
|
|
234
|
+
break;
|
|
235
|
+
case '--check':
|
|
236
|
+
opts.mode = 'check';
|
|
237
|
+
opts.check = value();
|
|
238
|
+
break;
|
|
239
|
+
case '--name':
|
|
240
|
+
opts.name = value();
|
|
241
|
+
break;
|
|
242
|
+
case '--timeout': {
|
|
243
|
+
const n = Number(value());
|
|
244
|
+
if (!Number.isInteger(n) || n < 1000 || n > 600_000)
|
|
245
|
+
throw new DeclareError('--timeout must be 1000..600000 ms');
|
|
246
|
+
opts.timeoutMs = n;
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
default: throw new DeclareError(`unknown option ${a}`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (opts.mode === 'check') {
|
|
253
|
+
if (command.length || url || opts.out || opts.serverJson)
|
|
254
|
+
throw new DeclareError('--check reads a declaration file; it does not start a server');
|
|
255
|
+
if (/^https?:\/\//i.test(opts.check) && !opts.name)
|
|
256
|
+
throw new DeclareError('--check URL needs --name, the server name in the registry (e.g. ai.acme/launcher)');
|
|
257
|
+
return opts;
|
|
258
|
+
}
|
|
259
|
+
if (opts.out && opts.serverJson)
|
|
260
|
+
throw new DeclareError('--out writes a declaration file, --server-json prints the registry block: pick one');
|
|
261
|
+
if (opts.link && !opts.serverJson)
|
|
262
|
+
throw new DeclareError('--link goes with --server-json');
|
|
263
|
+
if (command.length && url)
|
|
264
|
+
throw new DeclareError('give a command after -- or --url, not both');
|
|
265
|
+
if (command.length)
|
|
266
|
+
opts.ref = { id: 'declare', name: command.join(' '), transport: 'stdio', command: command[0], args: command.slice(1) };
|
|
267
|
+
else if (url) {
|
|
268
|
+
if (!/^https?:\/\//i.test(url))
|
|
269
|
+
throw new DeclareError('--url must be an http(s) URL');
|
|
270
|
+
opts.ref = { id: 'declare', name: url, transport: 'http', url };
|
|
271
|
+
}
|
|
272
|
+
else if (!(opts.serverJson && opts.link))
|
|
273
|
+
throw new DeclareError('give the server: a command after --, or --url');
|
|
274
|
+
return opts;
|
|
275
|
+
}
|
|
276
|
+
async function httpGet(url, timeoutMs) {
|
|
277
|
+
const res = await fetch(url, { redirect: 'manual', signal: AbortSignal.timeout(timeoutMs), headers: { accept: 'application/json', 'user-agent': `warden-mcp/${packageVersion()}` } });
|
|
278
|
+
if (!res.body)
|
|
279
|
+
return { status: res.status, body: '' };
|
|
280
|
+
const reader = res.body.getReader();
|
|
281
|
+
const chunks = [];
|
|
282
|
+
let size = 0;
|
|
283
|
+
for (;;) {
|
|
284
|
+
const { done, value } = await reader.read();
|
|
285
|
+
if (done)
|
|
286
|
+
break;
|
|
287
|
+
chunks.push(value);
|
|
288
|
+
size += value.length;
|
|
289
|
+
if (size > MAX_FILE_BYTES) {
|
|
290
|
+
await reader.cancel();
|
|
291
|
+
break;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return { status: res.status, body: Buffer.concat(chunks).toString('utf8') };
|
|
295
|
+
}
|
|
296
|
+
async function atomicWrite(path, text) {
|
|
297
|
+
const tmp = `${path}.${process.pid}.tmp`;
|
|
298
|
+
await writeFile(tmp, text);
|
|
299
|
+
await rename(tmp, path);
|
|
300
|
+
}
|
|
301
|
+
/** Runs one `declare`; returns the exit code (0 ok, 1 refused or failed). */
|
|
302
|
+
export async function runDeclare(opts, deps = {}) {
|
|
303
|
+
const out = deps.out ?? (t => process.stdout.write(t + '\n'));
|
|
304
|
+
const err = deps.err ?? (t => process.stderr.write(t + '\n'));
|
|
305
|
+
const read = deps.readFile ?? (p => readFile(p, 'utf8'));
|
|
306
|
+
const write = deps.writeFile ?? atomicWrite;
|
|
307
|
+
if (opts.mode === 'check') {
|
|
308
|
+
const target = opts.check;
|
|
309
|
+
let text;
|
|
310
|
+
if (/^https?:\/\//i.test(target)) {
|
|
311
|
+
const refusal = urlRefusal(target, opts.name);
|
|
312
|
+
if (refusal) {
|
|
313
|
+
err(`HISTOR will not read this file: ${refusal}.`);
|
|
314
|
+
return 1;
|
|
315
|
+
}
|
|
316
|
+
let got;
|
|
317
|
+
try {
|
|
318
|
+
got = await (deps.get ?? httpGet)(target, opts.timeoutMs);
|
|
319
|
+
}
|
|
320
|
+
catch (e) {
|
|
321
|
+
err(`HISTOR could not read this file: the request failed (${displaySafe(e instanceof Error ? e.message : String(e), 200)}).`);
|
|
322
|
+
return 1;
|
|
323
|
+
}
|
|
324
|
+
if (got.status >= 300 && got.status < 400) {
|
|
325
|
+
err(`HISTOR will not read this file: http-${got.status}, and redirects are not followed. Serve it at this address.`);
|
|
326
|
+
return 1;
|
|
327
|
+
}
|
|
328
|
+
if (got.status !== 200) {
|
|
329
|
+
err(`HISTOR could not read this file: http-${got.status}.`);
|
|
330
|
+
return 1;
|
|
331
|
+
}
|
|
332
|
+
if (Buffer.byteLength(got.body) > MAX_FILE_BYTES) {
|
|
333
|
+
err(`HISTOR will not read this file: it is larger than ${MAX_FILE_BYTES / 1024} KiB.`);
|
|
334
|
+
return 1;
|
|
335
|
+
}
|
|
336
|
+
text = got.body;
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
try {
|
|
340
|
+
text = await read(target);
|
|
341
|
+
}
|
|
342
|
+
catch (e) {
|
|
343
|
+
err(`cannot read ${displaySafe(target, 300)}: ${displaySafe(e instanceof Error ? e.message : String(e), 200)}`);
|
|
344
|
+
return 1;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
let parsed;
|
|
348
|
+
try {
|
|
349
|
+
parsed = parseDeclarationFile(text);
|
|
350
|
+
}
|
|
351
|
+
catch (e) {
|
|
352
|
+
err(`HISTOR will not take this file: ${e instanceof Error ? e.message : String(e)}.`);
|
|
353
|
+
return 1;
|
|
354
|
+
}
|
|
355
|
+
for (const why of parsed.ignored)
|
|
356
|
+
err(`skipped: ${why}`);
|
|
357
|
+
out(parsed.sets.length
|
|
358
|
+
? `OK: HISTOR will take ${parsed.sets.length} set${parsed.sets.length === 1 ? '' : 's'} from this file${parsed.ignored.length ? ` (${parsed.ignored.length} skipped, above)` : ''}.`
|
|
359
|
+
: 'OK: an empty "sets" list. HISTOR will withdraw every set this file declared before.');
|
|
360
|
+
for (const s of parsed.sets)
|
|
361
|
+
out(` ${s.digest}${s.count !== undefined ? ` · ${s.count} tools` : ''}${s.when ? ` · "${s.when}"` : ''}`);
|
|
362
|
+
return 0;
|
|
363
|
+
}
|
|
364
|
+
let set;
|
|
365
|
+
if (opts.ref) {
|
|
366
|
+
let fetched;
|
|
367
|
+
try {
|
|
368
|
+
fetched = deps.fetch ? await deps.fetch(opts.ref, opts.timeoutMs)
|
|
369
|
+
: await fetchServer(opts.ref, { timeoutMs: opts.timeoutMs, clientVersion: packageVersion(), cwd: process.cwd() });
|
|
370
|
+
}
|
|
371
|
+
catch (e) {
|
|
372
|
+
const msg = e instanceof McpClientError ? e.message : e instanceof Error ? e.message : String(e);
|
|
373
|
+
err(`the server did not answer tools/list: ${displaySafe(msg, 400)}`);
|
|
374
|
+
return 1;
|
|
375
|
+
}
|
|
376
|
+
try {
|
|
377
|
+
set = setFrom(fetched, opts.when);
|
|
378
|
+
}
|
|
379
|
+
catch (e) {
|
|
380
|
+
err(e instanceof Error ? e.message : String(e));
|
|
381
|
+
return 1;
|
|
382
|
+
}
|
|
383
|
+
err(`${set.count} tool${set.count === 1 ? '' : 's'} · ${set.digest}${set.when ? ` · "${set.when}"` : ''}`);
|
|
384
|
+
}
|
|
385
|
+
if (opts.serverJson) {
|
|
386
|
+
if (opts.link) {
|
|
387
|
+
// The domain can only be checked against the server's registry name; say what the rule is.
|
|
388
|
+
err(`"url" must be on the domain the registry verified for your server's namespace (ai.acme/x → acme.ai) or a subdomain; check it with --check ${opts.link} --name <server name>.`);
|
|
389
|
+
}
|
|
390
|
+
try {
|
|
391
|
+
out(JSON.stringify(serverJsonBlock(set ? [set] : [], opts.link), null, 2));
|
|
392
|
+
}
|
|
393
|
+
catch (e) {
|
|
394
|
+
err(e instanceof Error ? e.message : String(e));
|
|
395
|
+
return 1;
|
|
396
|
+
}
|
|
397
|
+
return 0;
|
|
398
|
+
}
|
|
399
|
+
if (opts.out) {
|
|
400
|
+
let existing;
|
|
401
|
+
let text;
|
|
402
|
+
try {
|
|
403
|
+
text = await read(opts.out);
|
|
404
|
+
}
|
|
405
|
+
catch {
|
|
406
|
+
text = undefined;
|
|
407
|
+
}
|
|
408
|
+
if (text !== undefined) {
|
|
409
|
+
try {
|
|
410
|
+
existing = { mtl: '1', sets: parseDeclarationFile(text).sets };
|
|
411
|
+
}
|
|
412
|
+
catch (e) {
|
|
413
|
+
err(`${displaySafe(opts.out, 300)} is not a declaration file HISTOR would read (${e instanceof Error ? e.message : String(e)}); not overwriting it.`);
|
|
414
|
+
return 1;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
let next;
|
|
418
|
+
try {
|
|
419
|
+
next = withSet(existing, set);
|
|
420
|
+
}
|
|
421
|
+
catch (e) {
|
|
422
|
+
err(e instanceof Error ? e.message : String(e));
|
|
423
|
+
return 1;
|
|
424
|
+
}
|
|
425
|
+
await write(opts.out, JSON.stringify(next, null, 2) + '\n');
|
|
426
|
+
const replaced = existing?.sets.some(s => s.digest === set.digest);
|
|
427
|
+
out(`${replaced ? 'Updated' : 'Added'} the set in ${opts.out} (${next.sets.length} set${next.sets.length === 1 ? '' : 's'}). Publish it on your domain; HISTOR reads it every hour.`);
|
|
428
|
+
return 0;
|
|
429
|
+
}
|
|
430
|
+
out(JSON.stringify(set, null, 2));
|
|
431
|
+
return 0;
|
|
432
|
+
}
|
|
433
|
+
/** `warden-mcp declare …` — returns the process exit code. */
|
|
434
|
+
export async function runDeclareCli(argv) {
|
|
435
|
+
let opts;
|
|
436
|
+
try {
|
|
437
|
+
opts = parseDeclareArgs(argv);
|
|
438
|
+
}
|
|
439
|
+
catch (e) {
|
|
440
|
+
if (e instanceof DeclareUsage) {
|
|
441
|
+
process.stdout.write(DECLARE_USAGE + '\n');
|
|
442
|
+
return 0;
|
|
443
|
+
}
|
|
444
|
+
process.stderr.write(`warden-mcp declare: ${displaySafe(e instanceof Error ? e.message : String(e), 1000)}\nRun warden-mcp declare --help for options.\n`);
|
|
445
|
+
return 2;
|
|
446
|
+
}
|
|
447
|
+
return runDeclare(opts);
|
|
448
|
+
}
|
|
449
|
+
//# sourceMappingURL=declare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declare.js","sourceRoot":"","sources":["../src/declare.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
export type FlowLabel = 'private' | 'untrusted' | 'outbound' | 'destructive';
|
|
2
|
+
export type FlowMode = 'ask' | 'deny' | 'audit' | 'off';
|
|
3
|
+
export interface FlowPolicy {
|
|
4
|
+
mode: FlowMode;
|
|
5
|
+
/** Tool-name globs → the labels an operator assigns; replaces the built-in guess for that tool. */
|
|
6
|
+
labels: Record<string, FlowLabel[]>;
|
|
7
|
+
/** Hosts whose content does not taint the session (docs you trust). `*.example.com` covers subdomains. */
|
|
8
|
+
trustedSources: string[];
|
|
9
|
+
/** Hosts an outbound call may reach in a tainted session without asking. Fingerprint checks still apply. */
|
|
10
|
+
allowedDestinations: string[];
|
|
11
|
+
/** Treat every local file the agent reads as outside text (strict). Default: only foreign paths. */
|
|
12
|
+
taintLocalFiles: boolean;
|
|
13
|
+
/** Tool-name globs → argument names whose values are destinations or targets (recipient, file id). */
|
|
14
|
+
destinationArgs: Record<string, string[]>;
|
|
15
|
+
/** Explicitly trusted, read-only contact lookup tools. Results must contain structured name/email records. */
|
|
16
|
+
contactTools?: string[];
|
|
17
|
+
}
|
|
18
|
+
export interface FlowSource {
|
|
19
|
+
tool: string;
|
|
20
|
+
src: string;
|
|
21
|
+
at: string;
|
|
22
|
+
}
|
|
23
|
+
export interface FlowState {
|
|
24
|
+
v: 1;
|
|
25
|
+
untrusted: FlowSource[];
|
|
26
|
+
private: Array<FlowSource & {
|
|
27
|
+
secret: boolean;
|
|
28
|
+
}>;
|
|
29
|
+
notified: boolean;
|
|
30
|
+
/** Fingerprint store reached its cap: later private reads are not fingerprinted. */
|
|
31
|
+
full: boolean;
|
|
32
|
+
/** What the user typed this session (normalized, capped): a destination named here is the user's choice. */
|
|
33
|
+
intent?: string[];
|
|
34
|
+
/** The same, lower-cased with spacing kept, for whole-word matches of short names and numbers. */
|
|
35
|
+
intentRaw?: string[];
|
|
36
|
+
/** Addresses resolved by explicitly trusted contact tools, bound to full display names. */
|
|
37
|
+
resolved?: Array<{
|
|
38
|
+
v: string;
|
|
39
|
+
names: string[];
|
|
40
|
+
}>;
|
|
41
|
+
resolvedVersion?: 2;
|
|
42
|
+
}
|
|
43
|
+
export interface Classified {
|
|
44
|
+
labels: Set<FlowLabel>;
|
|
45
|
+
/** Hosts named in the call (URLs, ssh/scp targets). */
|
|
46
|
+
hosts: string[];
|
|
47
|
+
/** For results: a short description of where the text came from. */
|
|
48
|
+
src: string;
|
|
49
|
+
/** Private read of a credential path. */
|
|
50
|
+
secret: boolean;
|
|
51
|
+
/** The call writes WARDEN's policy/state or Claude Code's hook/MCP settings. */
|
|
52
|
+
protectedTouch: boolean;
|
|
53
|
+
/** Shell code that is not a small literal read-only command. Destination exemptions never apply. */
|
|
54
|
+
opaqueShell?: boolean;
|
|
55
|
+
}
|
|
56
|
+
export interface FlowDecision {
|
|
57
|
+
permissionDecision: 'ask' | 'deny';
|
|
58
|
+
permissionDecisionReason: string;
|
|
59
|
+
}
|
|
60
|
+
/** Set by the integration, never by tool arguments. A proxy cannot display an approval dialog. */
|
|
61
|
+
export type FlowPresentation = 'hook' | 'refuse' | 'audit';
|
|
62
|
+
export declare const DEFAULT_POLICY: FlowPolicy;
|
|
63
|
+
export declare function stateDir(env?: NodeJS.ProcessEnv): string;
|
|
64
|
+
export declare function flowPaths(dir: string, sessionId: string): {
|
|
65
|
+
dir: string;
|
|
66
|
+
state: string;
|
|
67
|
+
fp: string;
|
|
68
|
+
secret: string;
|
|
69
|
+
pii: string;
|
|
70
|
+
log: string;
|
|
71
|
+
};
|
|
72
|
+
export declare function isSecretPath(path: string): boolean;
|
|
73
|
+
/** Files that, if the agent could change them, would let it switch the guard off. */
|
|
74
|
+
export declare function isProtectedPath(path: string, cwd: string, env?: NodeJS.ProcessEnv): boolean;
|
|
75
|
+
/** User-level policy only (`<state dir>/flow-policy.json`): a project file is something the agent can edit. */
|
|
76
|
+
export declare function loadPolicy(env?: NodeJS.ProcessEnv): FlowPolicy;
|
|
77
|
+
export declare function hostMatches(host: string, patterns: readonly string[]): boolean;
|
|
78
|
+
export declare function hostsIn(texts: readonly string[]): string[];
|
|
79
|
+
export declare function classifyShell(command: string): {
|
|
80
|
+
labels: Set<FlowLabel>;
|
|
81
|
+
hosts: string[];
|
|
82
|
+
local: boolean;
|
|
83
|
+
};
|
|
84
|
+
export declare function classifyCall(toolName: string, input: Record<string, unknown>, cwd: string, policy: FlowPolicy, env?: NodeJS.ProcessEnv): Classified;
|
|
85
|
+
export declare function destinations(toolName: string, input: Record<string, unknown>, policy: FlowPolicy, hosts: readonly string[]): string[];
|
|
86
|
+
/**
|
|
87
|
+
* The operator named this tool's destination arguments and the call sets none of them: it acts on an
|
|
88
|
+
* existing relationship (change the amount of a standing order, not its payee), so no new party is reached.
|
|
89
|
+
* Unconfigured tools never qualify: without the operator's word, an absent argument proves nothing.
|
|
90
|
+
*/
|
|
91
|
+
export declare function keepsDestination(toolName: string, input: Record<string, unknown>, policy: FlowPolicy): boolean;
|
|
92
|
+
/** Only structured records from explicitly configured contact tools may resolve a full display name.
|
|
93
|
+
* Arbitrary prose, YAML, capitalized words and local file reads cannot create authority. */
|
|
94
|
+
export declare function resolvedContacts(value: unknown, depth?: number): Array<{
|
|
95
|
+
v: string;
|
|
96
|
+
names: string[];
|
|
97
|
+
}>;
|
|
98
|
+
export declare function namedByUser(dests: readonly string[], intent: readonly string[] | undefined, intentRaw?: readonly string[], resolved?: FlowState['resolved']): boolean;
|
|
99
|
+
export declare function resultTaints(toolName: string, input: Record<string, unknown>, responseText: string, cwd: string, policy: FlowPolicy, classified: Classified): {
|
|
100
|
+
untrusted: boolean;
|
|
101
|
+
private: boolean;
|
|
102
|
+
src: string;
|
|
103
|
+
};
|
|
104
|
+
export declare function normalizeText(s: string): string;
|
|
105
|
+
/** Windows of the private text at every STRIDE-th position: any leaked run of WINDOW+STRIDE-1 normalized chars hits one. */
|
|
106
|
+
export declare function fingerprints(text: string): string[];
|
|
107
|
+
/** The texts an outbound call could be carrying: raw, URL-decoded, and base64/hex runs decoded. */
|
|
108
|
+
export declare function candidates(texts: readonly string[]): string[];
|
|
109
|
+
export declare function piiTokens(text: string): string[];
|
|
110
|
+
export declare function secretPattern(texts: readonly string[]): string | undefined;
|
|
111
|
+
export interface LeakCheck {
|
|
112
|
+
secret?: string;
|
|
113
|
+
private?: boolean;
|
|
114
|
+
pii?: boolean;
|
|
115
|
+
}
|
|
116
|
+
/** `typed`: what the user typed this session. A value the user typed is theirs to send; it is skipped
|
|
117
|
+
* for ordinary private text, never for secrets. */
|
|
118
|
+
export declare function checkLeak(paths: ReturnType<typeof flowPaths>, input: Record<string, unknown>, typed?: readonly string[]): LeakCheck;
|
|
119
|
+
export declare function readFlowState(path: string): FlowState;
|
|
120
|
+
export declare function updateFlowState(path: string, change: (s: FlowState) => void): FlowState;
|
|
121
|
+
export declare function flowPre(input: Record<string, unknown>, env?: NodeJS.ProcessEnv, presentation?: FlowPresentation): FlowDecision | undefined;
|
|
122
|
+
export interface FlowPostOutput {
|
|
123
|
+
systemMessage?: string;
|
|
124
|
+
additionalContext?: string;
|
|
125
|
+
}
|
|
126
|
+
export declare function flowPost(input: Record<string, unknown>, env?: NodeJS.ProcessEnv): FlowPostOutput | undefined;
|
|
127
|
+
/** UserPromptSubmit: remember what the user asked for, so destinations they named are theirs. */
|
|
128
|
+
export declare function flowPrompt(input: Record<string, unknown>, env?: NodeJS.ProcessEnv): void;
|
|
129
|
+
/** Hook runner shared by the CLI and the plugin script: `pre` or `post`, hook JSON on stdin, decision JSON on stdout. */
|
|
130
|
+
export declare function runFlowHook(event: string, stdin: string, env?: NodeJS.ProcessEnv): string | undefined;
|
|
131
|
+
export declare function flowGuardMain(argv?: string[]): void;
|
|
132
|
+
export declare function flowStateExists(sessionId: string, env?: NodeJS.ProcessEnv): boolean;
|
|
133
|
+
//# sourceMappingURL=flow-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-guard.d.ts","sourceRoot":"","sources":["../src/flow-guard.ts"],"names":[],"mappings":"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"}
|