@classytic/arc 2.20.0 → 2.22.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 (143) hide show
  1. package/dist/{BaseController-D-MHZ27_.mjs → BaseController-C6FlRWxF.mjs} +2 -2
  2. package/dist/{EventTransport-IEn7Tn-Q.d.mts → EventTransport-QmY7A258.d.mts} +0 -1
  3. package/dist/{QueryCache-TRfXau3W.d.mts → QueryCache-Z1B38koh.d.mts} +0 -1
  4. package/dist/{actionPermissions-C9RMiIpc.mjs → actionPermissions-ze70xXJi.mjs} +1 -1
  5. package/dist/audit/index.d.mts +9 -5
  6. package/dist/auth/audit.d.mts +7 -4
  7. package/dist/auth/audit.mjs +5 -0
  8. package/dist/auth/index.d.mts +35 -14
  9. package/dist/auth/index.mjs +6 -3
  10. package/dist/auth/redis-session.d.mts +1 -2
  11. package/dist/cache/index.d.mts +2 -3
  12. package/dist/cli/commands/describe.d.mts +1 -2
  13. package/dist/cli/commands/docs.mjs +1 -1
  14. package/dist/cli/commands/init.mjs +1 -1
  15. package/dist/cli/index.mjs +1 -1
  16. package/dist/context/index.d.mts +2 -2
  17. package/dist/core/index.d.mts +3 -3
  18. package/dist/core/index.mjs +4 -4
  19. package/dist/{core-CWhyGkiM.mjs → core-b6fgFgnd.mjs} +129 -17
  20. package/dist/{createActionRouter-HlQso0jO.mjs → createActionRouter-h1cEEaEX.mjs} +10 -6
  21. package/dist/{createAggregationRouter-5LzPzgw1.mjs → createAggregationRouter-B1C0kvTL.mjs} +3 -3
  22. package/dist/{createApp-D6uwzCKu.mjs → createApp-Ci7yG5gv.mjs} +390 -192
  23. package/dist/discovery/index.d.mts +0 -1
  24. package/dist/docs/index.d.mts +1 -2
  25. package/dist/docs/index.mjs +1 -1
  26. package/dist/{elevation-xGUBq6p_.d.mts → elevation-C9s5hFP_.d.mts} +0 -1
  27. package/dist/encryption/index.d.mts +2 -144
  28. package/dist/encryption/index.mjs +9 -5
  29. package/dist/{errorHandler-Dxf6P_kV.mjs → errorHandler-BTzXSwIg.mjs} +24 -3
  30. package/dist/{errorHandler-BtUUDPEa.d.mts → errorHandler-C6yv4ZTW.d.mts} +13 -1
  31. package/dist/{errors-DOHkjQlD.d.mts → errors-DHcHVAgk.d.mts} +0 -1
  32. package/dist/{eventPlugin-DbBFd3x_.d.mts → eventPlugin-A6EbthXR.d.mts} +10 -6
  33. package/dist/events/index.d.mts +9 -6
  34. package/dist/events/transports/redis-stream-entry.d.mts +1 -1
  35. package/dist/events/transports/redis.d.mts +1 -2
  36. package/dist/factory/index.d.mts +30 -9
  37. package/dist/factory/index.mjs +35 -4
  38. package/dist/{fastify-augmentation-CCQJEDgh.d.mts → fastify-augmentation-9_fuetB4.d.mts} +2 -3
  39. package/dist/fields-D3lhgzhD.d.mts +121 -0
  40. package/dist/health-ScyjIVo5.mjs +202 -0
  41. package/dist/hooks/index.d.mts +1 -1
  42. package/dist/idempotency/index.d.mts +4 -3
  43. package/dist/idempotency/index.mjs +2 -0
  44. package/dist/idempotency/redis.d.mts +1 -1
  45. package/dist/{types-BHMKlMBU.d.mts → index-BEu4wjbL.d.mts} +241 -80
  46. package/dist/{index-DUa8WHz3.d.mts → index-D8MKYGDa.d.mts} +88 -7
  47. package/dist/{index-_--GyzcO.d.mts → index-DbtgCOCj.d.mts} +1324 -1228
  48. package/dist/{index-CdFkIMEd.d.mts → index-ogIHvOjo.d.mts} +36 -7
  49. package/dist/index.d.mts +8 -7
  50. package/dist/index.mjs +6 -6
  51. package/dist/{init-YH_nslQR.mjs → init-DleK3p9f.mjs} +272 -139
  52. package/dist/integrations/event-gateway.d.mts +2 -3
  53. package/dist/integrations/index.d.mts +2 -2
  54. package/dist/integrations/jobs.d.mts +0 -1
  55. package/dist/integrations/mcp/index.d.mts +6 -7
  56. package/dist/integrations/mcp/index.mjs +1 -1
  57. package/dist/integrations/mcp/testing.d.mts +1 -2
  58. package/dist/integrations/mcp/testing.mjs +1 -1
  59. package/dist/integrations/streamline.d.mts +2 -2
  60. package/dist/integrations/webhooks.d.mts +8 -5
  61. package/dist/integrations/webhooks.mjs +9 -5
  62. package/dist/integrations/websocket-pushref-redis.d.mts +1 -2
  63. package/dist/integrations/websocket-redis.d.mts +1 -2
  64. package/dist/integrations/websocket.d.mts +2 -2
  65. package/dist/jsonBody-BlzAoGCe.mjs +43 -0
  66. package/dist/{loadResources-B8UmpITt.mjs → loadResources-DpU8pfjV.mjs} +4 -3
  67. package/dist/logger/index.d.mts +26 -1
  68. package/dist/logger/index.mjs +39 -1
  69. package/dist/{mcpPlugin-CuW6L_uD.mjs → mcpPlugin-ByA2tf6D.mjs} +8 -4
  70. package/dist/middleware/index.d.mts +1 -2
  71. package/dist/{module-JYH9V0I8.d.mts → module-B4u10iOJ.d.mts} +71 -1
  72. package/dist/{openapi-Dq6RbEGK.mjs → openapi-BRpMZD7C.mjs} +3 -3
  73. package/dist/permissions/index.d.mts +4 -3
  74. package/dist/permissions/index.mjs +2 -2
  75. package/dist/{permissions-CgbOLJZG.mjs → permissions-BJMuKMl7.mjs} +33 -1
  76. package/dist/pipeline/index.d.mts +1 -2
  77. package/dist/plugins/index.d.mts +96 -7
  78. package/dist/plugins/index.mjs +86 -268
  79. package/dist/plugins/response-cache.d.mts +5 -3
  80. package/dist/plugins/response-cache.mjs +1 -0
  81. package/dist/plugins/tracing-entry.d.mts +1 -1
  82. package/dist/plugins/tracing-entry.mjs +7 -4
  83. package/dist/presets/filesUpload.d.mts +4 -5
  84. package/dist/presets/filesUpload.mjs +1 -1
  85. package/dist/presets/index.d.mts +1 -2
  86. package/dist/presets/index.mjs +1 -1
  87. package/dist/presets/multiTenant.d.mts +1 -2
  88. package/dist/presets/search.d.mts +2 -3
  89. package/dist/presets/search.mjs +1 -1
  90. package/dist/{presets-DWsYQdbV.mjs → presets-gw0ciIUD.mjs} +1 -1
  91. package/dist/{pushref-registry-DnCqL3aa.d.mts → pushref-registry-BbcnpNTm.d.mts} +4 -2
  92. package/dist/{queryCachePlugin-xzFyKAjT.d.mts → queryCachePlugin-CfYWq-Ak.d.mts} +1 -2
  93. package/dist/rateLimitKey-BoWRH3e7.mjs +14 -0
  94. package/dist/{redis-C3W0qbz8.d.mts → redis-UDtLaNj6.d.mts} +0 -1
  95. package/dist/{redis-stream-DsP1vqZB.d.mts → redis-stream-iVR2l7aS.d.mts} +1 -2
  96. package/dist/{registerRoute-DGSREwPw.mjs → registerRoute-xHc42fwB.mjs} +38 -18
  97. package/dist/registry/index.d.mts +2 -2
  98. package/dist/requestId-5BhTVzBv.mjs +113 -0
  99. package/dist/schemaConverter-Ds5reSGs.mjs +168 -0
  100. package/dist/{schemaIR-ajetw3Fv.mjs → schemaIR-B-6SPe7g.mjs} +2 -2
  101. package/dist/schemas/index.d.mts +0 -1
  102. package/dist/scim/index.d.mts +0 -1
  103. package/dist/scim/index.mjs +6 -7
  104. package/dist/scope/index.d.mts +2 -3
  105. package/dist/scope/index.mjs +2 -76
  106. package/dist/scope-k15RXfcq.mjs +64 -0
  107. package/dist/{sessionManager-BXG-HGwG.d.mts → sessionManager-BHOM3N_0.d.mts} +10 -6
  108. package/dist/{storage-Co_PQpeQ.d.mts → storage-DLUZ04kK.d.mts} +8 -4
  109. package/dist/testing/index.d.mts +83 -4
  110. package/dist/testing/index.mjs +74 -4
  111. package/dist/testing/storageContract.d.mts +1 -2
  112. package/dist/{tracing-D8jlGXP7.d.mts → tracing-CsGKQJGg.d.mts} +0 -1
  113. package/dist/types/index.d.mts +4 -4
  114. package/dist/types/storage.d.mts +1 -1
  115. package/dist/{types-C9b2HR5W.d.mts → types-Bc42CUyk.d.mts} +1 -2
  116. package/dist/types-Cc91nXuA.d.mts +132 -0
  117. package/dist/{fields-C7ahdGYf.d.mts → types-Csxga7d3.d.mts} +2 -123
  118. package/dist/{types-LNebCoJx.d.mts → types-DH0GupI7.d.mts} +8 -4
  119. package/dist/usage/index.d.mts +142 -0
  120. package/dist/usage/index.mjs +0 -0
  121. package/dist/utils/index.d.mts +220 -144
  122. package/dist/utils/index.mjs +3 -3
  123. package/dist/{utils-ChjYQpjn.mjs → utils-FhJ88TJE.mjs} +129 -39
  124. package/dist/{versioning-D_eBCfNr.d.mts → versioning-DLwklPlG.d.mts} +1 -7
  125. package/dist/{websocket-MlYlrYq0.d.mts → websocket-uuWqM6UY.d.mts} +5 -4
  126. package/llms.txt +39 -0
  127. package/package.json +453 -447
  128. package/skills/arc/SKILL.md +14 -8
  129. package/skills/arc/references/api-reference.md +34 -0
  130. package/skills/arc/references/auth.md +21 -4
  131. package/skills/arc/references/mcp.md +1 -1
  132. package/skills/arc/references/production.md +44 -2
  133. package/skills/arc-code-review/SKILL.md +1 -1
  134. package/skills/arc-code-review/references/anti-patterns.md +71 -18
  135. package/skills/arc-code-review/references/arc-cheatsheet.md +15 -2
  136. package/skills/arc-code-review/references/migration-recipes.md +7 -7
  137. package/skills/arc-code-review/references/mongokit-migration.md +4 -3
  138. package/skills/arc-module-publishing/SKILL.md +243 -0
  139. package/skills/arc-module-publishing/references/authoring-modules.md +327 -0
  140. package/skills/arc-module-publishing/references/package-manifest.md +157 -0
  141. package/skills/arc-module-publishing/references/publishing-workflow.md +182 -0
  142. package/dist/preloadResources-CHw3_oA_.mjs +0 -45
  143. package/dist/schemaConverter-U0MnO9vd.mjs +0 -110
