@adtl/gateway 0.1.0 → 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.
Files changed (49) hide show
  1. package/README.md +48 -4
  2. package/dist/approvals.d.ts +97 -0
  3. package/dist/approvals.d.ts.map +1 -0
  4. package/dist/approvals.js +151 -0
  5. package/dist/approvals.js.map +1 -0
  6. package/dist/audit.d.ts +10 -0
  7. package/dist/audit.d.ts.map +1 -1
  8. package/dist/audit.js.map +1 -1
  9. package/dist/cli.js +8 -2
  10. package/dist/cli.js.map +1 -1
  11. package/dist/config.d.ts +352 -2
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +69 -2
  14. package/dist/config.js.map +1 -1
  15. package/dist/email.d.ts +35 -0
  16. package/dist/email.d.ts.map +1 -0
  17. package/dist/email.js +63 -0
  18. package/dist/email.js.map +1 -0
  19. package/dist/gateway.d.ts +12 -2
  20. package/dist/gateway.d.ts.map +1 -1
  21. package/dist/gateway.js +91 -11
  22. package/dist/gateway.js.map +1 -1
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +3 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/invoker.d.ts +10 -1
  28. package/dist/invoker.d.ts.map +1 -1
  29. package/dist/invoker.js +15 -6
  30. package/dist/invoker.js.map +1 -1
  31. package/dist/ntfy.d.ts +44 -0
  32. package/dist/ntfy.d.ts.map +1 -0
  33. package/dist/ntfy.js +133 -0
  34. package/dist/ntfy.js.map +1 -0
  35. package/dist/startup.d.ts +3 -0
  36. package/dist/startup.d.ts.map +1 -1
  37. package/dist/startup.js +39 -4
  38. package/dist/startup.js.map +1 -1
  39. package/package.json +4 -3
  40. package/src/approvals.ts +219 -0
  41. package/src/audit.ts +5 -0
  42. package/src/cli.ts +15 -4
  43. package/src/config.ts +71 -2
  44. package/src/email.ts +79 -0
  45. package/src/gateway.ts +103 -11
  46. package/src/index.ts +3 -0
  47. package/src/invoker.ts +17 -5
  48. package/src/ntfy.ts +154 -0
  49. package/src/startup.ts +36 -3
