@classytic/arc 2.11.4 → 2.14.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 (167) hide show
  1. package/README.md +16 -12
  2. package/dist/{BaseController-swXruJ2_.mjs → BaseController-DX_T-bDB.mjs} +388 -423
  3. package/dist/EventTransport-CT_52aWU.d.mts +34 -0
  4. package/dist/EventTransport-DLWoUMHy.mjs +103 -0
  5. package/dist/{ResourceRegistry-DkAeAuTX.mjs → ResourceRegistry-CTERg_2x.mjs} +139 -66
  6. package/dist/audit/index.d.mts +2 -2
  7. package/dist/audit/index.mjs +1 -1
  8. package/dist/auth/audit.d.mts +199 -0
  9. package/dist/auth/audit.mjs +288 -0
  10. package/dist/auth/index.d.mts +3 -3
  11. package/dist/auth/index.mjs +117 -191
  12. package/dist/{betterAuthOpenApi-DwxtK3uG.mjs → betterAuthOpenApi--M_i87dQ.mjs} +1 -1
  13. package/dist/buildHandler-olo-gt94.mjs +610 -0
  14. package/dist/cache/index.mjs +3 -3
  15. package/dist/cli/commands/describe.d.mts +89 -13
  16. package/dist/cli/commands/describe.mjs +56 -2
  17. package/dist/cli/commands/docs.mjs +2 -2
  18. package/dist/cli/commands/generate.mjs +147 -48
  19. package/dist/cli/commands/init.d.mts +13 -0
  20. package/dist/cli/commands/init.mjs +130 -87
  21. package/dist/cli/commands/introspect.mjs +8 -1
  22. package/dist/context/index.mjs +1 -1
  23. package/dist/core/index.d.mts +3 -3
  24. package/dist/core/index.mjs +5 -5
  25. package/dist/core-DECn6zaU.mjs +1399 -0
  26. package/dist/{createActionRouter-CIKOcNA7.mjs → createActionRouter-CBxLLbn3.mjs} +7 -20
  27. package/dist/createAggregationRouter-CRIBv4sC.mjs +114 -0
  28. package/dist/{createApp-C9bRrqlX.mjs → createApp-XX2-N0Yd.mjs} +28 -22
  29. package/dist/{defineEvent-D1Ky9M1D.mjs → defineEvent-D5h7EvAx.mjs} +1 -1
  30. package/dist/docs/index.d.mts +24 -11
  31. package/dist/docs/index.mjs +2 -2
  32. package/dist/{elevation-DOFoxoDs.mjs → elevation-DgoeTyfX.mjs} +1 -1
  33. package/dist/errorHandler-Bk-AGhkU.mjs +174 -0
  34. package/dist/errorHandler-DFr45ZG4.d.mts +45 -0
  35. package/dist/errors-j4aJm1Wg.mjs +184 -0
  36. package/dist/{eventPlugin-Cts2-Tfj.mjs → eventPlugin-CaKTYkYM.mjs} +28 -4
  37. package/dist/{eventPlugin-DDJoNEPL.d.mts → eventPlugin-qXpqTebY.d.mts} +24 -1
  38. package/dist/events/index.d.mts +6 -6
  39. package/dist/events/index.mjs +11 -35
  40. package/dist/events/transports/redis-stream-entry.d.mts +1 -1
  41. package/dist/events/transports/redis.d.mts +1 -1
  42. package/dist/factory/index.d.mts +2 -2
  43. package/dist/factory/index.mjs +2 -2
  44. package/dist/{fields-BRjxOAFp.d.mts → fields-COhcH3fk.d.mts} +23 -2
  45. package/dist/hooks/index.d.mts +1 -1
  46. package/dist/hooks/index.mjs +1 -1
  47. package/dist/idempotency/index.d.mts +1 -1
  48. package/dist/idempotency/index.mjs +1 -20
  49. package/dist/idempotency/redis.mjs +1 -1
  50. package/dist/{index-rHjXmJar.d.mts → index-BTqLEvhu.d.mts} +163 -3
  51. package/dist/{index-CXXRbnf8.d.mts → index-BtW7qYwa.d.mts} +660 -326
  52. package/dist/{index-m8mOOlFW.d.mts → index-Ds61mrJE.d.mts} +50 -4
  53. package/dist/{index-D9t1KNaB.d.mts → index-Dz5IKsrE.d.mts} +360 -219
  54. package/dist/index.d.mts +6 -7
  55. package/dist/index.mjs +9 -10
  56. package/dist/integrations/event-gateway.d.mts +1 -1
  57. package/dist/integrations/event-gateway.mjs +1 -1
  58. package/dist/integrations/index.d.mts +1 -1
  59. package/dist/integrations/mcp/index.d.mts +2 -2
  60. package/dist/integrations/mcp/index.mjs +1 -1
  61. package/dist/integrations/mcp/testing.d.mts +1 -1
  62. package/dist/integrations/mcp/testing.mjs +1 -1
  63. package/dist/integrations/streamline.d.mts +60 -11
  64. package/dist/integrations/streamline.mjs +75 -85
  65. package/dist/integrations/websocket.mjs +2 -8
  66. package/dist/middleware/index.d.mts +1 -1
  67. package/dist/middleware/index.mjs +2 -2
  68. package/dist/migrations/index.d.mts +23 -3
  69. package/dist/migrations/index.mjs +0 -7
  70. package/dist/{multipartBody-CvTR1Un6.mjs → multipartBody-BOvVSVCD.mjs} +11 -8
  71. package/dist/openapi-noXno2CV.mjs +968 -0
  72. package/dist/org/index.d.mts +2 -2
  73. package/dist/org/index.mjs +1 -1
  74. package/dist/permissions/index.d.mts +3 -3
  75. package/dist/permissions/index.mjs +3 -3
  76. package/dist/{permissions-gd_aUWrR.mjs → permissions-ohQyv50e.mjs} +404 -176
  77. package/dist/{pipe-DVoIheVC.mjs → pipe-Zr0KXjQe.mjs} +1 -1
  78. package/dist/pipeline/index.d.mts +1 -1
  79. package/dist/pipeline/index.mjs +1 -1
  80. package/dist/plugins/index.d.mts +16 -31
  81. package/dist/plugins/index.mjs +33 -13
  82. package/dist/plugins/response-cache.mjs +1 -1
  83. package/dist/plugins/tracing-entry.mjs +1 -1
  84. package/dist/presets/filesUpload.d.mts +4 -4
  85. package/dist/presets/filesUpload.mjs +6 -9
  86. package/dist/presets/index.d.mts +1 -1
  87. package/dist/presets/index.mjs +1 -1
  88. package/dist/presets/multiTenant.d.mts +1 -1
  89. package/dist/presets/multiTenant.mjs +2 -2
  90. package/dist/presets/search.d.mts +2 -2
  91. package/dist/presets/search.mjs +6 -8
  92. package/dist/{presets-Z7P5w4gF.mjs → presets-BbkjdPeH.mjs} +6 -28
  93. package/dist/{queryCachePlugin-Bq6bO6vc.mjs → queryCachePlugin-m1XsgAIJ.mjs} +3 -3
  94. package/dist/{redis-stream-xTGxB2bm.d.mts → redis-stream-D6HzR1Z_.d.mts} +1 -1
  95. package/dist/registry/index.d.mts +1 -1
  96. package/dist/registry/index.mjs +2 -2
  97. package/dist/{replyHelpers-ByllIXXV.mjs → replyHelpers-CK-FNO8E.mjs} +3 -21
  98. package/dist/{resourceToTools-CxNmI6xF.mjs → resourceToTools-DLL32us3.mjs} +224 -71
  99. package/dist/{routerShared-BqLRb5l7.mjs → routerShared-DrOa-26E.mjs} +41 -36
  100. package/dist/{schemaIR-Dy2p4MxS.mjs → schemaIR-lYhC2gE5.mjs} +1 -1
  101. package/dist/schemas/index.d.mts +100 -30
  102. package/dist/schemas/index.mjs +86 -29
  103. package/dist/scim/index.d.mts +264 -0
  104. package/dist/scim/index.mjs +963 -0
  105. package/dist/scope/index.d.mts +3 -3
  106. package/dist/scope/index.mjs +4 -4
  107. package/dist/{sse-V7aXc3bW.mjs → sse-Bz-5ZeTt.mjs} +1 -1
  108. package/dist/{store-helpers-Cp4uKC1U.mjs → store-helpers-BkIN9-vu.mjs} +1 -1
  109. package/dist/testing/index.d.mts +2 -8
  110. package/dist/testing/index.mjs +16 -24
  111. package/dist/types/index.d.mts +4 -4
  112. package/dist/{types-D7KpfiL1.d.mts → types-BvqwCCSx.d.mts} +73 -25
  113. package/dist/{types-DDyTPc6y.d.mts → types-CTYvcwHe.d.mts} +195 -1
  114. package/dist/{types-AOD8fxIw.mjs → types-C_s5moIu.mjs} +117 -1
  115. package/dist/{types-BQ9TJQNy.d.mts → types-DQHFc8PM.d.mts} +1 -1
  116. package/dist/utils/index.d.mts +2 -2
  117. package/dist/utils/index.mjs +5 -5
  118. package/dist/{utils-CcYTj09l.mjs → utils-_h9B3c57.mjs} +1269 -1334
  119. package/dist/{versioning-DsglKfM_.d.mts → versioning-DTTvc80y.d.mts} +1 -1
  120. package/package.json +24 -34
  121. package/skills/arc/SKILL.md +147 -51
  122. package/skills/arc/references/agent-auth.md +238 -0
  123. package/skills/arc/references/api-reference.md +187 -0
  124. package/skills/arc/references/auth.md +354 -7
  125. package/skills/arc/references/enterprise-auth.md +94 -0
  126. package/skills/arc/references/events.md +8 -6
  127. package/skills/arc/references/mcp.md +2 -2
  128. package/skills/arc/references/multi-tenancy.md +11 -2
  129. package/skills/arc/references/production.md +10 -9
  130. package/skills/arc/references/scim.md +247 -0
  131. package/skills/arc/references/testing.md +1 -1
  132. package/skills/arc-code-review/SKILL.md +141 -0
  133. package/skills/arc-code-review/references/anti-patterns.md +911 -0
  134. package/skills/arc-code-review/references/arc-cheatsheet.md +380 -0
  135. package/skills/arc-code-review/references/migration-recipes.md +700 -0
  136. package/skills/arc-code-review/references/mongokit-migration.md +386 -0
  137. package/skills/arc-code-review/references/scaffolding.md +230 -0
  138. package/skills/arc-code-review/references/severity.md +127 -0
  139. package/dist/EventTransport-BFQjw9pB.mjs +0 -133
  140. package/dist/EventTransport-CYNUXdCJ.d.mts +0 -293
  141. package/dist/adapters/index.d.mts +0 -3
  142. package/dist/adapters/index.mjs +0 -2
  143. package/dist/adapters-DUUiiimH.mjs +0 -964
  144. package/dist/auth/mongoose.d.mts +0 -191
  145. package/dist/auth/mongoose.mjs +0 -73
  146. package/dist/core-CbcQRIch.mjs +0 -1054
  147. package/dist/errorHandler-BQm8ZxTK.mjs +0 -173
  148. package/dist/errorHandler-DEWmGWPz.d.mts +0 -114
  149. package/dist/errors-D5c-5BJL.mjs +0 -232
  150. package/dist/index-Rg8axYPz.d.mts +0 -370
  151. package/dist/openapi-D7G1V7ex.mjs +0 -557
  152. /package/dist/{HookSystem-CGsMd6oK.mjs → HookSystem-Iiebom92.mjs} +0 -0
  153. /package/dist/{actionPermissions-sUUKDhtP.mjs → actionPermissions-CyUkQu6O.mjs} +0 -0
  154. /package/dist/{caching-CheW3m-S.mjs → caching-SM8gghN6.mjs} +0 -0
  155. /package/dist/{constants-BhY1OHoH.mjs → constants-Cxde4rpC.mjs} +0 -0
  156. /package/dist/{elevation-BQQXZ_VR.d.mts → elevation-BXOWoGCF.d.mts} +0 -0
  157. /package/dist/{keys-CARyUjiR.mjs → keys-CGcCbNyu.mjs} +0 -0
  158. /package/dist/{loadResources-CPpkyKfM.mjs → loadResources-DBMQg_Aj.mjs} +0 -0
  159. /package/dist/{memory-DikHSvWa.mjs → memory-UBydS5ku.mjs} +0 -0
  160. /package/dist/{metrics-Csh4nsvv.mjs → metrics-Qnvwc-LQ.mjs} +0 -0
  161. /package/dist/{pluralize-CWP6MB39.mjs → pluralize-DQgqgifU.mjs} +0 -0
  162. /package/dist/{registry-D63ee7fl.mjs → registry-I-ogLgL9.mjs} +0 -0
  163. /package/dist/{requestContext-C5XeK3VA.mjs → requestContext-SSaaTgW8.mjs} +0 -0
  164. /package/dist/{schemaConverter-B0oKLuqI.mjs → schemaConverter-De34B1ZG.mjs} +0 -0
  165. /package/dist/{typeGuards-CcFZXgU7.mjs → typeGuards-BzkXkvVv.mjs} +0 -0
  166. /package/dist/{types-DV9WDfeg.mjs → types-D57iXYb8.mjs} +0 -0
  167. /package/dist/{versioning-CGPjkqAg.mjs → versioning-BUrT5aP4.mjs} +0 -0
