gemi 0.75.0 → 0.77.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 (188) hide show
  1. package/dist/ai/AgentController.d.ts +47 -0
  2. package/dist/ai/AgentController.d.ts.map +1 -1
  3. package/dist/ai/index.js +10 -10
  4. package/dist/ai/index.js.map +7 -5
  5. package/dist/ai/providers/request.d.ts.map +1 -1
  6. package/dist/ai/store/TurnJournal.d.ts +97 -0
  7. package/dist/ai/store/TurnJournal.d.ts.map +1 -0
  8. package/dist/ai/types.d.ts +29 -3
  9. package/dist/ai/types.d.ts.map +1 -1
  10. package/dist/app/index.js +1 -1
  11. package/dist/broadcasting/index.js +1 -1
  12. package/dist/bun/plugin.js +1 -1
  13. package/dist/bun/preload.js +1 -1
  14. package/dist/{chunk-fy2f8sq8.js → chunk-0472aphj.js} +2 -2
  15. package/dist/{chunk-fy2f8sq8.js.map → chunk-0472aphj.js.map} +1 -1
  16. package/dist/{chunk-bm97dwbp.js → chunk-0da5t7vs.js} +2 -2
  17. package/dist/{chunk-bm97dwbp.js.map → chunk-0da5t7vs.js.map} +1 -1
  18. package/dist/{chunk-17q5kheg.js → chunk-0pqsp84p.js} +2 -2
  19. package/dist/{chunk-17q5kheg.js.map → chunk-0pqsp84p.js.map} +1 -1
  20. package/dist/{chunk-8ef9n5pk.js → chunk-1712rv0r.js} +2 -2
  21. package/dist/{chunk-8ef9n5pk.js.map → chunk-1712rv0r.js.map} +1 -1
  22. package/dist/{chunk-9gn3x603.js → chunk-1ap69pez.js} +1 -1
  23. package/dist/{chunk-a1n0thja.js → chunk-1qwkhbc4.js} +2 -2
  24. package/dist/{chunk-a1n0thja.js.map → chunk-1qwkhbc4.js.map} +1 -1
  25. package/dist/{chunk-qn7rr4bw.js → chunk-27pnn95c.js} +2 -2
  26. package/dist/{chunk-qn7rr4bw.js.map → chunk-27pnn95c.js.map} +1 -1
  27. package/dist/{chunk-q60vevbt.js → chunk-34s3tfgk.js} +3 -3
  28. package/dist/{chunk-q60vevbt.js.map → chunk-34s3tfgk.js.map} +1 -1
  29. package/dist/{chunk-9h0cz1f0.js → chunk-3hfwbp2m.js} +2 -2
  30. package/dist/{chunk-9h0cz1f0.js.map → chunk-3hfwbp2m.js.map} +1 -1
  31. package/dist/{chunk-3dd2gwrj.js → chunk-3jyz4378.js} +2 -2
  32. package/dist/{chunk-3dd2gwrj.js.map → chunk-3jyz4378.js.map} +1 -1
  33. package/dist/{chunk-t20b1xn4.js → chunk-443yr2km.js} +3 -3
  34. package/dist/{chunk-t20b1xn4.js.map → chunk-443yr2km.js.map} +1 -1
  35. package/dist/{chunk-xrd9xx3c.js → chunk-4h7z32zp.js} +3 -3
  36. package/dist/{chunk-xrd9xx3c.js.map → chunk-4h7z32zp.js.map} +1 -1
  37. package/dist/{chunk-3nxkn558.js → chunk-5ddn8mfj.js} +2 -2
  38. package/dist/{chunk-3nxkn558.js.map → chunk-5ddn8mfj.js.map} +1 -1
  39. package/dist/{chunk-pxfw8dg1.js → chunk-6h5gvcs8.js} +2 -2
  40. package/dist/{chunk-pxfw8dg1.js.map → chunk-6h5gvcs8.js.map} +1 -1
  41. package/dist/{chunk-7e4rhaqs.js → chunk-7yhsy039.js} +2 -2
  42. package/dist/{chunk-7e4rhaqs.js.map → chunk-7yhsy039.js.map} +1 -1
  43. package/dist/{chunk-zat41156.js → chunk-989rzqd6.js} +3 -3
  44. package/dist/{chunk-zat41156.js.map → chunk-989rzqd6.js.map} +1 -1
  45. package/dist/{chunk-hny56r47.js → chunk-9z3y20ms.js} +2 -2
  46. package/dist/{chunk-hny56r47.js.map → chunk-9z3y20ms.js.map} +1 -1
  47. package/dist/{chunk-yqb9cpkx.js → chunk-axxbkm30.js} +2 -2
  48. package/dist/{chunk-yqb9cpkx.js.map → chunk-axxbkm30.js.map} +1 -1
  49. package/dist/{chunk-mc7nbgct.js → chunk-b941c34r.js} +2 -2
  50. package/dist/{chunk-mc7nbgct.js.map → chunk-b941c34r.js.map} +1 -1
  51. package/dist/{chunk-62pzr6vf.js → chunk-bdfdjnht.js} +3 -3
  52. package/dist/{chunk-62pzr6vf.js.map → chunk-bdfdjnht.js.map} +1 -1
  53. package/dist/chunk-cr9f0s09.js +5 -0
  54. package/dist/{chunk-krjkgg9v.js.map → chunk-cr9f0s09.js.map} +1 -1
  55. package/dist/{chunk-0yfgptrq.js → chunk-dgqqv3pb.js} +2 -2
  56. package/dist/{chunk-0yfgptrq.js.map → chunk-dgqqv3pb.js.map} +1 -1
  57. package/dist/{chunk-j9r5w8xf.js → chunk-dmdmt3gw.js} +2 -2
  58. package/dist/{chunk-j9r5w8xf.js.map → chunk-dmdmt3gw.js.map} +1 -1
  59. package/dist/chunk-e8z3nyd5.js +19 -0
  60. package/dist/{chunk-ytt205yt.js.map → chunk-e8z3nyd5.js.map} +8 -7
  61. package/dist/{chunk-8rqdeyhv.js → chunk-e97kq9tn.js} +2 -2
  62. package/dist/{chunk-8rqdeyhv.js.map → chunk-e97kq9tn.js.map} +1 -1
  63. package/dist/{chunk-evbvpfv6.js → chunk-eekg7k6d.js} +1 -1
  64. package/dist/{chunk-26rqzgsr.js → chunk-ezae18wm.js} +2 -2
  65. package/dist/{chunk-26rqzgsr.js.map → chunk-ezae18wm.js.map} +1 -1
  66. package/dist/{chunk-ppscsvv8.js → chunk-f2hkhw76.js} +2 -2
  67. package/dist/{chunk-ppscsvv8.js.map → chunk-f2hkhw76.js.map} +1 -1
  68. package/dist/{chunk-d6dz2706.js → chunk-fd0n8sav.js} +2 -2
  69. package/dist/{chunk-1x8gzkpq.js.map → chunk-fd0n8sav.js.map} +1 -1
  70. package/dist/{chunk-3sdrj0ma.js → chunk-fmhkn266.js} +2 -2
  71. package/dist/{chunk-3sdrj0ma.js.map → chunk-fmhkn266.js.map} +1 -1
  72. package/dist/{chunk-9ecgk1c5.js → chunk-fms4fcd1.js} +2 -2
  73. package/dist/{chunk-9ecgk1c5.js.map → chunk-fms4fcd1.js.map} +1 -1
  74. package/dist/{chunk-f90k29w1.js → chunk-fvn78g6k.js} +2 -2
  75. package/dist/{chunk-f90k29w1.js.map → chunk-fvn78g6k.js.map} +1 -1
  76. package/dist/{chunk-8ypzxfvx.js → chunk-gzs2y282.js} +2 -2
  77. package/dist/{chunk-8ypzxfvx.js.map → chunk-gzs2y282.js.map} +1 -1
  78. package/dist/{chunk-gpys09rg.js → chunk-j1w19cec.js} +3 -3
  79. package/dist/{chunk-gpys09rg.js.map → chunk-j1w19cec.js.map} +1 -1
  80. package/dist/{chunk-8jgj7vdp.js → chunk-j8nbjpkg.js} +2 -2
  81. package/dist/{chunk-8jgj7vdp.js.map → chunk-j8nbjpkg.js.map} +1 -1
  82. package/dist/{chunk-achgw308.js → chunk-jcq0tbdv.js} +2 -2
  83. package/dist/{chunk-achgw308.js.map → chunk-jcq0tbdv.js.map} +1 -1
  84. package/dist/{chunk-9sqw5bjy.js → chunk-m2bmwre5.js} +2 -2
  85. package/dist/{chunk-9sqw5bjy.js.map → chunk-m2bmwre5.js.map} +1 -1
  86. package/dist/{chunk-pp9c3f5m.js → chunk-mmhf39tr.js} +2 -2
  87. package/dist/{chunk-pp9c3f5m.js.map → chunk-mmhf39tr.js.map} +1 -1
  88. package/dist/{chunk-15gc8m24.js → chunk-n03frt02.js} +2 -2
  89. package/dist/{chunk-15gc8m24.js.map → chunk-n03frt02.js.map} +1 -1
  90. package/dist/{chunk-wtwkzgec.js → chunk-njh95es7.js} +2 -2
  91. package/dist/{chunk-wtwkzgec.js.map → chunk-njh95es7.js.map} +1 -1
  92. package/dist/{chunk-ngq4n2b3.js → chunk-q0nqypca.js} +2 -2
  93. package/dist/{chunk-ngq4n2b3.js.map → chunk-q0nqypca.js.map} +1 -1
  94. package/dist/{chunk-jpej3172.js → chunk-q623tx9p.js} +2 -2
  95. package/dist/{chunk-jpej3172.js.map → chunk-q623tx9p.js.map} +1 -1
  96. package/dist/{chunk-dz7b35tn.js → chunk-qgvg10ad.js} +3 -3
  97. package/dist/{chunk-dz7b35tn.js.map → chunk-qgvg10ad.js.map} +1 -1
  98. package/dist/{chunk-9p5vwn4d.js → chunk-qjgfrsw7.js} +2 -2
  99. package/dist/{chunk-9p5vwn4d.js.map → chunk-qjgfrsw7.js.map} +1 -1
  100. package/dist/{chunk-371tt28q.js → chunk-rkx6qhwg.js} +4 -4
  101. package/dist/{chunk-371tt28q.js.map → chunk-rkx6qhwg.js.map} +1 -1
  102. package/dist/{chunk-1k0gv92y.js → chunk-rv9k5bqn.js} +2 -2
  103. package/dist/{chunk-1k0gv92y.js.map → chunk-rv9k5bqn.js.map} +1 -1
  104. package/dist/{chunk-407t1q1d.js → chunk-s7hv9qgp.js} +2 -2
  105. package/dist/{chunk-407t1q1d.js.map → chunk-s7hv9qgp.js.map} +1 -1
  106. package/dist/{chunk-wbxmwzdb.js → chunk-sbqy6r29.js} +1 -1
  107. package/dist/{chunk-a82m12q4.js → chunk-sp4wwg7s.js} +3 -3
  108. package/dist/{chunk-a82m12q4.js.map → chunk-sp4wwg7s.js.map} +1 -1
  109. package/dist/{chunk-3eejq348.js → chunk-sqvw7rv2.js} +3 -3
  110. package/dist/{chunk-3eejq348.js.map → chunk-sqvw7rv2.js.map} +1 -1
  111. package/dist/{chunk-1yr8qejy.js → chunk-ss7ymqfm.js} +2 -2
  112. package/dist/{chunk-1yr8qejy.js.map → chunk-ss7ymqfm.js.map} +1 -1
  113. package/dist/{chunk-cr2wpeh5.js → chunk-sww4kgk4.js} +2 -2
  114. package/dist/{chunk-cr2wpeh5.js.map → chunk-sww4kgk4.js.map} +1 -1
  115. package/dist/{chunk-4z5qqq1t.js → chunk-tnt0ybj9.js} +2 -2
  116. package/dist/{chunk-4z5qqq1t.js.map → chunk-tnt0ybj9.js.map} +1 -1
  117. package/dist/{chunk-pjcdekm1.js → chunk-tpdsfr2k.js} +2 -2
  118. package/dist/{chunk-pjcdekm1.js.map → chunk-tpdsfr2k.js.map} +1 -1
  119. package/dist/{chunk-ra1ccnd5.js → chunk-vr84mhmq.js} +2 -2
  120. package/dist/{chunk-ra1ccnd5.js.map → chunk-vr84mhmq.js.map} +1 -1
  121. package/dist/{chunk-y3hmzww0.js → chunk-waax3j1k.js} +2 -2
  122. package/dist/{chunk-y3hmzww0.js.map → chunk-waax3j1k.js.map} +1 -1
  123. package/dist/{chunk-1x8gzkpq.js → chunk-xzp2ptj5.js} +2 -2
  124. package/dist/{chunk-d6dz2706.js.map → chunk-xzp2ptj5.js.map} +1 -1
  125. package/dist/{chunk-ywf0kz71.js → chunk-yaz93haz.js} +2 -2
  126. package/dist/{chunk-ywf0kz71.js.map → chunk-yaz93haz.js.map} +1 -1
  127. package/dist/{chunk-1rnzaqpm.js → chunk-yernnzqs.js} +2 -2
  128. package/dist/{chunk-1rnzaqpm.js.map → chunk-yernnzqs.js.map} +1 -1
  129. package/dist/{chunk-a4xxmmct.js → chunk-zjg31baf.js} +2 -2
  130. package/dist/{chunk-a4xxmmct.js.map → chunk-zjg31baf.js.map} +1 -1
  131. package/dist/{chunk-14pybfjk.js → chunk-zkty5j42.js} +2 -2
  132. package/dist/{chunk-14pybfjk.js.map → chunk-zkty5j42.js.map} +1 -1
  133. package/dist/{chunk-g2hwd2ts.js → chunk-zzh52t0y.js} +2 -2
  134. package/dist/{chunk-g2hwd2ts.js.map → chunk-zzh52t0y.js.map} +1 -1
  135. package/dist/client/MutationError.d.ts +16 -1
  136. package/dist/client/MutationError.d.ts.map +1 -1
  137. package/dist/client/index.js +94 -76
  138. package/dist/client/index.js.map +1 -1
  139. package/dist/client/useMutation.d.ts +1 -1
  140. package/dist/client/useMutation.d.ts.map +1 -1
  141. package/dist/config/index.js +1 -1
  142. package/dist/console/run.js +2 -2
  143. package/dist/console/run.js.map +1 -1
  144. package/dist/container/index.js +2 -2
  145. package/dist/container/index.js.map +1 -1
  146. package/dist/database/index.js +2 -2
  147. package/dist/database/index.js.map +1 -1
  148. package/dist/email/index.js +2 -2
  149. package/dist/email/index.js.map +1 -1
  150. package/dist/facades/index.js +2 -2
  151. package/dist/facades/index.js.map +1 -1
  152. package/dist/foundation/index.js +2 -2
  153. package/dist/foundation/index.js.map +1 -1
  154. package/dist/http/ApiRouter.d.ts +3 -2
  155. package/dist/http/ApiRouter.d.ts.map +1 -1
  156. package/dist/http/HttpResponse.d.ts +83 -0
  157. package/dist/http/HttpResponse.d.ts.map +1 -0
  158. package/dist/http/ViewRouter.d.ts.map +1 -1
  159. package/dist/http/index.d.ts +1 -0
  160. package/dist/http/index.d.ts.map +1 -1
  161. package/dist/http/index.js +2 -2
  162. package/dist/http/index.js.map +1 -1
  163. package/dist/i18n/dictionaryRuntime.js +2 -2
  164. package/dist/i18n/dictionaryRuntime.js.map +1 -1
  165. package/dist/i18n/index.js +2 -2
  166. package/dist/i18n/index.js.map +1 -1
  167. package/dist/kernel/index.js +2 -2
  168. package/dist/kernel/index.js.map +1 -1
  169. package/dist/orm/index.js +2 -2
  170. package/dist/orm/index.js.map +1 -1
  171. package/dist/server/index.js +2 -2
  172. package/dist/server/index.js.map +1 -1
  173. package/dist/services/index.js +2 -2
  174. package/dist/services/index.js.map +1 -1
  175. package/dist/services/queue/queueDriverContract.d.ts +6 -2
  176. package/dist/services/queue/queueDriverContract.d.ts.map +1 -1
  177. package/dist/services/queue/work.js +2 -2
  178. package/dist/services/queue/work.js.map +1 -1
  179. package/dist/services/router/ApiRouteDispatcher.d.ts.map +1 -1
  180. package/dist/services/router/serverQueryFetcher.d.ts.map +1 -1
  181. package/dist/support/index.js +2 -2
  182. package/dist/support/index.js.map +1 -1
  183. package/package.json +1 -1
  184. package/dist/chunk-krjkgg9v.js +0 -5
  185. package/dist/chunk-ytt205yt.js +0 -19
  186. /package/dist/{chunk-9gn3x603.js.map → chunk-1ap69pez.js.map} +0 -0
  187. /package/dist/{chunk-evbvpfv6.js.map → chunk-eekg7k6d.js.map} +0 -0
  188. /package/dist/{chunk-wbxmwzdb.js.map → chunk-sbqy6r29.js.map} +0 -0
