stitchkit 0.44.1 → 0.46.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 (104) hide show
  1. package/README.md +1 -1
  2. package/dist/browser/http.d.ts.map +1 -1
  3. package/dist/browser/socket-io.d.ts +16 -0
  4. package/dist/browser/socket-io.d.ts.map +1 -1
  5. package/dist/cli.js +3 -4
  6. package/dist/contract/errors.d.ts +1 -0
  7. package/dist/contract/errors.d.ts.map +1 -1
  8. package/dist/contract/index.js +2 -2
  9. package/dist/{index-yh0p5ddn.js → index-5s8b7z6q.js} +31 -11
  10. package/dist/{index-mvjyq9h9.js → index-62pqb23z.js} +309 -144
  11. package/dist/index-c40tkxcd.js +181 -0
  12. package/dist/{index-r6czv7yt.js → index-pwyedf7b.js} +4 -3
  13. package/dist/{index-6jypn22c.js → index-r1qp4rve.js} +9 -1
  14. package/dist/{index-s4qsmgwe.js → index-tss6bk5c.js} +4 -1
  15. package/dist/{index-36f1xkdb.js → index-w1s873ng.js} +2 -2
  16. package/dist/index-yxpe3phd.js +63 -0
  17. package/dist/{index-4fyn9f09.js → index-zwqty9zf.js} +396 -246
  18. package/dist/index.d.ts +4 -2
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +266 -17
  21. package/dist/internal/errors.d.ts.map +1 -1
  22. package/dist/internal/secure-fetch.d.ts +23 -3
  23. package/dist/internal/secure-fetch.d.ts.map +1 -1
  24. package/dist/internal/typed.d.ts +7 -0
  25. package/dist/internal/typed.d.ts.map +1 -1
  26. package/dist/internal/within-dir.d.ts +6 -0
  27. package/dist/internal/within-dir.d.ts.map +1 -1
  28. package/dist/logger.d.ts +8 -0
  29. package/dist/logger.d.ts.map +1 -0
  30. package/dist/node.d.ts +1 -0
  31. package/dist/node.d.ts.map +1 -1
  32. package/dist/node.js +5 -4
  33. package/dist/observability/audit.d.ts.map +1 -1
  34. package/dist/observability/event.d.ts +7 -0
  35. package/dist/observability/event.d.ts.map +1 -1
  36. package/dist/observability/index.js +54 -125
  37. package/dist/observability/sanitize.d.ts +8 -1
  38. package/dist/observability/sanitize.d.ts.map +1 -1
  39. package/dist/observability/trace.d.ts +3 -1
  40. package/dist/observability/trace.d.ts.map +1 -1
  41. package/dist/react/cache-bridge.d.ts +4 -0
  42. package/dist/react/cache-bridge.d.ts.map +1 -1
  43. package/dist/react.js +46 -5
  44. package/dist/realtime/contract.d.ts +39 -0
  45. package/dist/realtime/contract.d.ts.map +1 -0
  46. package/dist/realtime/index.d.ts +3 -0
  47. package/dist/realtime/index.d.ts.map +1 -0
  48. package/dist/realtime/rejection.d.ts +10 -0
  49. package/dist/realtime/rejection.d.ts.map +1 -0
  50. package/dist/realtime/socket.d.ts +30 -0
  51. package/dist/realtime/socket.d.ts.map +1 -0
  52. package/dist/server/cache.d.ts +5 -1
  53. package/dist/server/cache.d.ts.map +1 -1
  54. package/dist/server/error-hook.d.ts +1 -0
  55. package/dist/server/error-hook.d.ts.map +1 -1
  56. package/dist/server/file.d.ts +6 -0
  57. package/dist/server/file.d.ts.map +1 -1
  58. package/dist/server/implement.d.ts.map +1 -1
  59. package/dist/server/index.d.ts +3 -3
  60. package/dist/server/index.d.ts.map +1 -1
  61. package/dist/server/index.js +110 -11
  62. package/dist/server/middleware/cors.d.ts.map +1 -1
  63. package/dist/server/openapi.d.ts.map +1 -1
  64. package/dist/server/realtime.d.ts +24 -0
  65. package/dist/server/realtime.d.ts.map +1 -0
  66. package/dist/server/router.d.ts +0 -8
  67. package/dist/server/router.d.ts.map +1 -1
  68. package/dist/server/stream.d.ts.map +1 -1
  69. package/dist/server/types.d.ts +2 -7
  70. package/dist/server/types.d.ts.map +1 -1
  71. package/dist/tools/cli-args.d.ts +11 -3
  72. package/dist/tools/cli-args.d.ts.map +1 -1
  73. package/dist/tools/cli.d.ts +5 -0
  74. package/dist/tools/cli.d.ts.map +1 -1
  75. package/dist/tools/coerce.d.ts.map +1 -1
  76. package/dist/tools/json-schema.d.ts.map +1 -1
  77. package/dist/tools/mcp-handler.d.ts +4 -3
  78. package/dist/tools/mcp-handler.d.ts.map +1 -1
  79. package/dist/tools/mcp-prepare.d.ts +95 -0
  80. package/dist/tools/mcp-prepare.d.ts.map +1 -0
  81. package/dist/tools/mcp-round.d.ts +4 -0
  82. package/dist/tools/mcp-round.d.ts.map +1 -1
  83. package/dist/tools/mcp-stdio.d.ts +2 -1
  84. package/dist/tools/mcp-stdio.d.ts.map +1 -1
  85. package/dist/tools/mcp.d.ts +2 -78
  86. package/dist/tools/mcp.d.ts.map +1 -1
  87. package/dist/tools/mount-download.d.ts +5 -0
  88. package/dist/tools/mount-download.d.ts.map +1 -1
  89. package/dist/tools/native-mcp.d.ts +1 -1
  90. package/dist/tools/native-mcp.d.ts.map +1 -1
  91. package/dist/tools/oauth-provider.d.ts +20 -1
  92. package/dist/tools/oauth-provider.d.ts.map +1 -1
  93. package/dist/tools/tool-logger.d.ts +1 -1
  94. package/dist/tools/tool-logger.d.ts.map +1 -1
  95. package/dist/tools/view-file.d.ts +9 -0
  96. package/dist/tools/view-file.d.ts.map +1 -1
  97. package/dist/tools.d.ts +2 -1
  98. package/dist/tools.d.ts.map +1 -1
  99. package/dist/tools.js +342 -214
  100. package/llms-full.txt +175 -44
  101. package/llms.txt +1 -1
  102. package/package.json +2 -2
  103. package/dist/index-frfyw9fa.js +0 -33
  104. package/dist/index-x3fcszf8.js +0 -8
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,wBAAwB,EACxB,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,QAAQ,EACR,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,cAAc,EACd,cAAc,EACd,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,KAAK,eAAe,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAClE,cAAc,YAAY,CAAC;AAG3B,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,YAAY,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,wBAAwB,EACxB,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,QAAQ,EACR,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,KAAK,eAAe,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAClE,cAAc,YAAY,CAAC;AAC3B,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG7C,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,YAAY,GAClB,MAAM,uBAAuB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -17,12 +17,13 @@ import {
17
17
  parseTrailingWildcard,
18
18
  rateLimited,
19
19
  unauthorized
20
- } from "./index-r6czv7yt.js";
20
+ } from "./index-pwyedf7b.js";
21
21
  import {
22
22
  isRecord,
23
23
  mapObject,
24
+ transportResult,
24
25
  typedEntries
25
- } from "./index-s4qsmgwe.js";
26
+ } from "./index-tss6bk5c.js";
26
27
 