@@ -1,8 +1,9 @@
1
- import { Pt as AnyRecord, Q as MiddlewareConfig, ft as RouteSchemaOptions, gn as HookSystem, lt as RouteDefinition, tt as PresetHook, z as ResourceRegistry } from "../index-CXXRbnf8.mjs";
1
+ import { En as HookSystem, Q as MiddlewareConfig, Wt as AnyRecord, ft as RouteSchemaOptions, lt as RouteDefinition, tt as PresetHook, z as ResourceRegistry } from "../index-BtW7qYwa.mjs";
2
2
  import { t as ExternalOpenApiPaths } from "../externalPaths-BD5nw6St.mjs";
3
- import { a as MetricsCollector, c as metricsPlugin, d as ssePlugin, f as CachingOptions, h as cachingPlugin, i as MetricEntry, l as SSEOptions, m as _default$1, n as _default$7, o as MetricsOptions, p as CachingRule, r as versioningPlugin, s as _default$4, t as VersioningOptions, u as _default$6 } from "../versioning-DsglKfM_.mjs";
4
- import { i as errorHandlerPlugin, n as ErrorMapper, r as defaultIsDuplicateKeyError, t as ErrorHandlerOptions } from "../errorHandler-DEWmGWPz.mjs";
3
+ import { a as MetricsCollector, c as metricsPlugin, d as ssePlugin, f as CachingOptions, h as cachingPlugin, i as MetricEntry, l as SSEOptions, m as _default$1, n as _default$7, o as MetricsOptions, p as CachingRule, r as versioningPlugin, s as _default$4, t as VersioningOptions, u as _default$6 } from "../versioning-DTTvc80y.mjs";
4
+ import { i as errorHandlerPlugin, n as ErrorMapper, r as defaultIsDuplicateKeyError, t as ErrorHandlerOptions } from "../errorHandler-DFr45ZG4.mjs";
5
5
  import { t as TracingOptions } from "../tracing-QJVprktp.mjs";
