@grindfree/guard 0.0.0-stage → 0.2.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.
@@ -0,0 +1,161 @@
1
+ import { type ClientOptions } from "./client.js";
2
+ import { type EnforceOptions, type NormalizedDecision } from "./decisions.js";
3
+ export type ToolCallInput = {
4
+ tool: string;
5
+ destination?: {
6
+ host?: string;
7
+ scheme?: string;
8
+ port?: number;
9
+ path_class?: string;
10
+ };
11
+ arg_classes?: string[];
12
+ taint?: string[];
13
+ secret_labels?: string[];
14
+ policy?: Record<string, unknown>;
15
+ policy_hash?: string;
16
+ rule_pack?: string;
17
+ };
18
+ export type CommandInput = {
19
+ command: string;
20
+ shell?: "bash" | "sh" | "zsh" | "fish" | "powershell" | "cmd";
21
+ policy?: Record<string, unknown>;
22
+ };
23
+ export type SqlInput = {
24
+ sql: string;
25
+ dialect?: "postgres" | "mysql" | "mariadb" | "sqlite" | "mssql" | "snowflake" | "bigquery" | "other";
26
+ policy?: Record<string, unknown>;
27
+ };
28
+ export type PromptInput = {
29
+ content: string;
30
+ format?: "text" | "html";
31
+ };
32
+ export type CrawlInput = {
33
+ url: string;
34
+ user_agent?: string;
35
+ check_page?: boolean;
36
+ };
37
+ export type MemoryInput = {
38
+ content?: string;
39
+ source?: "user" | "assistant" | "tool" | "web" | "document" | "email" | "retrieved" | "mcp" | "unknown";
40
+ memory_type?: "fact" | "preference" | "instruction" | "episodic" | "summary";
41
+ entries?: Array<{
42
+ key?: string;
43
+ content: string;
44
+ source?: string;
45
+ }>;
46
+ policy?: Record<string, unknown>;
47
+ };
48
+ export type OutputInput = {
49
+ content: string;
50
+ format?: "markdown" | "text" | "html" | "json";
51
+ allowed_domains?: string[];
52
+ canaries?: string[];
53
+ system_prompt?: string;
54
+ policy?: Record<string, unknown>;
55
+ };
56
+ export type DocumentInput = {
57
+ content?: string;
58
+ content_base64?: string;
59
+ format?: "html" | "markdown" | "text";
60
+ filename?: string;
61
+ include_text?: boolean;
62
+ policy?: Record<string, unknown>;
63
+ };
64
+ export type ReadInput = {
65
+ url: string;
66
+ format?: "markdown" | "text";
67
+ mode?: "strip" | "flag";
68
+ max_chars?: number;
69
+ include_links?: boolean;
70
+ include_images?: boolean;
71
+ main_content?: boolean;
72
+ policy?: Record<string, unknown>;
73
+ };
74
+ export type SafeReadResult = {
75
+ /** Clean Markdown/text with hidden content and injected instructions removed (strip mode). */
76
+ text: string;
77
+ title?: string;
78
+ finalUrl?: string;
79
+ decision: NormalizedDecision;
80
+ };
81
+ export type GuardOptions = ClientOptions & EnforceOptions & {
82
+ /** Default ToolGuard / CommandGuard policy sent when a call omits one. */
83
+ policy?: Record<string, unknown>;
84
+ };
85
+ export type GuardedResult<T> = {
86
+ value: T;
87
+ decision: NormalizedDecision;
88
+ };
89
+ export declare class GrindFreeGuard {
90
+ readonly options: GuardOptions;
91
+ private readonly paidFetch;
92
+ constructor(options?: GuardOptions);
93
+ private enforceOpts;
94
+ private call;
95
+ private callAndEnforce;
96
+ /** ToolGuard evaluate only (no enforcement). */
97
+ evaluateTool(input: ToolCallInput): Promise<NormalizedDecision>;
98
+ /**
99
+ * Screen a tool call with ToolGuard, enforce allow/review/deny, then run `fn`.
100
+ * On deny (or review with default onReview=throw) `fn` is not called.
101
+ */
102
+ guardToolCall<T>(input: ToolCallInput, fn: () => Promise<T> | T): Promise<GuardedResult<T>>;
103
+ /**
104
+ * Wrap any tool function so ToolGuard runs first.
105
+ * `classify` maps arguments to a ToolGuard body; defaults to `{ tool: name }`.
106
+ */
107
+ wrapTool<Args extends unknown[], R>(name: string, fn: (...args: Args) => Promise<R> | R, classify?: (...args: Args) => ToolCallInput | Promise<ToolCallInput>): (...args: Args) => Promise<R>;
108
+ checkCommand(input: CommandInput): Promise<NormalizedDecision>;
109
+ guardCommand<T>(input: CommandInput, fn: () => Promise<T> | T): Promise<GuardedResult<T>>;
110
+ checkSql(input: SqlInput): Promise<NormalizedDecision>;
111
+ guardSql<T>(input: SqlInput, fn: () => Promise<T> | T): Promise<GuardedResult<T>>;
112
+ screenPrompt(input: PromptInput): Promise<NormalizedDecision>;
113
+ /**
114
+ * Screen untrusted text/HTML. Throws on high risk (deny). Returns sanitized
115
+ * text (or the original when the service did not supply one).
116
+ */
117
+ requireSafePrompt(input: PromptInput): Promise<{
118
+ text: string;
119
+ decision: NormalizedDecision;
120
+ }>;
121
+ cleanHtml(content: string): Promise<{
122
+ text: string;
123
+ raw: Record<string, unknown>;
124
+ }>;
125
+ checkCrawl(input: CrawlInput): Promise<NormalizedDecision>;
126
+ requireCrawlAllowed(input: CrawlInput): Promise<NormalizedDecision>;
127
+ screenMemory(input: MemoryInput): Promise<NormalizedDecision>;
128
+ requireSafeMemory(input: MemoryInput): Promise<{
129
+ text?: string;
130
+ decision: NormalizedDecision;
131
+ }>;
132
+ scanOutput(input: OutputInput): Promise<NormalizedDecision>;
133
+ requireSafeOutput(input: OutputInput): Promise<{
134
+ text: string;
135
+ decision: NormalizedDecision;
136
+ }>;
137
+ scanDocument(input: DocumentInput): Promise<NormalizedDecision>;
138
+ requireSafeDocument(input: DocumentInput): Promise<{
139
+ text?: string;
140
+ decision: NormalizedDecision;
141
+ }>;
142
+ /** SafeRead raw call (no enforcement): fetch a URL as clean Markdown/text. */
143
+ readUrl(input: ReadInput | string): Promise<NormalizedDecision>;
144
+ /**
145
+ * Fetch a URL through SafeRead and return clean text. Does NOT throw on a
146
+ * "block" verdict: injected instructions are already removed from `text`;
147
+ * inspect `decision.verdict` / `decision.findings` to see what was taken out.
148
+ */
149
+ safeRead(input: ReadInput | string): Promise<SafeReadResult>;
150
+ /** Like safeRead, but enforces: block → GuardDenied, warn → onReview policy. */
151
+ requireSafeRead(input: ReadInput | string): Promise<SafeReadResult>;
152
+ }
153
+ export declare function createGuard(options?: GuardOptions): GrindFreeGuard;
154
+ /** Convenience wrapper around `createGuard(...).guardToolCall`. */
155
+ export declare function guardToolCall<T>(input: ToolCallInput, fn: () => Promise<T> | T, options?: GuardOptions): Promise<GuardedResult<T>>;
156
+ /**
157
+ * Express/fetch-style middleware: evaluate an outbound tool described by
158
+ * `classify(request)` and only call `next` when the verdict allows it.
159
+ */
160
+ export declare function createGuardMiddleware(options?: GuardOptions): <Req, Res>(classify: (req: Req) => ToolCallInput | Promise<ToolCallInput>, next: (req: Req) => Promise<Res> | Res, req: Req) => Promise<GuardedResult<Res>>;
161
+ //# sourceMappingURL=guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"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"}
package/dist/guard.js ADDED
@@ -0,0 +1,187 @@
1
+ import { createPaidFetch, postJson } from "./client.js";
2
+ import { enforce, enforceError, normalizeDecision } from "./decisions.js";
3
+ import { GuardDenied } from "./errors.js";
4
+ import { serviceUrl } from "./services.js";
5
+ function clean(obj) {
6
+ return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined));
7
+ }
8
+ export class GrindFreeGuard {
9
+ options;
10
+ paidFetch;
11
+ constructor(options = {}) {
12
+ this.options = options;
13
+ this.paidFetch = createPaidFetch(options);
14
+ }
15
+ enforceOpts() {
16
+ return { onReview: this.options.onReview, onError: this.options.onError };
17
+ }
18
+ async call(service, endpoint, body) {
19
+ const url = serviceUrl(service, endpoint);
20
+ try {
21
+ const raw = await postJson(this.paidFetch, url, body, {
22
+ timeoutMs: this.options.timeoutMs,
23
+ service,
24
+ });
25
+ return normalizeDecision(service, endpoint, raw);
26
+ }
27
+ catch (err) {
28
+ if (this.options.onError === "allow") {
29
+ if (err instanceof GuardDenied)
30
+ throw err;
31
+ const message = err instanceof Error ? err.message : String(err);
32
+ return {
33
+ verdict: "allow",
34
+ service,
35
+ endpoint,
36
+ reasons: [`transport failure allowed by onError=allow: ${message}`],
37
+ findings: [],
38
+ raw: { error: message },
39
+ };
40
+ }
41
+ enforceError(err, service, this.enforceOpts());
42
+ }
43
+ }
44
+ async callAndEnforce(service, endpoint, body) {
45
+ const decision = await this.call(service, endpoint, body);
46
+ return enforce(decision, this.enforceOpts());
47
+ }
48
+ /** ToolGuard evaluate only (no enforcement). */
49
+ evaluateTool(input) {
50
+ const body = clean({ ...input, policy: input.policy ?? this.options.policy });
51
+ return this.call("toolguard", "evaluate", body);
52
+ }
53
+ /**
54
+ * Screen a tool call with ToolGuard, enforce allow/review/deny, then run `fn`.
55
+ * On deny (or review with default onReview=throw) `fn` is not called.
56
+ */
57
+ async guardToolCall(input, fn) {
58
+ const decision = await this.callAndEnforce("toolguard", "evaluate", clean({ ...input, policy: input.policy ?? this.options.policy }));
59
+ const value = await fn();
60
+ return { value, decision };
61
+ }
62
+ /**
63
+ * Wrap any tool function so ToolGuard runs first.
64
+ * `classify` maps arguments to a ToolGuard body; defaults to `{ tool: name }`.
65
+ */
66
+ wrapTool(name, fn, classify) {
67
+ return async (...args) => {
68
+ const input = classify ? await classify(...args) : { tool: name };
69
+ const { value } = await this.guardToolCall({ ...input, tool: input.tool ?? name }, () => fn(...args));
70
+ return value;
71
+ };
72
+ }
73
+ checkCommand(input) {
74
+ return this.call("commandguard", "command", clean({ ...input, policy: input.policy ?? this.options.policy }));
75
+ }
76
+ async guardCommand(input, fn) {
77
+ const decision = await this.callAndEnforce("commandguard", "command", clean({ ...input, policy: input.policy ?? this.options.policy }));
78
+ return { value: await fn(), decision };
79
+ }
80
+ checkSql(input) {
81
+ return this.call("commandguard", "sql", clean({ ...input, policy: input.policy ?? this.options.policy }));
82
+ }
83
+ async guardSql(input, fn) {
84
+ const decision = await this.callAndEnforce("commandguard", "sql", clean({ ...input, policy: input.policy ?? this.options.policy }));
85
+ return { value: await fn(), decision };
86
+ }
87
+ screenPrompt(input) {
88
+ return this.call("promptshield", "screen", input);
89
+ }
90
+ /**
91
+ * Screen untrusted text/HTML. Throws on high risk (deny). Returns sanitized
92
+ * text (or the original when the service did not supply one).
93
+ */
94
+ async requireSafePrompt(input) {
95
+ const decision = await this.callAndEnforce("promptshield", "screen", input);
96
+ return { text: decision.sanitized ?? input.content, decision };
97
+ }
98
+ async cleanHtml(content) {
99
+ try {
100
+ const raw = await postJson(this.paidFetch, serviceUrl("promptshield", "clean"), { content }, {
101
+ timeoutMs: this.options.timeoutMs,
102
+ service: "promptshield",
103
+ });
104
+ return { text: typeof raw.text === "string" ? raw.text : "", raw };
105
+ }
106
+ catch (err) {
107
+ if (this.options.onError === "allow") {
108
+ return { text: content, raw: { error: err instanceof Error ? err.message : String(err) } };
109
+ }
110
+ enforceError(err, "promptshield", this.enforceOpts());
111
+ }
112
+ }
113
+ checkCrawl(input) {
114
+ return this.call("crawlsafe", "check", input);
115
+ }
116
+ async requireCrawlAllowed(input) {
117
+ return this.callAndEnforce("crawlsafe", "check", input);
118
+ }
119
+ screenMemory(input) {
120
+ return this.call("memoryguard", "screen", clean({ ...input, policy: input.policy ?? this.options.policy }));
121
+ }
122
+ async requireSafeMemory(input) {
123
+ const decision = await this.callAndEnforce("memoryguard", "screen", clean({ ...input, policy: input.policy ?? this.options.policy }));
124
+ return { text: decision.sanitized ?? input.content, decision };
125
+ }
126
+ scanOutput(input) {
127
+ return this.call("wireshield", "scan", clean({ ...input, policy: input.policy ?? this.options.policy }));
128
+ }
129
+ async requireSafeOutput(input) {
130
+ const decision = await this.callAndEnforce("wireshield", "scan", clean({ ...input, policy: input.policy ?? this.options.policy }));
131
+ return { text: decision.sanitized ?? input.content, decision };
132
+ }
133
+ scanDocument(input) {
134
+ return this.call("docshield", "scan", clean({ ...input, policy: input.policy ?? this.options.policy }));
135
+ }
136
+ async requireSafeDocument(input) {
137
+ const decision = await this.callAndEnforce("docshield", "scan", clean({ ...input, policy: input.policy ?? this.options.policy }));
138
+ return { text: decision.safeText ?? decision.sanitized ?? input.content, decision };
139
+ }
140
+ /** SafeRead raw call (no enforcement): fetch a URL as clean Markdown/text. */
141
+ readUrl(input) {
142
+ return this.call("saferead", "read", clean({ ...toReadInput(input) }));
143
+ }
144
+ /**
145
+ * Fetch a URL through SafeRead and return clean text. Does NOT throw on a
146
+ * "block" verdict: injected instructions are already removed from `text`;
147
+ * inspect `decision.verdict` / `decision.findings` to see what was taken out.
148
+ */
149
+ async safeRead(input) {
150
+ return toReadResult(await this.readUrl(input));
151
+ }
152
+ /** Like safeRead, but enforces: block → GuardDenied, warn → onReview policy. */
153
+ async requireSafeRead(input) {
154
+ return toReadResult(await this.callAndEnforce("saferead", "read", clean({ ...toReadInput(input) })));
155
+ }
156
+ }
157
+ function toReadInput(input) {
158
+ return typeof input === "string" ? { url: input } : input;
159
+ }
160
+ function toReadResult(decision) {
161
+ const raw = decision.raw;
162
+ return {
163
+ text: decision.safeText ?? "",
164
+ title: typeof raw.title === "string" ? raw.title : undefined,
165
+ finalUrl: typeof raw.final_url === "string" ? raw.final_url : undefined,
166
+ decision,
167
+ };
168
+ }
169
+ export function createGuard(options = {}) {
170
+ return new GrindFreeGuard(options);
171
+ }
172
+ /** Convenience wrapper around `createGuard(...).guardToolCall`. */
173
+ export function guardToolCall(input, fn, options = {}) {
174
+ return createGuard(options).guardToolCall(input, fn);
175
+ }
176
+ /**
177
+ * Express/fetch-style middleware: evaluate an outbound tool described by
178
+ * `classify(request)` and only call `next` when the verdict allows it.
179
+ */
180
+ export function createGuardMiddleware(options = {}) {
181
+ const guard = createGuard(options);
182
+ return async function grindfreeMiddleware(classify, next, req) {
183
+ const input = await classify(req);
184
+ return guard.guardToolCall(input, () => next(req));
185
+ };
186
+ }
187
+ //# sourceMappingURL=guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export { createGuard, guardToolCall, createGuardMiddleware, GrindFreeGuard } from "./guard.js";
2
+ export type { GuardOptions, GuardedResult, ToolCallInput, CommandInput, SqlInput, PromptInput, CrawlInput, MemoryInput, OutputInput, DocumentInput, ReadInput, SafeReadResult, } from "./guard.js";
3
+ export { createPaidFetch, postJson, readPrivateKey } from "./client.js";
4
+ export type { ClientOptions, PaidFetch } from "./client.js";
5
+ export { normalizeDecision, enforce, enforceError } from "./decisions.js";
6
+ export type { Verdict, ReviewMode, ErrorMode, NormalizedDecision, EnforceOptions } from "./decisions.js";
7
+ export { GuardConfigError, GuardError, GuardDenied, GuardReviewRequired } from "./errors.js";
8
+ export { SERVICES, NETWORK, PAY_TO, serviceUrl } from "./services.js";
9
+ export type { ServiceName, ServiceSpec, EndpointSpec } from "./services.js";
10
+ export { wrapMcpClient } from "./wrap-mcp.js";
11
+ export type { WrapMcpOptions } from "./wrap-mcp.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC/F,YAAY,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,UAAU,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,SAAS,EACT,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACxE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1E,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACzG,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACtE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { createGuard, guardToolCall, createGuardMiddleware, GrindFreeGuard } from "./guard.js";
2
+ export { createPaidFetch, postJson, readPrivateKey } from "./client.js";
3
+ export { normalizeDecision, enforce, enforceError } from "./decisions.js";
4
+ export { GuardConfigError, GuardError, GuardDenied, GuardReviewRequired } from "./errors.js";
5
+ export { SERVICES, NETWORK, PAY_TO, serviceUrl } from "./services.js";
6
+ export { wrapMcpClient } from "./wrap-mcp.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAe/F,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE1E,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,96 @@
1
+ /** Live GrindFree x402 origins, prices, and paths. USDC on Base. */
2
+ export declare const NETWORK: "eip155:8453";
3
+ export declare const PAY_TO: "0xe4b5827994B7B3Cd38F9830d9ECF58b51B77721b";
4
+ export type ServiceName = "promptshield" | "crawlsafe" | "toolguard" | "commandguard" | "memoryguard" | "wireshield" | "docshield" | "saferead";
5
+ export interface EndpointSpec {
6
+ path: string;
7
+ priceUsdc: string;
8
+ }
9
+ export interface ServiceSpec {
10
+ origin: string;
11
+ endpoints: Record<string, EndpointSpec>;
12
+ }
13
+ export declare const SERVICES: {
14
+ readonly promptshield: {
15
+ readonly origin: "https://promptshield.grindfree.net";
16
+ readonly endpoints: {
17
+ readonly screen: {
18
+ readonly path: "/v1/screen";
19
+ readonly priceUsdc: "0.002";
20
+ };
21
+ readonly clean: {
22
+ readonly path: "/v1/clean";
23
+ readonly priceUsdc: "0.002";
24
+ };
25
+ };
26
+ };
27
+ readonly crawlsafe: {
28
+ readonly origin: "https://crawlsafe.grindfree.net";
29
+ readonly endpoints: {
30
+ readonly check: {
31
+ readonly path: "/v1/check";
32
+ readonly priceUsdc: "0.002";
33
+ };
34
+ };
35
+ };
36
+ readonly toolguard: {
37
+ readonly origin: "https://toolguard.grindfree.net";
38
+ readonly endpoints: {
39
+ readonly evaluate: {
40
+ readonly path: "/v1/evaluate";
41
+ readonly priceUsdc: "0.002";
42
+ };
43
+ };
44
+ };
45
+ readonly commandguard: {
46
+ readonly origin: "https://commandguard.grindfree.net";
47
+ readonly endpoints: {
48
+ readonly command: {
49
+ readonly path: "/v1/command";
50
+ readonly priceUsdc: "0.001";
51
+ };
52
+ readonly sql: {
53
+ readonly path: "/v1/sql";
54
+ readonly priceUsdc: "0.001";
55
+ };
56
+ };
57
+ };
58
+ readonly memoryguard: {
59
+ readonly origin: "https://memoryguard.grindfree.net";
60
+ readonly endpoints: {
61
+ readonly screen: {
62
+ readonly path: "/v1/screen";
63
+ readonly priceUsdc: "0.002";
64
+ };
65
+ };
66
+ };
67
+ readonly wireshield: {
68
+ readonly origin: "https://wireshield.grindfree.net";
69
+ readonly endpoints: {
70
+ readonly scan: {
71
+ readonly path: "/v1/scan";
72
+ readonly priceUsdc: "0.002";
73
+ };
74
+ };
75
+ };
76
+ readonly docshield: {
77
+ readonly origin: "https://docshield.grindfree.net";
78
+ readonly endpoints: {
79
+ readonly scan: {
80
+ readonly path: "/v1/scan";
81
+ readonly priceUsdc: "0.004";
82
+ };
83
+ };
84
+ };
85
+ readonly saferead: {
86
+ readonly origin: "https://saferead.grindfree.net";
87
+ readonly endpoints: {
88
+ readonly read: {
89
+ readonly path: "/v1/read";
90
+ readonly priceUsdc: "0.003";
91
+ };
92
+ };
93
+ };
94
+ };
95
+ export declare function serviceUrl(service: ServiceName, endpoint: string): string;
96
+ //# sourceMappingURL=services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,eAAO,MAAM,OAAO,EAAG,aAAsB,CAAC;AAC9C,eAAO,MAAM,MAAM,EAAG,4CAAqD,CAAC;AAE5E,MAAM,MAAM,WAAW,GACnB,cAAc,GACd,WAAW,GACX,WAAW,GACX,cAAc,GACd,aAAa,GACb,YAAY,GACZ,WAAW,GACX,UAAU,CAAC;AAEf,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACzC;AAED,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDgC,CAAC;AAEtD,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKzE"}
@@ -0,0 +1,63 @@
1
+ /** Live GrindFree x402 origins, prices, and paths. USDC on Base. */
2
+ export const NETWORK = "eip155:8453";
3
+ export const PAY_TO = "0xe4b5827994B7B3Cd38F9830d9ECF58b51B77721b";
4
+ export const SERVICES = {
5
+ promptshield: {
6
+ origin: "https://promptshield.grindfree.net",
7
+ endpoints: {
8
+ screen: { path: "/v1/screen", priceUsdc: "0.002" },
9
+ clean: { path: "/v1/clean", priceUsdc: "0.002" },
10
+ },
11
+ },
12
+ crawlsafe: {
13
+ origin: "https://crawlsafe.grindfree.net",
14
+ endpoints: {
15
+ check: { path: "/v1/check", priceUsdc: "0.002" },
16
+ },
17
+ },
18
+ toolguard: {
19
+ origin: "https://toolguard.grindfree.net",
20
+ endpoints: {
21
+ evaluate: { path: "/v1/evaluate", priceUsdc: "0.002" },
22
+ },
23
+ },
24
+ commandguard: {
25
+ origin: "https://commandguard.grindfree.net",
26
+ endpoints: {
27
+ command: { path: "/v1/command", priceUsdc: "0.001" },
28
+ sql: { path: "/v1/sql", priceUsdc: "0.001" },
29
+ },
30
+ },
31
+ memoryguard: {
32
+ origin: "https://memoryguard.grindfree.net",
33
+ endpoints: {
34
+ screen: { path: "/v1/screen", priceUsdc: "0.002" },
35
+ },
36
+ },
37
+ wireshield: {
38
+ origin: "https://wireshield.grindfree.net",
39
+ endpoints: {
40
+ scan: { path: "/v1/scan", priceUsdc: "0.002" },
41
+ },
42
+ },
43
+ docshield: {
44
+ origin: "https://docshield.grindfree.net",
45
+ endpoints: {
46
+ scan: { path: "/v1/scan", priceUsdc: "0.004" },
47
+ },
48
+ },
49
+ saferead: {
50
+ origin: "https://saferead.grindfree.net",
51
+ endpoints: {
52
+ read: { path: "/v1/read", priceUsdc: "0.003" },
53
+ },
54
+ },
55
+ };
56
+ export function serviceUrl(service, endpoint) {
57
+ const spec = SERVICES[service];
58
+ const ep = spec.endpoints[endpoint];
59
+ if (!ep)
60
+ throw new Error(`Unknown endpoint ${service} ${endpoint}`);
61
+ return `${spec.origin}${ep.path}`;
62
+ }
63
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,MAAM,CAAC,MAAM,OAAO,GAAG,aAAsB,CAAC;AAC9C,MAAM,CAAC,MAAM,MAAM,GAAG,4CAAqD,CAAC;AAsB5E,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,YAAY,EAAE;QACZ,MAAM,EAAE,oCAAoC;QAC5C,SAAS,EAAE;YACT,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE;YAClD,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE;SACjD;KACF;IACD,SAAS,EAAE;QACT,MAAM,EAAE,iCAAiC;QACzC,SAAS,EAAE;YACT,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE;SACjD;KACF;IACD,SAAS,EAAE;QACT,MAAM,EAAE,iCAAiC;QACzC,SAAS,EAAE;YACT,QAAQ,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,EAAE;SACvD;KACF;IACD,YAAY,EAAE;QACZ,MAAM,EAAE,oCAAoC;QAC5C,SAAS,EAAE;YACT,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE;YACpD,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE;SAC7C;KACF;IACD,WAAW,EAAE;QACX,MAAM,EAAE,mCAAmC;QAC3C,SAAS,EAAE;YACT,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE;SACnD;KACF;IACD,UAAU,EAAE;QACV,MAAM,EAAE,kCAAkC;QAC1C,SAAS,EAAE;YACT,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE;SAC/C;KACF;IACD,SAAS,EAAE;QACT,MAAM,EAAE,iCAAiC;QACzC,SAAS,EAAE;YACT,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE;SAC/C;KACF;IACD,QAAQ,EAAE;QACR,MAAM,EAAE,gCAAgC;QACxC,SAAS,EAAE;YACT,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE;SAC/C;KACF;CACkD,CAAC;AAEtD,MAAM,UAAU,UAAU,CAAC,OAAoB,EAAE,QAAgB;IAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAgB,CAAC;IAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,IAAI,QAAQ,EAAE,CAAC,CAAC;IACpE,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * MCP client wrapper: evaluate ToolGuard before client.callTool, and
3
+ * CommandGuard when the tool looks like a shell/SQL execution.
4
+ *
5
+ * No MCP SDK dependency. Pass any client with callTool().
6
+ * export X402_PRIVATE_KEY=0xYOUR_BASE_USDC_PRIVATE_KEY
7
+ */
8
+ import { type GrindFreeGuard } from "./guard.js";
9
+ export type WrapMcpOptions = {
10
+ guard?: GrindFreeGuard;
11
+ /** Tool names treated as shell execution (CommandGuard). */
12
+ commandTools?: string[];
13
+ /** Tool names treated as SQL execution (CommandGuard /v1/sql). */
14
+ sqlTools?: string[];
15
+ policy?: Record<string, unknown>;
16
+ };
17
+ /**
18
+ * Wrap an MCP client so every callTool is screened first. The original
19
+ * client is returned for chaining; callTool is replaced in place.
20
+ */
21
+ export declare function wrapMcpClient<T extends {
22
+ callTool: (...args: any[]) => any;
23
+ }>(client: T, opts?: WrapMcpOptions): T;
24
+ //# sourceMappingURL=wrap-mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-mcp.d.ts","sourceRoot":"","sources":["../src/wrap-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAG9D,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAcF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,GAAE,cAAmB,GAAG,CAAC,CA8BtH"}