package/dist/gateway.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  import type { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
2
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
3
  import { type CallToolResult, type Tool } from "@modelcontextprotocol/sdk/types.js";
4
+ import type { ApprovalBroker } from "./approvals.js";
4
5
  import type { AuditSink } from "./audit.js";
5
6
  import type { InterceptorInvoker } from "./invoker.js";
6
- export declare const GATEWAY_VERSION = "0.1.0";
7
+ export declare const GATEWAY_VERSION = "0.2.0";
7
8
  /** `_meta` key on gateway-generated error results describing why a call was stopped. */
8
9
  export declare const GATEWAY_DECISION_KEY = "adtl/gateway";
9
10
  export interface GatewayLogger {
@@ -17,6 +18,12 @@ export interface AdtlGatewayOptions {
17
18
  sessionId?: string;
18
19
  audit?: AuditSink;
19
20
  logger?: GatewayLogger;
21
+ /** Asks humans about "ask" decisions and sends notices. */
22
+ approvals?: ApprovalBroker;
23
+ }
24
+ export interface CallOptions {
25
+ /** Report progress to the client while a call waits for approval. */
26
+ progress?: (progress: number, message: string) => Promise<void>;
20
27
  }
21
28
  export declare class AdtlGateway {
22
29
  readonly sessionId: string;
@@ -24,11 +31,14 @@ export declare class AdtlGateway {
24
31
  private readonly invoker;
25
32
  private readonly audit;
26
33
  private readonly log;
34
+ private readonly approvals;
27
35
  private routes;
28
36
  constructor(opts: AdtlGatewayOptions);
29
37
  /** The downstream MCP server the agent connects to. */
30
38
  createServer(): Server;
31
39
  listTools(): Promise<Tool[]>;
32
- callTool(name: string, args: Record<string, unknown>): Promise<CallToolResult>;
40
+ callTool(name: string, args: Record<string, unknown>, opts?: CallOptions): Promise<CallToolResult>;
41
+ /** Run an approval request, reporting progress to the client while it waits. */
42
+ private waitForApproval;
33
43
  }
34
44
  //# sourceMappingURL=gateway.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,IAAI,EACV,MAAM,oCAAoC,CAAC;AAE5C,OAAO,KAAK,EAAc,SAAS,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,KAAK,EAAyB,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE9E,eAAO,MAAM,eAAe,UAAU,CAAC;AAEvC,wFAAwF;AACxF,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AAQnD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAOD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAoBD,qBAAa,WAAW;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAC9C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,MAAM,CAA4B;gBAE9B,IAAI,EAAE,kBAAkB;IAQpC,uDAAuD;IACvD,YAAY,IAAI,MAAM;IAehB,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAuB5B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;CAoErF"}
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,IAAI,EACV,MAAM,oCAAoC,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,gBAAgB,CAAC;AACrE,OAAO,KAAK,EAAc,SAAS,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,KAAK,EAAyB,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE9E,eAAO,MAAM,eAAe,UAAU,CAAC;AAEvC,wFAAwF;AACxF,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AAQnD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAOD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAmCD,qBAAa,WAAW;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAC9C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,MAAM,CAA4B;gBAE9B,IAAI,EAAE,kBAAkB;IASpC,uDAAuD;IACvD,YAAY,IAAI,MAAM;IAuBhB,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAuB5B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IA2G5G,gFAAgF;YAClE,eAAe;CAY9B"}
package/dist/gateway.js CHANGED
@@ -7,30 +7,50 @@
7
7
  * interceptors (adtl.label) → agent
8
8
  *
9
9
  * When a call is stopped, the agent receives a normal tool result with
10
- * `isError: true` explaining why, so the model can tell the user. In v0.1 an
11
- * "ask" decision is treated as a block; approvals arrive in v0.2.
10
+ * `isError: true` explaining why, so the model can tell the user.
11
+ *
12
+ * An "ask" decision holds the call and asks a human through the approval
13
+ * broker (e.g. a phone notification). Approved calls run; denied, unanswered
14
+ * or undeliverable ones are stopped. Without an approval channel, "ask" blocks.
15
+ *
16
+ * In audit mode (the invoker runs every interceptor with `mode: "audit"`)
17
+ * nothing is stopped or changed: calls the policy would stop are forwarded,
18
+ * and the audit log records what would have happened.
12
19
  */
13
20
  import { randomUUID } from "node:crypto";
14
21
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
15
22
  import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
16
23
  import { TOOL_SEPARATOR } from "./config.js";
17
- export const GATEWAY_VERSION = "0.1.0";
24
+ export const GATEWAY_VERSION = "0.2.0";
18
25
  /** `_meta` key on gateway-generated error results describing why a call was stopped. */
19
26
  export const GATEWAY_DECISION_KEY = "adtl/gateway";
20
27
  const stderrLogger = {
21
28
  info: (m) => console.error(`[adtl-gateway] ${m}`),
22
29
  warn: (m) => console.error(`[adtl-gateway] warning: ${m}`),
23
30
  };
31
+ /** How often a waiting call reports progress, so clients that reset their timeout on progress keep waiting. */
32
+ const PROGRESS_INTERVAL_MS = 10_000;
24
33
  function textError(text, meta) {
25
34
  return { content: [{ type: "text", text }], isError: true, _meta: { [GATEWAY_DECISION_KEY]: meta } };
26
35
  }
27
36
  function blockedMessage(b) {
28
37
  if (b.decision === "ask") {
29
38
  return (`ADTL stopped this call because it needs a human's approval: ${b.reason}. ` +
30
- `This version of ADTL cannot ask for approval yet, so the call was not run. Tell the user what you were trying to do.`);
39
+ `No approval channel is configured, so the call was not run. Tell the user what you were trying to do.`);
31
40
  }
32
41
  return `ADTL blocked this call: ${b.reason}. The call was not run.`;
33
42
  }
43
+ function approvalMessage(b, a) {
44
+ const why = `ADTL asked a human to approve this call because: ${b.reason}.`;
45
+ switch (a.outcome) {
46
+ case "denied":
47
+ return `${why} The request was denied, so the call was not run. Do not retry it; tell the user what you were trying to do.`;
48
+ case "timeout":
49
+ return `${why} Nobody answered in time, so the call was not run. Tell the user, who can approve it if you try again.`;
50
+ default:
51
+ return `${why} ADTL could not reach anyone to approve it, so the call was not run. Tell the user what you were trying to do.`;
52
+ }
53
+ }
34
54
  function infoOf(outcome, interceptor) {
35
55
  return outcome.results.find((r) => r.interceptor === interceptor)?.info ?? {};
36
56
  }
@@ -40,6 +60,7 @@ export class AdtlGateway {
40
60
  invoker;
41
61
  audit;
42
62
  log;
63
+ approvals;
43
64
  routes = new Map();
44
65
  constructor(opts) {
45
66
  this.upstreams = opts.upstreams;
@@ -47,6 +68,7 @@ export class AdtlGateway {
47
68
  this.sessionId = opts.sessionId ?? randomUUID();
48
69
  this.audit = opts.audit;
49
70
  this.log = opts.logger ?? stderrLogger;
71
+ this.approvals = opts.approvals;
50
72
  }
51
73
  /** The downstream MCP server the agent connects to. */
52
74
  createServer() {
@@ -56,7 +78,13 @@ export class AdtlGateway {
56
78
  "if a call is stopped, the result explains why.",
57
79
  });
58
80
  server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: await this.listTools() }));
59
- server.setRequestHandler(CallToolRequestSchema, async (req) => this.callTool(req.params.name, req.params.arguments ?? {}));
81
+ server.setRequestHandler(CallToolRequestSchema, async (req, extra) => {
82
+ const progressToken = req.params._meta?.progressToken;
83
+ const progress = progressToken === undefined
84
+ ? undefined
85
+ : (progress, message) => extra.sendNotification({ method: "notifications/progress", params: { progressToken, progress, message } });
86
+ return this.callTool(req.params.name, req.params.arguments ?? {}, progress ? { progress } : {});
87
+ });
60
88
  return server;
61
89
  }
