queue-pilot 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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +177 -0
  3. package/dist/index.d.ts +9 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +81 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/rabbitmq/client.d.ts +22 -0
  8. package/dist/rabbitmq/client.d.ts.map +1 -0
  9. package/dist/rabbitmq/client.js +82 -0
  10. package/dist/rabbitmq/client.js.map +1 -0
  11. package/dist/rabbitmq/types.d.ts +55 -0
  12. package/dist/rabbitmq/types.d.ts.map +1 -0
  13. package/dist/rabbitmq/types.js +2 -0
  14. package/dist/rabbitmq/types.js.map +1 -0
  15. package/dist/schemas/loader.d.ts +3 -0
  16. package/dist/schemas/loader.d.ts.map +1 -0
  17. package/dist/schemas/loader.js +37 -0
  18. package/dist/schemas/loader.js.map +1 -0
  19. package/dist/schemas/types.d.ts +27 -0
  20. package/dist/schemas/types.d.ts.map +1 -0
  21. package/dist/schemas/types.js +2 -0
  22. package/dist/schemas/types.js.map +1 -0
  23. package/dist/schemas/validator.d.ts +10 -0
  24. package/dist/schemas/validator.d.ts.map +1 -0
  25. package/dist/schemas/validator.js +106 -0
  26. package/dist/schemas/validator.js.map +1 -0
  27. package/dist/server.d.ts +10 -0
  28. package/dist/server.d.ts.map +1 -0
  29. package/dist/server.js +208 -0
  30. package/dist/server.js.map +1 -0
  31. package/dist/tools/create-binding.d.ts +15 -0
  32. package/dist/tools/create-binding.d.ts.map +1 -0
  33. package/dist/tools/create-binding.js +10 -0
  34. package/dist/tools/create-binding.js.map +1 -0
  35. package/dist/tools/create-queue.d.ts +15 -0
  36. package/dist/tools/create-queue.d.ts.map +1 -0
  37. package/dist/tools/create-queue.js +13 -0
  38. package/dist/tools/create-queue.js.map +1 -0
  39. package/dist/tools/get-schema.d.ts +9 -0
  40. package/dist/tools/get-schema.d.ts.map +1 -0
  41. package/dist/tools/get-schema.js +16 -0
  42. package/dist/tools/get-schema.js.map +1 -0
  43. package/dist/tools/inspect-queue.d.ts +36 -0
  44. package/dist/tools/inspect-queue.d.ts.map +1 -0
  45. package/dist/tools/inspect-queue.js +74 -0
  46. package/dist/tools/inspect-queue.js.map +1 -0
  47. package/dist/tools/list-bindings.d.ts +11 -0
  48. package/dist/tools/list-bindings.d.ts.map +1 -0
  49. package/dist/tools/list-bindings.js +12 -0
  50. package/dist/tools/list-bindings.js.map +1 -0
  51. package/dist/tools/list-exchanges.d.ts +10 -0
  52. package/dist/tools/list-exchanges.d.ts.map +1 -0
  53. package/dist/tools/list-exchanges.js +11 -0
  54. package/dist/tools/list-exchanges.js.map +1 -0
  55. package/dist/tools/list-queues.d.ts +11 -0
  56. package/dist/tools/list-queues.d.ts.map +1 -0
  57. package/dist/tools/list-queues.js +12 -0
  58. package/dist/tools/list-queues.js.map +1 -0
  59. package/dist/tools/list-schemas.d.ts +11 -0
  60. package/dist/tools/list-schemas.d.ts.map +1 -0
  61. package/dist/tools/list-schemas.js +14 -0
  62. package/dist/tools/list-schemas.js.map +1 -0
  63. package/dist/tools/peek-messages.d.ts +19 -0
  64. package/dist/tools/peek-messages.d.ts.map +1 -0
  65. package/dist/tools/peek-messages.js +20 -0
  66. package/dist/tools/peek-messages.js.map +1 -0
  67. package/dist/tools/publish-message.d.ts +28 -0
  68. package/dist/tools/publish-message.d.ts.map +1 -0
  69. package/dist/tools/publish-message.js +80 -0
  70. package/dist/tools/publish-message.js.map +1 -0
  71. package/dist/tools/purge-queue.d.ts +7 -0
  72. package/dist/tools/purge-queue.d.ts.map +1 -0
  73. package/dist/tools/purge-queue.js +8 -0
  74. package/dist/tools/purge-queue.js.map +1 -0
  75. package/dist/tools/validate-message.d.ts +11 -0
  76. package/dist/tools/validate-message.d.ts.map +1 -0
  77. package/dist/tools/validate-message.js +20 -0
  78. package/dist/tools/validate-message.js.map +1 -0
  79. package/package.json +64 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Lars
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,177 @@
1
+ # Queue Pilot
2
+
3
+ MCP server for message queue development — combines RabbitMQ message inspection with JSON Schema validation.
4
+
5
+ Designed for integration projects where multiple teams communicate via RabbitMQ: inspect queues, view messages, and validate payloads against agreed-upon schemas — all from your AI assistant.
6
+
7
+ ## Features
8
+
9
+ - **Message Inspection** — Browse queues, peek at messages without consuming them
10
+ - **Schema Validation** — Validate message payloads against JSON Schema definitions
11
+ - **Combined Inspection** — `inspect_queue` peeks messages AND validates each against its schema
12
+ - **Validated Publishing** — `publish_message` validates against a schema before sending — invalid messages never hit the broker
13
+ - **Queue Management** — Create queues, bindings, and purge messages for dev/test workflows
14
+ - **Broker Info** — List exchanges and bindings to understand message routing
15
+
16
+ ## Quick Start
17
+
18
+ ### 1. Define your schemas
19
+
20
+ Create JSON Schema files in a directory:
21
+
22
+ ```json
23
+ // schemas/order.created.json
24
+ {
25
+ "$id": "order.created",
26
+ "$schema": "http://json-schema.org/draft-07/schema#",
27
+ "title": "Order Created",
28
+ "description": "Emitted when a new order is placed",
29
+ "version": "1.0.0",
30
+ "type": "object",
31
+ "required": ["orderId", "amount"],
32
+ "properties": {
33
+ "orderId": { "type": "string" },
34
+ "amount": { "type": "number" }
35
+ }
36
+ }
37
+ ```
38
+
39
+ ### 2. Add to your MCP client
40
+
41
+ Add the following server configuration to your MCP client:
42
+
43
+ ```json
44
+ {
45
+ "mcpServers": {
46
+ "queue-pilot": {
47
+ "command": "npx",
48
+ "args": [
49
+ "queue-pilot",
50
+ "--schemas", "./schemas",
51
+ "--rabbitmq-url", "http://localhost:15672",
52
+ "--rabbitmq-user", "guest",
53
+ "--rabbitmq-pass", "guest"
54
+ ]
55
+ }
56
+ }
57
+ }
58
+ ```
59
+
60
+ <details>
61
+ <summary>Where does this config go?</summary>
62
+
63
+ | Client | Config file |
64
+ |--------|------------|
65
+ | Claude Code | `.claude/mcp.json` (project) or `~/.claude/mcp.json` (global) |
66
+ | Claude Desktop | `claude_desktop_config.json` |
67
+ | Cursor | `.cursor/mcp.json` |
68
+ | VS Code (Copilot) | `.vscode/mcp.json` |
69
+ | Windsurf | `~/.codeium/windsurf/mcp_config.json` |
70
+
71
+ </details>
72
+
73
+ <details>
74
+ <summary>Development (running from source)</summary>
75
+
76
+ ```json
77
+ {
78
+ "mcpServers": {
79
+ "queue-pilot": {
80
+ "command": "npx",
81
+ "args": [
82
+ "tsx",
83
+ "src/index.ts",
84
+ "--schemas", "./schemas",
85
+ "--rabbitmq-url", "http://localhost:15672",
86
+ "--rabbitmq-user", "guest",
87
+ "--rabbitmq-pass", "guest"
88
+ ]
89
+ }
90
+ }
91
+ }
92
+ ```
93
+
94
+ </details>
95
+
96
+ ### 3. Use it
97
+
98
+ Ask your assistant things like:
99
+
100
+ - "Which queues are there and how many messages do they have?"
101
+ - "Show me the messages in the orders queue"
102
+ - "Inspect the registration queue and check if all messages are valid"
103
+ - "What schemas are available?"
104
+ - "Validate this message against the order.created schema"
105
+ - "Publish an order.created event to the events exchange"
106
+ - "Create a queue called dead-letters and bind it to the events exchange"
107
+ - "Purge all messages from the orders queue"
108
+
109
+ ## MCP Tools
110
+
111
+ ### Read
112
+
113
+ | Tool | Description |
114
+ |------|-------------|
115
+ | `list_schemas` | List all loaded message schemas |
116
+ | `get_schema` | Get the full definition of a specific schema |
117
+ | `validate_message` | Validate a JSON message against a schema |
118
+ | `list_queues` | List all RabbitMQ queues with message counts |
119
+ | `peek_messages` | View messages in a queue without consuming them |
120
+ | `inspect_queue` | Peek messages + validate each against its schema |
121
+ | `list_exchanges` | List all RabbitMQ exchanges |
122
+ | `list_bindings` | List bindings between exchanges and queues |
123
+
124
+ ### Write
125
+
126
+ | Tool | Description |
127
+ |------|-------------|
128
+ | `publish_message` | Publish a message to an exchange with optional schema validation gate |
129
+ | `purge_queue` | Remove all messages from a queue (returns count purged) |
130
+ | `create_queue` | Create a new queue (idempotent if settings match) |
131
+ | `create_binding` | Bind a queue to an exchange with a routing key |
132
+
133
+ ## Schema Format
134
+
135
+ Schemas follow JSON Schema draft-07 with a few conventions:
136
+
137
+ - `$id` — Message type identifier (matches the `type` property on RabbitMQ messages)
138
+ - `version` — Schema version (custom field, not validated by JSON Schema)
139
+ - Standard JSON Schema validation including `required`, `properties`, `format` etc.
140
+
141
+ Schema matching: when inspecting a queue, the message's `type` property is used to find the corresponding schema by `$id`.
142
+
143
+ ## CLI Arguments
144
+
145
+ | Argument | Default | Description |
146
+ |----------|---------|-------------|
147
+ | `--schemas` | (required) | Path to directory containing JSON Schema files |
148
+ | `--rabbitmq-url` | `http://localhost:15672` | RabbitMQ Management API URL |
149
+ | `--rabbitmq-user` | `guest` | RabbitMQ username |
150
+ | `--rabbitmq-pass` | `guest` | RabbitMQ password |
151
+
152
+ ## Development
153
+
154
+ ```bash
155
+ npm install
156
+ npm test # Unit tests (103 tests)
157
+ npm run test:coverage # Coverage report
158
+ npm run build # TypeScript compilation
159
+ npm run lint # Type check
160
+
161
+ # Integration tests (requires RabbitMQ)
162
+ docker compose up -d
163
+ npm run test:integration
164
+ ```
165
+
166
+ ## Tech Stack
167
+
168
+ - TypeScript (strict mode, ESM)
169
+ - [MCP SDK](https://github.com/modelcontextprotocol/typescript-sdk) v1.26.0
170
+ - [Ajv](https://ajv.js.org/) for JSON Schema validation
171
+ - [Zod](https://zod.dev/) for MCP tool parameter definitions
172
+ - [Vitest](https://vitest.dev/) for testing
173
+ - RabbitMQ Management HTTP API (no additional broker dependencies)
174
+
175
+ ## License
176
+
177
+ MIT
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ export interface CliArgs {
3
+ schemas: string;
4
+ rabbitmqUrl: string;
5
+ rabbitmqUser: string;
6
+ rabbitmqPass: string;
7
+ }
8
+ export declare function parseArgs(argv: string[]): CliArgs;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAWA,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAeD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAyCjD"}
package/dist/index.js ADDED
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from "module";
3
+ import { fileURLToPath } from "url";
4
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
+ import { loadSchemas } from "./schemas/loader.js";
6
+ import { createServer } from "./server.js";
7
+ const require = createRequire(import.meta.url);
8
+ const pkg = require("../package.json");
9
+ const HELP_TEXT = `Queue Pilot - MCP server for RabbitMQ message inspection and schema validation
10
+
11
+ Usage: queue-pilot --schemas <directory> [options]
12
+
13
+ Options:
14
+ --schemas <dir> Directory containing JSON Schema files (required)
15
+ --rabbitmq-url <url> RabbitMQ Management API URL (default: http://localhost:15672)
16
+ --rabbitmq-user <user> RabbitMQ username (default: guest)
17
+ --rabbitmq-pass <pass> RabbitMQ password (default: guest)
18
+ --help Show this help message
19
+ --version Show version number
20
+ `;
21
+ export function parseArgs(argv) {
22
+ if (argv.includes("--help")) {
23
+ process.stderr.write(HELP_TEXT);
24
+ process.exit(0);
25
+ }
26
+ if (argv.includes("--version")) {
27
+ process.stderr.write(`${pkg.version}\n`);
28
+ process.exit(0);
29
+ }
30
+ const args = {};
31
+ for (let i = 0; i < argv.length; i++) {
32
+ switch (argv[i]) {
33
+ case "--schemas":
34
+ args.schemas = argv[++i];
35
+ break;
36
+ case "--rabbitmq-url":
37
+ args.rabbitmqUrl = argv[++i];
38
+ break;
39
+ case "--rabbitmq-user":
40
+ args.rabbitmqUser = argv[++i];
41
+ break;
42
+ case "--rabbitmq-pass":
43
+ args.rabbitmqPass = argv[++i];
44
+ break;
45
+ }
46
+ }
47
+ if (!args.schemas) {
48
+ process.stderr.write("Error: --schemas <directory> is required\n");
49
+ process.exit(1);
50
+ }
51
+ return {
52
+ schemas: args.schemas,
53
+ rabbitmqUrl: args.rabbitmqUrl ?? "http://localhost:15672",
54
+ rabbitmqUser: args.rabbitmqUser ?? "guest",
55
+ rabbitmqPass: args.rabbitmqPass ?? "guest",
56
+ };
57
+ }
58
+ async function main() {
59
+ const args = parseArgs(process.argv.slice(2));
60
+ process.stderr.write(`Queue Pilot starting...\n`);
61
+ process.stderr.write(`Loading schemas from: ${args.schemas}\n`);
62
+ const schemas = await loadSchemas(args.schemas);
63
+ process.stderr.write(`Loaded ${schemas.length} schema(s)\n`);
64
+ const server = createServer({
65
+ schemas,
66
+ rabbitmqUrl: args.rabbitmqUrl,
67
+ rabbitmqUser: args.rabbitmqUser,
68
+ rabbitmqPass: args.rabbitmqPass,
69
+ });
70
+ const transport = new StdioServerTransport();
71
+ await server.connect(transport);
72
+ process.stderr.write(`Queue Pilot running (stdio transport)\n`);
73
+ }
74
+ const isEntryPoint = process.argv[1] === fileURLToPath(import.meta.url);
75
+ if (isEntryPoint) {
76
+ main().catch((error) => {
77
+ process.stderr.write(`Fatal error: ${error}\n`);
78
+ process.exit(1);
79
+ });
80
+ }
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { RabbitMQConfig, QueueInfo, QueueMessage, ExchangeInfo, BindingInfo, PublishMessageBody, PublishResponse, PurgeResponse } from "./types.js";
2
+ export declare class RabbitMQClient {
3
+ private readonly baseUrl;
4
+ private readonly authHeader;
5
+ constructor(config: RabbitMQConfig);
6
+ private headers;
7
+ private rawRequest;
8
+ private request;
9
+ private requestVoid;
10
+ listQueues(vhost: string): Promise<QueueInfo[]>;
11
+ peekMessages(vhost: string, queue: string, count: number): Promise<QueueMessage[]>;
12
+ listExchanges(vhost: string): Promise<ExchangeInfo[]>;
13
+ listBindings(vhost: string): Promise<BindingInfo[]>;
14
+ purgeQueue(vhost: string, queue: string): Promise<PurgeResponse>;
15
+ createQueue(vhost: string, queue: string, options: {
16
+ durable: boolean;
17
+ auto_delete: boolean;
18
+ }): Promise<void>;
19
+ createBinding(vhost: string, exchange: string, queue: string, routingKey: string): Promise<void>;
20
+ publishMessage(vhost: string, exchange: string, body: PublishMessageBody): Promise<PublishResponse>;
21
+ }
22
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/rabbitmq/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,aAAa,EACd,MAAM,YAAY,CAAC;AAMpB,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,MAAM,EAAE,cAAc;IAOlC,OAAO,CAAC,OAAO;YAOD,UAAU;YAeV,OAAO;YAKP,WAAW;IAInB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAI/C,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,YAAY,EAAE,CAAC;IAcpB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAMrD,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAInD,UAAU,CACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,aAAa,CAAC;IAgBnB,WAAW,CACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE,GAClD,OAAO,CAAC,IAAI,CAAC;IAUV,aAAa,CACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAUV,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,eAAe,CAAC;CAS5B"}
@@ -0,0 +1,82 @@
1
+ function encodeVhost(vhost) {
2
+ return vhost === "/" ? "%2F" : encodeURIComponent(vhost);
3
+ }
4
+ export class RabbitMQClient {
5
+ baseUrl;
6
+ authHeader;
7
+ constructor(config) {
8
+ this.baseUrl = config.url.replace(/\/$/, "");
9
+ this.authHeader =
10
+ "Basic " +
11
+ Buffer.from(`${config.username}:${config.password}`).toString("base64");
12
+ }
13
+ headers() {
14
+ return {
15
+ Authorization: this.authHeader,
16
+ "Content-Type": "application/json",
17
+ };
18
+ }
19
+ async rawRequest(path, options) {
20
+ const response = await fetch(`${this.baseUrl}${path}`, {
21
+ ...options,
22
+ headers: { ...this.headers(), ...options?.headers },
23
+ });
24
+ if (!response.ok) {
25
+ throw new Error(`RabbitMQ API error: ${response.status} ${response.statusText}`);
26
+ }
27
+ return response;
28
+ }
29
+ async request(path, options) {
30
+ const response = await this.rawRequest(path, options);
31
+ return response.json();
32
+ }
33
+ async requestVoid(path, options) {
34
+ await this.rawRequest(path, options);
35
+ }
36
+ async listQueues(vhost) {
37
+ return this.request(`/api/queues/${encodeVhost(vhost)}`);
38
+ }
39
+ async peekMessages(vhost, queue, count) {
40
+ return this.request(`/api/queues/${encodeVhost(vhost)}/${encodeURIComponent(queue)}/get`, {
41
+ method: "POST",
42
+ body: JSON.stringify({
43
+ count,
44
+ ackmode: "ack_requeue_true",
45
+ encoding: "auto",
46
+ }),
47
+ });
48
+ }
49
+ async listExchanges(vhost) {
50
+ return this.request(`/api/exchanges/${encodeVhost(vhost)}`);
51
+ }
52
+ async listBindings(vhost) {
53
+ return this.request(`/api/bindings/${encodeVhost(vhost)}`);
54
+ }
55
+ async purgeQueue(vhost, queue) {
56
+ const encodedVhost = encodeVhost(vhost);
57
+ const encodedQueue = encodeURIComponent(queue);
58
+ const messages = await this.peekMessages(vhost, queue, 1);
59
+ const messageCount = messages.length > 0 ? messages[0].message_count + 1 : 0;
60
+ await this.requestVoid(`/api/queues/${encodedVhost}/${encodedQueue}/contents`, { method: "DELETE" });
61
+ return { messages_purged: messageCount };
62
+ }
63
+ async createQueue(vhost, queue, options) {
64
+ return this.requestVoid(`/api/queues/${encodeVhost(vhost)}/${encodeURIComponent(queue)}`, {
65
+ method: "PUT",
66
+ body: JSON.stringify(options),
67
+ });
68
+ }
69
+ async createBinding(vhost, exchange, queue, routingKey) {
70
+ return this.requestVoid(`/api/bindings/${encodeVhost(vhost)}/e/${encodeURIComponent(exchange)}/q/${encodeURIComponent(queue)}`, {
71
+ method: "POST",
72
+ body: JSON.stringify({ routing_key: routingKey }),
73
+ });
74
+ }
75
+ async publishMessage(vhost, exchange, body) {
76
+ return this.request(`/api/exchanges/${encodeVhost(vhost)}/${encodeURIComponent(exchange)}/publish`, {
77
+ method: "POST",
78
+ body: JSON.stringify(body),
79
+ });
80
+ }
81
+ }
82
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/rabbitmq/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ export interface RabbitMQConfig {
2
+ url: string;
3
+ username: string;
4
+ password: string;
5
+ }
6
+ export interface QueueInfo {
7
+ name: string;
8
+ messages_ready: number;
9
+ messages_unacknowledged: number;
10
+ state: string;
11
+ vhost: string;
12
+ }
13
+ export interface MessageProperties {
14
+ correlation_id?: string;
15
+ message_id?: string;
16
+ type?: string;
17
+ timestamp?: number;
18
+ headers?: Record<string, unknown>;
19
+ content_type?: string;
20
+ }
21
+ export interface QueueMessage {
22
+ payload: string;
23
+ payload_encoding: string;
24
+ properties: MessageProperties;
25
+ exchange: string;
26
+ routing_key: string;
27
+ message_count: number;
28
+ redelivered: boolean;
29
+ }
30
+ export interface ExchangeInfo {
31
+ name: string;
32
+ type: string;
33
+ durable: boolean;
34
+ vhost: string;
35
+ }
36
+ export interface BindingInfo {
37
+ source: string;
38
+ destination: string;
39
+ destination_type: string;
40
+ routing_key: string;
41
+ vhost: string;
42
+ }
43
+ export interface PublishMessageBody {
44
+ routing_key: string;
45
+ payload: string;
46
+ payload_encoding: string;
47
+ properties: Record<string, unknown>;
48
+ }
49
+ export interface PublishResponse {
50
+ routed: boolean;
51
+ }
52
+ export interface PurgeResponse {
53
+ messages_purged: number;
54
+ }
55
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rabbitmq/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB,EAAE,MAAM,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,CAAC;CACzB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/rabbitmq/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { SchemaEntry } from "./types.js";
2
+ export declare function loadSchemas(directory: string): Promise<SchemaEntry[]>;
3
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/schemas/loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAoB,WAAW,EAAE,MAAM,YAAY,CAAC;AAEhE,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAsC3E"}
@@ -0,0 +1,37 @@
1
+ import { readdir, readFile, access } from "fs/promises";
2
+ import { join } from "path";
3
+ export async function loadSchemas(directory) {
4
+ try {
5
+ await access(directory);
6
+ }
7
+ catch {
8
+ throw new Error(`Schema directory not found: ${directory}`);
9
+ }
10
+ const files = await readdir(directory);
11
+ const jsonFiles = files.filter((f) => f.endsWith(".json"));
12
+ const entries = [];
13
+ for (const file of jsonFiles) {
14
+ try {
15
+ const filePath = join(directory, file);
16
+ const content = await readFile(filePath, "utf-8");
17
+ const parsed = JSON.parse(content);
18
+ if (!parsed.$id || typeof parsed.$id !== "string") {
19
+ throw new Error(`Missing required "$id" field`);
20
+ }
21
+ const schema = parsed;
22
+ entries.push({
23
+ name: schema.$id,
24
+ version: schema.version ?? "0.0.0",
25
+ title: schema.title ?? schema.$id,
26
+ description: schema.description ?? "",
27
+ schema,
28
+ });
29
+ }
30
+ catch (error) {
31
+ const message = error instanceof Error ? error.message : String(error);
32
+ process.stderr.write(`Warning: skipping ${file}: ${message}\n`);
33
+ }
34
+ }
35
+ return entries;
36
+ }
37
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/schemas/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAE3D,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;YAE9D,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAClD,CAAC;YAED,MAAM,MAAM,GAAG,MAA0B,CAAC;YAE1C,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM,CAAC,GAAG;gBAChB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,OAAO;gBAClC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG;gBACjC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;gBACrC,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,27 @@
1
+ export interface SchemaDefinition {
2
+ $id: string;
3
+ $schema: string;
4
+ title: string;
5
+ description: string;
6
+ version: string;
7
+ type: string;
8
+ required?: string[];
9
+ properties?: Record<string, unknown>;
10
+ [key: string]: unknown;
11
+ }
12
+ export interface SchemaEntry {
13
+ name: string;
14
+ version: string;
15
+ title: string;
16
+ description: string;
17
+ schema: SchemaDefinition;
18
+ }
19
+ export interface ValidationError {
20
+ path: string;
21
+ message: string;
22
+ }
23
+ export interface ValidationResult {
24
+ valid: boolean;
25
+ errors: ValidationError[];
26
+ }
27
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/schemas/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/schemas/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import type { SchemaEntry, ValidationResult } from "./types.js";
2
+ export declare class SchemaValidator {
3
+ private readonly ajv;
4
+ private readonly schemas;
5
+ constructor(schemas: SchemaEntry[]);
6
+ validate(schemaName: string, message: unknown): ValidationResult;
7
+ getSchemaNames(): string[];
8
+ getSchema(name: string): SchemaEntry | undefined;
9
+ }
10
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/schemas/validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAoB,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAiElF,qBAAa,eAAe;IAE1B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;gBAEvC,OAAO,EAAE,WAAW,EAAE;IAWlC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,gBAAgB;IAiChE,cAAc,IAAI,MAAM,EAAE;IAI1B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;CAGjD"}