minecraft-bedrock-mcp-server 0.1.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 (207) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +577 -0
  3. package/dist/bridge/event-route.d.ts +11 -0
  4. package/dist/bridge/event-route.d.ts.map +1 -0
  5. package/dist/bridge/event-route.js +28 -0
  6. package/dist/bridge/event-route.js.map +1 -0
  7. package/dist/bridge/handshake-route.d.ts +11 -0
  8. package/dist/bridge/handshake-route.d.ts.map +1 -0
  9. package/dist/bridge/handshake-route.js +45 -0
  10. package/dist/bridge/handshake-route.js.map +1 -0
  11. package/dist/bridge/poll-route.d.ts +11 -0
  12. package/dist/bridge/poll-route.d.ts.map +1 -0
  13. package/dist/bridge/poll-route.js +28 -0
  14. package/dist/bridge/poll-route.js.map +1 -0
  15. package/dist/bridge/result-route.d.ts +10 -0
  16. package/dist/bridge/result-route.d.ts.map +1 -0
  17. package/dist/bridge/result-route.js +23 -0
  18. package/dist/bridge/result-route.js.map +1 -0
  19. package/dist/config/config-error.d.ts +12 -0
  20. package/dist/config/config-error.d.ts.map +1 -0
  21. package/dist/config/config-error.js +13 -0
  22. package/dist/config/config-error.js.map +1 -0
  23. package/dist/config/environment.d.ts +89 -0
  24. package/dist/config/environment.d.ts.map +1 -0
  25. package/dist/config/environment.js +73 -0
  26. package/dist/config/environment.js.map +1 -0
  27. package/dist/config/tls.d.ts +15 -0
  28. package/dist/config/tls.d.ts.map +1 -0
  29. package/dist/config/tls.js +27 -0
  30. package/dist/config/tls.js.map +1 -0
  31. package/dist/errors/bridge-error.d.ts +41 -0
  32. package/dist/errors/bridge-error.d.ts.map +1 -0
  33. package/dist/errors/bridge-error.js +33 -0
  34. package/dist/errors/bridge-error.js.map +1 -0
  35. package/dist/errors/error-codes.d.ts +13 -0
  36. package/dist/errors/error-codes.d.ts.map +1 -0
  37. package/dist/errors/error-codes.js +41 -0
  38. package/dist/errors/error-codes.js.map +1 -0
  39. package/dist/events/subscription-registry.d.ts +55 -0
  40. package/dist/events/subscription-registry.d.ts.map +1 -0
  41. package/dist/events/subscription-registry.js +64 -0
  42. package/dist/events/subscription-registry.js.map +1 -0
  43. package/dist/http/app.d.ts +26 -0
  44. package/dist/http/app.d.ts.map +1 -0
  45. package/dist/http/app.js +88 -0
  46. package/dist/http/app.js.map +1 -0
  47. package/dist/http/authentication.d.ts +11 -0
  48. package/dist/http/authentication.d.ts.map +1 -0
  49. package/dist/http/authentication.js +36 -0
  50. package/dist/http/authentication.js.map +1 -0
  51. package/dist/http/health-route.d.ts +10 -0
  52. package/dist/http/health-route.d.ts.map +1 -0
  53. package/dist/http/health-route.js +18 -0
  54. package/dist/http/health-route.js.map +1 -0
  55. package/dist/http/metrics-route.d.ts +8 -0
  56. package/dist/http/metrics-route.d.ts.map +1 -0
  57. package/dist/http/metrics-route.js +11 -0
  58. package/dist/http/metrics-route.js.map +1 -0
  59. package/dist/index.d.ts +3 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +134 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/mcp/mcp-route.d.ts +12 -0
  64. package/dist/mcp/mcp-route.d.ts.map +1 -0
  65. package/dist/mcp/mcp-route.js +49 -0
  66. package/dist/mcp/mcp-route.js.map +1 -0
  67. package/dist/mcp/mcp-server-factory.d.ts +20 -0
  68. package/dist/mcp/mcp-server-factory.d.ts.map +1 -0
  69. package/dist/mcp/mcp-server-factory.js +23 -0
  70. package/dist/mcp/mcp-server-factory.js.map +1 -0
  71. package/dist/mcp/session-manager.d.ts +30 -0
  72. package/dist/mcp/session-manager.d.ts.map +1 -0
  73. package/dist/mcp/session-manager.js +38 -0
  74. package/dist/mcp/session-manager.js.map +1 -0
  75. package/dist/mcp/tool-registry.d.ts +15 -0
  76. package/dist/mcp/tool-registry.d.ts.map +1 -0
  77. package/dist/mcp/tool-registry.js +27 -0
  78. package/dist/mcp/tool-registry.js.map +1 -0
  79. package/dist/observability/logger.d.ts +16 -0
  80. package/dist/observability/logger.d.ts.map +1 -0
  81. package/dist/observability/logger.js +19 -0
  82. package/dist/observability/logger.js.map +1 -0
  83. package/dist/observability/metrics.d.ts +27 -0
  84. package/dist/observability/metrics.d.ts.map +1 -0
  85. package/dist/observability/metrics.js +72 -0
  86. package/dist/observability/metrics.js.map +1 -0
  87. package/dist/protocol/command.d.ts +92 -0
  88. package/dist/protocol/command.d.ts.map +1 -0
  89. package/dist/protocol/command.js +37 -0
  90. package/dist/protocol/command.js.map +1 -0
  91. package/dist/protocol/event.d.ts +82 -0
  92. package/dist/protocol/event.d.ts.map +1 -0
  93. package/dist/protocol/event.js +37 -0
  94. package/dist/protocol/event.js.map +1 -0
  95. package/dist/protocol/handshake.d.ts +150 -0
  96. package/dist/protocol/handshake.d.ts.map +1 -0
  97. package/dist/protocol/handshake.js +65 -0
  98. package/dist/protocol/handshake.js.map +1 -0
  99. package/dist/protocol/index.d.ts +14 -0
  100. package/dist/protocol/index.d.ts.map +1 -0
  101. package/dist/protocol/index.js +14 -0
  102. package/dist/protocol/index.js.map +1 -0
  103. package/dist/protocol/protocol-version.d.ts +18 -0
  104. package/dist/protocol/protocol-version.d.ts.map +1 -0
  105. package/dist/protocol/protocol-version.js +28 -0
  106. package/dist/protocol/protocol-version.js.map +1 -0
  107. package/dist/protocol/result.d.ts +79 -0
  108. package/dist/protocol/result.d.ts.map +1 -0
  109. package/dist/protocol/result.js +35 -0
  110. package/dist/protocol/result.js.map +1 -0
  111. package/dist/queue/command-id.d.ts +15 -0
  112. package/dist/queue/command-id.d.ts.map +1 -0
  113. package/dist/queue/command-id.js +38 -0
  114. package/dist/queue/command-id.js.map +1 -0
  115. package/dist/queue/command-queue.d.ts +90 -0
  116. package/dist/queue/command-queue.d.ts.map +1 -0
  117. package/dist/queue/command-queue.js +151 -0
  118. package/dist/queue/command-queue.js.map +1 -0
  119. package/dist/queue/command-throttle.d.ts +38 -0
  120. package/dist/queue/command-throttle.d.ts.map +1 -0
  121. package/dist/queue/command-throttle.js +26 -0
  122. package/dist/queue/command-throttle.js.map +1 -0
  123. package/dist/queue/instrumented-command-queue.d.ts +9 -0
  124. package/dist/queue/instrumented-command-queue.d.ts.map +1 -0
  125. package/dist/queue/instrumented-command-queue.js +39 -0
  126. package/dist/queue/instrumented-command-queue.js.map +1 -0
  127. package/dist/queue/pending-commands.d.ts +35 -0
  128. package/dist/queue/pending-commands.d.ts.map +1 -0
  129. package/dist/queue/pending-commands.js +41 -0
  130. package/dist/queue/pending-commands.js.map +1 -0
  131. package/dist/server-info.d.ts +5 -0
  132. package/dist/server-info.d.ts.map +1 -0
  133. package/dist/server-info.js +22 -0
  134. package/dist/server-info.js.map +1 -0
  135. package/dist/structures/structure-file-store.d.ts +22 -0
  136. package/dist/structures/structure-file-store.d.ts.map +1 -0
  137. package/dist/structures/structure-file-store.js +89 -0
  138. package/dist/structures/structure-file-store.js.map +1 -0
  139. package/dist/tools/block-tools.d.ts +4 -0
  140. package/dist/tools/block-tools.d.ts.map +1 -0
  141. package/dist/tools/block-tools.js +111 -0
  142. package/dist/tools/block-tools.js.map +1 -0
  143. package/dist/tools/command-tools.d.ts +4 -0
  144. package/dist/tools/command-tools.d.ts.map +1 -0
  145. package/dist/tools/command-tools.js +23 -0
  146. package/dist/tools/command-tools.js.map +1 -0
  147. package/dist/tools/common-schemas.d.ts +65 -0
  148. package/dist/tools/common-schemas.d.ts.map +1 -0
  149. package/dist/tools/common-schemas.js +32 -0
  150. package/dist/tools/common-schemas.js.map +1 -0
  151. package/dist/tools/effect-tools.d.ts +4 -0
  152. package/dist/tools/effect-tools.d.ts.map +1 -0
  153. package/dist/tools/effect-tools.js +32 -0
  154. package/dist/tools/effect-tools.js.map +1 -0
  155. package/dist/tools/entity-tools.d.ts +4 -0
  156. package/dist/tools/entity-tools.d.ts.map +1 -0
  157. package/dist/tools/entity-tools.js +133 -0
  158. package/dist/tools/entity-tools.js.map +1 -0
  159. package/dist/tools/event-tools.d.ts +4 -0
  160. package/dist/tools/event-tools.d.ts.map +1 -0
  161. package/dist/tools/event-tools.js +84 -0
  162. package/dist/tools/event-tools.js.map +1 -0
  163. package/dist/tools/index.d.ts +4 -0
  164. package/dist/tools/index.d.ts.map +1 -0
  165. package/dist/tools/index.js +30 -0
  166. package/dist/tools/index.js.map +1 -0
  167. package/dist/tools/inventory-tools.d.ts +4 -0
  168. package/dist/tools/inventory-tools.d.ts.map +1 -0
  169. package/dist/tools/inventory-tools.js +52 -0
  170. package/dist/tools/inventory-tools.js.map +1 -0
  171. package/dist/tools/player-tools.d.ts +4 -0
  172. package/dist/tools/player-tools.d.ts.map +1 -0
  173. package/dist/tools/player-tools.js +117 -0
  174. package/dist/tools/player-tools.js.map +1 -0
  175. package/dist/tools/property-tools.d.ts +4 -0
  176. package/dist/tools/property-tools.d.ts.map +1 -0
  177. package/dist/tools/property-tools.js +45 -0
  178. package/dist/tools/property-tools.js.map +1 -0
  179. package/dist/tools/scoreboard-tools.d.ts +4 -0
  180. package/dist/tools/scoreboard-tools.d.ts.map +1 -0
  181. package/dist/tools/scoreboard-tools.js +68 -0
  182. package/dist/tools/scoreboard-tools.js.map +1 -0
  183. package/dist/tools/server-tools.d.ts +4 -0
  184. package/dist/tools/server-tools.d.ts.map +1 -0
  185. package/dist/tools/server-tools.js +25 -0
  186. package/dist/tools/server-tools.js.map +1 -0
  187. package/dist/tools/structure-file-tools.d.ts +4 -0
  188. package/dist/tools/structure-file-tools.d.ts.map +1 -0
  189. package/dist/tools/structure-file-tools.js +57 -0
  190. package/dist/tools/structure-file-tools.js.map +1 -0
  191. package/dist/tools/structure-tools.d.ts +4 -0
  192. package/dist/tools/structure-tools.d.ts.map +1 -0
  193. package/dist/tools/structure-tools.js +91 -0
  194. package/dist/tools/structure-tools.js.map +1 -0
  195. package/dist/tools/tool-definition.d.ts +68 -0
  196. package/dist/tools/tool-definition.d.ts.map +1 -0
  197. package/dist/tools/tool-definition.js +40 -0
  198. package/dist/tools/tool-definition.js.map +1 -0
  199. package/dist/tools/tool-result.d.ts +17 -0
  200. package/dist/tools/tool-result.d.ts.map +1 -0
  201. package/dist/tools/tool-result.js +52 -0
  202. package/dist/tools/tool-result.js.map +1 -0
  203. package/dist/tools/world-tools.d.ts +4 -0
  204. package/dist/tools/world-tools.d.ts.map +1 -0
  205. package/dist/tools/world-tools.js +97 -0
  206. package/dist/tools/world-tools.js.map +1 -0
  207. package/package.json +69 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/mcp/session-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAOzD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,6BAA6B,GAAG,SAAS,CAAC;IAClE;;;;OAIG;IACH,MAAM,IAAI,OAAO,CAAC,6BAA6B,CAAC,CAAC;IACjD,sCAAsC;IACtC,KAAK,IAAI,MAAM,CAAC;IAChB,4DAA4D;IAC5D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,sDAAsD;AACtD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,EAAE,MAAM,SAAS,CAAC;CACxC;AAED,+CAA+C;AAC/C,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc,CAuCnF"}
