paygate-mcp 7.0.0 → 7.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.
- package/README.md +70 -0
- package/dist/audit.d.ts +1 -1
- package/dist/audit.d.ts.map +1 -1
- package/dist/audit.js.map +1 -1
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +302 -0
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -97,6 +97,8 @@ Agent → PayGate (auth + billing) → Your MCP Server (stdio or HTTP)
|
|
|
97
97
|
- **Maintenance Mode** — `POST /maintenance` enables/disables maintenance mode with custom message — `/mcp` returns 503 to clients while admin endpoints stay operational, `GET /maintenance` checks status, `GET /health` reflects maintenance state, full audit trail
|
|
98
98
|
- **Admin Event Stream** — `GET /admin/events` SSE endpoint streams real-time audit events to admin clients — tool calls, denials, key operations, maintenance changes, all with optional `?types=` filter for event type filtering, keepalive pings, multi-client support
|
|
99
99
|
- **Key Notes** — `POST /keys/notes` adds timestamped notes to API keys, `GET /keys/notes?key=...` lists notes, `DELETE /keys/notes?key=...&index=N` removes notes — max 50 per key, 1000 char limit, works on suspended/revoked keys, alias support, audit trail
|
|
100
|
+
- **Scheduled Actions** — `POST /keys/schedule` creates future-dated actions (revoke/suspend/topup) on API keys, `GET /keys/schedule` lists pending schedules with optional `?key=` filter, `DELETE /keys/schedule?id=...` cancels a schedule — max 20 per key, alias support, background execution timer, audit trail
|
|
101
|
+
- **Key Activity Timeline** — `GET /keys/activity?key=...` returns a unified chronological feed of audit events and usage events for a specific key — newest first, optional `?since=` and `?limit=` filters, alias support
|
|
100
102
|
- **Config Hot Reload** — `POST /config/reload` reloads pricing, rate limits, webhooks, quotas, and behavior flags from config file without server restart
|
|
101
103
|
- **Webhook Events** — POST batched usage events to any URL for external billing/alerting
|
|
102
104
|
- **Config File Mode** — Load all settings from a JSON file (`--config`)
|
|
@@ -1964,6 +1966,74 @@ curl -X DELETE "http://localhost:3402/keys/notes?key=pg_...&index=0" \
|
|
|
1964
1966
|
|
|
1965
1967
|
Max 50 notes per key, 1000 characters per note. Works on suspended and revoked keys. Supports aliases. All add/delete operations recorded in audit trail (`key.note_added` / `key.note_deleted`).
|
|
1966
1968
|
|
|
1969
|
+
### Scheduled Actions
|
|
1970
|
+
|
|
1971
|
+
Schedule future-dated actions on API keys — automatically revoke, suspend, or top up credits at a specified time:
|
|
1972
|
+
|
|
1973
|
+
```bash
|
|
1974
|
+
# Schedule a key revocation in 24 hours
|
|
1975
|
+
curl -X POST http://localhost:3402/keys/schedule \
|
|
1976
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
|
|
1977
|
+
-d '{"key": "pg_...", "action": "revoke", "executeAt": "2025-04-01T00:00:00Z"}'
|
|
1978
|
+
|
|
1979
|
+
# Schedule a credit top-up
|
|
1980
|
+
curl -X POST http://localhost:3402/keys/schedule \
|
|
1981
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
|
|
1982
|
+
-d '{"key": "pg_...", "action": "topup", "executeAt": "2025-04-01T00:00:00Z", "params": {"credits": 500}}'
|
|
1983
|
+
|
|
1984
|
+
# List all pending schedules (optional ?key= filter)
|
|
1985
|
+
curl "http://localhost:3402/keys/schedule" -H "X-Admin-Key: YOUR_ADMIN_KEY"
|
|
1986
|
+
|
|
1987
|
+
# Cancel a schedule
|
|
1988
|
+
curl -X DELETE "http://localhost:3402/keys/schedule?id=sched_1" \
|
|
1989
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY"
|
|
1990
|
+
```
|
|
1991
|
+
|
|
1992
|
+
**Response (create):**
|
|
1993
|
+
|
|
1994
|
+
```json
|
|
1995
|
+
{
|
|
1996
|
+
"id": "sched_1",
|
|
1997
|
+
"key": "pg_abc1...2345",
|
|
1998
|
+
"action": "revoke",
|
|
1999
|
+
"executeAt": "2025-04-01T00:00:00.000Z",
|
|
2000
|
+
"createdAt": "2025-03-15T10:30:00.000Z"
|
|
2001
|
+
}
|
|
2002
|
+
```
|
|
2003
|
+
|
|
2004
|
+
Supported actions: `revoke`, `suspend`, `topup` (requires `params.credits`). Max 20 schedules per key. Supports aliases. Background timer checks every 10 seconds. All create/execute/cancel operations recorded in audit trail (`schedule.created` / `schedule.executed` / `schedule.cancelled`).
|
|
2005
|
+
|
|
2006
|
+
### Key Activity Timeline
|
|
2007
|
+
|
|
2008
|
+
Get a unified chronological feed of all events for a specific key — audit events (creation, suspension, notes, etc.) and usage events (tool calls, denials) merged into one timeline:
|
|
2009
|
+
|
|
2010
|
+
```bash
|
|
2011
|
+
# Get activity for a key (newest first, default limit 50)
|
|
2012
|
+
curl "http://localhost:3402/keys/activity?key=pg_..." -H "X-Admin-Key: YOUR_ADMIN_KEY"
|
|
2013
|
+
|
|
2014
|
+
# With filters
|
|
2015
|
+
curl "http://localhost:3402/keys/activity?key=pg_...&limit=20&since=2025-03-15T00:00:00Z" \
|
|
2016
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY"
|
|
2017
|
+
```
|
|
2018
|
+
|
|
2019
|
+
**Response:**
|
|
2020
|
+
|
|
2021
|
+
```json
|
|
2022
|
+
{
|
|
2023
|
+
"key": "pg_abc1...2345",
|
|
2024
|
+
"name": "my-agent",
|
|
2025
|
+
"total": 42,
|
|
2026
|
+
"limit": 50,
|
|
2027
|
+
"events": [
|
|
2028
|
+
{ "timestamp": "2025-03-16T10:30:00Z", "source": "usage", "type": "tool.call", "message": "Called search (5 credits)", "metadata": { "tool": "search", "creditsCharged": 5, "allowed": true } },
|
|
2029
|
+
{ "timestamp": "2025-03-16T09:00:00Z", "source": "audit", "type": "key.note_added", "message": "Note added to key", "metadata": { "key": "pg_abc1...2345" } },
|
|
2030
|
+
{ "timestamp": "2025-03-15T14:00:00Z", "source": "audit", "type": "key.created", "message": "Key created: my-agent", "metadata": { "keyMasked": "pg_abc1...2345" } }
|
|
2031
|
+
]
|
|
2032
|
+
}
|
|
2033
|
+
```
|
|
2034
|
+
|
|
2035
|
+
Max 200 events per request. Supports aliases. Works on suspended and revoked keys.
|
|
2036
|
+
|
|
1967
2037
|
### IP Allowlisting
|
|
1968
2038
|
|
|
1969
2039
|
Restrict API keys to specific IP addresses or CIDR ranges:
|
package/dist/audit.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* session lifecycle, and admin operations. Ring buffer with configurable
|
|
6
6
|
* max size and age-based retention. Zero external dependencies.
|
|
7
7
|
*/
|
|
8
|
-
export type AuditEventType = 'key.created' | 'key.revoked' | 'key.suspended' | 'key.resumed' | 'key.cloned' | 'key.rotated' | 'key.topup' | 'key.acl_updated' | 'key.expiry_updated' | 'key.quota_updated' | 'key.tags_updated' | 'key.ip_updated' | 'key.limit_updated' | 'gate.allow' | 'gate.deny' | 'session.created' | 'session.destroyed' | 'oauth.client_registered' | 'oauth.token_issued' | 'oauth.token_revoked' | 'team.created' | 'team.updated' | 'team.deleted' | 'team.key_assigned' | 'team.key_removed' | 'admin.auth_failed' | 'admin.alerts_configured' | 'webhook.dead_letter_cleared' | 'webhook.replayed' | 'webhook.test' | 'webhook.pause' | 'webhook.resume' | 'key.alias_set' | 'key.expiry_warning' | 'template.created' | 'template.updated' | 'template.deleted' | 'token.created' | 'token.revoked' | 'billing.refund' | 'key.auto_topup_configured' | 'key.auto_topped_up' | 'admin_key.created' | 'admin_key.revoked' | 'group.created' | 'group.updated' | 'group.deleted' | 'group.key_assigned' | 'group.key_removed' | 'key.credits_transferred' | 'keys.exported' | 'keys.imported' | 'webhook_filter.created' | 'webhook_filter.updated' | 'webhook_filter.deleted' | 'config.reloaded' | 'config.export' | 'maintenance.enabled' | 'maintenance.disabled' | 'key.note_added' | 'key.note_deleted';
|
|
8
|
+
export type AuditEventType = 'key.created' | 'key.revoked' | 'key.suspended' | 'key.resumed' | 'key.cloned' | 'key.rotated' | 'key.topup' | 'key.acl_updated' | 'key.expiry_updated' | 'key.quota_updated' | 'key.tags_updated' | 'key.ip_updated' | 'key.limit_updated' | 'gate.allow' | 'gate.deny' | 'session.created' | 'session.destroyed' | 'oauth.client_registered' | 'oauth.token_issued' | 'oauth.token_revoked' | 'team.created' | 'team.updated' | 'team.deleted' | 'team.key_assigned' | 'team.key_removed' | 'admin.auth_failed' | 'admin.alerts_configured' | 'webhook.dead_letter_cleared' | 'webhook.replayed' | 'webhook.test' | 'webhook.pause' | 'webhook.resume' | 'key.alias_set' | 'key.expiry_warning' | 'template.created' | 'template.updated' | 'template.deleted' | 'token.created' | 'token.revoked' | 'billing.refund' | 'key.auto_topup_configured' | 'key.auto_topped_up' | 'admin_key.created' | 'admin_key.revoked' | 'group.created' | 'group.updated' | 'group.deleted' | 'group.key_assigned' | 'group.key_removed' | 'key.credits_transferred' | 'keys.exported' | 'keys.imported' | 'webhook_filter.created' | 'webhook_filter.updated' | 'webhook_filter.deleted' | 'config.reloaded' | 'config.export' | 'maintenance.enabled' | 'maintenance.disabled' | 'key.note_added' | 'key.note_deleted' | 'schedule.created' | 'schedule.executed' | 'schedule.cancelled';
|
|
9
9
|
export interface AuditEvent {
|
|
10
10
|
/** Monotonically increasing ID */
|
|
11
11
|
id: number;
|
package/dist/audit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,MAAM,cAAc,GAEtB,aAAa,GACb,aAAa,GACb,eAAe,GACf,aAAa,GACb,YAAY,GACZ,aAAa,GACb,WAAW,GACX,iBAAiB,GACjB,oBAAoB,GACpB,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,GAChB,mBAAmB,GAEnB,YAAY,GACZ,WAAW,GAEX,iBAAiB,GACjB,mBAAmB,GAEnB,yBAAyB,GACzB,oBAAoB,GACpB,qBAAqB,GAErB,cAAc,GACd,cAAc,GACd,cAAc,GACd,mBAAmB,GACnB,kBAAkB,GAElB,mBAAmB,GACnB,yBAAyB,GAEzB,6BAA6B,GAC7B,kBAAkB,GAClB,cAAc,GACd,eAAe,GACf,gBAAgB,GAEhB,eAAe,GAEf,oBAAoB,GAEpB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAElB,eAAe,GACf,eAAe,GAEf,gBAAgB,GAEhB,2BAA2B,GAC3B,oBAAoB,GAEpB,mBAAmB,GACnB,mBAAmB,GAEnB,eAAe,GACf,eAAe,GACf,eAAe,GACf,oBAAoB,GACpB,mBAAmB,GAEnB,yBAAyB,GAEzB,eAAe,GACf,eAAe,GAEf,wBAAwB,GACxB,wBAAwB,GACxB,wBAAwB,GAExB,iBAAiB,GACjB,eAAe,GAEf,qBAAqB,GACrB,sBAAsB,GAEtB,gBAAgB,GAChB,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,MAAM,cAAc,GAEtB,aAAa,GACb,aAAa,GACb,eAAe,GACf,aAAa,GACb,YAAY,GACZ,aAAa,GACb,WAAW,GACX,iBAAiB,GACjB,oBAAoB,GACpB,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,GAChB,mBAAmB,GAEnB,YAAY,GACZ,WAAW,GAEX,iBAAiB,GACjB,mBAAmB,GAEnB,yBAAyB,GACzB,oBAAoB,GACpB,qBAAqB,GAErB,cAAc,GACd,cAAc,GACd,cAAc,GACd,mBAAmB,GACnB,kBAAkB,GAElB,mBAAmB,GACnB,yBAAyB,GAEzB,6BAA6B,GAC7B,kBAAkB,GAClB,cAAc,GACd,eAAe,GACf,gBAAgB,GAEhB,eAAe,GAEf,oBAAoB,GAEpB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAElB,eAAe,GACf,eAAe,GAEf,gBAAgB,GAEhB,2BAA2B,GAC3B,oBAAoB,GAEpB,mBAAmB,GACnB,mBAAmB,GAEnB,eAAe,GACf,eAAe,GACf,eAAe,GACf,oBAAoB,GACpB,mBAAmB,GAEnB,yBAAyB,GAEzB,eAAe,GACf,eAAe,GAEf,wBAAwB,GACxB,wBAAwB,GACxB,wBAAwB,GAExB,iBAAiB,GACjB,eAAe,GAEf,qBAAqB,GACrB,sBAAsB,GAEtB,gBAAgB,GAChB,kBAAkB,GAElB,kBAAkB,GAClB,mBAAmB,GACnB,oBAAoB,CAAC;AAEzB,MAAM,WAAW,UAAU;IACzB,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,IAAI,EAAE,cAAc,CAAC;IACrB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAUD,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,YAAY,CAA+C;IAEnE,mFAAmF;IACnF,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;gBAEzC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAU5C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,UAAU;IAyB7G;;OAEG;IACH,KAAK,CAAC,CAAC,GAAE,UAAe,GAAG,gBAAgB;IAoC3C;;OAEG;IACH,KAAK,IAAI;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;KACvB;IA0BD;;OAEG;IACH,SAAS,IAAI,UAAU,EAAE;IAIzB;;OAEG;IACH,SAAS,CAAC,CAAC,GAAE,UAAe,GAAG,MAAM;IASrC;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAS1B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,OAAO,IAAI,IAAI;CAMhB;AAID,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGnD"}
|
package/dist/audit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -107,6 +107,12 @@ export declare class PayGateServer {
|
|
|
107
107
|
private adminEventStreams;
|
|
108
108
|
/** Keepalive timer for admin event streams */
|
|
109
109
|
private adminEventKeepAliveTimer;
|
|
110
|
+
/** Scheduled actions queue */
|
|
111
|
+
private scheduledActions;
|
|
112
|
+
/** Timer for checking scheduled actions */
|
|
113
|
+
private scheduleTimer;
|
|
114
|
+
/** Auto-incrementing schedule ID counter */
|
|
115
|
+
private nextScheduleId;
|
|
110
116
|
/** Number of in-flight /mcp requests */
|
|
111
117
|
private inflight;
|
|
112
118
|
/** Config file path for hot reload (null if not using config file) */
|
|
@@ -228,6 +234,12 @@ export declare class PayGateServer {
|
|
|
228
234
|
private handleGetNotes;
|
|
229
235
|
private handleAddNote;
|
|
230
236
|
private handleDeleteNote;
|
|
237
|
+
private handleGetSchedules;
|
|
238
|
+
private handleCreateSchedule;
|
|
239
|
+
private handleCancelSchedule;
|
|
240
|
+
/** Execute any scheduled actions that are due. Called by the schedule timer. */
|
|
241
|
+
private executeScheduledActions;
|
|
242
|
+
private handleKeyActivity;
|
|
231
243
|
private handleConfigReload;
|
|
232
244
|
private handleWebhookStats;
|
|
233
245
|
private handleWebhookLog;
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -225,6 +225,12 @@ class PayGateServer {
|
|
|
225
225
|
adminEventStreams = new Set();
|
|
226
226
|
/** Keepalive timer for admin event streams */
|
|
227
227
|
adminEventKeepAliveTimer = null;
|
|
228
|
+
/** Scheduled actions queue */
|
|
229
|
+
scheduledActions = [];
|
|
230
|
+
/** Timer for checking scheduled actions */
|
|
231
|
+
scheduleTimer = null;
|
|
232
|
+
/** Auto-incrementing schedule ID counter */
|
|
233
|
+
nextScheduleId = 1;
|
|
228
234
|
/** Number of in-flight /mcp requests */
|
|
229
235
|
inflight = 0;
|
|
230
236
|
/** Config file path for hot reload (null if not using config file) */
|
|
@@ -442,6 +448,9 @@ class PayGateServer {
|
|
|
442
448
|
await this.handler.start();
|
|
443
449
|
// Start the key expiry scanner (proactive background scanning)
|
|
444
450
|
this.expiryScanner.start(() => this.gate.store.getAllRecords());
|
|
451
|
+
// Start scheduled actions executor (checks every 10s)
|
|
452
|
+
this.scheduleTimer = setInterval(() => this.executeScheduledActions(), 10_000);
|
|
453
|
+
this.scheduleTimer.unref();
|
|
445
454
|
// Plugin lifecycle: onStart
|
|
446
455
|
if (this.plugins.count > 0) {
|
|
447
456
|
await this.plugins.executeStart();
|
|
@@ -549,6 +558,22 @@ class PayGateServer {
|
|
|
549
558
|
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
550
559
|
res.end(JSON.stringify({ error: 'Method not allowed' }));
|
|
551
560
|
return;
|
|
561
|
+
case '/keys/schedule':
|
|
562
|
+
if (req.method === 'GET')
|
|
563
|
+
return this.handleGetSchedules(req, res);
|
|
564
|
+
if (req.method === 'POST')
|
|
565
|
+
return this.handleCreateSchedule(req, res);
|
|
566
|
+
if (req.method === 'DELETE')
|
|
567
|
+
return this.handleCancelSchedule(req, res);
|
|
568
|
+
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
569
|
+
res.end(JSON.stringify({ error: 'Method not allowed' }));
|
|
570
|
+
return;
|
|
571
|
+
case '/keys/activity':
|
|
572
|
+
if (req.method === 'GET')
|
|
573
|
+
return this.handleKeyActivity(req, res);
|
|
574
|
+
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
575
|
+
res.end(JSON.stringify({ error: 'Method not allowed. Use GET.' }));
|
|
576
|
+
return;
|
|
552
577
|
case '/keys/rotate':
|
|
553
578
|
return this.handleRotateKey(req, res);
|
|
554
579
|
case '/keys/acl':
|
|
@@ -1187,6 +1212,8 @@ class PayGateServer {
|
|
|
1187
1212
|
maintenance: 'GET /maintenance — Check status + POST to enable/disable maintenance mode (requires X-Admin-Key)',
|
|
1188
1213
|
adminEvents: 'GET /admin/events — Real-time SSE stream of server events (requires X-Admin-Key, Accept: text/event-stream)',
|
|
1189
1214
|
keyNotes: 'GET /keys/notes?key=... — List notes + POST to add + DELETE to remove (requires X-Admin-Key)',
|
|
1215
|
+
keySchedule: 'GET /keys/schedule?key=... — List schedules + POST to create + DELETE to cancel (requires X-Admin-Key)',
|
|
1216
|
+
keyActivity: 'GET /keys/activity?key=... — Unified activity timeline for a key (requires X-Admin-Key)',
|
|
1190
1217
|
...(this.oauth ? {
|
|
1191
1218
|
oauthMetadata: 'GET /.well-known/oauth-authorization-server — OAuth 2.1 server metadata',
|
|
1192
1219
|
oauthRegister: 'POST /oauth/register — Register OAuth client',
|
|
@@ -4085,6 +4112,276 @@ class PayGateServer {
|
|
|
4085
4112
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
4086
4113
|
res.end(JSON.stringify({ deleted, remaining: notes.length }));
|
|
4087
4114
|
}
|
|
4115
|
+
// ─── /keys/schedule — Scheduled actions on API keys ──────────────────────
|
|
4116
|
+
handleGetSchedules(req, res) {
|
|
4117
|
+
if (!this.checkAdmin(req, res))
|
|
4118
|
+
return;
|
|
4119
|
+
const urlParts = req.url?.split('?') || [];
|
|
4120
|
+
const params = new URLSearchParams(urlParts[1] || '');
|
|
4121
|
+
const keyParam = params.get('key');
|
|
4122
|
+
let schedules = this.scheduledActions;
|
|
4123
|
+
if (keyParam) {
|
|
4124
|
+
// Resolve alias
|
|
4125
|
+
const record = this.gate.store.resolveKeyRaw(keyParam);
|
|
4126
|
+
if (!record) {
|
|
4127
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
4128
|
+
res.end(JSON.stringify({ error: 'Key not found' }));
|
|
4129
|
+
return;
|
|
4130
|
+
}
|
|
4131
|
+
schedules = schedules.filter(s => s.key === record.key);
|
|
4132
|
+
}
|
|
4133
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
4134
|
+
res.end(JSON.stringify({
|
|
4135
|
+
schedules: schedules.map(s => ({
|
|
4136
|
+
...s,
|
|
4137
|
+
key: (0, audit_1.maskKeyForAudit)(s.key),
|
|
4138
|
+
})),
|
|
4139
|
+
count: schedules.length,
|
|
4140
|
+
}));
|
|
4141
|
+
}
|
|
4142
|
+
handleCreateSchedule(req, res) {
|
|
4143
|
+
if (!this.checkAdmin(req, res))
|
|
4144
|
+
return;
|
|
4145
|
+
let body = '';
|
|
4146
|
+
req.on('data', (chunk) => { body += chunk; });
|
|
4147
|
+
req.on('end', () => {
|
|
4148
|
+
let params;
|
|
4149
|
+
try {
|
|
4150
|
+
params = JSON.parse(body);
|
|
4151
|
+
}
|
|
4152
|
+
catch {
|
|
4153
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4154
|
+
res.end(JSON.stringify({ error: 'Invalid JSON body' }));
|
|
4155
|
+
return;
|
|
4156
|
+
}
|
|
4157
|
+
if (!params.key || typeof params.key !== 'string') {
|
|
4158
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4159
|
+
res.end(JSON.stringify({ error: 'Missing required field: key' }));
|
|
4160
|
+
return;
|
|
4161
|
+
}
|
|
4162
|
+
const validActions = ['revoke', 'suspend', 'topup'];
|
|
4163
|
+
if (!params.action || !validActions.includes(params.action)) {
|
|
4164
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4165
|
+
res.end(JSON.stringify({ error: `Missing or invalid action. Must be one of: ${validActions.join(', ')}` }));
|
|
4166
|
+
return;
|
|
4167
|
+
}
|
|
4168
|
+
if (!params.executeAt || typeof params.executeAt !== 'string') {
|
|
4169
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4170
|
+
res.end(JSON.stringify({ error: 'Missing required field: executeAt (ISO 8601 timestamp)' }));
|
|
4171
|
+
return;
|
|
4172
|
+
}
|
|
4173
|
+
const executeTime = new Date(params.executeAt).getTime();
|
|
4174
|
+
if (isNaN(executeTime)) {
|
|
4175
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4176
|
+
res.end(JSON.stringify({ error: 'Invalid executeAt: must be a valid ISO 8601 timestamp' }));
|
|
4177
|
+
return;
|
|
4178
|
+
}
|
|
4179
|
+
if (executeTime <= Date.now()) {
|
|
4180
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4181
|
+
res.end(JSON.stringify({ error: 'executeAt must be in the future' }));
|
|
4182
|
+
return;
|
|
4183
|
+
}
|
|
4184
|
+
// Topup requires credits param
|
|
4185
|
+
if (params.action === 'topup') {
|
|
4186
|
+
const credits = params.params?.credits;
|
|
4187
|
+
if (!credits || typeof credits !== 'number' || credits <= 0) {
|
|
4188
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4189
|
+
res.end(JSON.stringify({ error: 'topup action requires params.credits (positive number)' }));
|
|
4190
|
+
return;
|
|
4191
|
+
}
|
|
4192
|
+
}
|
|
4193
|
+
const record = this.gate.store.resolveKeyRaw(params.key);
|
|
4194
|
+
if (!record) {
|
|
4195
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
4196
|
+
res.end(JSON.stringify({ error: 'Key not found' }));
|
|
4197
|
+
return;
|
|
4198
|
+
}
|
|
4199
|
+
// Max 20 schedules per key
|
|
4200
|
+
const keySchedules = this.scheduledActions.filter(s => s.key === record.key);
|
|
4201
|
+
if (keySchedules.length >= 20) {
|
|
4202
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4203
|
+
res.end(JSON.stringify({ error: 'Maximum 20 scheduled actions per key' }));
|
|
4204
|
+
return;
|
|
4205
|
+
}
|
|
4206
|
+
const schedule = {
|
|
4207
|
+
id: `sched_${this.nextScheduleId++}`,
|
|
4208
|
+
key: record.key,
|
|
4209
|
+
action: params.action,
|
|
4210
|
+
executeAt: new Date(params.executeAt).toISOString(),
|
|
4211
|
+
createdAt: new Date().toISOString(),
|
|
4212
|
+
params: params.params,
|
|
4213
|
+
};
|
|
4214
|
+
this.scheduledActions.push(schedule);
|
|
4215
|
+
this.audit.log('schedule.created', 'admin', `Scheduled ${params.action} on key`, {
|
|
4216
|
+
scheduleId: schedule.id,
|
|
4217
|
+
key: (0, audit_1.maskKeyForAudit)(record.key),
|
|
4218
|
+
action: params.action,
|
|
4219
|
+
executeAt: schedule.executeAt,
|
|
4220
|
+
});
|
|
4221
|
+
res.writeHead(201, { 'Content-Type': 'application/json' });
|
|
4222
|
+
res.end(JSON.stringify({
|
|
4223
|
+
...schedule,
|
|
4224
|
+
key: (0, audit_1.maskKeyForAudit)(schedule.key),
|
|
4225
|
+
}));
|
|
4226
|
+
});
|
|
4227
|
+
}
|
|
4228
|
+
handleCancelSchedule(req, res) {
|
|
4229
|
+
if (!this.checkAdmin(req, res))
|
|
4230
|
+
return;
|
|
4231
|
+
const urlParts = req.url?.split('?') || [];
|
|
4232
|
+
const params = new URLSearchParams(urlParts[1] || '');
|
|
4233
|
+
const scheduleId = params.get('id');
|
|
4234
|
+
if (!scheduleId) {
|
|
4235
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4236
|
+
res.end(JSON.stringify({ error: 'Missing required query parameter: id' }));
|
|
4237
|
+
return;
|
|
4238
|
+
}
|
|
4239
|
+
const idx = this.scheduledActions.findIndex(s => s.id === scheduleId);
|
|
4240
|
+
if (idx === -1) {
|
|
4241
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
4242
|
+
res.end(JSON.stringify({ error: 'Schedule not found' }));
|
|
4243
|
+
return;
|
|
4244
|
+
}
|
|
4245
|
+
const cancelled = this.scheduledActions.splice(idx, 1)[0];
|
|
4246
|
+
this.audit.log('schedule.cancelled', 'admin', `Cancelled scheduled ${cancelled.action}`, {
|
|
4247
|
+
scheduleId: cancelled.id,
|
|
4248
|
+
key: (0, audit_1.maskKeyForAudit)(cancelled.key),
|
|
4249
|
+
action: cancelled.action,
|
|
4250
|
+
executeAt: cancelled.executeAt,
|
|
4251
|
+
});
|
|
4252
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
4253
|
+
res.end(JSON.stringify({
|
|
4254
|
+
cancelled: { ...cancelled, key: (0, audit_1.maskKeyForAudit)(cancelled.key) },
|
|
4255
|
+
}));
|
|
4256
|
+
}
|
|
4257
|
+
/** Execute any scheduled actions that are due. Called by the schedule timer. */
|
|
4258
|
+
executeScheduledActions() {
|
|
4259
|
+
const now = Date.now();
|
|
4260
|
+
const due = this.scheduledActions.filter(s => new Date(s.executeAt).getTime() <= now);
|
|
4261
|
+
for (const schedule of due) {
|
|
4262
|
+
// Remove from queue
|
|
4263
|
+
const idx = this.scheduledActions.indexOf(schedule);
|
|
4264
|
+
if (idx !== -1)
|
|
4265
|
+
this.scheduledActions.splice(idx, 1);
|
|
4266
|
+
const record = this.gate.store.resolveKeyRaw(schedule.key);
|
|
4267
|
+
if (!record)
|
|
4268
|
+
continue; // Key was deleted
|
|
4269
|
+
try {
|
|
4270
|
+
switch (schedule.action) {
|
|
4271
|
+
case 'revoke':
|
|
4272
|
+
if (record.active) {
|
|
4273
|
+
record.active = false;
|
|
4274
|
+
this.gate.store.save();
|
|
4275
|
+
}
|
|
4276
|
+
break;
|
|
4277
|
+
case 'suspend':
|
|
4278
|
+
if (!record.suspended) {
|
|
4279
|
+
record.suspended = true;
|
|
4280
|
+
this.gate.store.save();
|
|
4281
|
+
}
|
|
4282
|
+
break;
|
|
4283
|
+
case 'topup': {
|
|
4284
|
+
const credits = schedule.params?.credits || 0;
|
|
4285
|
+
if (credits > 0) {
|
|
4286
|
+
record.credits += credits;
|
|
4287
|
+
this.gate.store.save();
|
|
4288
|
+
}
|
|
4289
|
+
break;
|
|
4290
|
+
}
|
|
4291
|
+
}
|
|
4292
|
+
this.audit.log('schedule.executed', 'system', `Executed scheduled ${schedule.action}`, {
|
|
4293
|
+
scheduleId: schedule.id,
|
|
4294
|
+
key: (0, audit_1.maskKeyForAudit)(schedule.key),
|
|
4295
|
+
action: schedule.action,
|
|
4296
|
+
});
|
|
4297
|
+
}
|
|
4298
|
+
catch {
|
|
4299
|
+
// Log error but don't crash
|
|
4300
|
+
}
|
|
4301
|
+
}
|
|
4302
|
+
}
|
|
4303
|
+
// ─── /keys/activity — Unified activity timeline for a key ────────────────
|
|
4304
|
+
handleKeyActivity(req, res) {
|
|
4305
|
+
if (!this.checkAdmin(req, res))
|
|
4306
|
+
return;
|
|
4307
|
+
const urlParts = req.url?.split('?') || [];
|
|
4308
|
+
const params = new URLSearchParams(urlParts[1] || '');
|
|
4309
|
+
const keyParam = params.get('key');
|
|
4310
|
+
if (!keyParam) {
|
|
4311
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4312
|
+
res.end(JSON.stringify({ error: 'Missing required query parameter: key' }));
|
|
4313
|
+
return;
|
|
4314
|
+
}
|
|
4315
|
+
const record = this.gate.store.resolveKeyRaw(keyParam);
|
|
4316
|
+
if (!record) {
|
|
4317
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
4318
|
+
res.end(JSON.stringify({ error: 'Key not found' }));
|
|
4319
|
+
return;
|
|
4320
|
+
}
|
|
4321
|
+
const since = params.get('since') || undefined;
|
|
4322
|
+
const limit = Math.min(200, Math.max(1, parseInt(params.get('limit') || '50', 10) || 50));
|
|
4323
|
+
const maskedKey = (0, audit_1.maskKeyForAudit)(record.key);
|
|
4324
|
+
// 1. Collect audit events for this key
|
|
4325
|
+
// Audit events store masked keys in metadata.key or metadata.keyMasked
|
|
4326
|
+
const auditResult = this.audit.query({
|
|
4327
|
+
since,
|
|
4328
|
+
limit: 1000, // Grab up to 1000 to merge
|
|
4329
|
+
});
|
|
4330
|
+
const keyAuditEvents = auditResult.events.filter(e => {
|
|
4331
|
+
// Check metadata.key or metadata.keyMasked (both patterns are used)
|
|
4332
|
+
for (const field of ['key', 'keyMasked', 'sourceKey', 'destKey']) {
|
|
4333
|
+
const val = e.metadata?.[field];
|
|
4334
|
+
if (val && typeof val === 'string' && val === maskedKey)
|
|
4335
|
+
return true;
|
|
4336
|
+
}
|
|
4337
|
+
// Check actor field (gate events use masked key as actor)
|
|
4338
|
+
if (e.actor === maskedKey)
|
|
4339
|
+
return true;
|
|
4340
|
+
return false;
|
|
4341
|
+
});
|
|
4342
|
+
// 2. Collect usage events for this key
|
|
4343
|
+
const usageEvents = this.gate.meter.getEvents(since).filter(e => e.apiKey === record.key);
|
|
4344
|
+
// 3. Merge into unified timeline
|
|
4345
|
+
const timeline = [];
|
|
4346
|
+
for (const e of keyAuditEvents) {
|
|
4347
|
+
timeline.push({
|
|
4348
|
+
timestamp: e.timestamp,
|
|
4349
|
+
source: 'audit',
|
|
4350
|
+
type: e.type,
|
|
4351
|
+
message: e.message,
|
|
4352
|
+
metadata: e.metadata,
|
|
4353
|
+
});
|
|
4354
|
+
}
|
|
4355
|
+
for (const e of usageEvents) {
|
|
4356
|
+
timeline.push({
|
|
4357
|
+
timestamp: e.timestamp,
|
|
4358
|
+
source: 'usage',
|
|
4359
|
+
type: e.allowed ? 'tool.call' : 'tool.denied',
|
|
4360
|
+
message: e.allowed
|
|
4361
|
+
? `Called ${e.tool} (${e.creditsCharged} credits)`
|
|
4362
|
+
: `Denied ${e.tool}: ${e.denyReason || 'unknown'}`,
|
|
4363
|
+
metadata: {
|
|
4364
|
+
tool: e.tool,
|
|
4365
|
+
creditsCharged: e.creditsCharged,
|
|
4366
|
+
allowed: e.allowed,
|
|
4367
|
+
denyReason: e.denyReason,
|
|
4368
|
+
durationMs: e.durationMs,
|
|
4369
|
+
},
|
|
4370
|
+
});
|
|
4371
|
+
}
|
|
4372
|
+
// Sort by timestamp descending (newest first)
|
|
4373
|
+
timeline.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
|
4374
|
+
// Apply limit
|
|
4375
|
+
const page = timeline.slice(0, limit);
|
|
4376
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
4377
|
+
res.end(JSON.stringify({
|
|
4378
|
+
key: maskedKey,
|
|
4379
|
+
name: record.name,
|
|
4380
|
+
total: timeline.length,
|
|
4381
|
+
limit,
|
|
4382
|
+
events: page,
|
|
4383
|
+
}));
|
|
4384
|
+
}
|
|
4088
4385
|
// ─── /config/reload — Hot reload configuration from file ─────────────────
|
|
4089
4386
|
async handleConfigReload(req, res) {
|
|
4090
4387
|
if (req.method !== 'POST') {
|
|
@@ -5576,6 +5873,11 @@ class PayGateServer {
|
|
|
5576
5873
|
});
|
|
5577
5874
|
}
|
|
5578
5875
|
async stop() {
|
|
5876
|
+
// Stop scheduled actions timer
|
|
5877
|
+
if (this.scheduleTimer) {
|
|
5878
|
+
clearInterval(this.scheduleTimer);
|
|
5879
|
+
this.scheduleTimer = null;
|
|
5880
|
+
}
|
|
5579
5881
|
// Close admin event stream connections
|
|
5580
5882
|
if (this.adminEventKeepAliveTimer) {
|
|
5581
5883
|
clearInterval(this.adminEventKeepAliveTimer);
|