stitchkit 0.42.0 → 0.43.1

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 (38) hide show
  1. package/README.md +22 -5
  2. package/dist/browser/client.d.ts.map +1 -1
  3. package/dist/browser/http.d.ts +2 -1
  4. package/dist/browser/http.d.ts.map +1 -1
  5. package/dist/browser/request-id.d.ts +3 -0
  6. package/dist/browser/request-id.d.ts.map +1 -0
  7. package/dist/cli.js +1 -1
  8. package/dist/contract/factory.d.ts +29 -2
  9. package/dist/contract/factory.d.ts.map +1 -1
  10. package/dist/contract/index.d.ts +1 -1
  11. package/dist/contract/index.d.ts.map +1 -1
  12. package/dist/contract/index.js +1 -1
  13. package/dist/{index-181aebw8.js → index-esqmem78.js} +100 -66
  14. package/dist/{index-p9vkwns1.js → index-h2wdcsby.js} +93 -15
  15. package/dist/{index-11x5dts2.js → index-r6czv7yt.js} +14 -9
  16. package/dist/index.js +16 -7
  17. package/dist/node.js +1 -1
  18. package/dist/observability/audit.d.ts +27 -15
  19. package/dist/observability/audit.d.ts.map +1 -1
  20. package/dist/observability/event.d.ts +2 -2
  21. package/dist/observability/index.d.ts +4 -4
  22. package/dist/observability/index.d.ts.map +1 -1
  23. package/dist/observability/index.js +69 -58
  24. package/dist/server/create.d.ts.map +1 -1
  25. package/dist/server/index.js +1 -1
  26. package/dist/server/logger.d.ts +0 -1
  27. package/dist/server/logger.d.ts.map +1 -1
  28. package/dist/server/types.d.ts +8 -13
  29. package/dist/server/types.d.ts.map +1 -1
  30. package/dist/tools/flatten-join.d.ts.map +1 -1
  31. package/dist/tools/runtime-tool.d.ts +31 -0
  32. package/dist/tools/runtime-tool.d.ts.map +1 -1
  33. package/dist/tools.d.ts +1 -1
  34. package/dist/tools.d.ts.map +1 -1
  35. package/dist/tools.js +52 -4
  36. package/llms-full.txt +272 -88
  37. package/llms.txt +1 -0
  38. package/package.json +2 -2
package/README.md CHANGED
@@ -51,6 +51,17 @@ supported via `stitchkit/node`.
51
51
 
52
52
  ## Install
53
53
 