6
+ import { PaginatedResult } from "@classytic/repo-core/pagination";
6
7
  import { FastifyInstance, FastifyPluginAsync } from "fastify";
7
8
  import * as _$node_stream0 from "node:stream";
8
9
 
@@ -172,38 +173,22 @@ declare const _default$3: FastifyPluginAsync<HealthOptions>;
172
173
  //#region src/plugins/replyHelpers.d.ts
173
174
  declare module "fastify" {
174
175
  interface FastifyReply {
175
- /** Send a success response with data */
176
- ok<T>(data: T, statusCode?: number): FastifyReply;
177
- /** Send an error response */
178
- fail(error: string | string[], statusCode?: number): FastifyReply;
179
- /** Send a paginated list response */
180
- paginated<T>(result: {
181
- docs: T[];
182
- total: number;
183
- page: number;
184
- limit: number;
185
- [key: string]: unknown;
186
- }): FastifyReply;
176
+ /**
177
+ * Send a list response, normalised to the canonical wire shape.
178
+ *
179
+ * Accepts either a bare array (endpoints that don't paginate) or any
180
+ * kit-shaped pagination result (`OffsetPaginationResult`,
181
+ * `KeysetPaginationResult`, `AggregatePaginationResult`). Routes
182
+ * through `toCanonicalList` from `@classytic/repo-core/pagination`
183
+ * so server and typed-client (`@classytic/arc-next`) share one
184
+ * declaration — the `method` discriminant cannot drift between them.
185
+ */
186
+ sendList<T>(input: T[] | readonly T[] | PaginatedResult<T>): FastifyReply;
187
187
  /**
188
188
  * Stream a readable source as a file download or raw stream.
189
189
  *
190
190
  * @example
191
- * ```typescript
192
- * // CSV export
193
- * return reply.stream(csvReadableStream, {
194
- * contentType: 'text/csv',
195
- * filename: 'export.csv',
196
- * });
197
- *
198
- * // PDF download
199
- * return reply.stream(pdfBuffer, {
200
- * contentType: 'application/pdf',
201
- * filename: 'report.pdf',
202
- * });
203
- *
204
- * // Raw stream (no Content-Disposition)
205
- * return reply.stream(dataStream, { contentType: 'application/octet-stream' });
206
- * ```
191
+ * return reply.stream(csvReadable, { contentType: 'text/csv', filename: 'export.csv' });
207
192
  */
208
193
  stream(source: _$node_stream0.Readable | Buffer | AsyncIterable<unknown>, options: {
209
194
  contentType: string;
@@ -1,15 +1,15 @@
1
- import { p as MUTATION_OPERATIONS } from "../constants-BhY1OHoH.mjs";
2
- import { o as getOrgId } from "../types-AOD8fxIw.mjs";
3
- import { t as requestContext } from "../requestContext-C5XeK3VA.mjs";
4
- import { t as hasEvents } from "../typeGuards-CcFZXgU7.mjs";
5
- import { t as HookSystem } from "../HookSystem-CGsMd6oK.mjs";
6
- import { t as ResourceRegistry } from "../ResourceRegistry-DkAeAuTX.mjs";
7
- import { n as caching_default, t as cachingPlugin } from "../caching-CheW3m-S.mjs";
8
- import { n as errorHandlerPlugin, t as defaultIsDuplicateKeyError } from "../errorHandler-BQm8ZxTK.mjs";
9
- import { n as metrics_default, t as metricsPlugin } from "../metrics-Csh4nsvv.mjs";
10
- import { t as replyHelpersPlugin } from "../replyHelpers-ByllIXXV.mjs";
11
- import { n as sse_default, t as ssePlugin } from "../sse-V7aXc3bW.mjs";
12
- import { n as versioning_default, t as versioningPlugin } from "../versioning-CGPjkqAg.mjs";
1
+ import { p as MUTATION_OPERATIONS } from "../constants-Cxde4rpC.mjs";
2
+ import { c as getOrgId } from "../types-C_s5moIu.mjs";
3
+ import { t as requestContext } from "../requestContext-SSaaTgW8.mjs";
4
+ import { t as hasEvents } from "../typeGuards-BzkXkvVv.mjs";
5
+ import { t as HookSystem } from "../HookSystem-Iiebom92.mjs";
6
+ import { t as ResourceRegistry } from "../ResourceRegistry-CTERg_2x.mjs";
7
+ import { n as caching_default, t as cachingPlugin } from "../caching-SM8gghN6.mjs";
8
+ import { n as errorHandlerPlugin, t as defaultIsDuplicateKeyError } from "../errorHandler-Bk-AGhkU.mjs";
9
+ import { n as metrics_default, t as metricsPlugin } from "../metrics-Qnvwc-LQ.mjs";
10
+ import { t as replyHelpersPlugin } from "../replyHelpers-CK-FNO8E.mjs";
11
+ import { n as sse_default, t as ssePlugin } from "../sse-Bz-5ZeTt.mjs";
12
+ import { n as versioning_default, t as versioningPlugin } from "../versioning-BUrT5aP4.mjs";
13
13
  import { randomUUID } from "node:crypto";
14
14
  import fp from "fastify-plugin";
15
15
  //#region src/core/arcCorePlugin.ts
@@ -198,6 +198,26 @@ function createHttpMetrics() {
198
198
  const healthPlugin = async (fastify, opts = {}) => {
199
199
  const { prefix = "/_health", checks = [], metrics = false, metricsCollector, version, collectHttpMetrics = metrics } = opts;
200
200
  const httpMetrics = createHttpMetrics();
201
+ fastify.get(prefix, { schema: {
202
+ tags: ["Health"],
203
+ summary: "Liveness probe (alias for /live)",
204
+ description: "Returns 200 if the process is alive",
205
+ response: { 200: {
206
+ type: "object",
207
+ properties: {
208
+ status: {
209
+ type: "string",
210
+ enum: ["ok"]
211
+ },
212
+ timestamp: { type: "string" },
213
+ version: { type: "string" }
214
+ }
215
+ } }
216
+ } }, async () => ({
217
+ status: "ok",
218
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
219
+ ...version ? { version } : {}
220
+ }));
201
221
  fastify.get(`${prefix}/live`, { schema: {
202
222
  tags: ["Health"],
203
223
  summary: "Liveness probe",
@@ -331,7 +351,7 @@ const healthPlugin = async (fastify, opts = {}) => {
331
351
  httpMetrics._ringIndex = httpMetrics._ringIndex + 1;
332
352
  });
333
353
  }
334
- fastify.log?.debug?.(`Health plugin registered at ${prefix}`);
354
+ fastify.log?.debug?.(`Health plugin registered at ${prefix} (alias), ${prefix}/live, ${prefix}/ready${metrics ? `, ${prefix}/metrics` : ""}`);
335
355
  };
336
356
  /**
337
357
  * Run all health checks with timeout
@@ -1,4 +1,4 @@
1
- import { t as hasEvents } from "../typeGuards-CcFZXgU7.mjs";
1
+ import { t as hasEvents } from "../typeGuards-BzkXkvVv.mjs";
2
2
  import fp from "fastify-plugin";
3
3
  //#region src/plugins/response-cache.ts
4
4
  /**
@@ -58,7 +58,7 @@ try {
58
58
  function createTracerProvider(options) {
59
59
  if (!isAvailable || !NodeTracerProvider || !BatchSpanProcessor || !OTLPTraceExporter) return null;
60
60
  const { serviceName = "@classytic/arc", serviceVersion, exporterUrl = "http://localhost:4318/v1/traces" } = options;
61
- const resolvedVersion = serviceVersion ?? "2.11.4";
61
+ const resolvedVersion = serviceVersion ?? "2.14.0";
62
62
  const exporter = new OTLPTraceExporter({ url: exporterUrl });
63
63
  const provider = new NodeTracerProvider({ resource: { attributes: {
64
64
  "service.name": serviceName,
@@ -1,6 +1,6 @@
1
- import { nt as PresetResult } from "../index-CXXRbnf8.mjs";
2
- import { r as RequestScope } from "../types-DDyTPc6y.mjs";
3
- import { c as PermissionCheck } from "../fields-BRjxOAFp.mjs";
1
+ import { nt as PresetResult } from "../index-BtW7qYwa.mjs";
2
+ import { i as RequestScope } from "../types-CTYvcwHe.mjs";
3
+ import { c as PermissionCheck } from "../fields-COhcH3fk.mjs";
4
4
  import { a as StorageReadResult, i as StorageReadRange, n as StorageContext, o as StorageUploadInput, r as StorageFile, t as Storage } from "../storage-Dfzt4VTl.mjs";
5
5
 
6
6
  //#region src/presets/filesUpload.d.ts
@@ -27,7 +27,7 @@ interface FilesUploadPresetPermissions {
27
27
  * - function: custom policy. Return a string to *transform* the filename,
28
28
  * `false` to reject (triggers `ValidationError`), or `true`/`void` to accept.
29
29
  */
30
- type FilenamePolicy = boolean | "*" | ((filename: string) => string | boolean | void);
30
+ type FilenamePolicy = boolean | "*" | ((filename: string) => string | boolean | undefined);
31
31
  interface FilesUploadPresetOptions {
32
32
  /** Any implementation of the `Storage` interface. App owns it. */
33
33
  storage: Storage;
@@ -1,7 +1,7 @@
1
- import { o as getOrgId, p as getUserId } from "../types-AOD8fxIw.mjs";
2
- import { C as requireAuth, y as allowPublic } from "../permissions-gd_aUWrR.mjs";
3
- import { i as NotFoundError, u as ValidationError } from "../errors-D5c-5BJL.mjs";
4
- import { t as multipartBody } from "../multipartBody-CvTR1Un6.mjs";
1
+ import { i as NotFoundError, u as ValidationError } from "../errors-j4aJm1Wg.mjs";
2
+ import { c as getOrgId, h as getUserId } from "../types-C_s5moIu.mjs";
3
+ import { C as allowPublic, D as requireAuth } from "../permissions-ohQyv50e.mjs";
4
+ import { t as multipartBody } from "../multipartBody-BOvVSVCD.mjs";
5
5
  //#region src/presets/filesUpload.ts
6
6
  const DEFAULT_FIELD_NAME = "file";
7
7
  const DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024;
@@ -29,7 +29,7 @@ function buildStorageContext(request, contextFrom) {
29
29
  * to the full-object response (per RFC 7233 §4.1 a server MAY ignore ranges).
30
30
  */
31
31
  function parseRangeHeader(header, totalSize) {
32
- if (!header || !header.startsWith("bytes=")) return void 0;
32
+ if (!header?.startsWith("bytes=")) return void 0;
33
33
  const spec = header.slice(6).split(",")[0]?.trim();
34
34
  if (!spec) return void 0;
35
35
  const dashIndex = spec.indexOf("-");
@@ -102,10 +102,7 @@ function makeUploadHandler(deps) {
102
102
  mimeType: file.mimetype,
103
103
  size: file.size
104
104
  }, ctx);
105
- return reply.code(201).send({
106
- success: true,
107
- data: toResponseFile(result)
108
- });
105
+ return reply.code(201).send(toResponseFile(result));
109
106
  };
110
107
  }
111
108
  function toResponseFile(file) {
@@ -1,4 +1,4 @@
1
- import { Pt as AnyRecord, _t as IControllerResponse, at as ResourceConfig, d as PaginationResult, nt as PresetResult, vt as IRequestContext } from "../index-CXXRbnf8.mjs";
1
+ import { Wt as AnyRecord, _t as IControllerResponse, at as ResourceConfig, d as PaginationResult, nt as PresetResult, vt as IRequestContext } from "../index-BtW7qYwa.mjs";
2
2
  import { FilesUploadPresetOptions, FilesUploadPresetPermissions, FilesUploadPresetRoutes, filesUploadPreset } from "./filesUpload.mjs";
3
3
  import { MultiTenantOptions, TenantFieldSpec, multiTenantPreset } from "./multiTenant.mjs";
4
4
  import { SearchHandler, SearchPresetOptions, SearchRouteConfig, searchPreset } from "./search.mjs";
@@ -1,5 +1,5 @@
1
1
  import { multiTenantPreset } from "./multiTenant.mjs";
2
- import { a as registerPreset, c as auditedPreset, d as ownedByUserPreset, i as getPreset, l as softDeletePreset, n as flexibleMultiTenantPreset, o as treePreset, r as getAvailablePresets, s as bulkPreset, t as applyPresets, u as slugLookupPreset } from "../presets-Z7P5w4gF.mjs";
2
+ import { a as registerPreset, c as auditedPreset, d as ownedByUserPreset, i as getPreset, l as softDeletePreset, n as flexibleMultiTenantPreset, o as treePreset, r as getAvailablePresets, s as bulkPreset, t as applyPresets, u as slugLookupPreset } from "../presets-BbkjdPeH.mjs";
3
3
  import { filesUploadPreset } from "./filesUpload.mjs";
4
4
  import { searchPreset } from "./search.mjs";
5
5
  export { applyPresets, auditedPreset, bulkPreset, filesUploadPreset, flexibleMultiTenantPreset, getAvailablePresets, getPreset, multiTenantPreset, ownedByUserPreset, registerPreset, searchPreset, slugLookupPreset, softDeletePreset, treePreset };
@@ -1,4 +1,4 @@
1
- import { J as CrudRouteKey, nt as PresetResult } from "../index-CXXRbnf8.mjs";
1
+ import { J as CrudRouteKey, nt as PresetResult } from "../index-BtW7qYwa.mjs";
2
2
 
3
3
  //#region src/presets/multiTenant.d.ts
4
4
  /**
@@ -1,5 +1,5 @@
1
- import "../constants-BhY1OHoH.mjs";
2
- import { _ as isElevated, c as getRequestScope, f as getTeamId, h as hasOrgAccess, l as getScopeContext, o as getOrgId } from "../types-AOD8fxIw.mjs";
1
+ import "../constants-Cxde4rpC.mjs";
2
+ import { _ as hasOrgAccess, c as getOrgId, d as getScopeContext, m as getTeamId, u as getRequestScope, y as isElevated } from "../types-C_s5moIu.mjs";
3
3
  //#region src/presets/multiTenant.ts
4
4
  /**
5
5
  * Resolve a single TenantFieldSpec against the current scope.
@@ -1,5 +1,5 @@
1
- import { lt as RouteDefinition, nt as PresetResult, pt as ControllerHandler, ut as RouteMcpConfig } from "../index-CXXRbnf8.mjs";
2
- import { c as PermissionCheck } from "../fields-BRjxOAFp.mjs";
1
+ import { lt as RouteDefinition, nt as PresetResult, pt as ControllerHandler, ut as RouteMcpConfig } from "../index-BtW7qYwa.mjs";
2
+ import { c as PermissionCheck } from "../fields-COhcH3fk.mjs";
3
3
 
4
4
  //#region src/presets/search.d.ts
5
5
  /**
@@ -1,4 +1,4 @@
1
- import { C as requireAuth, y as allowPublic } from "../permissions-gd_aUWrR.mjs";
1
+ import { C as allowPublic, D as requireAuth } from "../permissions-ohQyv50e.mjs";
2
2
  //#region src/presets/search.ts
3
3
  const BUILTINS = [
4
4
  {
@@ -28,17 +28,15 @@ const BUILTINS = [
28
28
  ];
29
29
  /**
30
30
  * Wrap the user handler to normalise the return shape into arc's envelope.
31
- * If the handler already returns `{ success, data }`, arc passes it through;
32
- * otherwise we wrap the raw return value so callers don't have to.
31
+ * If the handler already returns an `IControllerResponse` envelope (carrying
32
+ * a `data` slot), arc passes it through; otherwise we wrap the raw return
33
+ * value so callers don't have to.
33
34
  */
34
35
  function wrapEnvelope(handler) {
35
36
  return async (req) => {
36
37
  const out = await handler(req);
37
- if (out !== null && typeof out === "object" && "success" in out) return out;
38
- return {
39
- success: true,
40
- data: out
41
- };
38
+ if (out !== null && typeof out === "object" && "data" in out) return out;
39
+ return { data: out };
42
40
  };
43
41
  }
44
42
  /**
@@ -1,5 +1,5 @@
1
- import { _ as isElevated, n as PUBLIC_SCOPE } from "./types-AOD8fxIw.mjs";
2
- import { C as requireAuth, T as requireRoles, y as allowPublic } from "./permissions-gd_aUWrR.mjs";
1
+ import { n as PUBLIC_SCOPE, y as isElevated } from "./types-C_s5moIu.mjs";
2
+ import { C as allowPublic, D as requireAuth, k as requireRoles } from "./permissions-ohQyv50e.mjs";
3
3
  import { multiTenantPreset } from "./presets/multiTenant.mjs";
4
4
  //#region src/presets/ownedByUser.ts
5
5
  /**
@@ -169,17 +169,7 @@ function bulkPreset(opts) {
169
169
  } },
170
170
  required: ["items"]
171
171
  },
172
- response: { 201: {
173
- type: "object",
174
- properties: {
175
- success: { type: "boolean" },
176
- data: { type: "array" },
177
- meta: {
178
- type: "object",
179
- properties: { count: { type: "number" } }
180
- }
181
- }
182
- } }
172
+ response: { 201: { type: "array" } }
183
173
  }
184
174
  });
185
175
  if (operations.includes("updateMany")) routes.push({
@@ -201,14 +191,8 @@ function bulkPreset(opts) {
201
191
  response: { 200: {
202
192
  type: "object",
203
193
  properties: {
204
- success: { type: "boolean" },
205
- data: {
206
- type: "object",
207
- properties: {
208
- matchedCount: { type: "number" },
209
- modifiedCount: { type: "number" }
210
- }
211
- }
194
+ matchedCount: { type: "number" },
195
+ modifiedCount: { type: "number" }
212
196
  }
213
197
  } }
214
198
  }
@@ -228,13 +212,7 @@ function bulkPreset(opts) {
228
212
  },
229
213
  response: { 200: {
230
214
  type: "object",
231
- properties: {
232
- success: { type: "boolean" },
233
- data: {
234
- type: "object",
235
- properties: { deletedCount: { type: "number" } }
236
- }
237
- }
215
+ properties: { deletedCount: { type: "number" } }
238
216
  } }
239
217
  }
240
218
  });
@@ -1,7 +1,7 @@
1
1
  import { t as __exportAll } from "./chunk-BpYLSNr0.mjs";
2
- import { i as versionKey, r as tagVersionKey } from "./keys-CARyUjiR.mjs";
3
- import { t as MemoryCacheStore } from "./memory-DikHSvWa.mjs";
4
- import { t as hasEvents } from "./typeGuards-CcFZXgU7.mjs";
2
+ import { t as MemoryCacheStore } from "./memory-UBydS5ku.mjs";
3
+ import { t as hasEvents } from "./typeGuards-BzkXkvVv.mjs";
4
+ import { i as versionKey, r as tagVersionKey } from "./keys-CGcCbNyu.mjs";
5
5
  import fp from "fastify-plugin";
6
6
  //#region src/cache/QueryCache.ts
7
7
  var QueryCache = class {
@@ -1,4 +1,4 @@
1
- import { i as EventLogger, n as DomainEvent, o as EventTransport, r as EventHandler } from "./EventTransport-CYNUXdCJ.mjs";
1
+ import { a as EventTransport, i as EventLogger, n as DomainEvent, r as EventHandler } from "./EventTransport-CT_52aWU.mjs";
2
2
 
3
3
  //#region src/events/transports/redis-stream.d.ts
4
4
  interface RedisStreamLike {
@@ -1,4 +1,4 @@
1
- import { R as RegisterOptions, k as IntrospectionPluginOptions, z as ResourceRegistry } from "../index-CXXRbnf8.mjs";
1
+ import { R as RegisterOptions, k as IntrospectionPluginOptions, z as ResourceRegistry } from "../index-BtW7qYwa.mjs";
2
2
  import { FastifyPluginAsync } from "fastify";
3
3
 
4
4
  //#region src/registry/introspectionPlugin.d.ts
@@ -1,3 +1,3 @@
1
- import { n as introspectionPlugin_default, t as introspectionPlugin } from "../registry-D63ee7fl.mjs";
2
- import { t as ResourceRegistry } from "../ResourceRegistry-DkAeAuTX.mjs";
1
+ import { n as introspectionPlugin_default, t as introspectionPlugin } from "../registry-I-ogLgL9.mjs";
2
+ import { t as ResourceRegistry } from "../ResourceRegistry-CTERg_2x.mjs";
3
3
  export { ResourceRegistry, introspectionPlugin_default as introspectionPlugin, introspectionPlugin as introspectionPluginFn };
@@ -1,29 +1,11 @@
1
1
  import { t as __exportAll } from "./chunk-BpYLSNr0.mjs";
2
+ import { toCanonicalList } from "@classytic/repo-core/pagination";
2
3
  import fp from "fastify-plugin";
3
4
  //#region src/plugins/replyHelpers.ts
4
5
  var replyHelpers_exports = /* @__PURE__ */ __exportAll({ replyHelpersPlugin: () => replyHelpersPlugin });
5
6
  async function replyHelpersPluginFn(fastify) {
6
- fastify.decorateReply("ok", function(data, statusCode = 200) {
7
- return this.code(statusCode).send({
8
- success: true,
9
- data
10
- });
11
- });
12
- fastify.decorateReply("fail", function(error, statusCode = 400) {
13
- if (Array.isArray(error)) return this.code(statusCode).send({
14
- success: false,
15
- errors: error
16
- });
17
- return this.code(statusCode).send({
18
- success: false,
19
- error
20
- });
21
- });
22
- fastify.decorateReply("paginated", function(result) {
23
- return this.code(200).send({
24
- success: true,
25
- ...result
26
- });
7
+ fastify.decorateReply("sendList", function(input) {
8
+ return this.code(200).send(toCanonicalList(input));
27
9
  });
28
10
  fastify.decorateReply("stream", function(source, options) {
29
11
  this.code(options.statusCode ?? 200);