@beignet/core 0.0.33 → 0.0.35

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 (142) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +207 -30
  3. package/dist/agent-capabilities/index.d.ts +167 -0
  4. package/dist/agent-capabilities/index.d.ts.map +1 -0
  5. package/dist/agent-capabilities/index.js +275 -0
  6. package/dist/agent-capabilities/index.js.map +1 -0
  7. package/dist/application/index.d.ts +2 -2
  8. package/dist/application/index.d.ts.map +1 -1
  9. package/dist/application/index.js +13 -3
  10. package/dist/application/index.js.map +1 -1
  11. package/dist/client/client.d.ts +2 -0
  12. package/dist/client/client.d.ts.map +1 -1
  13. package/dist/client/client.js +33 -16
  14. package/dist/client/client.js.map +1 -1
  15. package/dist/contracts/contract-builder.d.ts +5 -7
  16. package/dist/contracts/contract-builder.d.ts.map +1 -1
  17. package/dist/contracts/contract-builder.js +3 -18
  18. package/dist/contracts/contract-builder.js.map +1 -1
  19. package/dist/contracts/contract-group.d.ts +2 -2
  20. package/dist/contracts/contract-group.d.ts.map +1 -1
  21. package/dist/contracts/contract-group.js +2 -1
  22. package/dist/contracts/contract-group.js.map +1 -1
  23. package/dist/contracts/metadata.d.ts +3 -0
  24. package/dist/contracts/metadata.d.ts.map +1 -0
  25. package/dist/contracts/metadata.js +14 -0
  26. package/dist/contracts/metadata.js.map +1 -0
  27. package/dist/contracts/types.d.ts +20 -0
  28. package/dist/contracts/types.d.ts.map +1 -1
  29. package/dist/contracts/types.js.map +1 -1
  30. package/dist/events/index.d.ts +4 -4
  31. package/dist/events/index.d.ts.map +1 -1
  32. package/dist/events/index.js +5 -5
  33. package/dist/events/index.js.map +1 -1
  34. package/dist/flags/index.d.ts +0 -4
  35. package/dist/flags/index.d.ts.map +1 -1
  36. package/dist/flags/index.js +0 -4
  37. package/dist/flags/index.js.map +1 -1
  38. package/dist/idempotency/index.d.ts.map +1 -1
  39. package/dist/idempotency/index.js +14 -9
  40. package/dist/idempotency/index.js.map +1 -1
  41. package/dist/jobs/index.d.ts.map +1 -1
  42. package/dist/jobs/index.js +10 -4
  43. package/dist/jobs/index.js.map +1 -1
  44. package/dist/notifications/index.d.ts +194 -10
  45. package/dist/notifications/index.d.ts.map +1 -1
  46. package/dist/notifications/index.js +397 -59
  47. package/dist/notifications/index.js.map +1 -1
  48. package/dist/openapi/index.js +15 -8
  49. package/dist/openapi/index.js.map +1 -1
  50. package/dist/ports/auth.d.ts +2 -0
  51. package/dist/ports/auth.d.ts.map +1 -1
  52. package/dist/ports/auth.js +2 -0
  53. package/dist/ports/auth.js.map +1 -1
  54. package/dist/ports/events.d.ts +2 -2
  55. package/dist/ports/index.d.ts +1 -1
  56. package/dist/ports/index.d.ts.map +1 -1
  57. package/dist/ports/index.js +1 -1
  58. package/dist/ports/index.js.map +1 -1
  59. package/dist/providers/index.d.ts +1 -1
  60. package/dist/providers/index.d.ts.map +1 -1
  61. package/dist/providers/index.js.map +1 -1
  62. package/dist/providers/provider.d.ts +10 -2
  63. package/dist/providers/provider.d.ts.map +1 -1
  64. package/dist/providers/provider.js.map +1 -1
  65. package/dist/schedules/index.d.ts +6 -13
  66. package/dist/schedules/index.d.ts.map +1 -1
  67. package/dist/schedules/index.js +24 -44
  68. package/dist/schedules/index.js.map +1 -1
  69. package/dist/server/index.d.ts +2 -2
  70. package/dist/server/index.d.ts.map +1 -1
  71. package/dist/server/index.js +1 -1
  72. package/dist/server/index.js.map +1 -1
  73. package/dist/server/request-executor.d.ts +72 -0
  74. package/dist/server/request-executor.d.ts.map +1 -0
  75. package/dist/server/request-executor.js +781 -0
  76. package/dist/server/request-executor.js.map +1 -0
  77. package/dist/server/request-preparation.d.ts +39 -0
  78. package/dist/server/request-preparation.d.ts.map +1 -0
  79. package/dist/server/request-preparation.js +248 -0
  80. package/dist/server/request-preparation.js.map +1 -0
  81. package/dist/server/response-finalization.d.ts +34 -0
  82. package/dist/server/response-finalization.d.ts.map +1 -0
  83. package/dist/server/response-finalization.js +279 -0
  84. package/dist/server/response-finalization.js.map +1 -0
  85. package/dist/server/route-definitions.d.ts +139 -0
  86. package/dist/server/route-definitions.d.ts.map +1 -0
  87. package/dist/server/route-definitions.js +94 -0
  88. package/dist/server/route-definitions.js.map +1 -0
  89. package/dist/server/route-matching.d.ts +15 -0
  90. package/dist/server/route-matching.d.ts.map +1 -0
  91. package/dist/server/route-matching.js +46 -0
  92. package/dist/server/route-matching.js.map +1 -0
  93. package/dist/server/server.d.ts +6 -157
  94. package/dist/server/server.d.ts.map +1 -1
  95. package/dist/server/server.js +29 -1340
  96. package/dist/server/server.js.map +1 -1
  97. package/dist/server/use-case-route.d.ts +1 -1
  98. package/dist/testing/index.d.ts +1 -1
  99. package/dist/testing/index.d.ts.map +1 -1
  100. package/dist/testing/index.js +1 -0
  101. package/dist/testing/index.js.map +1 -1
  102. package/dist/tracing/index.d.ts +1 -1
  103. package/dist/tracing/index.d.ts.map +1 -1
  104. package/dist/tracing/index.js.map +1 -1
  105. package/dist/uploads/client.js +4 -7
  106. package/dist/uploads/client.js.map +1 -1
  107. package/dist/uploads/index.d.ts.map +1 -1
  108. package/dist/uploads/index.js +59 -12
  109. package/dist/uploads/index.js.map +1 -1
  110. package/package.json +5 -5
  111. package/skills/app-architecture/SKILL.md +31 -1
  112. package/src/agent-capabilities/index.ts +578 -0
  113. package/src/application/index.ts +19 -5
  114. package/src/client/client.ts +41 -17
  115. package/src/contracts/contract-builder.ts +8 -23
  116. package/src/contracts/contract-group.ts +4 -6
  117. package/src/contracts/metadata.ts +20 -0
  118. package/src/contracts/types.ts +39 -0
  119. package/src/events/index.ts +16 -20
  120. package/src/flags/index.ts +0 -5
  121. package/src/idempotency/index.ts +17 -9
  122. package/src/jobs/index.ts +8 -3
  123. package/src/notifications/index.ts +678 -70
  124. package/src/openapi/index.ts +24 -12
  125. package/src/ports/auth.ts +2 -0
  126. package/src/ports/events.ts +2 -2
  127. package/src/ports/index.ts +0 -1
  128. package/src/providers/index.ts +1 -0
  129. package/src/providers/provider.ts +18 -3
  130. package/src/schedules/index.ts +57 -63
  131. package/src/server/index.ts +4 -2
  132. package/src/server/request-executor.ts +1170 -0
  133. package/src/server/request-preparation.ts +409 -0
  134. package/src/server/response-finalization.ts +385 -0
  135. package/src/server/route-definitions.ts +338 -0
  136. package/src/server/route-matching.ts +64 -0
  137. package/src/server/server.ts +63 -2171
  138. package/src/server/use-case-route.ts +1 -1
  139. package/src/testing/index.ts +2 -0
  140. package/src/tracing/index.ts +1 -0
  141. package/src/uploads/client.ts +4 -7
  142. package/src/uploads/index.ts +70 -12