@@ -1,9 +1,8 @@
1
- import { Qt as UserLike, S as QueryParserInterface, b as ParsedQuery, et as OpenApiSchemas, qt as AnyRecord, st as ResourceConfig } from "../index-_--GyzcO.mjs";
2
- import { n as ErrorMapper } from "../errorHandler-BtUUDPEa.mjs";
3
- import { a as NotFoundError, c as RateLimitError, d as ValidationError, f as createDomainError, i as ForbiddenError, l as ServiceUnavailableError, m as isArcError, n as ConflictError, o as OrgAccessDeniedError, p as createError, r as ErrorOptions, s as OrgRequiredError, t as ArcError, u as UnauthorizedError } from "../errors-DOHkjQlD.mjs";
1
+ import { $ as OpenApiSchemas, Qt as UserLike, S as QueryParserInterface, U as ResourceConfig, b as ParsedQuery, qt as AnyRecord } from "../index-DbtgCOCj.mjs";
2
+ import { n as ErrorMapper } from "../errorHandler-C6yv4ZTW.mjs";
3
+ import { a as NotFoundError, c as RateLimitError, d as ValidationError, f as createDomainError, i as ForbiddenError, l as ServiceUnavailableError, m as isArcError, n as ConflictError, o as OrgAccessDeniedError, p as createError, r as ErrorOptions, s as OrgRequiredError, t as ArcError, u as UnauthorizedError } from "../errors-DHcHVAgk.mjs";
4
4
  import { errorContractSchema, errorDetailSchema } from "@classytic/repo-core/errors";