@@ -485,6 +485,96 @@ function useInfiniteQuery(url, options, config) {
485
485
  };
486
486
  }
487
487
  //#endregion
488
+ //#region client/MutationError.ts
489
+ var AUTHENTICATION = "Authentication error";
490
+ var PERMISSION = ["Insufficient permissions", "Not authorized"];
491
+ var CSRF = "Invalid CSRF token";
492
+ var SERVER = "Internal Server Error";
493
+ function isObject(error) {
494
+ return typeof error === "object" && error !== null;
495
+ }
496
+ function bodyMessage(error) {
497
+ return isObject(error) && !(error instanceof Error) && !("kind" in error) ? error.message : void 0;
498
+ }
499
+ /**
500
+ * The `MutationError` a non-2xx response's parsed body stands for.
501
+ *
502
+ * gemi's own error bodies are `{ error }`, and the value under `error` is what
503
+ * the guards above read, so that is what is handed over. An app's body without
504
+ * one — `HttpResponse.json({ message: "Taken" }, { status: 409 })` — is handed
505
+ * over whole: read as `body.error` it was `undefined`, and a failed request
506
+ * left `error` looking like no error at all. A body with no content to hand
507
+ * over (`null`) becomes a `{ message }` naming the status.
508
+ *
509
+ * @internal
510
+ */
511
+ function mutationErrorFromBody(body, status) {
512
+ if (isObject(body) && "error" in body && body.error != null) return body.error;
513
+ if (body == null) return { message: `Request failed with status ${status}` };
514
+ return body;
515
+ }
516
+ /** Field messages, as `<ValidationErrors>` renders them. */
517
+ function isValidationError(error) {
518
+ return isObject(error) && error.kind === "validation_error";
519
+ }
520
+ /** A form-level message, as `<FormError>` renders it. */
521
+ function isFormError(error) {
522
+ return isObject(error) && error.kind === "form_error";
523
+ }
524
+ /** No signed-in user: `AuthenticationError` (401). */
525
+ function isAuthenticationError(error) {
526
+ return error === AUTHENTICATION;
527
+ }
528
+ /**
529
+ * A signed-in user who may not do this: `InsufficientPermissionsError` (403),
530
+ * `AuthorizationError` (401) or a policy denial (403, `{ message:
531
+ * "Forbidden" }`). Recognised by the framework's default messages.
532
+ */
533
+ function isPermissionError(error) {
534
+ return typeof error === "string" && PERMISSION.includes(error) || bodyMessage(error) === "Forbidden";
535
+ }
536
+ /** The CSRF cookie is missing or stale (403). A reload fixes it. */
537
+ function isCsrfError(error) {
538
+ return error === CSRF;
539
+ }
540
+ /** A missing record, file or route (404). */
541
+ function isNotFoundError(error) {
542
+ return bodyMessage(error) === "Not found";
543
+ }
544
+ /** `RateLimitMiddleware` refused the request (429). */
545
+ function isRateLimitError(error) {
546
+ return bodyMessage(error) === "Rate limit exceeded";
547
+ }
548
+ /**
549
+ * The server failed (a production 500), or answered something that is not
550
+ * JSON. Under `gemi dev` a 500 carries the exception's message instead, which
551
+ * is `"unknown"`.
552
+ */
553
+ function isServerError(error) {
554
+ return error === SERVER || isObject(error) && error.kind === "server_error" || error instanceof SyntaxError;
555
+ }
556
+ /** The request got no answer: offline, DNS, CORS, a dropped connection. */
557
+ function isNetworkError(error) {
558
+ return error instanceof TypeError;
559
+ }
560
+ /**
561
+ * Which of the guards above `error` passes, for a `switch` over all of them.
562
+ * `"unknown"` is everything else: a refusal thrown with a message of its own,
563
+ * a 500 under `gemi dev`, an error body of the app's own shape.
564
+ */
565
+ function mutationErrorKind(error) {
566
+ if (isValidationError(error)) return "validation";
567
+ if (isFormError(error)) return "form";
568
+ if (isAuthenticationError(error)) return "authentication";
569
+ if (isPermissionError(error)) return "permission";
570
+ if (isCsrfError(error)) return "csrf";
571
+ if (isNotFoundError(error)) return "not_found";
572
+ if (isRateLimitError(error)) return "rate_limit";
573
+ if (isServerError(error)) return "server";
574
+ if (isNetworkError(error)) return "network";
575
+ return "unknown";
576
+ }
577
+ //#endregion
488
578
  //#region client/useMutation.ts