@@ -258,7 +258,7 @@ type HooksOf<E> = E extends { hooks: infer H extends readonly unknown[] }
258
258
 
259
259
  /**
260
260
  * Per-element binder validation applied where route tuples are inferred, such
261
- * as `defineRouteGroup<Ctx>()({ ... })`, so contract/use-case mismatches are
261
+ * as an app-bound `defineRouteGroup({ ... })`, so contract/use-case mismatches are
262
262
  * reported on the individual route literal.
263
263
  */
264
264
  export type ValidatedRouteInput<Ctx, E> = E extends {
@@ -72,6 +72,8 @@ import {
72
72
  enterActiveRequestContext,
73
73
  } from "../server/request-context.js";
74
74
 
75
+ export * from "../ports/testing.js";
76
+
75
77
  /**
76
78
  * Value that may be returned synchronously or asynchronously.
77
79
  */
@@ -93,6 +93,7 @@ export type TraceSpanKind =
93
93
  export type TraceOperationType =
94
94
  | "request"
95
95
  | "useCase"
96
+ | "agentCapability"
96
97
  | "listener"
97
98
  | "job"
98
99
  | "schedule"
@@ -688,7 +688,7 @@ async function requestJson<Result>(args: {
688
688
 
689
689
  const body = await parseJsonBody(response, args);
690
690
  if (!response.ok) {
691
- const envelope = uploadErrorEnvelope(body);
691
+ const envelope = uploadErrorBody(body);
692
692
  throw new UploadClientError({
693
693
  operation: args.operation,
694
694
  uploadName: args.uploadName,
@@ -725,17 +725,14 @@ async function parseJsonBody(
725
725
  }
726
726
  }
727
727
 
728
- function uploadErrorEnvelope(
728
+ function uploadErrorBody(
729
729
  body: unknown,
730
730
  ): { code?: string; message?: string; details?: unknown } | undefined {
731
- if (typeof body !== "object" || body === null || !("error" in body)) {
731
+ if (typeof body !== "object" || body === null) {
732
732
  return undefined;
733
733
  }
734
734
 
735
- const error = body.error;
736
- if (typeof error !== "object" || error === null) return undefined;
737
-
738
- const errorRecord = error as Record<string, unknown>;
735
+ const errorRecord = body as Record<string, unknown>;
739
736
 
740
737
  return {
741
738
  code: typeof errorRecord.code === "string" ? errorRecord.code : undefined,
@@ -1166,12 +1166,23 @@ export function createUploadRouter<Ctx>(
1166
1166
  );
1167
1167
  }
1168
1168
 
1169
- assertUploadContentLengthWithinLimit(request.headers, {
1169
+ const multipartContext = {
1170
1170
  uploadName: requestOptions.uploadName,
1171
1171
  action: "upload",
1172
1172
  maxBytes: requestLimits.multipartMaxBytes,
1173
- });
1174
- const formData = await request.formData();
1173
+ } as const;
1174
+ const multipartBody = await readLimitedRequestBytes(
1175
+ request,
1176
+ multipartContext,
1177
+ );
1178
+ const multipartHeaders = new Headers(request.headers);
1179
+ multipartHeaders.delete("content-length");
1180
+ const formData = await new Request(request.url, {
1181
+ method: request.method,
1182
+ headers: multipartHeaders,
1183
+ body: multipartBody,
1184
+ signal: request.signal,
1185
+ }).formData();
1175
1186
  return jsonResponse(
1176
1187
  await upload(requestOptions.uploadName, {
1177
1188
  formData,
@@ -1240,6 +1251,57 @@ function assertUploadContentLengthWithinLimit(
1240
1251
  }
1241
1252
  }
1242
1253
 
1254
+ async function readLimitedRequestBytes(
1255
+ request: Request,
1256
+ context: {
1257
+ uploadName: string;
1258
+ action: "upload";
1259
+ maxBytes: number;
1260
+ },
1261
+ ): Promise<ArrayBuffer> {
1262
+ assertUploadContentLengthWithinLimit(request.headers, context);
1263
+
1264
+ if (!request.body) return new ArrayBuffer(0);
1265
+
1266
+ const reader = request.body.getReader();
1267
+ const chunks: Uint8Array[] = [];
1268
+ let actualBytes = 0;
1269
+
1270
+ try {
1271
+ while (true) {
1272
+ const result = await reader.read();
1273
+ if (result.done) break;
1274
+ actualBytes += result.value.byteLength;
1275
+ if (actualBytes > context.maxBytes) {
1276
+ try {
1277
+ await reader.cancel();
1278
+ } catch {
1279
+ // Preserve the size-limit error when the request source rejects cancellation.
1280
+ }
1281
+ throw new UploadBodyTooLargeError({
1282
+ message: `Upload "${context.uploadName}" ${context.action} body is too large.`,
1283
+ details: {
1284
+ maxBytes: context.maxBytes,
1285
+ actualBytes,
1286
+ },
1287
+ });
1288
+ }
1289
+ chunks.push(result.value);
1290
+ }
1291
+ } finally {
1292
+ reader.releaseLock();
1293
+ }
1294
+
1295
+ const body = new ArrayBuffer(actualBytes);
1296
+ const bytes = new Uint8Array(body);
1297
+ let offset = 0;
1298
+ for (const chunk of chunks) {
1299
+ bytes.set(chunk, offset);
1300
+ offset += chunk.byteLength;
1301
+ }
1302
+ return body;
1303
+ }
1304
+
1243
1305
  async function readLimitedRequestText(
1244
1306
  request: Request,
1245
1307
  context: {
@@ -2000,11 +2062,9 @@ function uploadErrorResponse(error: unknown): Response {
2000
2062
  if (error instanceof UploadError) {
2001
2063
  return jsonResponse(
2002
2064
  {
2003
- error: {
2004
- code: error.code,
2005
- message: error.message,
2006
- ...(error.details !== undefined ? { details: error.details } : {}),
2007
- },
2065
+ code: error.code,
2066
+ message: error.message,
2067
+ ...(error.details !== undefined ? { details: error.details } : {}),
2008
2068
  },
2009
2069
  { status: error.status },
2010
2070
  );
@@ -2012,10 +2072,8 @@ function uploadErrorResponse(error: unknown): Response {
2012
2072
 
2013
2073
  return jsonResponse(
2014
2074
  {
2015
- error: {
2016
- code: "INTERNAL_SERVER_ERROR",
2017
- message: "Internal server error",
2018
- },
2075
+ code: "INTERNAL_SERVER_ERROR",
2076
+ message: "Internal server error",
2019
2077
  },
2020
2078
  { status: 500 },
2021
2079
  );