@@ -0,0 +1,38 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
3
+ /** Creates an empty {@link SessionManager}. */
4
+ export function createSessionManager(options) {
5
+ const sessions = new Map();
6
+ return {
7
+ get(sessionId) {
8
+ return sessions.get(sessionId)?.transport;
9
+ },
10
+ async create() {
11
+ const server = options.createServer();
12
+ const transport = new StreamableHTTPServerTransport({
13
+ sessionIdGenerator: () => randomUUID(),
14
+ onsessioninitialized: (sessionId) => {
15
+ sessions.set(sessionId, { server, transport });
16
+ options.logger.info({ sessionId, sessionCount: sessions.size }, "mcp session opened");
17
+ },
18
+ });
19
+ transport.onclose = () => {
20
+ const sessionId = transport.sessionId;
21
+ if (sessionId !== undefined && sessions.delete(sessionId)) {
22
+ options.logger.info({ sessionId, sessionCount: sessions.size }, "mcp session closed");
23
+ }
24
+ };
25
+ await server.connect(transport);
26
+ return transport;
27
+ },
28
+ count() {
29
+ return sessions.size;
30
+ },
31
+ async closeAll() {
32
+ const open = [...sessions.values()];
33
+ sessions.clear();
34
+ await Promise.allSettled(open.flatMap((session) => [session.transport.close(), session.server.close()]));
35
+ },
36
+ };
37
+ }
38
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/mcp/session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAmCnG,+CAA+C;AAC/C,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IACjE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE/C,OAAO;QACL,GAAG,CAAC,SAAS;YACX,OAAO,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;QAC5C,CAAC;QAED,KAAK,CAAC,MAAM;YACV,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;gBAClD,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;gBACtC,oBAAoB,EAAE,CAAC,SAAS,EAAE,EAAE;oBAClC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;oBAC/C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,oBAAoB,CAAC,CAAC;gBACxF,CAAC;aACF,CAAC,CAAC;YACH,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;gBACvB,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;gBACtC,IAAI,SAAS,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC1D,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,oBAAoB,CAAC,CAAC;gBACxF,CAAC;YACH,CAAC,CAAC;YACF,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,KAAK;YACH,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAED,KAAK,CAAC,QAAQ;YACZ,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACpC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,OAAO,CAAC,UAAU,CACtB,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAC/E,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ToolContext, ToolDefinition } from "../tools/tool-definition.js";
3
+ /** Builds a per-invocation {@link ToolContext} from MCP request metadata. */
4
+ export type ToolContextFactory = (extra: {
5
+ readonly signal: AbortSignal;
6
+ readonly requestId: string | number;
7
+ }) => ToolContext;
8
+ /**
9
+ * Registers every tool definition on an MCP server.
10
+ *
11
+ * Each handler is wrapped so that a thrown error becomes a coded error
12
+ * envelope rather than a transport-level failure.
13
+ */
14
+ export declare function registerTools(server: McpServer, tools: readonly ToolDefinition[], contextFor: ToolContextFactory): void;
15
+ //# sourceMappingURL=tool-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../src/mcp/tool-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAG/E,6EAA6E;AAC7E,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE;IACvC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CACrC,KAAK,WAAW,CAAC;AAElB;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,UAAU,EAAE,kBAAkB,GAC7B,IAAI,CAqBN"}
@@ -0,0 +1,27 @@
1
+ import { toErrorResult } from "../tools/tool-result.js";
2
+ /**
3
+ * Registers every tool definition on an MCP server.
4
+ *
5
+ * Each handler is wrapped so that a thrown error becomes a coded error
6
+ * envelope rather than a transport-level failure.
7
+ */
8
+ export function registerTools(server, tools, contextFor) {
9
+ for (const tool of tools) {
10
+ server.registerTool(tool.name, {
11
+ title: tool.title,
12
+ description: tool.description,
13
+ inputSchema: tool.inputShape,
14
+ annotations: tool.annotations,
15
+ }, async (input, extra) => {
16
+ const context = contextFor({ signal: extra.signal, requestId: extra.requestId });
17
+ try {
18
+ return await tool.handler(input, context);
19
+ }
20
+ catch (error) {
21
+ context.logger.error({ err: error, tool: tool.name }, "tool handler failed");
22
+ return toErrorResult(error);
23
+ }
24
+ });
25
+ }
26
+ }
27
+ //# sourceMappingURL=tool-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../src/mcp/tool-registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAQxD;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAiB,EACjB,KAAgC,EAChC,UAA8B;IAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,YAAY,CACjB,IAAI,CAAC,IAAI,EACT;YACE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,UAAU;YAC5B,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,EACD,KAAK,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE;YAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;YACjF,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,qBAAqB,CAAC,CAAC;gBAC7E,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type Logger } from "pino";
2
+ export type { Logger };
3
+ /** Options for {@link createLogger}. */
4
+ export interface LoggerOptions {
5
+ /** pino log level. */
6
+ readonly level: string;
7
+ /** When true, render human-readable logs via `pino-pretty` (development). */
8
+ readonly pretty: boolean;
9
+ }
10
+ /**
11
+ * Creates the application's root structured logger.
12
+ *
13
+ * Bearer tokens and `Authorization` headers are redacted from every log line.
14
+ */
15
+ export declare function createLogger(options: LoggerOptions): Logger;
16
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/observability/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAEzC,YAAY,EAAE,MAAM,EAAE,CAAC;AAEvB,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,sBAAsB;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAW3D"}
@@ -0,0 +1,19 @@
1
+ import { pino } from "pino";
2
+ /**
3
+ * Creates the application's root structured logger.
4
+ *
5
+ * Bearer tokens and `Authorization` headers are redacted from every log line.
6
+ */
7
+ export function createLogger(options) {
8
+ return pino({
9
+ level: options.level,
10
+ redact: {
11
+ paths: ["req.headers.authorization", "headers.authorization", "authorization", "*.token"],
12
+ remove: true,
13
+ },
14
+ ...(options.pretty
15
+ ? { transport: { target: "pino-pretty", options: { translateTime: "SYS:standard" } } }
16
+ : {}),
17
+ });
18
+ }
19
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/observability/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,MAAM,CAAC;AAYzC;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,OAAsB;IACjD,OAAO,IAAI,CAAC;QACV,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE;YACN,KAAK,EAAE,CAAC,2BAA2B,EAAE,uBAAuB,EAAE,eAAe,EAAE,SAAS,CAAC;YACzF,MAAM,EAAE,IAAI;SACb;QACD,GAAG,CAAC,OAAO,CAAC,MAAM;YAChB,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,cAAc,EAAE,EAAE,EAAE;YACtF,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { Registry } from "prom-client";
2
+ /** A completed bridge command, observed for metrics. */
3
+ export interface CommandObservation {
4
+ readonly kind: string;
5
+ readonly status: "ok" | "error";
6
+ readonly code?: string;
7
+ readonly durationMs: number;
8
+ }
9
+ /** Live values the queue gauges read at scrape time. */
10
+ export interface MetricsCollectors {
11
+ readonly queueDepth: () => number;
12
+ readonly commandsInFlight: () => number;
13
+ readonly bridgeConnected: () => boolean;
14
+ readonly mcpSessions: () => number;
15
+ }
16
+ /** Records server events and renders the Prometheus exposition. */
17
+ export interface Metrics {
18
+ /** The Prometheus registry, rendered by the `/metrics` route. */
19
+ readonly registry: Registry;
20
+ /** Records a completed HTTP request. */
21
+ recordHttpRequest(method: string, statusCode: number): void;
22
+ /** Records a completed bridge command. */
23
+ recordCommand(observation: CommandObservation): void;
24
+ }
25
+ /** Creates a {@link Metrics} façade backed by a private Prometheus registry. */
26
+ export declare function createMetrics(collectors: MetricsCollectors): Metrics;
27
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/observability/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,QAAQ,EAAE,MAAM,aAAa,CAAC;AAElE,wDAAwD;AACxD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,wDAAwD;AACxD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,MAAM,CAAC;IACxC,QAAQ,CAAC,eAAe,EAAE,MAAM,OAAO,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,MAAM,CAAC;CACpC;AAED,mEAAmE;AACnE,MAAM,WAAW,OAAO;IACtB,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,wCAAwC;IACxC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5D,0CAA0C;IAC1C,aAAa,CAAC,WAAW,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACtD;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAyEpE"}
@@ -0,0 +1,72 @@
1
+ import { Counter, Gauge, Histogram, Registry } from "prom-client";
2
+ /** Creates a {@link Metrics} façade backed by a private Prometheus registry. */
3
+ export function createMetrics(collectors) {
4
+ const registry = new Registry();
5
+ const httpRequests = new Counter({
6
+ name: "bridge_http_requests_total",
7
+ help: "Total HTTP requests by method and response status.",
8
+ labelNames: ["method", "status"],
9
+ registers: [registry],
10
+ });
11
+ const commandDuration = new Histogram({
12
+ name: "bridge_command_duration_seconds",
13
+ help: "Bridge command round-trip duration by kind and status.",
14
+ labelNames: ["kind", "status"],
15
+ buckets: [0.05, 0.1, 0.25, 0.5, 1, 2, 5, 10, 15],
16
+ registers: [registry],
17
+ });
18
+ const commandResults = new Counter({
19
+ name: "bridge_command_results_total",
20
+ help: "Bridge command outcomes by kind, status, and error code.",
21
+ labelNames: ["kind", "status", "code"],
22
+ registers: [registry],
23
+ });
24
+ // Gauges sample live state through the collectors when the registry is scraped.
25
+ const _queueDepth = new Gauge({
26
+ name: "bridge_command_queue_depth",
27
+ help: "Commands enqueued but not yet dequeued.",
28
+ registers: [registry],
29
+ collect() {
30
+ this.set(collectors.queueDepth());
31
+ },
32
+ });
33
+ const _commandsInFlight = new Gauge({
34
+ name: "bridge_commands_in_flight",
35
+ help: "Commands dequeued but not yet settled.",
36
+ registers: [registry],
37
+ collect() {
38
+ this.set(collectors.commandsInFlight());
39
+ },
40
+ });
41
+ const _bridgeConnected = new Gauge({
42
+ name: "bridge_connected",
43
+ help: "Whether a behavior pack is connected (1) or not (0).",
44
+ registers: [registry],
45
+ collect() {
46
+ this.set(collectors.bridgeConnected() ? 1 : 0);
47
+ },
48
+ });
49
+ const _mcpSessions = new Gauge({
50
+ name: "bridge_mcp_sessions",
51
+ help: "Open MCP client sessions.",
52
+ registers: [registry],
53
+ collect() {
54
+ this.set(collectors.mcpSessions());
55
+ },
56
+ });
57
+ return {
58
+ registry,
59
+ recordHttpRequest(method, statusCode) {
60
+ httpRequests.inc({ method, status: String(statusCode) });
61
+ },
62
+ recordCommand(observation) {
63
+ commandDuration.observe({ kind: observation.kind, status: observation.status }, observation.durationMs / 1000);
64
+ commandResults.inc({
65
+ kind: observation.kind,
66
+ status: observation.status,
67
+ code: observation.code ?? "",
68
+ });
69
+ },
70
+ };
71
+ }
72
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/observability/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Pattern for a command identifier: the literal `cmd_` followed by a 26-char
4
+ * Crockford base32 ULID.
5
+ */
6
+ export declare const COMMAND_ID_PATTERN: RegExp;
7
+ /** A command identifier, correlating a queued command with its result. */
8
+ export declare const CommandIdSchema: z.ZodString;
9
+ /**
10
+ * A single command delivered to the behavior pack via `GET /bridge/poll`.
11
+ *
12
+ * `payload` is intentionally opaque at the protocol layer; it is validated
13
+ * against the originating MCP tool's input schema before the command is
14
+ * enqueued.
15
+ */
16
+ export declare const CommandSchema: z.ZodObject<{
17
+ /** Correlation identifier (`cmd_<ULID>`). */
18
+ id: z.ZodString;
19
+ /** Command kind — the MCP tool name, e.g. `mc_block_set`. */
20
+ kind: z.ZodString;
21
+ /** Command arguments, validated per-kind at the tool layer. */
22
+ payload: z.ZodUnknown;
23
+ /** ISO-8601 timestamp at which the server issued the command. */
24
+ issued_at: z.ZodString;
25
+ /** Milliseconds of execution budget remaining when the command was delivered. */
26
+ deadline_ms: z.ZodNumber;
27
+ }, "strip", z.ZodTypeAny, {
28
+ id: string;
29
+ kind: string;
30
+ issued_at: string;
31
+ deadline_ms: number;
32
+ payload?: unknown;
33
+ }, {
34
+ id: string;
35
+ kind: string;
36
+ issued_at: string;
37
+ deadline_ms: number;
38
+ payload?: unknown;
39
+ }>;
40
+ /** A single command delivered to the behavior pack. */
41
+ export type Command = z.infer<typeof CommandSchema>;
42
+ /** The response envelope for `GET /bridge/poll`. */
43
+ export declare const PollResponseSchema: z.ZodObject<{
44
+ /** Commands to execute; empty when the long poll timed out. */
45
+ commands: z.ZodArray<z.ZodObject<{
46
+ /** Correlation identifier (`cmd_<ULID>`). */
47
+ id: z.ZodString;
48
+ /** Command kind — the MCP tool name, e.g. `mc_block_set`. */
49
+ kind: z.ZodString;
50
+ /** Command arguments, validated per-kind at the tool layer. */
51
+ payload: z.ZodUnknown;
52
+ /** ISO-8601 timestamp at which the server issued the command. */
53
+ issued_at: z.ZodString;
54
+ /** Milliseconds of execution budget remaining when the command was delivered. */
55
+ deadline_ms: z.ZodNumber;
56
+ }, "strip", z.ZodTypeAny, {
57
+ id: string;
58
+ kind: string;
59
+ issued_at: string;
60
+ deadline_ms: number;
61
+ payload?: unknown;
62
+ }, {
63
+ id: string;
64
+ kind: string;
65
+ issued_at: string;
66
+ deadline_ms: number;
67
+ payload?: unknown;
68
+ }>, "many">;
69
+ /** ISO-8601 server timestamp, for behavior-pack clock-skew diagnostics. */
70
+ server_time: z.ZodString;
71
+ }, "strip", z.ZodTypeAny, {
72
+ commands: {
73
+ id: string;
74
+ kind: string;
75
+ issued_at: string;
76
+ deadline_ms: number;
77
+ payload?: unknown;
78
+ }[];
79
+ server_time: string;
80
+ }, {
81
+ commands: {
82
+ id: string;
83
+ kind: string;
84
+ issued_at: string;
85
+ deadline_ms: number;
86
+ payload?: unknown;
87
+ }[];
88
+ server_time: string;
89
+ }>;
90
+ /** The response envelope for `GET /bridge/poll`. */
91
+ export type PollResponse = z.infer<typeof PollResponseSchema>;
92
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/protocol/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,eAAO,MAAM,kBAAkB,QAAiC,CAAC;AAEjE,0EAA0E;AAC1E,eAAO,MAAM,eAAe,aAEoC,CAAC;AAEjE;;;;;;GAMG;AACH,eAAO,MAAM,aAAa;IACxB,6CAA6C;;IAE7C,6DAA6D;;IAE7D,+DAA+D;;IAE/D,iEAAiE;;IAEjE,iFAAiF;;;;;;;;;;;;;;EAEjF,CAAC;AAEH,uDAAuD;AACvD,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEpD,oDAAoD;AACpD,eAAO,MAAM,kBAAkB;IAC7B,+DAA+D;;QAjB/D,6CAA6C;;QAE7C,6DAA6D;;QAE7D,+DAA+D;;QAE/D,iEAAiE;;QAEjE,iFAAiF;;;;;;;;;;;;;;;IAWjF,2EAA2E;;;;;;;;;;;;;;;;;;;;EAE3E,CAAC;AAEH,oDAAoD;AACpD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Pattern for a command identifier: the literal `cmd_` followed by a 26-char
4
+ * Crockford base32 ULID.
5
+ */
6
+ export const COMMAND_ID_PATTERN = /^cmd_[0-9A-HJKMNP-TV-Z]{26}$/;
7
+ /** A command identifier, correlating a queued command with its result. */
8
+ export const CommandIdSchema = z
9
+ .string()
10
+ .regex(COMMAND_ID_PATTERN, "expected a cmd_<ULID> identifier");
11
+ /**
12
+ * A single command delivered to the behavior pack via `GET /bridge/poll`.
13
+ *
14
+ * `payload` is intentionally opaque at the protocol layer; it is validated
15
+ * against the originating MCP tool's input schema before the command is
16
+ * enqueued.
17
+ */
18
+ export const CommandSchema = z.object({
19
+ /** Correlation identifier (`cmd_<ULID>`). */
20
+ id: CommandIdSchema,
21
+ /** Command kind — the MCP tool name, e.g. `mc_block_set`. */
22
+ kind: z.string().min(1),
23
+ /** Command arguments, validated per-kind at the tool layer. */
24
+ payload: z.unknown(),
25
+ /** ISO-8601 timestamp at which the server issued the command. */
26
+ issued_at: z.string().datetime(),
27
+ /** Milliseconds of execution budget remaining when the command was delivered. */
28
+ deadline_ms: z.number().int().positive(),
29
+ });
30
+ /** The response envelope for `GET /bridge/poll`. */
31
+ export const PollResponseSchema = z.object({
32
+ /** Commands to execute; empty when the long poll timed out. */
33
+ commands: z.array(CommandSchema),
34
+ /** ISO-8601 server timestamp, for behavior-pack clock-skew diagnostics. */
35
+ server_time: z.string().datetime(),
36
+ });
37
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/protocol/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,8BAA8B,CAAC;AAEjE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC7B,MAAM,EAAE;KACR,KAAK,CAAC,kBAAkB,EAAE,kCAAkC,CAAC,CAAC;AAEjE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,6CAA6C;IAC7C,EAAE,EAAE,eAAe;IACnB,6DAA6D;IAC7D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,+DAA+D;IAC/D,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,iEAAiE;IACjE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,iFAAiF;IACjF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CACzC,CAAC,CAAC;AAKH,oDAAoD;AACpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,+DAA+D;IAC/D,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;IAChC,2EAA2E;IAC3E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Pattern for a subscription identifier: the literal `sub_` followed by a
4
+ * 26-char Crockford base32 ULID.
5
+ */
6
+ export declare const SUBSCRIPTION_ID_PATTERN: RegExp;
7
+ /** A subscription identifier, issued by `mc_event_subscribe`. */
8
+ export declare const SubscriptionIdSchema: z.ZodString;
9
+ /**
10
+ * A world event observed by the behavior pack for an active subscription.
11
+ *
12
+ * The behavior pack does not assign an ordering cursor; the server stamps an
13
+ * ingest sequence as it buffers events, so `mc_event_poll` cursors stay under
14
+ * server control.
15
+ */
16
+ export declare const BridgeEventSchema: z.ZodObject<{
17
+ /** The subscription this event belongs to. */
18
+ subscription_id: z.ZodString;
19
+ /** Event type, e.g. `playerJoin` or `blockBreak`. */
20
+ event_type: z.ZodString;
21
+ /** ISO-8601 timestamp at which the event occurred in-world. */
22
+ occurred_at: z.ZodString;
23
+ /** Event-specific data. */
24
+ payload: z.ZodUnknown;
25
+ }, "strip", z.ZodTypeAny, {
26
+ subscription_id: string;
27
+ event_type: string;
28
+ occurred_at: string;
29
+ payload?: unknown;
30
+ }, {
31
+ subscription_id: string;
32
+ event_type: string;
33
+ occurred_at: string;
34
+ payload?: unknown;
35
+ }>;
36
+ /** A world event observed by the behavior pack. */
37
+ export type BridgeEvent = z.infer<typeof BridgeEventSchema>;
38
+ /**
39
+ * The request envelope for `POST /bridge/event`.
40
+ *
41
+ * Events are batched: behavior packs fire bursts (e.g. `blockBreak`), and one
42
+ * HTTP request per event would overwhelm the bridge.
43
+ */
44
+ export declare const EventReportSchema: z.ZodObject<{
45
+ events: z.ZodArray<z.ZodObject<{
46
+ /** The subscription this event belongs to. */
47
+ subscription_id: z.ZodString;
48
+ /** Event type, e.g. `playerJoin` or `blockBreak`. */
49
+ event_type: z.ZodString;
50
+ /** ISO-8601 timestamp at which the event occurred in-world. */
51
+ occurred_at: z.ZodString;
52
+ /** Event-specific data. */
53
+ payload: z.ZodUnknown;
54
+ }, "strip", z.ZodTypeAny, {
55
+ subscription_id: string;
56
+ event_type: string;
57
+ occurred_at: string;
58
+ payload?: unknown;
59
+ }, {
60
+ subscription_id: string;
61
+ event_type: string;
62
+ occurred_at: string;
63
+ payload?: unknown;
64
+ }>, "many">;
65
+ }, "strip", z.ZodTypeAny, {
66
+ events: {
67
+ subscription_id: string;
68
+ event_type: string;
69
+ occurred_at: string;
70
+ payload?: unknown;
71
+ }[];
72
+ }, {
73
+ events: {
74
+ subscription_id: string;
75
+ event_type: string;
76
+ occurred_at: string;
77
+ payload?: unknown;
78
+ }[];
79
+ }>;
80
+ /** The request envelope for `POST /bridge/event`. */
81
+ export type EventReport = z.infer<typeof EventReportSchema>;
82
+ //# sourceMappingURL=event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/protocol/event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,eAAO,MAAM,uBAAuB,QAAiC,CAAC;AAEtE,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,aAEoC,CAAC;AAEtE;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB;IAC5B,8CAA8C;;IAE9C,qDAAqD;;IAErD,+DAA+D;;IAE/D,2BAA2B;;;;;;;;;;;;EAE3B,CAAC;AAEH,mDAAmD;AACnD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB;;QAnB5B,8CAA8C;;QAE9C,qDAAqD;;QAErD,+DAA+D;;QAE/D,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;EAe3B,CAAC;AAEH,qDAAqD;AACrD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Pattern for a subscription identifier: the literal `sub_` followed by a
4
+ * 26-char Crockford base32 ULID.
5
+ */
6
+ export const SUBSCRIPTION_ID_PATTERN = /^sub_[0-9A-HJKMNP-TV-Z]{26}$/;
7
+ /** A subscription identifier, issued by `mc_event_subscribe`. */
8
+ export const SubscriptionIdSchema = z
9
+ .string()
10
+ .regex(SUBSCRIPTION_ID_PATTERN, "expected a sub_<ULID> identifier");
11
+ /**
12
+ * A world event observed by the behavior pack for an active subscription.
13
+ *
14
+ * The behavior pack does not assign an ordering cursor; the server stamps an
15
+ * ingest sequence as it buffers events, so `mc_event_poll` cursors stay under
16
+ * server control.
17
+ */
18
+ export const BridgeEventSchema = z.object({
19
+ /** The subscription this event belongs to. */
20
+ subscription_id: SubscriptionIdSchema,
21
+ /** Event type, e.g. `playerJoin` or `blockBreak`. */
22
+ event_type: z.string().min(1),
23
+ /** ISO-8601 timestamp at which the event occurred in-world. */
24
+ occurred_at: z.string().datetime(),
25
+ /** Event-specific data. */
26
+ payload: z.unknown(),
27
+ });
28
+ /**
29
+ * The request envelope for `POST /bridge/event`.
30
+ *
31
+ * Events are batched: behavior packs fire bursts (e.g. `blockBreak`), and one
32
+ * HTTP request per event would overwhelm the bridge.
33
+ */
34
+ export const EventReportSchema = z.object({
35
+ events: z.array(BridgeEventSchema).min(1).max(256),
36
+ });
37
+ //# sourceMappingURL=event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../../src/protocol/event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,8BAA8B,CAAC;AAEtE,iEAAiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC;KAClC,MAAM,EAAE;KACR,KAAK,CAAC,uBAAuB,EAAE,kCAAkC,CAAC,CAAC;AAEtE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,8CAA8C;IAC9C,eAAe,EAAE,oBAAoB;IACrC,qDAAqD;IACrD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,+DAA+D;IAC/D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,2BAA2B;IAC3B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;CACrB,CAAC,CAAC;AAKH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;CACnD,CAAC,CAAC"}