27
28
  // src/browser/client-multipart.ts
28
29
  function isFileDescriptor(value) {
@@ -211,7 +212,7 @@ function joinClientBaseUrl(baseUrl, relativeUrl) {
211
212
  import ky, { isHTTPError } from "ky";
212
213
 
213
214
  // src/observability/trace.ts
214
- var TRACEPARENT_RE = /^00-([0-9a-f]{32})-([0-9a-f]{16})-[0-9a-f]{2}$/i;
215
+ var TRACEPARENT_RE = /^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})(.*)$/i;
215
216
  function randomHex(bytes) {
216
217
  const arr = new Uint8Array(bytes);
217
218
  crypto.getRandomValues(arr);
@@ -227,16 +228,24 @@ function parseTraceparent(header) {
227
228
  if (!header)
228
229
  return null;
229
230
  const match = TRACEPARENT_RE.exec(header.trim());
230
- if (!match?.[1] || !match[2])
231
+ if (!match?.[1] || !match[2] || !match[3] || !match[4] || match[5] === undefined)
231
232
  return null;
232
- const traceId = match[1].toLowerCase();
233
- const parentSpanId = match[2].toLowerCase();
233
+ const version = match[1].toLowerCase();
234
+ if (version === "ff")
235
+ return null;
236
+ const suffix = match[5];
237
+ if (version === "00" ? suffix !== "" : suffix !== "" && !/^(?:-[0-9a-f]{2,})+$/i.test(suffix)) {
238
+ return null;
239
+ }
240
+ const traceId = match[2].toLowerCase();
241
+ const parentSpanId = match[3].toLowerCase();
242
+ const traceFlags = match[4].toLowerCase();
234
243
  if (/^0+$/.test(traceId) || /^0+$/.test(parentSpanId))
235
244
  return null;
236
- return { traceId, spanId: randomHex(8), parentSpanId };
245
+ return { traceId, spanId: randomHex(8), parentSpanId, traceFlags };
237
246
  }
238
247
  function formatTraceparent(ctx) {
239
- return `00-${ctx.traceId}-${ctx.spanId}-01`;
248
+ return `00-${ctx.traceId}-${ctx.spanId}-${ctx.traceFlags ?? "01"}`;
240
249
  }
241
250
  function childSpan(parent) {
242
251
  return {
@@ -244,7 +253,8 @@ function childSpan(parent) {
244
253
  spanId: randomHex(8),
245
254
  parentSpanId: parent.spanId,
246
255
  ...parent.tracestate !== undefined && { tracestate: parent.tracestate },
247
- ...parent.baggage !== undefined && { baggage: parent.baggage }
256
+ ...parent.baggage !== undefined && { baggage: parent.baggage },
257
+ ...parent.traceFlags !== undefined && { traceFlags: parent.traceFlags }
248
258
  };
249
259
  }
250
260
  var encoder = new TextEncoder;
@@ -376,10 +386,10 @@ function createHttpClient(config) {
376
386
  }
377
387
  try {
378
388
  if (options.responseType === "blob") {
379
- return client[method](url, kyOptions).blob();
389
+ return transportResult(await client[method](url, kyOptions).blob());
380
390
  }
381
391
  if (options.responseType === "response") {
382
- return await client[method](url, kyOptions);
392
+ return transportResult(await client[method](url, kyOptions));
383
393
  }
384
394
  const response = await client[method](url, kyOptions);
385
395
  if (options.responseType === "void") {
@@ -389,9 +399,9 @@ function createHttpClient(config) {
389
399
  }
390
400
  }
391
401
  if (options.responseType === "void" || response.status === 204 || response.headers.get("content-length") === "0") {
392
- return;
402
+ return transportResult(undefined);
393
403
  }
394
- return response.json();
404
+ return await response.json();
395
405
  } catch (error) {
396
406
  if (ApiError.is(error))
397
407
  throw error;
@@ -646,6 +656,201 @@ function createUrlBuilders(contracts, source, contractConfig) {
646
656
  function createScopedUrlBuilders(contracts, source, scopeConfigs) {
647
657
  return buildScopedRegistry(contracts, scopeConfigs, "URL builder", (contract, config) => createUrlBuilder(contract, source, config));
648
658
  }
659
+ // src/realtime/rejection.ts
660
+ import { z as z2 } from "zod";
661
+
662
+ // src/internal/errors.ts
663
+ import { z } from "zod";
664
+ function issuePath(path) {
665
+ return path.length > 0 ? path.map(String).join(".") : "(root)";
666
+ }
667
+ function zodIssues(error) {
668
+ return error.issues.map((issue) => ({
669
+ path: issuePath(issue.path),
670
+ code: issue.code,
671
+ message: issue.message
672
+ }));
673
+ }
674
+
675
+ // src/realtime/rejection.ts
676
+ function realtimeContractViolation(options) {
677
+ const issues = options.cause instanceof z2.ZodError ? zodIssues(options.cause) : undefined;
678
+ const reason = options.reason.replaceAll("-", " ");
679
+ const error = new AppError("REALTIME_CONTRACT_VIOLATION", `Realtime event "${options.event}" (${options.direction}, ${options.phase}): ${reason}`, 500, {
680
+ event: options.event,
681
+ direction: options.direction,
682
+ phase: options.phase,
683
+ reason: options.reason,
684
+ fault: options.fault,
685
+ ...issues !== undefined && { issues }
686
+ });
687
+ if (options.cause !== undefined)
688
+ error.cause = options.cause;
689
+ return { ...options, error };
690
+ }
691
+
692
+ // src/realtime/socket.ts
693
+ function method(target, name) {
694
+ const value = Reflect.get(target, name);
695
+ if (typeof value !== "function") {
696
+ throw new Error(`Realtime target does not implement ${name}()`);
697
+ }
698
+ return (...args) => Reflect.apply(value, target, args);
699
+ }
700
+ function splitWireArguments(definition, args) {
701
+ if (!definition.ack)
702
+ return { values: args };
703
+ const acknowledgement = args.at(-1);
704
+ if (typeof acknowledgement !== "function")
705
+ return { values: args };
706
+ return {
707
+ values: args.slice(0, -1),
708
+ acknowledgement: (...callbackArgs) => Reflect.apply(acknowledgement, undefined, callbackArgs)
709
+ };
710
+ }
711
+ function eventDefinition(registry, event, direction) {
712
+ const definition = registry[event];
713
+ if (!definition) {
714
+ throw realtimeContractViolation({
715
+ event,
716
+ direction,
717
+ phase: "arguments",
718
+ reason: "unknown-event",
719
+ fault: "local"
720
+ }).error;
721
+ }
722
+ return definition;
723
+ }
724
+ function reportRejected(rejected, hook, logger) {
725
+ if (!hook) {
726
+ if (logger) {
727
+ logger.warn(rejected.error.message, rejected.error.details);
728
+ return;
729
+ }
730
+ console.warn(`[stitchkit] rejected realtime ${rejected.direction} event "${rejected.event}" (${rejected.phase})`, rejected.error);
731
+ return;
732
+ }
733
+ Promise.resolve(hook(rejected)).catch((error) => {
734
+ console.error("[stitchkit] realtime rejection hook failed", error);
735
+ });
736
+ }
737
+ function createValidatedRealtimeSocket({
738
+ target,
739
+ inbound,
740
+ outbound,
741
+ inboundDirection,
742
+ outboundDirection,
743
+ onRejected,
744
+ logger,
745
+ subscribe
746
+ }) {
747
+ const emitTarget = method(target, "emit");
748
+ return {
749
+ on: (event, handler) => {
750
+ const definition = eventDefinition(inbound, event, inboundDirection);
751
+ const wrapped = (...wireArgs) => {
752
+ const { values, acknowledgement } = splitWireArguments(definition, wireArgs);
753
+ const parsed = definition.args.safeParse(values);
754
+ if (!parsed.success) {
755
+ reportRejected(realtimeContractViolation({
756
+ event,
757
+ direction: inboundDirection,
758
+ phase: "arguments",
759
+ reason: "invalid-arguments",
760
+ fault: "peer",
761
+ cause: parsed.error
762
+ }), onRejected, logger);
763
+ return;
764
+ }
765
+ if (definition.ack && !acknowledgement) {
766
+ reportRejected(realtimeContractViolation({
767
+ event,
768
+ direction: inboundDirection,
769
+ phase: "acknowledgement",
770
+ reason: "missing-acknowledgement",
771
+ fault: "peer"
772
+ }), onRejected, logger);
773
+ return;
774
+ }
775
+ const applicationArgs = [...parsed.data];
776
+ if (definition.ack) {
777
+ applicationArgs.push((value) => {
778
+ const ack = definition.ack?.safeParse(value);
779
+ if (!ack?.success) {
780
+ if (ack) {
781
+ reportRejected(realtimeContractViolation({
782
+ event,
783
+ direction: outboundDirection,
784
+ phase: "acknowledgement",
785
+ reason: "invalid-acknowledgement-value",
786
+ fault: "local",
787
+ cause: ack.error
788
+ }), onRejected, logger);
789
+ }
790
+ return;
791
+ }
792
+ acknowledgement?.(ack.data);
793
+ });
794
+ }
795
+ Reflect.apply(handler, undefined, applicationArgs);
796
+ };
797
+ if (subscribe)
798
+ return subscribe(event, wrapped);
799
+ const onTarget = method(target, "on");
800
+ const offTarget = method(target, "off");
801
+ onTarget(event, wrapped);
802
+ return () => {
803
+ offTarget(event, wrapped);
804
+ };
805
+ },
806
+ emit: (event, ...args) => {
807
+ const definition = eventDefinition(outbound, event, outboundDirection);
808
+ const { values, acknowledgement } = splitWireArguments(definition, args);
809
+ const parsed = definition.args.safeParse(values);
810
+ if (!parsed.success) {
811
+ throw realtimeContractViolation({
812
+ event,
813
+ direction: outboundDirection,
814
+ phase: "arguments",
815
+ reason: "invalid-arguments",
816
+ fault: "local",
817
+ cause: parsed.error
818
+ }).error;
819
+ }
820
+ if (definition.ack && !acknowledgement) {
821
+ throw realtimeContractViolation({
822
+ event,
823
+ direction: outboundDirection,
824
+ phase: "acknowledgement",
825
+ reason: "missing-acknowledgement",
826
+ fault: "local"
827
+ }).error;
828
+ }
829
+ const wireArgs = [...parsed.data];
830
+ if (definition.ack && acknowledgement) {
831
+ wireArgs.push((value) => {
832
+ const ack = definition.ack?.safeParse(value);
833
+ if (!ack?.success) {
834
+ if (ack) {
835
+ reportRejected(realtimeContractViolation({
836
+ event,
837
+ direction: inboundDirection,
838
+ phase: "acknowledgement",
839
+ reason: "invalid-acknowledgement-value",
840
+ fault: "peer",
841
+ cause: ack.error
842
+ }), onRejected, logger);
843
+ }
844
+ return;
845
+ }
846
+ acknowledgement(ack.data);
847
+ });
848
+ }
849
+ emitTarget(event, ...wireArgs);
850
+ }
851
+ };
852
+ }
853
+
649
854
  // src/retained.ts
650
855
  function createRetainedTopics() {
651
856
  const last = {};
@@ -691,6 +896,40 @@ function toIoAuth(auth) {
691
896
  Promise.resolve().then(auth).then(cb, () => cb({}));
692
897
  };
693
898
  }
899
+ function createRealtimeClient(contract, { onRejected, logger, ...config }) {
900
+ const transport = createSocketIOClient(config);
901
+ const events = createValidatedRealtimeSocket({
902
+ target: transport,
903
+ inbound: contract.serverToClient,
904
+ outbound: contract.clientToServer,
905
+ inboundDirection: "client-inbound",
906
+ outboundDirection: "client-outbound",
907
+ onRejected,
908
+ logger,
909
+ subscribe: (event, handler) => {
910
+ const subscribe = Reflect.get(transport, "on");
911
+ if (typeof subscribe !== "function") {
912
+ throw new Error("Socket.IO client does not implement on()");
913
+ }
914
+ const unsubscribe = Reflect.apply(subscribe, transport, [event, handler]);
915
+ if (typeof unsubscribe !== "function") {
916
+ throw new Error("Socket.IO client on() did not return an unsubscribe function");
917
+ }
918
+ return () => {
919
+ Reflect.apply(unsubscribe, undefined, []);
920
+ };
921
+ }
922
+ });
923
+ return {
924
+ ...events,
925
+ connect: transport.connect,
926
+ disconnect: transport.disconnect,
927
+ get connected() {
928
+ return transport.connected;
929
+ },
930
+ onConnectionChange: transport.onConnectionChange
931
+ };
932
+ }
694
933
  function createSocketIOClient(config) {
695
934
  let socket = null;
696
935
  let desiredConnected = false;
@@ -741,6 +980,9 @@ function createSocketIOClient(config) {
741
980
  }, serverDisconnectDelay);
742
981
  }
743
982
  });
983
+ socket.io.on("reconnect_failed", () => {
984
+ desiredConnected = false;
985
+ });
744
986
  if (retained) {
745
987
  for (const name of retainNames) {
746
988
  socket.on(name, (payload) => retained.record(name, payload));
@@ -755,9 +997,13 @@ function createSocketIOClient(config) {
755
997
  return socket?.connected ?? false;
756
998
  },
757
999
  connect() {
758
- if (socket || desiredConnected)
1000
+ if (socket?.connected || desiredConnected)
759
1001
  return;
760
1002
  desiredConnected = true;
1003
+ if (socket) {
1004
+ socket.connect();
1005
+ return;
1006
+ }
761
1007
  loadIo().then(openSocket);
762
1008
  },
763
1009
  disconnect() {
@@ -801,9 +1047,6 @@ function createSocketIOClient(config) {
801
1047
  }
802
1048
  };
803
1049
  }
804
- // src/internal/errors.ts
805
- import { z } from "zod";
806
-
807
1050
  // src/server/stream.ts
808
1051
  async function* parseSSE(response, options) {
809
1052
  const reader = response.body?.getReader();
@@ -838,6 +1081,10 @@ async function* parseSSE(response, options) {
838
1081
  reader.releaseLock();
839
1082
  }
840
1083
  }
1084
+ // src/realtime/contract.ts
1085
+ function defineRealtimeContract(contract) {
1086
+ return contract;
1087
+ }
841
1088
  export {
842
1089
  unauthorized,
843
1090
  rateLimited,
@@ -849,6 +1096,7 @@ export {
849
1096
  formatTraceparent,
850
1097
  forbidden,
851
1098
  encodeCursor,
1099
+ defineRealtimeContract,
852
1100
  defineErrors,
853
1101
  defineContract,
854
1102
  decodeCursor,
@@ -859,6 +1107,7 @@ export {
859
1107
  createScopedUrlBuilders,
860
1108
  createScopedClients,
861
1109
  createRetainedTopics,
1110
+ createRealtimeClient,
862
1111
  createHttpClient,
863
1112
  createContractFactory,
864
1113
  createClients,
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/internal/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQvC,wBAAgB,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,GAAG,MAAM,CAMxD;AAED,qFAAqF;AACrF,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,GAAG,eAAe,EAAE,CAM9D;AAKD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI1D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,MAAM,EAAE,OAAO,GACd,MAAM,GAAG,SAAS,CAMpB;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAgBrD;AA4BD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,OAAO,EACb,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,GACrC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAe9D;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,GAAG,SAAS,EAC3B,IAAI,EAAE,OAAO,EACb,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,GACrC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAe9D"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/internal/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQvC,wBAAgB,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,GAAG,MAAM,CAMxD;AAED,qFAAqF;AACrF,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,GAAG,eAAe,EAAE,CAM9D;AAKD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI1D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,MAAM,EAAE,OAAO,GACd,MAAM,GAAG,SAAS,CAYpB;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAyBrD;AA4BD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,OAAO,EACb,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,GACrC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAe9D;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,GAAG,SAAS,EAC3B,IAAI,EAAE,OAAO,EACb,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,GACrC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAe9D"}
@@ -4,9 +4,13 @@ export declare function isPrivateIp(ip: string): boolean;
4
4
  * Refuse a URL that is not `http(s)`, has no host, or whose host is — or
5
5
  * resolves to — a private/internal address. Called on the initial URL and on
6
6
  * every redirect hop, so a public host cannot `302` to an internal address or
7
- * to a `file:` / `gopher:` / `data:` scheme.
7
+ * to a `file:` / `gopher:` / `data:` scheme. The DNS lookup honours `signal`,
8
+ * so a slow resolver cannot outlive the caller's deadline.
9
+ *
10
+ * This is the single host-validation implementation — `fetchGuarded` and
11
+ * `fetchPinnedDocument` both go through `resolvePublicAddress`.
8
12
  */
9
- export declare function assertPublicUrl(url: URL): Promise<void>;
13
+ export declare function assertPublicUrl(url: URL, signal?: AbortSignal): Promise<void>;
10
14
  /**
11
15
  * Fetch a URL with the SSRF guard enforced on the initial URL and on every
12
16
  * redirect hop — a public host can otherwise `302` to an internal address or a
@@ -17,7 +21,23 @@ export declare function assertPublicUrl(url: URL): Promise<void>;
17
21
  * per-hop re-check is the larger and fully-closed hole; a static private DNS
18
22
  * record is rejected outright.
19
23
  */
20
- export declare function fetchGuarded(start: URL, allowPrivate: boolean): Promise<Response>;
24
+ export interface GuardedFetchOptions {
25
+ /**
26
+ * Deadline for producing the FINAL response headers — DNS, connects and every
27
+ * redirect hop share this single budget, so a redirect chain cannot multiply
28
+ * it. Default 15 seconds.
29
+ */
30
+ timeoutMs?: number;
31
+ /**
32
+ * Separate deadline for consuming the body once headers have arrived — a slow
33
+ * LARGE download must not be killed by the connection budget, but a drip-feed
34
+ * body must still end. Default 120 seconds.
35
+ */
36
+ bodyTimeoutMs?: number;
37
+ /** Optional caller cancellation, combined with both deadlines. */
38
+ signal?: AbortSignal;
39
+ }
40
+ export declare function fetchGuarded(start: URL, allowPrivate: boolean, options?: GuardedFetchOptions): Promise<Response>;
21
41
  export interface PinnedDocumentFetchOptions {
22
42
  maxBytes: number;
23
43
  timeoutMs: number;
@@ -1 +1 @@
1
- {"version":3,"file":"secure-fetch.d.ts","sourceRoot":"","sources":["../../src/internal/secure-fetch.ts"],"names":[],"mappings":"AAiEA,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CA8D/C;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B7D;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAavF;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,6DAA6D;IAC7D,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,GAAG,EAAE,GAAG,CAAC;CACV;AAoCD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,GAAG,EACV,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,sBAAsB,CAAC,CAgFjC;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoBnF"}
1
+ {"version":3,"file":"secure-fetch.d.ts","sourceRoot":"","sources":["../../src/internal/secure-fetch.ts"],"names":[],"mappings":"AAiEA,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CA8D/C;AA4BD;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnF;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAsB,YAAY,CAChC,KAAK,EAAE,GAAG,EACV,YAAY,EAAE,OAAO,EACrB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,QAAQ,CAAC,CAiDnB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,6DAA6D;IAC7D,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,GAAG,EAAE,GAAG,CAAC;CACV;AAsCD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,GAAG,EACV,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,sBAAsB,CAAC,CAkFjC;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoBnF"}
@@ -3,6 +3,13 @@ export declare function typedEntries<T extends object>(value: T): Array<{
3
3
  }[keyof T]>;
4
4
  /** Narrow an unknown value to a plain object — not `null`, not an array. */
5
5
  export declare function isRecord(value: unknown): value is Record<string, unknown>;
6
+ /** Invoke a runtime-discovered handler after a fail-first function check. */
7
+ export declare function callRuntimeHandler(handler: unknown, context: unknown): unknown;
8
+ /**
9
+ * Isolated loose-to-typed adapter boundary for transports whose decoder is
10
+ * selected at runtime while the contract fixes the generic result type.
11
+ */
12
+ export declare function transportResult<T>(value: unknown): T;
6
13
  export declare function mapObject<TSource extends object, TResult extends {
7
14
  [K in keyof TSource]?: unknown;
8
15
  }>(source: TSource, mapper: <K extends keyof TSource>(key: K, value: TSource[K]) => TResult[K] | undefined): TResult;
@@ -1 +1 @@
1
- {"version":3,"file":"typed.d.ts","sourceRoot":"","sources":["../../src/internal/typed.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAC3C,KAAK,EAAE,CAAC,GACP,KAAK,CAAC;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAE/C;AAED,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,SAAS,CACvB,OAAO,SAAS,MAAM,EACtB,OAAO,SAAS;KAAG,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,EAAE,OAAO;CAAE,EAElD,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,GACrF,OAAO,CAOT;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,SAAS,MAAM,EACtB,OAAO,SAAS;KAAG,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,EAAE,OAAO;CAAE,EAElD,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK,OAAO,GACrE,OAAO,CAKT"}
1
+ {"version":3,"file":"typed.d.ts","sourceRoot":"","sources":["../../src/internal/typed.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAC3C,KAAK,EAAE,CAAC,GACP,KAAK,CAAC;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAE/C;AAED,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAK9E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,CAEpD;AAED,wBAAgB,SAAS,CACvB,OAAO,SAAS,MAAM,EACtB,OAAO,SAAS;KAAG,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,EAAE,OAAO;CAAE,EAElD,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,GACrF,OAAO,CAOT;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,SAAS,MAAM,EACtB,OAAO,SAAS;KAAG,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,EAAE,OAAO;CAAE,EAElD,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK,OAAO,GACrE,OAAO,CAKT"}
@@ -4,4 +4,10 @@
4
4
  * check behind `staticRoute` and `view_file`'s local-file branch.
5
5
  */
6
6
  export declare function isWithinDir(root: string, target: string): boolean;
7
+ /**
8
+ * Resolve both paths through the filesystem and return the real target only
9
+ * when it remains inside the real root. The lexical check must run first at a
10
+ * URL boundary; this second check closes symlink escapes.
11
+ */
12
+ export declare function realPathWithinDir(root: string, target: string): Promise<string | null>;
7
13
  //# sourceMappingURL=within-dir.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"within-dir.d.ts","sourceRoot":"","sources":["../../src/internal/within-dir.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQjE"}
1
+ {"version":3,"file":"within-dir.d.ts","sourceRoot":"","sources":["../../src/internal/within-dir.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQjE;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAO5F"}
@@ -0,0 +1,8 @@
1
+ /** Minimal structured logger shared by browser-safe and server entrypoints. */
2
+ export interface StitchLogger {
3
+ info(msg: string, data?: Record<string, unknown>): void;
4
+ warn(msg: string, data?: Record<string, unknown>): void;
5
+ error(msg: string, data?: Record<string, unknown>): void;
6
+ debug(msg: string, data?: Record<string, unknown>): void;
7
+ }
8
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC1D"}
package/dist/node.d.ts CHANGED
@@ -9,6 +9,7 @@ export { createHandler } from './server/create';
9
9
  export { createImplement, implement } from './server/implement';
10
10
  export type { LogFormat } from './server/logger';
11
11
  export { type NodeServerConfig, type NodeServerHandle, serveNode } from './server/node';
12
+ export { bindRealtimeServer, type RealtimeServer, type RealtimeServerConnection, type RealtimeServerHandle, } from './server/realtime';
12
13
  export { createNodeSocketIOServer as createSocketIOServer, type NodeSocketIOServerHandle as SocketIOServerHandle, type SocketIOServerConfig, } from './server/socket-io-node';
13
14
  export type { FetchComposition, FetchHandler, HandlerConfig, LoggingConfig, LogOutcome, RawRoute, RawRouteContext, ServiceDef, } from './server/types';
14
15
  //# sourceMappingURL=node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAChE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EACL,wBAAwB,IAAI,oBAAoB,EAChD,KAAK,wBAAwB,IAAI,oBAAoB,EACrD,KAAK,oBAAoB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,UAAU,EACV,QAAQ,EACR,eAAe,EACf,UAAU,GACX,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAChE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EACL,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,wBAAwB,IAAI,oBAAoB,EAChD,KAAK,wBAAwB,IAAI,oBAAoB,EACrD,KAAK,oBAAoB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,UAAU,EACV,QAAQ,EACR,eAAe,EACf,UAAU,GACX,MAAM,gBAAgB,CAAC"}
package/dist/node.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
+ bindRealtimeServer,
2
3
  createHandler,
3
4
  createImplement,
4
5
  createSocketIOServer,
5
6
  implement
6
- } from "./index-4fyn9f09.js";
7
- import"./index-6jypn22c.js";
8
- import"./index-x3fcszf8.js";
7
+ } from "./index-zwqty9zf.js";
8
+ import"./index-r1qp4rve.js";
9
9
  import {
10
10
  AppError,
11
11
  appError,
@@ -15,7 +15,7 @@ import {
15
15
  notFound,
16
16
  rateLimited,
17
17
  unauthorized
18
- } from "./index-yh0p5ddn.js";
18
+ } from "./index-5s8b7z6q.js";
19
19
  // src/server/node.ts
20
20
  import { serve } from "srvx";
21
21
  async function serveNode(config) {
@@ -55,6 +55,7 @@ export {
55
55
  createImplement,
56
56
  createHandler,
57
57
  conflict,
58
+ bindRealtimeServer,
58
59
  badRequest,
59
60
  appError,
60
61
  AppError
@@ -1 +1 @@
1
- {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/observability/audit.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAe,KAAK,eAAe,EAAmB,MAAM,YAAY,CAAC;AAGhF,kEAAkE;AAClE,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,KAAK,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,iFAAiF;IACjF,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC;IAC1C,yEAAyE;IACzE,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,0BAA2B,SAAQ,sBAAsB;IACxE,2DAA2D;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,0BAA0B,CAAC;IACrC,KAAK,CAAC,EAAE,sBAAsB,CAAC;CAChC;AAED,gEAAgE;AAChE,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,cAAc,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5B;AAED,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACnD;AAED,iFAAiF;AACjF,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,QAAQ,EAAE,aAAa,CAAC;CACzB;AAkFD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CA4G9E"}
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/observability/audit.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAe,KAAK,eAAe,EAAmB,MAAM,YAAY,CAAC;AAGhF,kEAAkE;AAClE,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,KAAK,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,iFAAiF;IACjF,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC;IAC1C,yEAAyE;IACzE,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,0BAA2B,SAAQ,sBAAsB;IACxE,2DAA2D;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,0BAA0B,CAAC;IACrC,KAAK,CAAC,EAAE,sBAAsB,CAAC;CAChC;AAED,gEAAgE;AAChE,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,cAAc,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5B;AAED,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACnD;AAED,iFAAiF;AACjF,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,QAAQ,EAAE,aAAa,CAAC;CACzB;AAkFD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CAwH9E"}
@@ -36,6 +36,8 @@ export interface RequestEvent {
36
36
  dimensions?: Record<string, string>;
37
37
  /** Tool name — tool calls only. */
38
38
  toolName?: string;
39
+ /** Distinguishes a completed operation from an MRTR input-gating round. */
40
+ toolPhase?: 'operation' | 'input-round';
39
41
  /** Validated MCP transport attribution, available only on MCP tool calls. */
40
42
  mcp?: {
41
43
  era: 'modern' | 'legacy';
@@ -81,6 +83,11 @@ export interface RequestEvent {
81
83
  resultSize: number | null;
82
84
  /** Serialised byte length of the result. */
83
85
  responseBytes: number;
86
+ /**
87
+ * Set when the result could not be serialised at all (bigint, a cycle) —
88
+ * distinguishes `responseBytes: 0` "nothing returned" from "unmeasurable".
89
+ */
90
+ resultUnserializable?: boolean;
84
91
  /** Resolved user id, when authenticated. */
85
92
  userId?: string;
86
93
  /** How the caller authenticated, when the app records it on the context. */
@@ -1 +1 @@
1
- {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/observability/event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,MAAM,EAAE,eAAe,CAAC;IACxB,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,GAAG,CAAC,EAAE;QACJ,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,kFAAkF;QAClF,UAAU,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/C,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,4CAA4C;QAC5C,OAAO,CAAC,EAAE,gBAAgB,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;QAC/E,8CAA8C;QAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,EAAE,EAAE,OAAO,CAAC;IACZ,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,uEAAuE;IACvE,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,mDAAmD;IACnD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,4CAA4C;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,SAAS,EAAE,IAAI,CAAC;CACjB"}
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/observability/event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,MAAM,EAAE,eAAe,CAAC;IACxB,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC;IACxC,6EAA6E;IAC7E,GAAG,CAAC,EAAE;QACJ,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,kFAAkF;QAClF,UAAU,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/C,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,4CAA4C;QAC5C,OAAO,CAAC,EAAE,gBAAgB,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;QAC/E,8CAA8C;QAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,EAAE,EAAE,OAAO,CAAC;IACZ,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,uEAAuE;IACvE,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,mDAAmD;IACnD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,4CAA4C;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,SAAS,EAAE,IAAI,CAAC;CACjB"}