62
90
  async listTools() {
@@ -82,7 +110,7 @@ export class AdtlGateway {
82
110
  this.routes = routes;
83
111
  return tools;
84
112
  }
85
- async callTool(name, args) {
113
+ async callTool(name, args, opts = {}) {
86
114
  const started = performance.now();
87
115
  let route = this.routes.get(name);
88
116
  if (!route) {
@@ -107,12 +135,45 @@ export class AdtlGateway {
107
135
  const requestPayload = { method: "tools/call", params: { name: route.tool, arguments: args } };
108
136
  const req = await this.invoker.runRequest({ event: "tools/call", payload: requestPayload, config, context });
109
137
  const policy = infoOf(req, "adtl.policy");
138
+ let approval;
110
139
  if (req.blocked) {
111
- finish({ outcome: "blocked", decision: req.blocked.decision, reason: req.blocked.reason, matched: policy.matched, callHash: policy.callHash, sessionLabel: policy.sessionLabel, warnings: req.warnings });
112
- this.log.info(`${req.blocked.decision} ${name}: ${req.blocked.reason}`);
113
- return textError(blockedMessage(req.blocked), { ...req.blocked, callHash: policy.callHash });
140
+ const b = req.blocked;
141
+ const stopped = { decision: b.decision, reason: b.reason, matched: policy.matched, callHash: policy.callHash, sessionLabel: policy.sessionLabel };
142
+ const matched = Array.isArray(policy.matched) ? policy.matched : [];
143
+ if (b.decision === "ask" && this.approvals?.canApprove && typeof policy.callHash === "string") {
144
+ this.log.info(`ask ${name}: waiting for approval (${b.reason})`);
145
+ approval = await this.waitForApproval(opts, () => this.approvals.request({
146
+ sessionId: this.sessionId,
147
+ server: route.upstream,
148
+ tool: route.tool,
149
+ callHash: policy.callHash,
150
+ reason: b.reason,
151
+ matched,
152
+ ...(policy.sessionLabel !== undefined ? { sessionLabel: policy.sessionLabel } : {}),
153
+ }));
154
+ this.log.info(`ask ${name}: ${approval.outcome}`);
155
+ if (approval.outcome !== "approved") {
156
+ finish({ outcome: "blocked", ...stopped, approval, warnings: req.warnings });
157
+ return textError(approvalMessage(b, approval), { ...b, callHash: policy.callHash, approval });
158
+ }
159
+ }
160
+ else {
161
+ finish({ outcome: "blocked", ...stopped, warnings: req.warnings });
162
+ this.log.info(`${b.decision} ${name}: ${b.reason}`);
163
+ this.approvals?.blocked({ sessionId: this.sessionId, server: route.upstream, tool: route.tool, reason: b.reason, matched });
164
+ return textError(blockedMessage(b), { ...b, callHash: policy.callHash });
165
+ }
114
166
  }
115
167
  const forwarded = req.payload.params;
168
+ const decision = policy["adtl/decision"];
169
+ const approved = approval ? { approval } : {};
170
+ const audit = this.invoker.modeOverride === "audit";
171
+ // Only set in audit mode, for calls the policy would have stopped.
172
+ const wouldStop = audit && decision !== undefined && decision !== "allow"
173
+ ? { reason: policy.reason, matched: policy.matched }
174
+ : undefined;
175
+ if (wouldStop)
176
+ this.log.info(`audit: would ${decision} ${name}: ${wouldStop.reason}`);
116
177
  // 2. Forward to the upstream server.
117
178
  let result;
118
179
  try {
@@ -120,7 +181,7 @@ export class AdtlGateway {
120
181
  }
121
182
  catch (err) {
122
183
  const reason = err.message;
123
- finish({ outcome: "upstream_error", decision: "allow", reason, callHash: policy.callHash, warnings: req.warnings });
184
+ finish({ outcome: "upstream_error", ...(decision ? { decision } : {}), ...approved, reason, callHash: policy.callHash, ...(audit ? { mode: "audit" } : {}), warnings: req.warnings });
124
185
  return textError(`The ${route.upstream} server returned an error: ${reason}`, { reason: "upstream_error" });
125
186
  }
126
187
  // 3. Response phase: adtl.label labels the result and records it in the session.
@@ -139,7 +200,11 @@ export class AdtlGateway {
139
200
  const label = infoOf(res, "adtl.label");
140
201
  finish({
141
202
  outcome: "forwarded",
142
- decision: policy["adtl/decision"] ?? "allow",
203
+ // Missing only if adtl.policy failed and was allowed to (audit mode); see warnings.
204
+ ...(decision ? { decision } : {}),
205
+ ...(wouldStop ?? {}),
206
+ ...approved,
207
+ ...(audit ? { mode: "audit" } : {}),
143
208
  callHash: policy.callHash,
144
209
  label: label.label,
145
210
  sessionLabel: label.sessionLabel,
@@ -147,5 +212,20 @@ export class AdtlGateway {
147
212
  });
148
213
  return res.payload.result;
149
214
  }
215
+ /** Run an approval request, reporting progress to the client while it waits. */
216
+ async waitForApproval(opts, ask) {
217
+ if (!opts.progress)
218
+ return ask();
219
+ let n = 0;
220
+ const report = () => void opts.progress(++n, "Waiting for a human to approve this call").catch(() => undefined);
221
+ report();
222
+ const timer = setInterval(report, PROGRESS_INTERVAL_MS);
223
+ try {
224
+ return await ask();
225
+ }
226
+ finally {
227
+ clearInterval(timer);
228
+ }
229
+ }
150
230
  }
151
231
  //# sourceMappingURL=gateway.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  export * from "./config.js";
2
2
  export * from "./invoker.js";
3
3
  export * from "./audit.js";
4
+ export * from "./approvals.js";
5
+ export * from "./ntfy.js";
6
+ export * from "./email.js";
4
7
  export * from "./gateway.js";
5
8
  export * from "./startup.js";
6
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,9 @@
1
1
  export * from "./config.js";
2
2
  export * from "./invoker.js";
3
3
  export * from "./audit.js";
4
+ export * from "./approvals.js";
5
+ export * from "./ntfy.js";
6
+ export * from "./email.js";
4
7
  export * from "./gateway.js";
5
8
  export * from "./startup.js";
6
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
package/dist/invoker.d.ts CHANGED
@@ -9,10 +9,14 @@
9
9
  * Only `severity: "error"` blocks. Audit-mode interceptors never block, and
10
10
  * their mutations are not applied. An interceptor that fails (error or
11
11
  * timeout) blocks the message unless it declares `failOpen: true`.
12
+ *
13
+ * The invoker may override every interceptor's `mode`, as SEP-2624 allows
14
+ * (e.g. audit in staging, active in production).
12
15
  */
13
16
  import type { Client } from "@modelcontextprotocol/sdk/client/index.js";
14
17
  import { type InterceptorDefinition, type InterceptorResult, type InvocationContext } from "@adtl/interceptors";
15
18
  import type { Decision } from "@adtl/labels";
19
+ export type InterceptorMode = NonNullable<InterceptorDefinition["mode"]>;
16
20
  export interface BoundInterceptor {
17
21
  client: Client;
18
22
  definition: InterceptorDefinition;
@@ -38,12 +42,17 @@ export interface InvokeOptions {
38
42
  export declare class InterceptorInvoker {
39
43
  private readonly interceptors;
40
44
  private readonly timeoutMs;
41
- constructor(interceptors: BoundInterceptor[], timeoutMs?: number);
45
+ /** Overrides the mode every interceptor declares. */
46
+ readonly modeOverride?: InterceptorMode | undefined;
47
+ constructor(interceptors: BoundInterceptor[], timeoutMs?: number,
48
+ /** Overrides the mode every interceptor declares. */
49
+ modeOverride?: InterceptorMode | undefined);
42
50
  /** Discover the interceptors an interceptor server offers. */
43
51
  static discover(client: Client): Promise<BoundInterceptor[]>;
44
52
  get definitions(): InterceptorDefinition[];
45
53
  runRequest(opts: InvokeOptions): Promise<ChainOutcome>;
46
54
  runResponse(opts: InvokeOptions): Promise<ChainOutcome>;
55
+ private isAudit;
47
56
  private select;
48
57
  private invoke;
49
58
  /** Handle an interceptor failure. Returns false if the chain must stop. */
@@ -1 +1 @@
1
- {"version":3,"file":"invoker.d.ts","sourceRoot":"","sources":["../src/invoker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,EAIL,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EAIvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAa7C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,qBAAqB,CAAC;CACnC;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAaD,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,YAAY,EAAE,gBAAgB,EAAE,EAChC,SAAS,SAAO;IAGnC,8DAA8D;WACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAMlE,IAAI,WAAW,IAAI,qBAAqB,EAAE,CAEzC;IAEK,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAOtD,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAO7D,OAAO,CAAC,MAAM;YAIA,MAAM;IAUpB,2EAA2E;IAC3E,OAAO,CAAC,MAAM;IAUd,6EAA6E;YAC/D,MAAM;IAoBpB,0DAA0D;YAC5C,QAAQ;CAsBvB"}
1
+ {"version":3,"file":"invoker.d.ts","sourceRoot":"","sources":["../src/invoker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,EAIL,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EAIvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAa7C,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,qBAAqB,CAAC;CACnC;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAaD,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,qDAAqD;IACrD,QAAQ,CAAC,YAAY,CAAC,EAAE,eAAe;gBAHtB,YAAY,EAAE,gBAAgB,EAAE,EAChC,SAAS,SAAO;IACjC,qDAAqD;IAC5C,YAAY,CAAC,EAAE,eAAe,YAAA;IAGzC,8DAA8D;WACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAMlE,IAAI,WAAW,IAAI,qBAAqB,EAAE,CAEzC;IAEK,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAOtD,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAO7D,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,MAAM;YAIA,MAAM;IAUpB,2EAA2E;IAC3E,OAAO,CAAC,MAAM;IAUd,6EAA6E;YAC/D,MAAM;IAoBpB,0DAA0D;YAC5C,QAAQ;CAuBvB"}
package/dist/invoker.js CHANGED
@@ -20,9 +20,13 @@ function hooks(def, event, phase) {
20
20
  export class InterceptorInvoker {
21
21
  interceptors;
22
22
  timeoutMs;
23
- constructor(interceptors, timeoutMs = 5000) {
23
+ modeOverride;
24
+ constructor(interceptors, timeoutMs = 5000,
25
+ /** Overrides the mode every interceptor declares. */
26
+ modeOverride) {
24
27
  this.interceptors = interceptors;
25
28
  this.timeoutMs = timeoutMs;
29
+ this.modeOverride = modeOverride;
26
30
  }
27
31
  /** Discover the interceptors an interceptor server offers. */
28
32
  static async discover(client) {
@@ -47,6 +51,9 @@ export class InterceptorInvoker {
47
51
  await this.mutate("response", opts, out);
48
52
  return out;
49
53
  }
54
+ isAudit(i) {
55
+ return (this.modeOverride ?? i.definition.mode) === "audit";
56
+ }
50
57
  select(type, event, phase) {
51
58
  return this.interceptors.filter((i) => i.definition.type === type && hooks(i.definition, event, phase));
52
59
  }
@@ -57,7 +64,7 @@ export class InterceptorInvoker {
57
64
  /** Handle an interceptor failure. Returns false if the chain must stop. */
58
65
  failed(i, err, out) {
59
66
  const msg = `${i.definition.name} failed: ${err instanceof Error ? err.message : String(err)}`;
60
- if (i.definition.mode === "audit" || i.definition.failOpen === true) {
67
+ if (this.isAudit(i) || i.definition.failOpen === true) {
61
68
  out.warnings.push(msg);
62
69
  return true;
63
70
  }
@@ -79,7 +86,7 @@ export class InterceptorInvoker {
79
86
  continue;
80
87
  }
81
88
  out.results.push(r);
82
- if (i.definition.mode !== "audit" && r.modified)
89
+ if (!this.isAudit(i) && r.modified)
83
90
  payload = r.payload;
84
91
  }
85
92
  out.payload = payload;
@@ -99,12 +106,14 @@ export class InterceptorInvoker {
99
106
  }
100
107
  const r = s.value;
101
108
  out.results.push(r);
102
- if (r.valid || r.severity !== "error" || i.definition.mode === "audit")
109
+ if (r.valid || r.severity !== "error" || this.isAudit(i))
103
110
  return;
104
- if (!out.blocked) {
111
+ // Keep the strictest rejection, so an "ask" never hides another validator's "block".
112
+ if (!out.blocked || out.blocked.decision === "ask") {
105
113
  const decision = r.info?.[DECISION_INFO_KEY] ?? "block";
106
114
  const reason = r.messages?.map((m) => m.message).join("; ") || `${i.definition.name} rejected the call`;
107
- out.blocked = { interceptor: i.definition.name, decision, reason };
115
+ if (!out.blocked || decision === "block")
116
+ out.blocked = { interceptor: i.definition.name, decision, reason };
108
117
  }
109
118
  ok = false;
110
119
  });
@@ -1 +1 @@
1
- {"version":3,"file":"invoker.js","sourceRoot":"","sources":["../src/invoker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"invoker.js","sourceRoot":"","sources":["../src/invoker.ts"],"names":[],"mappings":"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"}
package/dist/ntfy.d.ts ADDED
@@ -0,0 +1,44 @@
1
+ /**
2
+ * ntfy (https://ntfy.sh) push notifications with Allow / Deny buttons.
3
+ *
4
+ * The buttons make the phone POST a signed answer token to a reply topic on
5
+ * the same ntfy server, and the gateway subscribes to that topic. So answers
6
+ * reach the gateway without it ever accepting inbound connections.
7
+ *
8
+ * Messages name the tool, server and reason, never arguments or results.
9
+ * Anyone who can read the topic can press the buttons, so use a long random
10
+ * topic name or an access-controlled topic on your own server.
11
+ */
12
+ import type { AnswerFn, ApprovalEvent, ApprovalRequest, Notifier } from "./approvals.js";
13
+ export interface NtfyOptions {
14
+ /** Server base URL, e.g. https://ntfy.sh */
15
+ server: string;
16
+ topic: string;
17
+ /** Topic answers are posted to. Default: `<topic>-reply`. */
18
+ replyTopic?: string;
19
+ /** Access token for protected topics. */
20
+ token?: string;
21
+ fetch?: typeof fetch;
22
+ /** Delay before re-subscribing after the stream drops, and the base delay between publish retries. */
23
+ reconnectMs?: number;
24
+ /** Publish attempts before giving up (network errors, 429 and 5xx are retried). */
25
+ publishAttempts?: number;
26
+ }
27
+ export declare class NtfyNotifier implements Notifier {
28
+ readonly name = "ntfy";
29
+ private readonly server;
30
+ private readonly topic;
31
+ private readonly replyTopic;
32
+ private readonly token;
33
+ private readonly fetch;
34
+ private readonly reconnectMs;
35
+ private readonly publishAttempts;
36
+ constructor(opts: NtfyOptions);
37
+ private get auth();
38
+ notify(event: ApprovalEvent): Promise<void>;
39
+ /** POST with retries: flaky networks should not turn an approval request into a denial. */
40
+ private publish;
41
+ listen(request: ApprovalRequest, answer: AnswerFn, signal: AbortSignal): Promise<void>;
42
+ private read;
43
+ }
44
+ //# sourceMappingURL=ntfy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ntfy.d.ts","sourceRoot":"","sources":["../src/ntfy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEzF,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,sGAAsG;IACtG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAOD,qBAAa,YAAa,YAAW,QAAQ;IAC3C,QAAQ,CAAC,IAAI,UAAU;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAE7B,IAAI,EAAE,WAAW;IAU7B,OAAO,KAAK,IAAI,GAEf;IAEK,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCjD,2FAA2F;YAC7E,OAAO;IAgBf,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;YAkB9E,IAAI;CAoBnB"}
package/dist/ntfy.js ADDED
@@ -0,0 +1,133 @@
1
+ function describe(request) {
2
+ const secs = Math.max(0, Math.round((request.expiresAt.getTime() - request.createdAt.getTime()) / 1000));
3
+ return `${request.reason}\n\nRule: ${request.matched.join(", ") || "default"}\nExpires in ${secs}s; no answer means deny.`;
4
+ }
5
+ export class NtfyNotifier {
6
+ name = "ntfy";
7
+ server;
8
+ topic;
9
+ replyTopic;
10
+ token;
11
+ fetch;
12
+ reconnectMs;
13
+ publishAttempts;
14
+ constructor(opts) {
15
+ this.server = opts.server.replace(/\/+$/, "");
16
+ this.topic = opts.topic;
17
+ this.replyTopic = opts.replyTopic ?? `${opts.topic}-reply`;
18
+ this.token = opts.token;
19
+ this.fetch = opts.fetch ?? globalThis.fetch;
20
+ this.reconnectMs = opts.reconnectMs ?? 1000;
21
+ this.publishAttempts = opts.publishAttempts ?? 3;
22
+ }
23
+ get auth() {
24
+ return this.token ? { Authorization: `Bearer ${this.token}` } : {};
25
+ }
26
+ async notify(event) {
27
+ if (event.kind === "blocked")
28
+ return; // push is for decisions; email covers blocked notices
29
+ const { request } = event;
30
+ const subject = `${request.server}.${request.tool}`;
31
+ let message;
32
+ if (event.kind === "pending") {
33
+ const reply = `${this.server}/${encodeURIComponent(this.replyTopic)}`;
34
+ const button = (label, body) => ({
35
+ action: "http",
36
+ label,
37
+ url: reply,
38
+ method: "POST",
39
+ body,
40
+ clear: true,
41
+ ...(this.token ? { headers: this.auth } : {}),
42
+ });
43
+ message = {
44
+ title: `ADTL: allow ${subject}?`,
45
+ message: describe(request),
46
+ priority: 4,
47
+ tags: ["warning"],
48
+ actions: [button("Allow", event.tokens.allow), button("Deny", event.tokens.deny)],
49
+ };
50
+ }
51
+ else {
52
+ message = {
53
+ title: `ADTL: ${subject} ${event.result.outcome}`,
54
+ message: `Approval ${event.result.outcome} after ${Math.round(event.result.waitedMs / 1000)}s.`,
55
+ priority: 2,
56
+ tags: [event.result.outcome === "approved" ? "white_check_mark" : "x"],
57
+ };
58
+ }
59
+ await this.publish(JSON.stringify({ topic: this.topic, ...message }));
60
+ }
61
+ /** POST with retries: flaky networks should not turn an approval request into a denial. */
62
+ async publish(body) {
63
+ for (let attempt = 1;; attempt++) {
64
+ let res;
65
+ try {
66
+ res = await this.fetch(this.server, { method: "POST", headers: { "Content-Type": "application/json", ...this.auth }, body });
67
+ }
68
+ catch (err) {
69
+ if (attempt >= this.publishAttempts)
70
+ throw err;
71
+ }
72
+ if (res?.ok)
73
+ return;
74
+ if (res && ((res.status !== 429 && res.status < 500) || attempt >= this.publishAttempts)) {
75
+ throw new Error(`ntfy publish failed: HTTP ${res.status}`);
76
+ }
77
+ await new Promise((r) => setTimeout(r, this.reconnectMs * attempt));
78
+ }
79
+ }
80
+ async listen(request, answer, signal) {
81
+ // `since` replays anything posted after the request was created, so a fast
82
+ // answer is not lost while (re)connecting.
83
+ const since = Math.floor(request.createdAt.getTime() / 1000) - 1;
84
+ const url = `${this.server}/${encodeURIComponent(this.replyTopic)}/json?since=${since}`;
85
+ while (!signal.aborted) {
86
+ try {
87
+ const res = await this.fetch(url, { headers: this.auth, signal });
88
+ if (!res.ok || !res.body)
89
+ throw new Error(`ntfy subscribe failed: HTTP ${res.status}`);
90
+ await this.read(res.body, answer, signal);
91
+ }
92
+ catch (err) {
93
+ if (signal.aborted)
94
+ return;
95
+ if (err.message.includes("HTTP 401") || err.message.includes("HTTP 403"))
96
+ throw err;
97
+ }
98
+ if (!signal.aborted)
99
+ await sleep(this.reconnectMs, signal);
100
+ }
101
+ }
102
+ async read(body, answer, signal) {
103
+ const decoder = new TextDecoder();
104
+ let buf = "";
105
+ for await (const chunk of body) {
106
+ if (signal.aborted)
107
+ return;
108
+ buf += decoder.decode(chunk, { stream: true });
109
+ let nl;
110
+ while ((nl = buf.indexOf("\n")) >= 0) {
111
+ const line = buf.slice(0, nl).trim();
112
+ buf = buf.slice(nl + 1);
113
+ if (!line)
114
+ continue;
115
+ try {
116
+ const msg = JSON.parse(line);
117
+ if (msg.event === "message" && typeof msg.message === "string")
118
+ answer(msg.message);
119
+ }
120
+ catch {
121
+ // Not JSON: ignore.
122
+ }
123
+ }
124
+ }
125
+ }
126
+ }
127
+ function sleep(ms, signal) {
128
+ return new Promise((resolve) => {
129
+ const t = setTimeout(resolve, ms);
130
+ signal.addEventListener("abort", () => (clearTimeout(t), resolve()), { once: true });
131
+ });
132
+ }
133
+ //# sourceMappingURL=ntfy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ntfy.js","sourceRoot":"","sources":["../src/ntfy.ts"],"names":[],"mappings":"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"}