5
5
  import { FastifyInstance, FastifyReply, FastifyRequest, RouteHandlerMethod } from "fastify";
6
-
7
6
  //#region src/core/validateResourceConfig.d.ts
8
7
  interface ConfigError {
9
8
  field: string;
@@ -384,6 +383,49 @@ interface Guard<T> {
384
383
  */
385
384
  declare function defineGuard<T>(config: GuardConfig<T>): Guard<T>;
386
385
  //#endregion
386
+ //#region src/utils/filter-dialect.d.ts
387
+ /**
388
+ * Filter dialects — decouple `ArcQueryParser` from any single datastore's
389
+ * operator vocabulary.
390
+ *
391
+ * The parser owns everything store-INDEPENDENT: URL parsing, field/operator
392
+ * whitelisting, depth limits, value coercion, ReDoS-safe regex sanitisation.
393
+ * A `FilterDialect` owns the ONLY store-specific part of the output — which
394
+ * token each neutral operator (`gte`, `like`, `in`, …) is emitted as, and how a
395
+ * case-insensitive text match is expressed. Swap the dialect (or the whole
396
+ * parser via `QueryParserInterface`) to target a non-Mongo store; the default
397
+ * stays Mongo, so existing hosts are unaffected.
398
+ */
399
+ interface FilterDialect {
400
+ /**
401
+ * Neutral operator name → emitted token. An operator absent from this map is
402
+ * treated as unsupported (dropped), so a dialect also defines its operator set.
403
+ */
404
+ readonly operators: Readonly<Record<string, string>>;
405
+ /**
406
+ * Extra keys merged into a field-filter when a documented case-insensitive
407
+ * text operator (`like` / `contains`) is used. Mongo expresses this as a
408
+ * sibling `{ $options: 'i' }`; a dialect that encodes case-insensitivity in
409
+ * the operator itself returns `{}`.
410
+ */
411
+ caseInsensitiveModifier(): Record<string, unknown>;
412
+ }
413
+ /**
414
+ * Default dialect — MongoDB / MongoKit operator shape. Emits `$`-prefixed
415
+ * tokens and the `$options: 'i'` case-insensitive sibling. This is what
416
+ * `ArcQueryParser` uses when no dialect is supplied, so behaviour is identical
417
+ * to every prior arc version.
418
+ */
419
+ declare const MONGO_DIALECT: FilterDialect;
420
+ /**
421
+ * Store-neutral reference dialect — emits UN-prefixed operator tokens as a
422
+ * translation AST (`?price[gte]=40` → `{ price: { gte: 40 } }`, with
423
+ * `{ caseInsensitive: true }` for `like`/`contains`). A non-Mongo adapter can
424
+ * consume this directly instead of writing a full `QueryParserInterface`. Use
425
+ * as a starting point; adjust the token names to your store's vocabulary.
426
+ */
427
+ declare const NEUTRAL_DIALECT: FilterDialect;
428
+ //#endregion
387
429
  //#region src/utils/handleRaw.d.ts
388
430
  /**
389
431
  * Wrap a raw Fastify handler with Arc's response shape and error handling.
@@ -425,6 +467,13 @@ interface ArcQueryParserOptions {
425
467
  * Also used by MCP to enrich list tool descriptions.
426
468
  */
427
469
  allowedOperators?: string[];
470
+ /**
471
+ * Datastore dialect for the EMITTED filter shape (operator tokens +
472
+ * case-insensitive expression). Defaults to `MONGO_DIALECT`. Pass
473
+ * `NEUTRAL_DIALECT` (or a custom one) to retarget the operator vocabulary
474
+ * without writing a full `QueryParserInterface`.
475
+ */
476
+ dialect?: FilterDialect;
428
477
  }
429
478
  /**
430
479
  * Arc's default query parser
@@ -469,8 +518,13 @@ declare class ArcQueryParser implements QueryParserInterface {
469
518
  readonly allowedSortFields?: readonly string[];
470
519
  /** Allowed operators (used by MCP for operator descriptions) */
471
520
  readonly allowedOperators?: readonly string[];
472
- /** Supported filter operators */
473
- private readonly operators;
521
+ /**
522
+ * Datastore dialect — owns the store-specific operator tokens + the
523
+ * case-insensitive modifier. Defaults to Mongo (backward-compatible).
524
+ */
525
+ private readonly dialect;
526
+ /** Supported filter operators (neutral name → emitted token), from the dialect. */
527
+ private get operators();
474
528
  constructor(options?: ArcQueryParserOptions);
475
529
  /**
476
530
  * Parse URL query parameters into structured query options
@@ -545,9 +599,8 @@ declare function createQueryParser(options?: ArcQueryParserOptions): ArcQueryPar
545
599
  interface JsonSchema {
546
600
  /**
547
601
  * Optional because JSON Schema allows top-level combinator-only schemas
548
- * (`{ oneOf: [...] }`, `{ anyOf: [...] }`, `{ allOf: [...] }`) — see
549
- * `listResponse()`, which emits a `oneOf` of the four canonical list
550
- * shapes with no top-level `type`.
602
+ * (`{ oneOf: [...] }`, `{ anyOf: [...] }`, `{ allOf: [...] }`) — hosts
603
+ * may pass such schemas anywhere a `JsonSchema` is accepted.
551
604
  */
552
605
  type?: string | string[];
553
606
  properties?: Record<string, JsonSchema | AnyRecord>;
@@ -569,18 +622,25 @@ interface JsonSchema {
569
622
  */
570
623
  declare const paginationSchema: JsonSchema;
571
624
  /**
572
- * List response schema — full union of every wire shape `toCanonicalList`
573
- * can emit. Hosts who know their endpoint only ever produces one variant
574
- * can pin to a narrower helper:
625
+ * List response schema — accepts every wire shape `toCanonicalList` can
626
+ * emit. Hosts who know their endpoint only ever produces one variant can
627
+ * pin to a narrower helper (sharper OpenAPI docs, same serializer speed):
575
628
  * - `offsetListResponse(item)` — `{ method: 'offset', data, page, limit, total, pages, hasNext, hasPrev }`
576
629
  * - `keysetListResponse(item)` — `{ method: 'keyset', data, limit, hasMore, next: string|null }`
577
630
  * - `aggregateListResponse(item)` — `{ method: 'aggregate', ...offset fields }`
578
631
  * - `bareListResponse(item)` — `{ data }`
579
632
  *
580
- * The default `listResponse(item)` is the union (`oneOf`) of all four so
581
- * Fastify validation accepts any canonical kit shape — pre-2.13 this only
582
- * modelled offset and rejected keyset/aggregate/bare lists at the
583
- * response-schema gate.
633
+ * SHAPE: one merged permissive object, NOT a `oneOf` union (2.22). The
634
+ * pre-2.22 union was semantically identical on the wire — every variant is
635
+ * `additionalProperties: true` and the property definitions never conflict
636
+ * (`next` only exists on keyset, the offset counters only on offset/
637
+ * aggregate; fast-json-stringify skips undefined optionals) — but
638
+ * fast-json-stringify implements top-level `oneOf` by running full AJV
639
+ * validation PER RESPONSE to pick the branch, on the hottest route of
640
+ * every arc app. The merge keeps the exact bytes (pinned by
641
+ * `tests/utils/list-response-serialization.test.ts`) and drops the
642
+ * per-response branch validation. Only `data` is required — the one field
643
+ * all four variants share.
584
644
  */
585
645
  declare function listResponse(itemSchema: JsonSchema): JsonSchema;
586
646
  /** Offset variant — `{ method: 'offset', data, page, limit, total, pages, hasNext, hasPrev }`. */
@@ -607,12 +667,10 @@ declare const responses: {
607
667
  content: {
608
668
  "application/json": {
609
669
  schema: {
610
- additionalProperties: boolean;
611
670
  /**
612
671
  * Optional because JSON Schema allows top-level combinator-only schemas
613
- * (`{ oneOf: [...] }`, `{ anyOf: [...] }`, `{ allOf: [...] }`) — see
614
- * `listResponse()`, which emits a `oneOf` of the four canonical list
615
- * shapes with no top-level `type`.
672
+ * (`{ oneOf: [...] }`, `{ anyOf: [...] }`, `{ allOf: [...] }`) — hosts
673
+ * may pass such schemas anywhere a `JsonSchema` is accepted.
616
674
  */
617
675
  type?: string | string[];
618
676
  properties?: Record<string, JsonSchema | AnyRecord>;
@@ -623,6 +681,7 @@ declare const responses: {
623
681
  oneOf?: JsonSchema[];
624
682
  anyOf?: JsonSchema[];
625
683
  allOf?: JsonSchema[];
684
+ additionalProperties: boolean;
626
685
  };
627
686
  };
628
687
  };
@@ -632,54 +691,54 @@ declare const responses: {
632
691
  content: {
633
692
  "application/json": {
634
693
  schema: {
635
- readonly type: "object";
694
+ readonly type: 'object';
636
695
  readonly properties: {
637
696
  readonly code: {
638
- readonly type: "string";
697
+ readonly type: 'string';
639
698
  readonly description: "Hierarchical machine-readable code (e.g. 'arc.not_found').";
640
699
  };
641
700
  readonly message: {
642
- readonly type: "string";
643
- readonly description: "Human-readable, safe-for-client message.";
701
+ readonly type: 'string';
702
+ readonly description: 'Human-readable, safe-for-client message.';
644
703
  };
645
704
  readonly status: {
646
- readonly type: "integer";
647
- readonly description: "Suggested HTTP status code (hosts may override).";
705
+ readonly type: 'integer';
706
+ readonly description: 'Suggested HTTP status code (hosts may override).';
648
707
  };
649
708
  readonly details: {
650
- readonly type: "array";
651
- readonly description: "Field-scoped structured details (validation failures, duplicate keys, multi-code domain errors).";
709
+ readonly type: 'array';
710
+ readonly description: 'Field-scoped structured details (validation failures, duplicate keys, multi-code domain errors).';
652
711
  readonly items: {
653
- readonly type: "object";
712
+ readonly type: 'object';
654
713
  readonly properties: {
655
714
  readonly path: {
656
- readonly type: "string";
715
+ readonly type: 'string';
657
716
  readonly description: "Dot-path to the offending field, e.g. 'lines.0.quantity'.";
658
717
  };
659
718
  readonly code: {
660
- readonly type: "string";
719
+ readonly type: 'string';
661
720
  };
662
721
  readonly message: {
663
- readonly type: "string";
722
+ readonly type: 'string';
664
723
  };
665
724
  readonly meta: {
666
- readonly type: "object";
667
- readonly description: "Non-PII per-detail diagnostics (safe to log + return).";
725
+ readonly type: 'object';
726
+ readonly description: 'Non-PII per-detail diagnostics (safe to log + return).';
668
727
  };
669
728
  };
670
- readonly required: readonly ["code", "message"];
729
+ readonly required: readonly ['code', 'message'];
671
730
  };
672
731
  };
673
732
  readonly correlationId: {
674
- readonly type: "string";
675
- readonly description: "Request id for support lookups.";
733
+ readonly type: 'string';
734
+ readonly description: 'Request id for support lookups.';
676
735
  };
677
736
  readonly meta: {
678
- readonly type: "object";
679
- readonly description: "Non-PII diagnostics (safe to log + return).";
737
+ readonly type: 'object';
738
+ readonly description: 'Non-PII diagnostics (safe to log + return).';
680
739
  };
681
740
  };
682
- readonly required: readonly ["code", "message"];
741
+ readonly required: readonly ['code', 'message'];
683
742
  };
684
743
  };
685
744
  };
@@ -689,54 +748,54 @@ declare const responses: {
689
748
  content: {
690
749
  "application/json": {
691
750
  schema: {
692
- readonly type: "object";
751
+ readonly type: 'object';
693
752
  readonly properties: {
694
753
  readonly code: {
695
- readonly type: "string";
754
+ readonly type: 'string';
696
755
  readonly description: "Hierarchical machine-readable code (e.g. 'arc.not_found').";
697
756
  };
698
757
  readonly message: {
699
- readonly type: "string";
700
- readonly description: "Human-readable, safe-for-client message.";
758
+ readonly type: 'string';
759
+ readonly description: 'Human-readable, safe-for-client message.';
701
760
  };
702
761
  readonly status: {
703
- readonly type: "integer";
704
- readonly description: "Suggested HTTP status code (hosts may override).";
762
+ readonly type: 'integer';
763
+ readonly description: 'Suggested HTTP status code (hosts may override).';
705
764
  };
706
765
  readonly details: {
707
- readonly type: "array";
708
- readonly description: "Field-scoped structured details (validation failures, duplicate keys, multi-code domain errors).";
766
+ readonly type: 'array';
767
+ readonly description: 'Field-scoped structured details (validation failures, duplicate keys, multi-code domain errors).';
709
768
  readonly items: {
710
- readonly type: "object";
769
+ readonly type: 'object';
711
770
  readonly properties: {
712
771
  readonly path: {
713
- readonly type: "string";
772
+ readonly type: 'string';
714
773
  readonly description: "Dot-path to the offending field, e.g. 'lines.0.quantity'.";
715
774
  };
716
775
  readonly code: {
717
- readonly type: "string";
776
+ readonly type: 'string';
718
777
  };
719
778
  readonly message: {
720
- readonly type: "string";
779
+ readonly type: 'string';
721
780
  };
722
781
  readonly meta: {
723
- readonly type: "object";
724
- readonly description: "Non-PII per-detail diagnostics (safe to log + return).";
782
+ readonly type: 'object';
783
+ readonly description: 'Non-PII per-detail diagnostics (safe to log + return).';
725
784
  };
726
785
  };
727
- readonly required: readonly ["code", "message"];
786
+ readonly required: readonly ['code', 'message'];
728
787
  };
729
788
  };
730
789
  readonly correlationId: {
731
- readonly type: "string";
732
- readonly description: "Request id for support lookups.";
790
+ readonly type: 'string';
791
+ readonly description: 'Request id for support lookups.';
733
792
  };
734
793
  readonly meta: {
735
- readonly type: "object";
736
- readonly description: "Non-PII diagnostics (safe to log + return).";
794
+ readonly type: 'object';
795
+ readonly description: 'Non-PII diagnostics (safe to log + return).';
737
796
  };
738
797
  };
739
- readonly required: readonly ["code", "message"];
798
+ readonly required: readonly ['code', 'message'];
740
799
  };
741
800
  };
742
801
  };
@@ -746,54 +805,54 @@ declare const responses: {
746
805
  content: {
747
806
  "application/json": {
748
807
  schema: {
749
- readonly type: "object";
808
+ readonly type: 'object';
750
809
  readonly properties: {
751
810
  readonly code: {
752
- readonly type: "string";
811
+ readonly type: 'string';
753
812
  readonly description: "Hierarchical machine-readable code (e.g. 'arc.not_found').";
754
813
  };
755
814
  readonly message: {
756
- readonly type: "string";
757
- readonly description: "Human-readable, safe-for-client message.";
815
+ readonly type: 'string';
816
+ readonly description: 'Human-readable, safe-for-client message.';
758
817
  };
759
818
  readonly status: {
760
- readonly type: "integer";
761
- readonly description: "Suggested HTTP status code (hosts may override).";
819
+ readonly type: 'integer';
820
+ readonly description: 'Suggested HTTP status code (hosts may override).';
762
821
  };
763
822
  readonly details: {
764
- readonly type: "array";
765
- readonly description: "Field-scoped structured details (validation failures, duplicate keys, multi-code domain errors).";
823
+ readonly type: 'array';
824
+ readonly description: 'Field-scoped structured details (validation failures, duplicate keys, multi-code domain errors).';
766
825
  readonly items: {
767
- readonly type: "object";
826
+ readonly type: 'object';
768
827
  readonly properties: {
769
828
  readonly path: {
770
- readonly type: "string";
829
+ readonly type: 'string';
771
830
  readonly description: "Dot-path to the offending field, e.g. 'lines.0.quantity'.";
772
831
  };
773
832
  readonly code: {
774
- readonly type: "string";
833
+ readonly type: 'string';
775
834
  };
776
835
  readonly message: {
777
- readonly type: "string";
836
+ readonly type: 'string';
778
837
  };
779
838
  readonly meta: {
780
- readonly type: "object";
781
- readonly description: "Non-PII per-detail diagnostics (safe to log + return).";
839
+ readonly type: 'object';
840
+ readonly description: 'Non-PII per-detail diagnostics (safe to log + return).';
782
841
  };
783
842
  };
784
- readonly required: readonly ["code", "message"];
843
+ readonly required: readonly ['code', 'message'];
785
844
  };
786
845
  };
787
846
  readonly correlationId: {
788
- readonly type: "string";
789
- readonly description: "Request id for support lookups.";
847
+ readonly type: 'string';
848
+ readonly description: 'Request id for support lookups.';
790
849
  };
791
850
  readonly meta: {
792
- readonly type: "object";
793
- readonly description: "Non-PII diagnostics (safe to log + return).";
851
+ readonly type: 'object';
852
+ readonly description: 'Non-PII diagnostics (safe to log + return).';
794
853
  };
795
854
  };
796
- readonly required: readonly ["code", "message"];
855
+ readonly required: readonly ['code', 'message'];
797
856
  };
798
857
  };
799
858
  };
@@ -803,54 +862,54 @@ declare const responses: {
803
862
  content: {
804
863
  "application/json": {
805
864
  schema: {
806
- readonly type: "object";
865
+ readonly type: 'object';
807
866
  readonly properties: {
808
867
  readonly code: {
809
- readonly type: "string";
868
+ readonly type: 'string';
810
869
  readonly description: "Hierarchical machine-readable code (e.g. 'arc.not_found').";
811
870
  };
812
871
  readonly message: {
813
- readonly type: "string";
814
- readonly description: "Human-readable, safe-for-client message.";
872
+ readonly type: 'string';
873
+ readonly description: 'Human-readable, safe-for-client message.';
815
874
  };
816
875
  readonly status: {
817
- readonly type: "integer";
818
- readonly description: "Suggested HTTP status code (hosts may override).";
876
+ readonly type: 'integer';
877
+ readonly description: 'Suggested HTTP status code (hosts may override).';
819
878
  };
820
879
  readonly details: {
821
- readonly type: "array";
822
- readonly description: "Field-scoped structured details (validation failures, duplicate keys, multi-code domain errors).";
880
+ readonly type: 'array';
881
+ readonly description: 'Field-scoped structured details (validation failures, duplicate keys, multi-code domain errors).';
823
882
  readonly items: {
824
- readonly type: "object";
883
+ readonly type: 'object';
825
884
  readonly properties: {
826
885
  readonly path: {
827
- readonly type: "string";
886
+ readonly type: 'string';
828
887
  readonly description: "Dot-path to the offending field, e.g. 'lines.0.quantity'.";
829
888
  };
830
889
  readonly code: {
831
- readonly type: "string";
890
+ readonly type: 'string';
832
891
  };
833
892
  readonly message: {
834
- readonly type: "string";
893
+ readonly type: 'string';
835
894
  };
836
895
  readonly meta: {
837
- readonly type: "object";
838
- readonly description: "Non-PII per-detail diagnostics (safe to log + return).";
896
+ readonly type: 'object';
897
+ readonly description: 'Non-PII per-detail diagnostics (safe to log + return).';
839
898
  };
840
899
  };
841
- readonly required: readonly ["code", "message"];
900
+ readonly required: readonly ['code', 'message'];
842
901
  };
843
902
  };
844
903
  readonly correlationId: {
845
- readonly type: "string";
846
- readonly description: "Request id for support lookups.";
904
+ readonly type: 'string';
905
+ readonly description: 'Request id for support lookups.';
847
906
  };
848
907
  readonly meta: {
849
- readonly type: "object";
850
- readonly description: "Non-PII diagnostics (safe to log + return).";
908
+ readonly type: 'object';
909
+ readonly description: 'Non-PII diagnostics (safe to log + return).';
851
910
  };
852
911
  };
853
- readonly required: readonly ["code", "message"];
912
+ readonly required: readonly ['code', 'message'];
854
913
  };
855
914
  };
856
915
  };
@@ -860,54 +919,54 @@ declare const responses: {
860
919
  content: {
861
920
  "application/json": {
862
921
  schema: {
863
- readonly type: "object";
922
+ readonly type: 'object';
864
923
  readonly properties: {
865
924
  readonly code: {
866
- readonly type: "string";
925
+ readonly type: 'string';
867
926
  readonly description: "Hierarchical machine-readable code (e.g. 'arc.not_found').";
868
927
  };
869
928
  readonly message: {
870
- readonly type: "string";
871
- readonly description: "Human-readable, safe-for-client message.";
929
+ readonly type: 'string';
930
+ readonly description: 'Human-readable, safe-for-client message.';
872
931
  };
873
932
  readonly status: {
874
- readonly type: "integer";
875
- readonly description: "Suggested HTTP status code (hosts may override).";
933
+ readonly type: 'integer';
934
+ readonly description: 'Suggested HTTP status code (hosts may override).';
876
935
  };
877
936
  readonly details: {
878
- readonly type: "array";
879
- readonly description: "Field-scoped structured details (validation failures, duplicate keys, multi-code domain errors).";
937
+ readonly type: 'array';
938
+ readonly description: 'Field-scoped structured details (validation failures, duplicate keys, multi-code domain errors).';
880
939
  readonly items: {
881
- readonly type: "object";
940
+ readonly type: 'object';
882
941
  readonly properties: {
883
942
  readonly path: {
884
- readonly type: "string";
943
+ readonly type: 'string';
885
944
  readonly description: "Dot-path to the offending field, e.g. 'lines.0.quantity'.";
886
945
  };
887
946
  readonly code: {
888
- readonly type: "string";
947
+ readonly type: 'string';
889
948
  };
890
949
  readonly message: {
891
- readonly type: "string";
950
+ readonly type: 'string';
892
951
  };
893
952
  readonly meta: {
894
- readonly type: "object";
895
- readonly description: "Non-PII per-detail diagnostics (safe to log + return).";
953
+ readonly type: 'object';
954
+ readonly description: 'Non-PII per-detail diagnostics (safe to log + return).';
896
955
  };
897
956
  };
898
- readonly required: readonly ["code", "message"];
957
+ readonly required: readonly ['code', 'message'];
899
958
  };
900
959
  };
901
960
  readonly correlationId: {
902
- readonly type: "string";
903
- readonly description: "Request id for support lookups.";
961
+ readonly type: 'string';
962
+ readonly description: 'Request id for support lookups.';
904
963
  };
905
964
  readonly meta: {
906
- readonly type: "object";
907
- readonly description: "Non-PII diagnostics (safe to log + return).";
965
+ readonly type: 'object';
966
+ readonly description: 'Non-PII diagnostics (safe to log + return).';
908
967
  };
909
968
  };
910
- readonly required: readonly ["code", "message"];
969
+ readonly required: readonly ['code', 'message'];
911
970
  };
912
971
  };
913
972
  };
@@ -917,54 +976,54 @@ declare const responses: {
917
976
  content: {
918
977
  "application/json": {
919
978
  schema: {
920
- readonly type: "object";
979
+ readonly type: 'object';
921
980
  readonly properties: {
922
981
  readonly code: {
923
- readonly type: "string";
982
+ readonly type: 'string';
924
983
  readonly description: "Hierarchical machine-readable code (e.g. 'arc.not_found').";
925
984
  };
926
985
  readonly message: {
927
- readonly type: "string";
928
- readonly description: "Human-readable, safe-for-client message.";
986
+ readonly type: 'string';
987
+ readonly description: 'Human-readable, safe-for-client message.';
929
988
  };
930
989
  readonly status: {
931
- readonly type: "integer";
932
- readonly description: "Suggested HTTP status code (hosts may override).";
990
+ readonly type: 'integer';
991
+ readonly description: 'Suggested HTTP status code (hosts may override).';
933
992
  };
934
993
  readonly details: {
935
- readonly type: "array";
936
- readonly description: "Field-scoped structured details (validation failures, duplicate keys, multi-code domain errors).";
994
+ readonly type: 'array';
995
+ readonly description: 'Field-scoped structured details (validation failures, duplicate keys, multi-code domain errors).';
937
996
  readonly items: {
938
- readonly type: "object";
997
+ readonly type: 'object';
939
998
  readonly properties: {
940
999
  readonly path: {
941
- readonly type: "string";
1000
+ readonly type: 'string';
942
1001
  readonly description: "Dot-path to the offending field, e.g. 'lines.0.quantity'.";
943
1002
  };
944
1003
  readonly code: {
945
- readonly type: "string";
1004
+ readonly type: 'string';
946
1005
  };
947
1006
  readonly message: {
948
- readonly type: "string";
1007
+ readonly type: 'string';
949
1008
  };
950
1009
  readonly meta: {
951
- readonly type: "object";
952
- readonly description: "Non-PII per-detail diagnostics (safe to log + return).";
1010
+ readonly type: 'object';
1011
+ readonly description: 'Non-PII per-detail diagnostics (safe to log + return).';
953
1012
  };
954
1013
  };
955
- readonly required: readonly ["code", "message"];
1014
+ readonly required: readonly ['code', 'message'];
956
1015
  };
957
1016
  };
958
1017
  readonly correlationId: {
959
- readonly type: "string";
960
- readonly description: "Request id for support lookups.";
1018
+ readonly type: 'string';
1019
+ readonly description: 'Request id for support lookups.';
961
1020
  };
962
1021
  readonly meta: {
963
- readonly type: "object";
964
- readonly description: "Non-PII diagnostics (safe to log + return).";
1022
+ readonly type: 'object';
1023
+ readonly description: 'Non-PII diagnostics (safe to log + return).';
965
1024
  };
966
1025
  };
967
- readonly required: readonly ["code", "message"];
1026
+ readonly required: readonly ['code', 'message'];
968
1027
  };
969
1028
  };
970
1029
  };
@@ -1049,6 +1108,20 @@ declare function isJsonSchema(input: unknown): input is Record<string, unknown>;
1049
1108
  * Check if an object is a Zod schema (has `_zod` marker from Zod v4).
1050
1109
  */
1051
1110
  declare function isZodSchema(input: unknown): boolean;
1111
+ /**
1112
+ * How `toJsonSchema` reacts when a Zod schema CANNOT be converted (zod not
1113
+ * installed/loaded, zod v3, or `z.toJSONSchema()` threw):
1114
+ *
1115
+ * - `'throw'` — fail fast with an actionable error. Used by
1116
+ * `convertRouteSchema` (VALIDATION path): a schema that silently degrades
1117
+ * to `{ type: 'object' }` is validation switched off — the worst outcome
1118
+ * for a wire contract, worse than a boot failure.
1119
+ * - `'warn'` (default) — log loudly, degrade to a permissive `{ type:
1120
+ * 'object' }`. Used by doc-generation paths (OpenAPI extraction of
1121
+ * Better Auth endpoints etc.), where the schema is third-party and a doc
1122
+ * gap must not take the app down.
1123
+ */
1124
+ type UnconvertibleMode = "warn" | "throw";
1052
1125
  /**
1053
1126
  * Convert any schema input to JSON Schema.
1054
1127
  *
@@ -1056,13 +1129,16 @@ declare function isZodSchema(input: unknown): boolean;
1056
1129
  * 1. `null`/`undefined` → `undefined`
1057
1130
  * 2. Already JSON Schema → pass through as-is (zero overhead)
1058
1131
  * 3. Zod v4 schema → `z.toJSONSchema(schema, { target })`
1059
- * 4. Unrecognized object → return as-is (treat as opaque schema)
1132
+ * 4. Zod v3 schema → unconvertible (actionable "upgrade to v4" error/warn)
1133
+ * 5. Unrecognized object → return as-is (treat as opaque schema)
1060
1134
  *
1061
- * @param input Schema (Zod, plain JSON Schema, or opaque object)
1135
+ * @param input Schema (Zod, plain JSON Schema, or opaque object)
1062
1136
  * @param target Output target — defaults to `draft-7` for Fastify compatibility.
1063
1137
  * Pass `openapi-3.0`/`openapi-3.1` for OpenAPI document generation.
1138
+ * @param mode Failure policy for unconvertible Zod schemas — see
1139
+ * {@link UnconvertibleMode}. Defaults to `'warn'`.
1064
1140
  */
1065
- declare function toJsonSchema(input: unknown, target?: JsonSchemaTarget): Record<string, unknown> | undefined;
1141
+ declare function toJsonSchema(input: unknown, target?: JsonSchemaTarget, mode?: UnconvertibleMode): Record<string, unknown> | undefined;
1066
1142
  /**
1067
1143
  * Convert all schema fields in an OpenApiSchemas object.
1068
1144
  * JSON Schema values pass through unchanged. Only Zod schemas are converted.
@@ -1399,4 +1475,4 @@ declare function hasEvents(instance: FastifyInstance): instance is FastifyInstan
1399
1475
  */
1400
1476
  declare function getUserId(user: UserLike | null | undefined): string | undefined;
1401
1477
  //#endregion
1402
- export { ArcError, ArcQueryParser, type ArcQueryParserOptions, CircuitBreaker, CircuitBreakerError, type CircuitBreakerOptions, CircuitBreakerRegistry, type CircuitBreakerStats, CircuitState, type CompensationDefinition, type CompensationError, type CompensationHooks, type CompensationResult, type CompensationStep, type ConfigError, ConflictError, type ErrorOptions, type EventsDecorator, ForbiddenError, type Guard, type GuardConfig, type JsonSchema, type JsonSchemaTarget, NotFoundError, OrgAccessDeniedError, OrgRequiredError, type PipeUIMessageStreamOptions, RateLimitError, ServiceUnavailableError, type StateMachine, type TransitionConfig, UI_MESSAGE_STREAM_HEADERS, UnauthorizedError, type ValidateOptions, ValidationError, type ValidationResult, aggregateListResponse, assertValidConfig, bareListResponse, convertOpenApiSchemas, convertRouteSchema, createCircuitBreaker, createCircuitBreakerRegistry, createDomainError, createError, createQueryParser, createStateMachine, defineCompensation, defineErrorMapper, defineGuard, deleteResponse, errorContractSchema, errorDetailSchema, formatValidationErrors, forwardedStreamHeaders, getDefaultCrudSchemas, getListQueryParams, getUserId, handleRaw, hasEvents, isArcError, isJsonSchema, isReadableStream, isZodSchema, keysetListResponse, listResponse, offsetListResponse, paginationSchema, pipeUIMessageStreamToReply, promoteStreamTokenToHeader, queryParams, responses, scheduleBackground, simpleEqualityMatcher, toJsonSchema, validateResourceConfig, withCompensation };
1478
+ export { ArcError, ArcQueryParser, type ArcQueryParserOptions, CircuitBreaker, CircuitBreakerError, type CircuitBreakerOptions, CircuitBreakerRegistry, type CircuitBreakerStats, CircuitState, type CompensationDefinition, type CompensationError, type CompensationHooks, type CompensationResult, type CompensationStep, type ConfigError, ConflictError, type ErrorOptions, type EventsDecorator, type FilterDialect, ForbiddenError, type Guard, type GuardConfig, type JsonSchema, type JsonSchemaTarget, MONGO_DIALECT, NEUTRAL_DIALECT, NotFoundError, OrgAccessDeniedError, OrgRequiredError, type PipeUIMessageStreamOptions, RateLimitError, ServiceUnavailableError, type StateMachine, type TransitionConfig, UI_MESSAGE_STREAM_HEADERS, UnauthorizedError, type ValidateOptions, ValidationError, type ValidationResult, aggregateListResponse, assertValidConfig, bareListResponse, convertOpenApiSchemas, convertRouteSchema, createCircuitBreaker, createCircuitBreakerRegistry, createDomainError, createError, createQueryParser, createStateMachine, defineCompensation, defineErrorMapper, defineGuard, deleteResponse, errorContractSchema, errorDetailSchema, formatValidationErrors, forwardedStreamHeaders, getDefaultCrudSchemas, getListQueryParams, getUserId, handleRaw, hasEvents, isArcError, isJsonSchema, isReadableStream, isZodSchema, keysetListResponse, listResponse, offsetListResponse, paginationSchema, pipeUIMessageStreamToReply, promoteStreamTokenToHeader, queryParams, responses, scheduleBackground, simpleEqualityMatcher, toJsonSchema, validateResourceConfig, withCompensation };