489
579
  function applyParams(url, params = {}) {
490
580
  let out = url;
@@ -546,12 +636,13 @@ function useMutation(method, url, ...args) {
546
636
  if (!isLatest()) return;
547
637
  formData.current = new FormData();
548
638
  if (!response.ok) {
639
+ const error = mutationErrorFromBody(data, response.status);
549
640
  setState((prev) => ({
550
641
  data: prev.data,
551
- error: data.error,
642
+ error,
552
643
  loading: false
553
644
  }));
554
- options.onError(data.error);
645
+ options.onError(error);
555
646
  return;
556
647
  }
557
648
  clearPrefetchCache?.();
@@ -675,7 +766,7 @@ function useUpload(url, ...args) {
675
766
  message: result.statusText
676
767
  };
677
768
  try {
678
- error = (await result.json()).error;
769
+ error = mutationErrorFromBody(await result.json(), result.status);
679
770
  } catch (e) {}
680
771
  setState("error");
681
772
  options?.onError?.(error);
@@ -743,79 +834,6 @@ function useMutate() {
743
834
  };
744
835
  }
745
836
  //#endregion
746
- //#region client/MutationError.ts
747
- var AUTHENTICATION = "Authentication error";
748
- var PERMISSION = ["Insufficient permissions", "Not authorized"];
749
- var CSRF = "Invalid CSRF token";
750
- var SERVER = "Internal Server Error";
751
- function isObject(error) {
752
- return typeof error === "object" && error !== null;
753
- }
754
- function bodyMessage(error) {
755
- return isObject(error) && !(error instanceof Error) && !("kind" in error) ? error.message : void 0;
756
- }
757
- /** Field messages, as `<ValidationErrors>` renders them. */
758
- function isValidationError(error) {
759
- return isObject(error) && error.kind === "validation_error";
760
- }
761
- /** A form-level message, as `<FormError>` renders it. */
762
- function isFormError(error) {
763
- return isObject(error) && error.kind === "form_error";
764
- }
765
- /** No signed-in user: `AuthenticationError` (401). */
766
- function isAuthenticationError(error) {
767
- return error === AUTHENTICATION;
768
- }
769
- /**
770
- * A signed-in user who may not do this: `InsufficientPermissionsError` (403),
771
- * `AuthorizationError` (401) or a policy denial (403, `{ message:
772
- * "Forbidden" }`). Recognised by the framework's default messages.
773
- */
774
- function isPermissionError(error) {
775
- return typeof error === "string" && PERMISSION.includes(error) || bodyMessage(error) === "Forbidden";
776
- }
777
- /** The CSRF cookie is missing or stale (403). A reload fixes it. */
778
- function isCsrfError(error) {
779
- return error === CSRF;
780
- }
781
- /** A missing record, file or route (404). */
782
- function isNotFoundError(error) {
783
- return bodyMessage(error) === "Not found";
784
- }
785
- /** `RateLimitMiddleware` refused the request (429). */
786
- function isRateLimitError(error) {
787
- return bodyMessage(error) === "Rate limit exceeded";
788
- }
789
- /**
790
- * The server failed (a production 500), or answered something that is not
791
- * JSON. Under `gemi dev` a 500 carries the exception's message instead, which
792
- * is `"unknown"`.
793
- */
794
- function isServerError(error) {
795
- return error === SERVER || isObject(error) && error.kind === "server_error" || error instanceof SyntaxError;
796
- }
797
- /** The request got no answer: offline, DNS, CORS, a dropped connection. */
798
- function isNetworkError(error) {
799
- return error instanceof TypeError;
800
- }
801
- /**
802
- * Which of the guards above `error` passes, for a `switch` over all of them.
803
- * `"unknown"` is everything else: a refusal thrown with a message of its own,
804
- * a 500 under `gemi dev`, an error body of the app's own shape.
805
- */
806
- function mutationErrorKind(error) {
807
- if (isValidationError(error)) return "validation";
808
- if (isFormError(error)) return "form";
809
- if (isAuthenticationError(error)) return "authentication";
810
- if (isPermissionError(error)) return "permission";
811
- if (isCsrfError(error)) return "csrf";
812
- if (isNotFoundError(error)) return "not_found";
813
- if (isRateLimitError(error)) return "rate_limit";
814
- if (isServerError(error)) return "server";
815
- if (isNetworkError(error)) return "network";
816
- return "unknown";
817
- }
818
- //#endregion
819
837
  //#region client/Mutation.tsx
820
838
  var MutationContext = createContext({
821
839
  isPending: false,