54
+ Start a production-shaped Next.js, Stitchkit and PostgreSQL application:
55
+
56
+ ```bash
57
+ bun create stitchkit my-app
58
+ cd my-app
59
+ # Point DATABASE_URL in .env at your PostgreSQL database.
60
+ bun run dev
61
+ ```
62
+
63
+ To add Stitchkit to an existing project instead:
64
+
54
65
  ```bash
55
66
  bun add stitchkit # Bun
56
67
  npm install stitchkit # Node
@@ -348,11 +359,17 @@ never touches MCP never installs the MCP SDK. → [ADR 0011](./docs/decisions/00
348
359
  The framework stays focused and inspectable: explicit adapters, no generated
349
360
  application code and no framework build step in your app.
350
361
 
351
- ## Example
352
-
353
- A complete runnable app lives in [`packages/starter`](./packages/starter) a
354
- notes CRUD with a contract, a typed client, `react-query-kit` hooks and a
355
- Socket.IO live-reload.
362
+ ## Official starter
363
+
364
+ `bun create stitchkit my-app` generates the canonical application: separate
365
+ Next.js and Bun API processes, Prisma/PostgreSQL, shared Zod contracts, typed
366
+ HTTP/React Query clients, Socket.IO cache updates, OpenAPI, MCP, CLI and a full
367
+ UI catalogue. Its only source is
368
+ [`packages/create-stitchkit/template`](./packages/create-stitchkit/template).
369
+ The application owns its Prisma schema and migrations while PostgreSQL remains
370
+ external infrastructure configured through `DATABASE_URL`.
371
+ The template owns a committed Bun lockfile and an explicit Stitchkit catalog
372
+ range, so framework and scaffolder releases advance independently.
356
373
 
357
374
  ## Documentation — two roads
358
375
 
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/browser/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/browser/client.ts"],"names":[],"mappings":"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"}
@@ -14,7 +14,8 @@ export declare class ApiError extends Error {
14
14
  readonly status: number;
15
15
  readonly details?: unknown;
16
16
  readonly hint?: string | undefined;
17
- constructor(code: string, status?: number, details?: unknown, message?: string, hint?: string | undefined);
17
+ readonly traceId?: string | undefined;
18
+ constructor(code: string, status?: number, details?: unknown, message?: string, hint?: string | undefined, traceId?: string | undefined);
18
19
  static is(error: unknown): error is ApiError;
19
20
  }
20
21
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/browser/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/browser/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Read the framework-owned request correlation id from an HTTP response. */
2
+ export declare function responseTraceId(response: Response | undefined): string | undefined;
3
+ //# sourceMappingURL=request-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-id.d.ts","sourceRoot":"","sources":["../../src/browser/request-id.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAElF"}
package/dist/cli.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  emitResult,
5
5
  parseCliArgs,
6
6
  pollUntilDone
7
- } from "./index-p9vkwns1.js";
7
+ } from "./index-h2wdcsby.js";
8
8
  import"./index-frfyw9fa.js";
9
9
  import"./index-x3fcszf8.js";
10
10
  import"./index-gex6gxhe.js";
@@ -20,13 +20,37 @@
20
20
  * The returned contracts are ordinary `ContractDef`s — `implement`, `createClient`
21
21
  * and the tool mounts treat them exactly as before.
22
22
  */
23
- import type { ContractDef, EndpointDef } from './define';
23
+ import type { ContractDef, ContractMeta, EndpointDef, Transport } from './define';
24
+ export type ContractFactoryToolExposure = 'explicit';
25
+ export interface ContractFactoryConfig {
26
+ /** Missing endpoint `expose` becomes HTTP-only; every tool surface is opt-in. */
27
+ toolExposure: ContractFactoryToolExposure;
28
+ }
29
+ export type ExplicitToolExposureEndpoints<T extends Record<string, EndpointDef>> = {
30
+ [K in keyof T]: T[K] extends {
31
+ expose: readonly Transport[];
32
+ } ? T[K] : T[K] & {
33
+ expose: readonly ['HTTP'];
34
+ };
35
+ };
36
+ /** A factory-defined contract whose concrete scope remains required in metadata. */
37
+ export interface ScopedContractDef<T extends Record<string, EndpointDef> = Record<string, EndpointDef>, TScope extends string = string> extends ContractDef<T, TScope> {
38
+ meta: ContractMeta<TScope> & {
39
+ scope: TScope;
40
+ };
41
+ }
24
42
  /** A `defineContract` whose `scope` is required and typed to `TScope`. */
25
43
  export type ScopedDefineContract<TScope extends string> = <const TContractScope extends TScope, const T extends Record<string, EndpointDef>>(meta: {
26
44
  prefix: string;
27
45
  scope: TContractScope;
28
46
  meta?: Record<string, unknown>;
29
- }, endpoints: T) => ContractDef<T, TContractScope>;
47
+ }, endpoints: T) => ScopedContractDef<T, TContractScope>;
48
+ /** Scoped contract authoring where every omitted exposure becomes HTTP-only. */
49
+ export type ExplicitScopedDefineContract<TScope extends string> = <const TContractScope extends TScope, const T extends Record<string, EndpointDef>>(meta: {
50
+ prefix: string;
51
+ scope: TContractScope;
52
+ meta?: Record<string, unknown>;
53
+ }, endpoints: T) => ScopedContractDef<ExplicitToolExposureEndpoints<T>, TContractScope>;
30
54
  /**
31
55
  * Build a `defineContract` that requires a `scope` from the application's own
32
56
  * union. Call once per app and re-export the returned `defineContract`.
@@ -34,4 +58,7 @@ export type ScopedDefineContract<TScope extends string> = <const TContractScope
34
58
  export declare function createContractFactory<TScope extends string>(): {
35
59
  defineContract: ScopedDefineContract<TScope>;
36
60
  };
61
+ export declare function createContractFactory<TScope extends string>(config: ContractFactoryConfig): {
62
+ defineContract: ExplicitScopedDefineContract<TScope>;
63
+ };
37
64
  //# sourceMappingURL=factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/contract/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGzD,0EAA0E;AAC1E,MAAM,MAAM,oBAAoB,CAAC,MAAM,SAAS,MAAM,IAAI,CACxD,KAAK,CAAC,cAAc,SAAS,MAAM,EACnC,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAE3C,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAC/E,SAAS,EAAE,CAAC,KACT,WAAW,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AAEpC;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,SAAS,MAAM,KAAK;IAC9D,cAAc,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;CAC9C,CAiBA"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/contract/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGlF,MAAM,MAAM,2BAA2B,GAAG,UAAU,CAAC;AAErD,MAAM,WAAW,qBAAqB;IACpC,iFAAiF;IACjF,YAAY,EAAE,2BAA2B,CAAC;CAC3C;AAED,MAAM,MAAM,6BAA6B,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI;KAChF,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,MAAM,EAAE,SAAS,SAAS,EAAE,CAAA;KAAE,GACzD,CAAC,CAAC,CAAC,CAAC,GACJ,CAAC,CAAC,CAAC,CAAC,GAAG;QAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;KAAE;CACzC,CAAC;AAEF,oFAAoF;AACpF,MAAM,WAAW,iBAAiB,CAChC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACnE,MAAM,SAAS,MAAM,GAAG,MAAM,CAC9B,SAAQ,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC;IAC9B,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AAED,0EAA0E;AAC1E,MAAM,MAAM,oBAAoB,CAAC,MAAM,SAAS,MAAM,IAAI,CACxD,KAAK,CAAC,cAAc,SAAS,MAAM,EACnC,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAE3C,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAC/E,SAAS,EAAE,CAAC,KACT,iBAAiB,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AAE1C,gFAAgF;AAChF,MAAM,MAAM,4BAA4B,CAAC,MAAM,SAAS,MAAM,IAAI,CAChE,KAAK,CAAC,cAAc,SAAS,MAAM,EACnC,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAE3C,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAC/E,SAAS,EAAE,CAAC,KACT,iBAAiB,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,SAAS,MAAM,KAAK;IAC9D,cAAc,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;CAC9C,CAAC;AACF,wBAAgB,qBAAqB,CAAC,MAAM,SAAS,MAAM,EACzD,MAAM,EAAE,qBAAqB,GAC5B;IACD,cAAc,EAAE,4BAA4B,CAAC,MAAM,CAAC,CAAC;CACtD,CAAC"}
@@ -1,6 +1,6 @@
1
1
  export { ALL_TRANSPORTS, type BodyHttpSuccessStatus, type ContractDef, type ContractMeta, defineContract, type EndpointDef, type EndpointFn, type EndpointResponseMeta, type EndpointToolAnnotations, type EndpointUiMeta, type FileDescriptor, type HandlerContext, type HeadEndpointDef, type HttpMethod, type HttpSuccessStatus, type MultipartFile, type ResponseMetadata, type RuntimeContext, type ScopedEndpointFn, type ScopedHttpClient, type ScopedUrlBuilder, type ScopedUrlFn, type Transport, type TransportSource, type TypedClient, type TypedHttpClient, type TypedUrlBuilder, } from './define';
2
2
  export { AppError, appError, badRequest, conflict, type ErrorEnvelope, forbidden, isStitchErrorCode, notFound, rateLimited, STITCH_ERROR_STATUS, type StitchErrorCode, unauthorized, } from './errors';
3
3
  export { type DefinedAppError, type DefinedErrors, defineErrors, type ErrorDefinition, type ErrorDefinitions, type ErrorDetailsOutput, type ErrorDetailsSchema, type ErrorFactories, type ErrorFactory, type ErrorFactoryArguments, type FrozenErrorDefinitions, } from './errors-factory';
4
- export { createContractFactory, type ScopedDefineContract } from './factory';
4
+ export { type ContractFactoryConfig, type ContractFactoryToolExposure, createContractFactory, type ExplicitScopedDefineContract, type ExplicitToolExposureEndpoints, type ScopedContractDef, type ScopedDefineContract, } from './factory';
5
5
  export { decodeCursor, encodeCursor, type Paginated, paginatedSchema, } from './pagination';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contract/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,KAAK,aAAa,EAClB,SAAS,EACT,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,KAAK,eAAe,EACpB,YAAY,GACb,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAE7E,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,KAAK,SAAS,EACd,eAAe,GAChB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contract/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,KAAK,aAAa,EAClB,SAAS,EACT,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,KAAK,eAAe,EACpB,YAAY,GACb,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,qBAAqB,EACrB,KAAK,4BAA4B,EACjC,KAAK,6BAA6B,EAClC,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,GAC1B,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,KAAK,SAAS,EACd,eAAe,GAChB,MAAM,cAAc,CAAC"}
@@ -16,7 +16,7 @@ import {
16
16
  paginatedSchema,
17
17
  rateLimited,
18
18
  unauthorized
19
- } from "../index-11x5dts2.js";
19
+ } from "../index-r6czv7yt.js";
20
20
  import"../index-s4qsmgwe.js";
21
21
  export {
22
22
  unauthorized,
@@ -22,7 +22,9 @@ import {
22
22
  parseTrailingWildcard,
23
23
  recordedErrorMessage,
24
24
  resolveSocketIp,
25
+ resolveTraceContext,
25
26
  resolveTraceId,
27
+ runWithRequestContext,
26
28
  safeJsonParse,
27
29
  setRequestEndpoint,
28
30
  setRequestError,
@@ -484,9 +486,6 @@ function timestamp() {
484
486
  });
485
487
  return `${t}.${now.getMilliseconds().toString().padStart(3, "0")}`;
486
488
  }
487
- function elapsedMs(startTime) {
488
- return performance.now() - startTime;
489
- }
490
489
  function safePath(pathname) {
491
490
  let out = "";
492
491
  for (let i = 0;i < pathname.length; i++) {
@@ -544,7 +543,7 @@ function shouldLog(pathname, method) {
544
543
  return !SKIP_PREFIXES.some((prefix) => pathname.startsWith(prefix));
545
544
  }
546
545
  function logIncoming(req, pathname, traceId, format, ipAddress) {
547
- const log = { traceId, startTime: performance.now() };
546
+ const log = { traceId };
548
547
  if (format === "pretty") {
549
548
  const mc = METHOD_COLOR[req.method] ?? c.dim;
550
549
  console.log(`${c.gray}[${timestamp()}]${c.reset} ${mc}${req.method}${c.reset} ${c.dim}${traceId}${c.reset} ${c.cyan}→${c.reset} ${safePath(pathname)} ${ipLabel(ipAddress ?? "")}`);
@@ -560,7 +559,7 @@ function structuredLine(own, extra) {
560
559
  }
561
560
  function logOutgoing(entry) {
562
561
  const { req, pathname, status, log, ipAddress, errorCode: errorCode2, durationMs, format, extra } = entry;
563
- const ms = elapsedMs(log.startTime);
562
+ const ms = durationMs;
564
563
  if (format === "json") {
565
564
  const own = {
566
565
  ts: new Date().toISOString(),
@@ -664,8 +663,9 @@ function applyResponseMetadata(target, metadata, endpointIdentity) {
664
663
  }
665
664
 
666
665
  // src/server/create.ts
666
+ var BODY_METHODS = new Set(["POST", "PUT", "PATCH", "DELETE"]);
667
667
  function createHandler(config) {
668
- const { cors, hooks, logging = false, trustProxy = false } = config;
668
+ const { cors, hooks, logging = false, observability, trustProxy = false } = config;
669
669
  if (cors)
670
670
  assertCorsConfig(cors);
671
671
  assertJsonBodyLimit(config.maxJsonBodyBytes, "HandlerConfig.maxJsonBodyBytes");
@@ -683,17 +683,17 @@ function createHandler(config) {
683
683
  };
684
684
  let traceResolverBroken = false;
685
685
  const warnedEnrichKeys = new Set;
686
- const resolveId = (req) => {
686
+ const resolveId = (req, fallback) => {
687
687
  if (!customTraceId)
688
- return resolveTraceId(req);
688
+ return fallback ?? resolveTraceId(req);
689
689
  try {
690
- return customTraceId(req) ?? resolveTraceId(req);
690
+ return customTraceId(req) ?? fallback ?? resolveTraceId(req);
691
691
  } catch (err) {
692
692
  if (!traceResolverBroken) {
693
693
  traceResolverBroken = true;
694
694
  warn("[stitchkit] `traceId` resolver threw — falling back to the framework resolver. " + "Ids will not match your observability context until it is fixed: " + `${err instanceof Error ? err.message : String(err)}`);
695
695
  }
696
- return resolveTraceId(req);
696
+ return fallback ?? resolveTraceId(req);
697
697
  }
698
698
  };
699
699
  const routeMap = buildRouteMap(normalizeGroups(config));
@@ -704,16 +704,19 @@ function createHandler(config) {
704
704
  const line = `[stitchkit] raw route ${shadow.rawRoute} shadows contract route ${shadow.pattern}` + ` → ${shadow.endpoint}${gate} will never run, and its hooks never apply`;
705
705
  warn(line);
706
706
  }
707
- async function dispatch(req, url, traceId, server, clientIp) {
707
+ async function dispatch(req, url, traceId, server, clientIp, startedAt) {
708
708
  const shouldLogRequest = logConfig !== null && shouldLog(url.pathname, req.method) && !shouldSkipLog(logConfig, req, url);
709
709
  const ipAddress = extractIp(req, clientIp) || undefined;
710
+ const payload = observability?.includePayload && BODY_METHODS.has(req.method) ? req.clone().json().catch(() => {
711
+ return;
712
+ }) : undefined;
710
713
  const logFormat = resolveLogFormat(logConfig?.format);
711
714
  let reqLog;
712
715
  if (shouldLogRequest && useDefaultLog) {
713
716
  reqLog = logIncoming(req, url.pathname, traceId, logFormat, ipAddress);
714
717
  }
715
718
  if (shouldLogRequest && customLogger) {
716
- reqLog = { traceId, startTime: performance.now() };
719
+ reqLog = { traceId };
717
720
  try {
718
721
  customLogger.debug(`${req.method} ${url.pathname}`, {
719
722
  traceId,
@@ -723,50 +726,58 @@ function createHandler(config) {
723
726
  });
724
727
  } catch {}
725
728
  }
726
- let logged = false;
727
- const logDone = (status, errorCode2) => {
728
- if (!reqLog || logged || !logConfig)
729
+ let completed = false;
730
+ const complete = (status, errorCode2) => {
731
+ if (completed)
729
732
  return;
730
- logged = true;
731
- try {
732
- const durationMs = Math.round(elapsedMs(reqLog.startTime));
733
- const collected = collectExtraLogFields(logConfig, req, url, {
734
- status,
735
- durationMs,
736
- errorCode: errorCode2
737
- });
738
- const frameworkFields = buildLogFields(req.method, url.pathname, status, durationMs, reqLog.traceId, errorCode2);
739
- const ownedFields = { ...frameworkFields, ip: ipAddress };
740
- for (const key of collected.enrichKeys) {
741
- const ownedByActiveSink = Object.hasOwn(ownedFields, key) || useDefaultLog && (key === "ts" || key === "level" || key === "msg");
742
- if (ownedByActiveSink && !warnedEnrichKeys.has(key)) {
743
- warnedEnrichKeys.add(key);
744
- warn(`[stitchkit] logging.enrich field "${key}" was discarded because the framework owns it`);
745
- }
746
- }
747
- const extra = collected.fields;
748
- if (useDefaultLog) {
749
- logOutgoing({
750
- req,
751
- pathname: url.pathname,
733
+ completed = true;
734
+ const durationMs = Math.round(Number(process.hrtime.bigint() - startedAt) / 1e6);
735
+ if (reqLog && logConfig) {
736
+ try {
737
+ const collected = collectExtraLogFields(logConfig, req, url, {
752
738
  status,
753
- log: reqLog,
754
- ipAddress,
755
- errorCode: errorCode2,
756
739
  durationMs,
757
- format: logFormat,
758
- extra
740
+ errorCode: errorCode2
759
741
  });
760
- }
761
- if (customLogger) {
762
- const level = levelForStatus(status);
763
- customLogger[level](`${req.method} ${url.pathname} ${status}${errorCode2 ? ` ${errorCode2}` : ""} ${durationMs}ms`, {
764
- ...extra,
765
- ...frameworkFields,
766
- ip: ipAddress
767
- });
768
- }
769
- } catch {}
742
+ const frameworkFields = buildLogFields(req.method, url.pathname, status, durationMs, reqLog.traceId, errorCode2);
743
+ const ownedFields = { ...frameworkFields, ip: ipAddress };
744
+ for (const key of collected.enrichKeys) {
745
+ const ownedByActiveSink = Object.hasOwn(ownedFields, key) || useDefaultLog && (key === "ts" || key === "level" || key === "msg");
746
+ if (ownedByActiveSink && !warnedEnrichKeys.has(key)) {
747
+ warnedEnrichKeys.add(key);
748
+ warn(`[stitchkit] logging.enrich field "${key}" was discarded because the framework owns it`);
749
+ }
750
+ }
751
+ const extra = collected.fields;
752
+ if (useDefaultLog) {
753
+ logOutgoing({
754
+ req,
755
+ pathname: url.pathname,
756
+ status,
757
+ log: reqLog,
758
+ ipAddress,
759
+ errorCode: errorCode2,
760
+ durationMs,
761
+ format: logFormat,
762
+ extra
763
+ });
764
+ }
765
+ if (customLogger) {
766
+ const level = levelForStatus(status);
767
+ customLogger[level](`${req.method} ${url.pathname} ${status}${errorCode2 ? ` ${errorCode2}` : ""} ${durationMs}ms`, {
768
+ ...extra,
769
+ ...frameworkFields,
770
+ ip: ipAddress
771
+ });
772
+ }
773
+ } catch {}
774
+ }
775
+ const context = getRequestContext();
776
+ if (observability && context) {
777
+ try {
778
+ observability.complete({ context, statusCode: status, durationMs, payload });
779
+ } catch {}
780
+ }
770
781
  };
771
782
  const respondError = async (err, errCtx, endpoint) => {
772
783
  const recordFailure = (normalized) => {
@@ -786,25 +797,27 @@ function createHandler(config) {
786
797
  if (response instanceof Response) {
787
798
  recordFailure();
788
799
  const withCors = applyCors(response, cors, req);
789
- logDone(withCors.status, errorCode(err));
800
+ complete(withCors.status, errorCode(err));
790
801
  return withCors;
791
802
  }
792
803
  } catch {}
793
804
  }
794
805
  const appErr = normalizeError(err);
795
806
  recordFailure(appErr);
796
- logDone(appErr.status, appErr.code);
807
+ complete(appErr.status, appErr.code);
797
808
  return json(appErr.toJSON(), appErr.status, cors, req);
798
809
  };
799
810
  if (cors && req.method === "OPTIONS") {
800
- return corsPreflightResponse(cors, req);
811
+ const response = corsPreflightResponse(cors, req);
812
+ complete(response.status);
813
+ return response;
801
814
  }
802
815
  try {
803
816
  if (hooks?.onRequest) {
804
817
  const earlyResponse = await hooks.onRequest(req);
805
818
  if (earlyResponse instanceof Response) {
806
819
  const withCors = applyCors(earlyResponse, cors, req);
807
- logDone(withCors.status);
820
+ complete(withCors.status);
808
821
  return withCors;
809
822
  }
810
823
  }
@@ -821,7 +834,7 @@ function createHandler(config) {
821
834
  ipAddress
822
835
  });
823
836
  const withCors = applyCors(res, cors, req);
824
- logDone(withCors.status);
837
+ complete(withCors.status);
825
838
  return withCors;
826
839
  } catch (err) {
827
840
  return respondError(err);
@@ -863,7 +876,7 @@ function createHandler(config) {
863
876
  headers: result.headers
864
877
  }) : result;
865
878
  const rawRes = applyCors(response, cors, req);
866
- logDone(rawRes.status);
879
+ complete(rawRes.status);
867
880
  return rawRes;
868
881
  }
869
882
  if (groupHooks?.afterHandle) {
@@ -894,11 +907,11 @@ function createHandler(config) {
894
907
  applyResponseMetadata(responseHeaders, responseMetadata, `${method.serviceName}.${method.key}`);
895
908
  if (!method.outputSchema) {
896
909
  const empty = new Response(null, { status: responseStatus, headers: responseHeaders });
897
- logDone(responseStatus);
910
+ complete(responseStatus);
898
911
  return empty;
899
912
  }
900
913
  const body = Response.json(result, { status: responseStatus, headers: responseHeaders });
901
- logDone(responseStatus);
914
+ complete(responseStatus);
902
915
  return body;
903
916
  } catch (err) {
904
917
  return respondError(err, ctx, method);
@@ -906,16 +919,37 @@ function createHandler(config) {
906
919
  }
907
920
  return async (req, server) => {
908
921
  const url = new URL(req.url, "http://localhost");
909
- const traceId = resolveId(req);
922
+ const requestStartedAt = process.hrtime.bigint();
910
923
  const clientIp = {
911
924
  trustProxy,
912
925
  socketIp: resolveSocketIp(req, server)
913
926
  };
914
- const response = await dispatch(req, url, traceId, server, clientIp);
915
- try {
916
- response.headers.set("x-request-id", traceId);
917
- } catch {}
918
- return response;
927
+ const run = async (traceId2, startedAt) => {
928
+ const response = await dispatch(req, url, traceId2, server, clientIp, startedAt);
929
+ try {
930
+ response.headers.set("x-request-id", traceId2);
931
+ } catch {}
932
+ return response;
933
+ };
934
+ const activeContext = getRequestContext();
935
+ if (activeContext) {
936
+ return run(activeContext.trace.traceId, activeContext.startedAt);
937
+ }
938
+ if (!observability)
939
+ return run(resolveId(req), requestStartedAt);
940
+ const trace = resolveTraceContext(req);
941
+ const traceId = resolveId(req, trace.traceId);
942
+ const ipAddress = extractIp(req, clientIp) || undefined;
943
+ const userAgent = req.headers.get("user-agent") ?? undefined;
944
+ return runWithRequestContext({
945
+ source: "http",
946
+ method: req.method,
947
+ path: url.pathname,
948
+ startedAt: requestStartedAt,
949
+ trace: { ...trace, traceId },
950
+ ...ipAddress !== undefined && { ipAddress },
951
+ ...userAgent !== undefined && { userAgent }
952
+ }, () => run(traceId, requestStartedAt));
919
953
  };
920
954
  }
921
955
  function normalizeGroups(config) {
@@ -165,22 +165,97 @@ function stringValues(schema) {
165
165
  const values = schema.enum.filter((value) => typeof value === "string");
166
166
  return values.length === schema.enum.length ? values : null;
167
167
  }
168
+ var JSON_SCHEMA_TYPE_ORDER = [
169
+ "string",
170
+ "number",
171
+ "integer",
172
+ "boolean",
173
+ "object",
174
+ "array",
175
+ "null"
176
+ ];
177
+ function jsonSchemaType(value) {
178
+ switch (value) {
179
+ case "array":
180
+ case "boolean":
181
+ case "integer":
182
+ case "null":
183
+ case "number":
184
+ case "object":
185
+ case "string":
186
+ return value;
187
+ default:
188
+ return null;
189
+ }
190
+ }
191
+ function valueType(value) {
192
+ if (value === null)
193
+ return "null";
194
+ if (Array.isArray(value))
195
+ return "array";
196
+ if (isRecord(value))
197
+ return "object";
198
+ if (typeof value === "string")
199
+ return "string";
200
+ if (typeof value === "number")
201
+ return "number";
202
+ if (typeof value === "boolean")
203
+ return "boolean";
204
+ return null;
205
+ }
206
+ function normalizeTypes(types) {
207
+ const normalized = new Set(types);
208
+ if (normalized.has("number"))
209
+ normalized.delete("integer");
210
+ return JSON_SCHEMA_TYPE_ORDER.filter((type) => normalized.has(type));
211
+ }
212
+ function combinedBranchTypes(schema) {
213
+ for (const keyword of ["oneOf", "anyOf"]) {
214
+ const value = schema[keyword];
215
+ if (!Array.isArray(value) || value.length === 0)
216
+ continue;
217
+ const collected = [];
218
+ for (const branch of value) {
219
+ if (!isRecord(branch))
220
+ return null;
221
+ const types = typeNames(branch);
222
+ if (!types)
223
+ return null;
224
+ collected.push(...types);
225
+ }
226
+ return normalizeTypes(collected);
227
+ }
228
+ return null;
229
+ }
168
230
  function typeNames(schema) {
169
- if (typeof schema.type === "string")
170
- return [schema.type];
231
+ const direct = jsonSchemaType(schema.type);
232
+ if (direct)
233
+ return [direct];
171
234
  if (Array.isArray(schema.type)) {
172
- const values2 = schema.type.filter((value) => typeof value === "string");
173
- if (values2.length === schema.type.length)
174
- return values2;
175
- }
176
- const values = stringValues(schema);
177
- if (values)
178
- return ["string"];
179
- if (typeof schema.const === "number")
180
- return ["number"];
181
- if (typeof schema.const === "boolean")
182
- return ["boolean"];
183
- return null;
235
+ const values = [];
236
+ for (const value of schema.type) {
237
+ const type = jsonSchemaType(value);
238
+ if (!type)
239
+ return null;
240
+ values.push(type);
241
+ }
242
+ return values.length > 0 ? normalizeTypes(values) : null;
243
+ }
244
+ if (schema.const !== undefined) {
245
+ const type = valueType(schema.const);
246
+ return type ? [type] : null;
247
+ }
248
+ if (Array.isArray(schema.enum) && schema.enum.length > 0) {
249
+ const values = [];
250
+ for (const value of schema.enum) {
251
+ const type = valueType(value);
252
+ if (!type)
253
+ return null;
254
+ values.push(type);
255
+ }
256
+ return normalizeTypes(values);
257
+ }
258
+ return combinedBranchTypes(schema);
184
259
  }
185
260
  function typeSchema(type, nullable) {
186
261
  const schema = { type: nullable ? [type, "null"] : type };
@@ -206,6 +281,8 @@ function commonBaseType(schemas) {
206
281
  bases.add(name);
207
282
  }
208
283
  }
284
+ if (bases.size === 0)
285
+ return nullable ? { type: "null" } : {};
209
286
  if (bases.size === 1) {
210
287
  const [only] = bases;
211
288
  return only ? typeSchema(only, nullable) : {};
@@ -213,7 +290,8 @@ function commonBaseType(schemas) {
213
290
  if ([...bases].every((name) => name === "integer" || name === "number")) {
214
291
  return typeSchema("number", nullable);
215
292
  }
216
- return {};
293
+ const types = normalizeTypes(nullable ? [...bases, "null"] : bases);
294
+ return types.length > 0 ? { type: types } : {};
217
295
  }
218
296
  function mergePropertySchemas(properties) {
219
297
  const schemas = properties.map((property) => nullableProjection(property.schema));