@maudecode/kanvil 0.4.1 → 0.4.2

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 (109) hide show
  1. package/apps/server/.env.example +2 -0
  2. package/apps/server/dist/{auth-DAqfvUJm.mjs → auth-CLAZTAoL.mjs} +32 -9
  3. package/apps/server/dist/client.mjs +1 -1
  4. package/apps/server/dist/{config-BFzcAs8u.mjs → config-DOT1SDQO.mjs} +2 -1
  5. package/apps/server/dist/index.mjs +6 -6
  6. package/apps/server/dist/migrate.mjs +1 -1
  7. package/apps/server/dist/recover.mjs +3 -3
  8. package/apps/server/dist/{src-tQ82UI8k.mjs → src-VxR5jZiK.mjs} +145 -8
  9. package/apps/web/dist/assets/{CompositeItem-DgnfVvrF.js → CompositeItem-B5Qlh5m0.js} +1 -1
  10. package/apps/web/dist/assets/{Trans-f2VYVS9z.js → Trans-DxqBaUXP.js} +1 -1
  11. package/apps/web/dist/assets/{admin-settings-DBZL4siY.js → admin-settings-Bp7V2t1V.js} +1 -1
  12. package/apps/web/dist/assets/{archive-restore-CGuLxoHC.js → archive-restore-wsAzhqi-.js} +1 -1
  13. package/apps/web/dist/assets/az-AZ-DlsPlUZi.js +1 -0
  14. package/apps/web/dist/assets/{az-BE5iqNIE.js → az-C4KDjOOw.js} +1 -1
  15. package/apps/web/dist/assets/{corner-left-up-BCro--Gl.js → corner-left-up-arA2ipmM.js} +1 -1
  16. package/apps/web/dist/assets/de-DE-DLCaqUUe.js +1 -0
  17. package/apps/web/dist/assets/{de-DLGjUGf_.js → de-Z599ZW7b.js} +1 -1
  18. package/apps/web/dist/assets/default-6QIAyMq2.js +56 -0
  19. package/apps/web/dist/assets/{delivery-settings-CZOtb4X8.js → delivery-settings-D5NKPlhN.js} +1 -1
  20. package/apps/web/dist/assets/el-GR-P2XcwrSU.js +1 -0
  21. package/apps/web/dist/assets/{el-CG6Xy42v.js → el-xsvq992p.js} +1 -1
  22. package/apps/web/dist/assets/{ellipsis-ZJM26JNS.js → ellipsis-UOkL14vq.js} +1 -1
  23. package/apps/web/dist/assets/{es-Bbj5WuMM.js → es-D3e9L5_i.js} +1 -1
  24. package/apps/web/dist/assets/es-ES-CJoX8f3w.js +1 -0
  25. package/apps/web/dist/assets/{forms-C3pNy-qY.js → forms-BbWAl0BZ.js} +1 -1
  26. package/apps/web/dist/assets/{fr-CjuIKc1o.js → fr-CY35Bcpp.js} +1 -1
  27. package/apps/web/dist/assets/fr-FR-yLkQdy6a.js +1 -0
  28. package/apps/web/dist/assets/{hi-BVVrZ-zZ.js → hi-Cqfv-E5P.js} +1 -1
  29. package/apps/web/dist/assets/hi-IN-y8dqej7z.js +1 -0
  30. package/apps/web/dist/assets/{highlight-CKyEM4jx.js → highlight-Ds7xUUQv.js} +1 -1
  31. package/apps/web/dist/assets/{id-BhNWOQnp.js → id-CFBOVDUC.js} +1 -1
  32. package/apps/web/dist/assets/id-ID-DSvh8mGH.js +1 -0
  33. package/apps/web/dist/assets/{index-BIuqxnJn.js → index-2V6MWx63.js} +5 -5
  34. package/apps/web/dist/assets/{invitations-D5unaga2.js → invitations-BPk5fwwU.js} +1 -1
  35. package/apps/web/dist/assets/{it-Cav3_-xd.js → it-DNLponcC.js} +1 -1
  36. package/apps/web/dist/assets/it-IT-BUcfUqNo.js +1 -0
  37. package/apps/web/dist/assets/{item-Cj8xpMLk.js → item-DED0Ikqi.js} +1 -1
  38. package/apps/web/dist/assets/ja-JP-C-jLP_Ay.js +1 -0
  39. package/apps/web/dist/assets/{ja-DTmZE0Qe.js → ja-ZXGlS4WA.js} +1 -1
  40. package/apps/web/dist/assets/{ko-BuYCMOUj.js → ko-CSoj1hQM.js} +1 -1
  41. package/apps/web/dist/assets/ko-KR-C5Ozdm2E.js +1 -0
  42. package/apps/web/dist/assets/{label-settings-B89Ehf78.js → label-settings-D12QOkDs.js} +1 -1
  43. package/apps/web/dist/assets/{markdown-blocks-DSEA68s5.js → markdown-blocks-DbsqN1T2.js} +1 -1
  44. package/apps/web/dist/assets/{member-directory-48yD01yN.js → member-directory-BRhEIYZ6.js} +1 -1
  45. package/apps/web/dist/assets/{mk-BZ2Rg2sU.js → mk-D77vceoz.js} +1 -1
  46. package/apps/web/dist/assets/mk-MK-BdM_SsE8.js +1 -0
  47. package/apps/web/dist/assets/{nl-BtnPzRih.js → nl-Bew8-xmX.js} +1 -1
  48. package/apps/web/dist/assets/nl-NL-CwjB5sva.js +1 -0
  49. package/apps/web/dist/assets/{pl-Beg8hEdK.js → pl-CEBl_oa9.js} +1 -1
  50. package/apps/web/dist/assets/pl-PL-6-PMhTBd.js +1 -0
  51. package/apps/web/dist/assets/{project-lifecycle-CIAMJ-SX.js → project-lifecycle-DGHAmEB2.js} +1 -1
  52. package/apps/web/dist/assets/{project-settings-C7lolDSl.js → project-settings-DY8Ossd-.js} +1 -1
  53. package/apps/web/dist/assets/{pt-BR-B4VZ35N_.js → pt-BR-BDTQeKcp.js} +1 -1
  54. package/apps/web/dist/assets/pt-BR-TD_wt6Hr.js +1 -0
  55. package/apps/web/dist/assets/{public-project-DvvfaUd2.js → public-project-BeXla8TL.js} +1 -1
  56. package/apps/web/dist/assets/{rotate-ccw-GjVJPDML.js → rotate-ccw-DGM890Fc.js} +1 -1
  57. package/apps/web/dist/assets/{ru-DjVJVHzv.js → ru-BeH0eXQq.js} +1 -1
  58. package/apps/web/dist/assets/ru-RU-Bk1a6Oln.js +1 -0
  59. package/apps/web/dist/assets/{search-ZaQmVnj1.js → search-B3-w3oCd.js} +3 -3
  60. package/apps/web/dist/assets/{send-Dr9bXHhf.js → send-B9baaCnt.js} +1 -1
  61. package/apps/web/dist/assets/{settings-DXvrVvyS.js → settings-BKZfEkVk.js} +1 -1
  62. package/apps/web/dist/assets/{sliders-horizontal-C1t_zA7D.js → sliders-horizontal-yKgghk8h.js} +1 -1
  63. package/apps/web/dist/assets/{switch-D-WTDajm.js → switch-ByOrazEW.js} +1 -1
  64. package/apps/web/dist/assets/{table-BaRMFP84.js → table-Cm6NQXfq.js} +1 -1
  65. package/apps/web/dist/assets/{ticket-detail-CFJI4qoK.js → ticket-detail-Cd3_e2jz.js} +2 -2
  66. package/apps/web/dist/assets/{ticket-editor-DL3nHG_q.js → ticket-editor-CLDBUk0n.js} +2 -2
  67. package/apps/web/dist/assets/{ticket-list-CDkweYGS.js → ticket-list-BC9acNl4.js} +1 -1
  68. package/apps/web/dist/assets/{ticket-list-controls-CmTgFQQ-.js → ticket-list-controls-CRQk5ghe.js} +1 -1
  69. package/apps/web/dist/assets/{tr-Ckc4TA71.js → tr-BNApk6Hc.js} +1 -1
  70. package/apps/web/dist/assets/tr-TR-CUfBb7K9.js +1 -0
  71. package/apps/web/dist/assets/{uk-B4ZvJ8xG.js → uk-CjShsgpN.js} +1 -1
  72. package/apps/web/dist/assets/uk-UA-BDaXBsDP.js +1 -0
  73. package/apps/web/dist/assets/{upload-BwGa8shS.js → upload-BzLq4CMS.js} +1 -1
  74. package/apps/web/dist/assets/{useQueries-sQEHjB0a.js → useQueries-D64vLhM6.js} +1 -1
  75. package/apps/web/dist/assets/vi-VN-Bgb-L6mE.js +1 -0
  76. package/apps/web/dist/assets/{vi-Dq2krfY8.js → vi-s5Hfv1Y-.js} +1 -1
  77. package/apps/web/dist/assets/{visual-editor-CBhwqTDu.js → visual-editor-KE96mwCg.js} +1 -1
  78. package/apps/web/dist/assets/{workspace-settings-DgLyieJN.js → workspace-settings-C-Phmi9i.js} +1 -1
  79. package/apps/web/dist/assets/{zh-CN-B7Rxc3Mp.js → zh-CN-BBnpHJ9R.js} +1 -1
  80. package/apps/web/dist/assets/zh-CN-BypkvBe6.js +1 -0
  81. package/apps/web/dist/assets/zh-TW-CgMsT_XS.js +1 -0
  82. package/apps/web/dist/assets/{zh-TW-awiwHjeM.js → zh-TW-sSWkqSLN.js} +1 -1
  83. package/apps/web/dist/index.html +7 -7
  84. package/compose.yml +1 -0
  85. package/docs/api.md +2 -2
  86. package/docs/self-hosting.md +2 -0
  87. package/package.json +1 -1
  88. package/apps/server/dist/instance-CCeXRJ6m.mjs +0 -133
  89. package/apps/web/dist/assets/az-AZ-DesqXNg5.js +0 -1
  90. package/apps/web/dist/assets/de-DE-BIGY9SNm.js +0 -1
  91. package/apps/web/dist/assets/default-BgvtI7HK.js +0 -56
  92. package/apps/web/dist/assets/el-GR-D2TjImt0.js +0 -1
  93. package/apps/web/dist/assets/es-ES-C_fRqLGU.js +0 -1
  94. package/apps/web/dist/assets/fr-FR-_tnQsn4j.js +0 -1
  95. package/apps/web/dist/assets/hi-IN-CcmFsZYy.js +0 -1
  96. package/apps/web/dist/assets/id-ID-C59tC61D.js +0 -1
  97. package/apps/web/dist/assets/it-IT-BAP5O3gK.js +0 -1
  98. package/apps/web/dist/assets/ja-JP-vQa7mEdh.js +0 -1
  99. package/apps/web/dist/assets/ko-KR-CXlpmX0-.js +0 -1
  100. package/apps/web/dist/assets/mk-MK-BU5BLpXM.js +0 -1
  101. package/apps/web/dist/assets/nl-NL-2aSpdZkg.js +0 -1
  102. package/apps/web/dist/assets/pl-PL-C5Wvnv7f.js +0 -1
  103. package/apps/web/dist/assets/pt-BR-CVvI-ZB7.js +0 -1
  104. package/apps/web/dist/assets/ru-RU-C7UUdGIh.js +0 -1
  105. package/apps/web/dist/assets/tr-TR-VVsL3uMp.js +0 -1
  106. package/apps/web/dist/assets/uk-UA-DRpCbOps.js +0 -1
  107. package/apps/web/dist/assets/vi-VN-C0YFqq9j.js +0 -1
  108. package/apps/web/dist/assets/zh-CN-pcgTdR8c.js +0 -1
  109. package/apps/web/dist/assets/zh-TW-DymSXkFg.js +0 -1
@@ -12,6 +12,8 @@ KANVIL_TRUSTED_ORIGINS=http://localhost:5173
12
12
  KANVIL_SESSION_WRITE_LIMIT=120
13
13
  # Set false to disable rate limiting for all API keys, including existing keys.
14
14
  KANVIL_API_KEY_RATE_LIMIT_ENABLED=true
15
+ # Maximum initial or renewed claim lease in seconds. Defaults to 24 hours.
16
+ KANVIL_CLAIM_MAX_LEASE_SECONDS=86400
15
17
  # Configure all three OIDC values together. Omit them to use local login only.
16
18
  # OIDC_DISCOVERY_URL=https://identity.example.com/.well-known/openid-configuration
17
19
  # OIDC_CLIENT_ID=
@@ -1,6 +1,5 @@
1
- import { a as auth_schema_exports, c as oauthConsent, d as user, i as apikey, l as oauthRefreshToken, o as oauthAccessToken, r as account, s as oauthClient, u as session } from "./config-BFzcAs8u.mjs";
2
- import { c as searchAuthentication, i as instanceUpdateSchema, l as searchSettingsSchema, n as authenticationPolicySchema, r as brokerSettingsSchema, s as s3SettingsSchema } from "./instance-CCeXRJ6m.mjs";
3
- import { $ as permissions, C as eventLabels, Ct as ticketFilter, D as formatEvent, Dt as workflowOrder, E as filterList, Et as ticketSchema, J as parseCustomFieldFilter, K as operationPermission, L as isSeededRole, M as invitationStatuses, N as isHexColor, O as hasAdminRole, Ot as workspaceSchema, Q as permissionScope, S as eventCategories, St as ticketExportFormat, T as filterKey, Tt as ticketPredicates, X as parsePublicOutput, Y as parseOutput, Z as permissionLabels, _ as deliverySettingsSchema, _t as snapshotSchema, at as remoteKinds, b as difficulties, bt as states, c as credentialProjectsSchema, ct as repositorySecretFields, d as customFieldValue, dt as roleLabels, et as priorities, f as customFieldValueSchema, ft as roles, g as deliverySecretFields, gt as signInMethodLabels, h as deletedAccountName, ht as seededPermissions, i as channelRouteAllows, j as importSecretFields, l as customFieldFilterTokens, lt as resourceProvider, m as defaultWorkflow, mt as searchResultTypes, n as attachmentLimit, nt as projectSchema, o as closedStates, ot as repositoryProviderDefinitions, p as defaultOrder, pt as scopes, q as operations, r as channelKinds, rt as publicOperations, st as repositoryProviders, t as ApiError, tt as priorityLabels, u as customFieldSchema, ut as roleCategory, v as destinationEventKeys, vt as stagedUploadLifetime, w as eventSchema, wt as ticketImportSchema, y as destinationKinds, yt as stateLabels, z as mentionScheme } from "./src-tQ82UI8k.mjs";
1
+ import { a as auth_schema_exports, c as oauthConsent, d as user, i as apikey, l as oauthRefreshToken, o as oauthAccessToken, r as account, s as oauthClient, u as session } from "./config-DOT1SDQO.mjs";
2
+ import { $ as permissionLabels, A as hasAdminRole, At as workspaceSchema, D as filterKey, Dt as ticketPredicates, E as eventSchema, Et as ticketImportSchema, F as isHexColor, J as operationPermission, Lt as s3SettingsSchema, Mt as authenticationPolicySchema, N as importSecretFields, Nt as brokerSettingsSchema, O as filterList, Ot as ticketSchema, P as invitationStatuses, Pt as instanceUpdateSchema, Q as parsePublicOutput, Rt as searchAuthentication, S as difficulties, St as states, T as eventLabels, Tt as ticketFilter, V as mentionScheme, X as parseCustomFieldFilter, Y as operations, Z as parseOutput, _ as deletedAccountName, _t as seededPermissions, at as publicOperations, b as destinationEventKeys, bt as stagedUploadLifetime, ct as repositoryProviderDefinitions, d as customFieldSchema, dt as resourceProvider, et as permissionScope, f as customFieldValue, ft as roleCategory, g as defaultWorkflow, gt as searchResultTypes, h as defaultOrder, ht as scopes, i as channelRouteAllows, it as projectSchema, k as formatEvent, kt as workflowOrder, l as credentialProjectsSchema, lt as repositoryProviders, m as defaultClaimMaxLeaseSeconds, mt as roles, n as attachmentLimit, nt as priorities, p as customFieldValueSchema, pt as roleLabels, r as channelKinds, rt as priorityLabels, s as closedStates, st as remoteKinds, t as ApiError, tt as permissions, u as customFieldFilterTokens, ut as repositorySecretFields, v as deliverySecretFields, vt as signInMethodLabels, w as eventCategories, wt as ticketExportFormat, x as destinationKinds, xt as stateLabels, y as deliverySettingsSchema, yt as snapshotSchema, z as isSeededRole, zt as searchSettingsSchema } from "./src-VxR5jZiK.mjs";
4
3
  import { and, asc, count, desc, eq, getTableColumns, gt, ilike, inArray, isNotNull, isNull, lt, lte, ne, notInArray, or, sql } from "drizzle-orm";
5
4
  import { alias, bigint, boolean, check, customType, foreignKey, index, integer, jsonb, pgTable, primaryKey, text, timestamp, unionAll, unique, uniqueIndex, uuid } from "drizzle-orm/pg-core";
6
5
  import { z } from "zod";
@@ -2222,6 +2221,14 @@ async function readinessMany(ctx, selected) {
2222
2221
  }
2223
2222
  return result;
2224
2223
  }
2224
+ function claimExpiry(ctx, requested) {
2225
+ const leaseSeconds = requested ?? Math.min(300, ctx.claimMaxLeaseSeconds);
2226
+ if (leaseSeconds > ctx.claimMaxLeaseSeconds) fail(400, "validation_error", "Claim lease exceeds the configured maximum", {
2227
+ path: "leaseSeconds",
2228
+ maximum: ctx.claimMaxLeaseSeconds
2229
+ });
2230
+ return new Date(Date.now() + leaseSeconds * 1e3);
2231
+ }
2225
2232
  async function readiness(ctx, ticket) {
2226
2233
  return requireRow((await readinessMany(ctx, [ticket])).get(ticket.id));
2227
2234
  }
@@ -2885,7 +2892,7 @@ const ticketHandlers = {
2885
2892
  actorId: ctx.actor.id,
2886
2893
  ownerId: ctx.actor.ownerId,
2887
2894
  workerId: input.workerId,
2888
- expiresAt: new Date(Date.now() + input.leaseSeconds * 1e3)
2895
+ expiresAt: claimExpiry(ctx, input.leaseSeconds)
2889
2896
  }).returning());
2890
2897
  const row = one(await ctx.db.update(tickets).set({
2891
2898
  ...await resolveState(ctx, { status: "in_progress" }, ticket),
@@ -2904,7 +2911,7 @@ const ticketHandlers = {
2904
2911
  const ticket = await getTicket(ctx, input.ticketId);
2905
2912
  const current = one(await ctx.db.select().from(claims).where(and(eq(claims.id, input.claimId), eq(claims.ticketId, ticket.id))));
2906
2913
  if (!ownsLiveClaim(ctx, current)) fail(409, "claim_conflict", "Only the current worker can renew an unexpired claim");
2907
- const claim = one(await ctx.db.update(claims).set({ expiresAt: new Date(Date.now() + input.leaseSeconds * 1e3) }).where(eq(claims.id, current.id)).returning());
2914
+ const claim = one(await ctx.db.update(claims).set({ expiresAt: claimExpiry(ctx, input.leaseSeconds) }).where(eq(claims.id, current.id)).returning());
2908
2915
  await publish(ctx, "claim.renewed", ticket.id, {
2909
2916
  claimId: claim.id,
2910
2917
  expiresAt: claim.expiresAt.toISOString()
@@ -2914,7 +2921,7 @@ const ticketHandlers = {
2914
2921
  async release_claim(ctx, input) {
2915
2922
  const ticket = await getTicket(ctx, input.ticketId);
2916
2923
  const current = one(await ctx.db.select().from(claims).where(and(eq(claims.id, input.claimId), eq(claims.ticketId, ticket.id))));
2917
- if (!ownsLiveClaim(ctx, current)) fail(409, "claim_conflict", "Only the owning worker can release an unexpired claim. Expired claims require administrator recovery.");
2924
+ if (!ownsLiveClaim(ctx, current)) fail(409, "claim_conflict", "Only the owning worker can release an unexpired claim. Expired claims require explicit recovery.");
2918
2925
  await ctx.db.delete(claims).where(eq(claims.id, current.id));
2919
2926
  await publish(ctx, "claim.released", ticket.id, { claimId: current.id });
2920
2927
  return { ok: true };
@@ -2922,12 +2929,26 @@ const ticketHandlers = {
2922
2929
  async recover_claim(ctx, input) {
2923
2930
  const ticket = await getTicket(ctx, input.ticketId);
2924
2931
  const current = one(await ctx.db.select().from(claims).where(and(eq(claims.id, input.claimId), eq(claims.ticketId, ticket.id))));
2925
- if (current.expiresAt > /* @__PURE__ */ new Date()) fail(409, "claim_not_expired", "The current claim has not expired");
2932
+ if (input.cancelActive && !can(ctx, "project.manage")) fail(403, "forbidden", "Cancelling an active claim requires project management access and admin scope");
2933
+ if (current.expiresAt > /* @__PURE__ */ new Date() && !input.cancelActive) fail(409, "claim_not_expired", "The current claim has not expired");
2934
+ if (input.reschedule && input.expectedVersion !== void 0) {
2935
+ assertVersion(ticket, input.expectedVersion, "ticket", "rescheduling recovered work");
2936
+ const row = one(await ctx.db.update(tickets).set({
2937
+ ...await resolveState(ctx, { status: "todo" }, ticket),
2938
+ version: ticket.version + 1,
2939
+ updatedAt: /* @__PURE__ */ new Date()
2940
+ }).where(eq(tickets.id, ticket.id)).returning());
2941
+ await publish(ctx, "ticket.updated", ticket.id, {
2942
+ version: row.version,
2943
+ changedFields: ["status", "stateId"]
2944
+ });
2945
+ }
2926
2946
  await ctx.db.delete(claims).where(eq(claims.id, current.id));
2927
2947
  await publish(ctx, "claim.recovered", ticket.id, {
2928
2948
  claimId: current.id,
2929
2949
  reason: input.reason,
2930
- confirmedStopped: true
2950
+ confirmedStopped: true,
2951
+ ...input.cancelActive && { cancelActive: true }
2931
2952
  });
2932
2953
  return { ok: true };
2933
2954
  }
@@ -6775,7 +6796,8 @@ const baseContext = (db, actor) => ({
6775
6796
  search: builtinSearch,
6776
6797
  secrets: noSecrets,
6777
6798
  publicUrl: "http://localhost",
6778
- sources: noSources
6799
+ sources: noSources,
6800
+ claimMaxLeaseSeconds: defaultClaimMaxLeaseSeconds
6779
6801
  });
6780
6802
  const publicActor = {
6781
6803
  id: "",
@@ -7042,6 +7064,7 @@ function createDomain(database, services = {}) {
7042
7064
  if (services.secrets) ctx.secrets = services.secrets;
7043
7065
  if (services.publicUrl) ctx.publicUrl = services.publicUrl;
7044
7066
  if (services.sources) ctx.sources = services.sources;
7067
+ if (services.claimMaxLeaseSeconds !== void 0) ctx.claimMaxLeaseSeconds = services.claimMaxLeaseSeconds;
7045
7068
  return ctx;
7046
7069
  };
7047
7070
  const locked = (run) => database.db.transaction(async (tx) => {
@@ -1,4 +1,4 @@
1
- import { B as notificationIdsInput, G as okSchema, H as notificationPreferencesSchema, U as notificationReadInput, V as notificationPreferencesInput, W as notificationsSchema, X as parsePublicOutput, Y as parseOutput, _t as snapshotSchema, a as checkpointSchema, q as operations, rt as publicOperations, t as ApiError, w as eventSchema, x as errorSchema, xt as streamErrorSchema } from "./src-tQ82UI8k.mjs";
1
+ import { C as errorSchema, Ct as streamErrorSchema, E as eventSchema, G as notificationReadInput, H as notificationIdsInput, K as notificationsSchema, Q as parsePublicOutput, U as notificationPreferencesInput, W as notificationPreferencesSchema, Y as operations, Z as parseOutput, a as checkpointSchema, at as publicOperations, q as okSchema, t as ApiError, yt as snapshotSchema } from "./src-VxR5jZiK.mjs";
2
2
  import { z } from "zod";
3
3
  import { parseArgs } from "node:util";
4
4
  import { constants } from "node:fs";
@@ -1,4 +1,4 @@
1
- import { l as searchSettingsSchema, r as brokerSettingsSchema, s as s3SettingsSchema } from "./instance-CCeXRJ6m.mjs";
1
+ import { Lt as s3SettingsSchema, Nt as brokerSettingsSchema, m as defaultClaimMaxLeaseSeconds, o as claimLeaseSecondsSchema, zt as searchSettingsSchema } from "./src-VxR5jZiK.mjs";
2
2
  import pg from "pg";
3
3
  import { drizzle } from "drizzle-orm/node-postgres";
4
4
  import { relations } from "drizzle-orm";
@@ -394,6 +394,7 @@ const envSchema = z.object({
394
394
  GOOGLE_CLIENT_SECRET: optionalEnv(z.string().min(1)),
395
395
  DISCORD_CLIENT_ID: optionalEnv(z.string().min(1)),
396
396
  DISCORD_CLIENT_SECRET: optionalEnv(z.string().min(1)),
397
+ KANVIL_CLAIM_MAX_LEASE_SECONDS: z.coerce.number().pipe(claimLeaseSecondsSchema).default(defaultClaimMaxLeaseSeconds),
397
398
  KANVIL_SESSION_WRITE_LIMIT: z.coerce.number().int().min(1).max(1e5).default(120),
398
399
  KANVIL_API_KEY_RATE_LIMIT_ENABLED: z.enum(["true", "false"]).default("true").transform((value) => value === "true"),
399
400
  KANVIL_PUSH_ENABLED: z.enum(["true", "false"]).default("false").transform((value) => value === "true"),
@@ -1,8 +1,7 @@
1
- import { a as auth_schema_exports, d as user$1, i as apikey, n as createDatabase, r as account, t as readConfig, u as session } from "./config-BFzcAs8u.mjs";
2
- import { a as photoInputSchema, i as instanceUpdateSchema, l as searchSettingsSchema, o as photoResultSchema, r as brokerSettingsSchema, s as s3SettingsSchema, t as adminInstanceSchema } from "./instance-CCeXRJ6m.mjs";
1
+ import { a as auth_schema_exports, d as user$1, i as apikey, n as createDatabase, r as account, t as readConfig, u as session } from "./config-DOT1SDQO.mjs";
2
+ import { A as hasAdminRole, B as memberSchema, C as errorSchema, Ft as photoInputSchema, G as notificationReadInput, H as notificationIdsInput, I as isOperation, It as photoResultSchema, L as isPresetColor, Lt as s3SettingsSchema, M as importProviderDefinitions, Nt as brokerSettingsSchema, Pt as instanceUpdateSchema, R as isPublicOperation, U as notificationPreferencesInput, W as notificationPreferencesSchema, Y as operations, at as publicOperations, c as credentialInput, g as defaultWorkflow, ht as scopes, j as importLimits, jt as adminInstanceSchema, mt as roles, ot as pushDeviceInput, q as okSchema, s as closedStates, t as ApiError, wt as ticketExportFormat, xt as stateLabels, zt as searchSettingsSchema } from "./src-VxR5jZiK.mjs";
3
3
  import { t as migrateDatabase } from "./migrate-C9f4ozB4.mjs";
4
- import { $ as subscriptions, A as createTicketSearch, B as blobObjects, C as DeliveryError, D as requireInstanceAdmin, E as createWriteLimiter, F as stagedUploadCutoff, G as members, H as eventClock, I as createObjectStore, J as profilePhotos, K as notificationPreferences, L as createPollingJob, M as createBlobStorage, N as decodeImage, O as requireSession, P as imageResponse, Q as storageBackends, R as attachmentContent, S as deliverBatch, T as createAccess, U as events, V as deliveryCheckpoints, X as pushDevices, Y as projects, Z as stagedUploads, _ as recipientColumns, a as deliverySecrets, b as receiveRepositoryWebhook, c as ownerBlocker, d as createDomain, et as tickets, f as fail, g as reachable, h as one, i as createInstance, j as createTicketIndex, k as readCalendarFeed, l as appendEvents, m as notify, n as emailCodesAvailable, nt as workspaces, o as otherActiveAdministrator, p as json, q as notifications, r as signInProviders, rt as matchesOIDCBinding, s as ownedWorkspaces, t as createAuth, tt as workspaceMembers, u as assertVersion, v as requireRow, w as createHttpSender, x as defaultSenders, y as processImports, z as attachments } from "./auth-DAqfvUJm.mjs";
5
- import { A as importProviderDefinitions, B as notificationIdsInput, F as isPresetColor, G as okSchema, H as notificationPreferencesSchema, I as isPublicOperation, O as hasAdminRole, P as isOperation, R as memberSchema, St as ticketExportFormat, U as notificationReadInput, V as notificationPreferencesInput, ft as roles, it as pushDeviceInput, k as importLimits, m as defaultWorkflow, o as closedStates, pt as scopes, q as operations, rt as publicOperations, s as credentialInput, t as ApiError, x as errorSchema, yt as stateLabels } from "./src-tQ82UI8k.mjs";
4
+ import { $ as subscriptions, A as createTicketSearch, B as blobObjects, C as DeliveryError, D as requireInstanceAdmin, E as createWriteLimiter, F as stagedUploadCutoff, G as members, H as eventClock, I as createObjectStore, J as profilePhotos, K as notificationPreferences, L as createPollingJob, M as createBlobStorage, N as decodeImage, O as requireSession, P as imageResponse, Q as storageBackends, R as attachmentContent, S as deliverBatch, T as createAccess, U as events, V as deliveryCheckpoints, X as pushDevices, Y as projects, Z as stagedUploads, _ as recipientColumns, a as deliverySecrets, b as receiveRepositoryWebhook, c as ownerBlocker, d as createDomain, et as tickets, f as fail, g as reachable, h as one, i as createInstance, j as createTicketIndex, k as readCalendarFeed, l as appendEvents, m as notify, n as emailCodesAvailable, nt as workspaces, o as otherActiveAdministrator, p as json, q as notifications, r as signInProviders, rt as matchesOIDCBinding, s as ownedWorkspaces, t as createAuth, tt as workspaceMembers, u as assertVersion, v as requireRow, w as createHttpSender, x as defaultSenders, y as processImports, z as attachments } from "./auth-CLAZTAoL.mjs";
6
5
  import { serve } from "@hono/node-server";
7
6
  import pg from "pg";
8
7
  import { drizzle } from "drizzle-orm/node-postgres";
@@ -326,7 +325,7 @@ function createAccountAdministration(database, auth, config) {
326
325
  }
327
326
  //#endregion
328
327
  //#region src/version.ts
329
- const applicationVersion = "0.4.1";
328
+ const applicationVersion = "0.4.2";
330
329
  //#endregion
331
330
  //#region src/realtime.ts
332
331
  async function createRealtime(config) {
@@ -3221,7 +3220,8 @@ async function createApplication(database, config, overrides = {}) {
3221
3220
  secrets,
3222
3221
  publicUrl: config.KANVIL_URL,
3223
3222
  mail: senders.mail,
3224
- sources: adapters.importSources(config)
3223
+ sources: adapters.importSources(config),
3224
+ claimMaxLeaseSeconds: config.KANVIL_CLAIM_MAX_LEASE_SECONDS
3225
3225
  }), access = createAccess(auth, domain, config, database), realtime = await adapters.realtime(config, instance, integrationDatabase);
3226
3226
  const unsubscribeJobs = realtime.subscribe(() => {
3227
3227
  blobs.sync().catch(() => {});
@@ -1,4 +1,4 @@
1
- import { n as createDatabase, t as readConfig } from "./config-BFzcAs8u.mjs";
1
+ import { n as createDatabase, t as readConfig } from "./config-DOT1SDQO.mjs";
2
2
  import { t as migrateDatabase } from "./migrate-C9f4ozB4.mjs";
3
3
  //#region src/cli/migrate.ts
4
4
  const database = createDatabase(readConfig().DATABASE_URL);
@@ -1,6 +1,6 @@
1
- import { d as user, n as createDatabase, r as account, t as readConfig, u as session } from "./config-BFzcAs8u.mjs";
2
- import { W as instanceSettings, f as fail, t as createAuth } from "./auth-DAqfvUJm.mjs";
3
- import { O as hasAdminRole } from "./src-tQ82UI8k.mjs";
1
+ import { d as user, n as createDatabase, r as account, t as readConfig, u as session } from "./config-DOT1SDQO.mjs";
2
+ import { A as hasAdminRole } from "./src-VxR5jZiK.mjs";
3
+ import { W as instanceSettings, f as fail, t as createAuth } from "./auth-CLAZTAoL.mjs";
4
4
  import { and, eq, isNull, sql } from "drizzle-orm";
5
5
  import { z } from "zod";
6
6
  import { parseArgs } from "node:util";
@@ -1,6 +1,135 @@
1
- import { n as authenticationPolicySchema } from "./instance-CCeXRJ6m.mjs";
2
1
  import { z } from "zod";
3
2
  import i18next from "i18next";
3
+ //#region ../../packages/contracts/src/instance.ts
4
+ const endpoint$1 = z.url({ protocol: /^https?$/ }).refine((value) => !/^https?:\/\/[^/]*@/.test(value) && !/[?#]/.test(value), "Use an HTTP(S) endpoint without embedded credentials");
5
+ const s3SettingsSchema = z.object({
6
+ endpoint: z.union([endpoint$1, z.literal("")]).default(""),
7
+ region: z.string().min(1).max(100).default("us-east-1"),
8
+ bucket: z.string().min(3).max(255),
9
+ prefix: z.string().max(200).regex(/^[a-zA-Z0-9/_-]*$/).default("kanvil/"),
10
+ forcePathStyle: z.boolean().default(true),
11
+ accessKeyId: z.string().max(500).default(""),
12
+ secretAccessKey: z.string().max(2e3).optional()
13
+ }).strict();
14
+ const searchAuthenticationSchema = z.enum([
15
+ "none",
16
+ "apiKey",
17
+ "basic"
18
+ ]);
19
+ const searchSettingsSchema = z.object({
20
+ url: endpoint$1,
21
+ auth: searchAuthenticationSchema.optional(),
22
+ index: z.string().regex(/^[a-z0-9][a-z0-9_-]{0,100}$/),
23
+ apiKey: z.string().max(4e3).optional(),
24
+ username: z.string().max(500).default(""),
25
+ password: z.string().max(2e3).optional()
26
+ }).strict();
27
+ const storageSettingsSchema = z.discriminatedUnion("provider", [z.object({ provider: z.literal("local") }).strict(), s3SettingsSchema.extend({ provider: z.literal("s3") })]);
28
+ const externalSearchSettingsSchema = z.discriminatedUnion("provider", [z.object({ provider: z.literal("postgres") }).strict(), searchSettingsSchema.extend({ provider: z.literal("elasticsearch") })]);
29
+ const brokerSettingsSchema = z.object({
30
+ url: z.url({ protocol: /^amqps?$/ }).max(4e3).optional(),
31
+ exchange: z.string().min(1).max(200).regex(/^[a-zA-Z0-9_.-]+$/).refine((value) => !value.startsWith("amq."), "Use an application exchange").default("kanvil.events")
32
+ }).strict();
33
+ const eventDeliverySettingsSchema = z.discriminatedUnion("provider", [z.object({ provider: z.literal("postgres") }).strict(), brokerSettingsSchema.extend({ provider: z.literal("rabbitmq") })]);
34
+ const authenticationPolicySchema = z.object({
35
+ emailPasswordEnabled: z.boolean().default(true),
36
+ ssoAutoProvision: z.boolean().default(false)
37
+ }).strict();
38
+ const instanceUpdateSchema = z.object({
39
+ expectedVersion: z.number().int().positive(),
40
+ name: z.string().trim().min(1).max(100),
41
+ description: z.string().max(500),
42
+ storage: storageSettingsSchema,
43
+ search: externalSearchSettingsSchema,
44
+ broker: eventDeliverySettingsSchema.optional(),
45
+ authentication: authenticationPolicySchema.optional()
46
+ }).strict();
47
+ z.object({
48
+ name: z.string(),
49
+ description: z.string()
50
+ });
51
+ const adminInstanceSchema = z.object({
52
+ id: z.uuid(),
53
+ version: z.number().int(),
54
+ name: z.string(),
55
+ description: z.string(),
56
+ authentication: authenticationPolicySchema.default(() => authenticationPolicySchema.parse({})),
57
+ storage: z.object({
58
+ provider: z.enum(["local", "s3"]),
59
+ source: z.enum(["deployment", "admin"]),
60
+ settings: s3SettingsSchema.omit({ secretAccessKey: true }).nullable(),
61
+ secretConfigured: z.boolean(),
62
+ pending: z.number().int(),
63
+ status: z.enum([
64
+ "ready",
65
+ "transferring",
66
+ "unavailable"
67
+ ]),
68
+ error: z.string().nullable()
69
+ }),
70
+ search: z.object({
71
+ provider: z.enum(["postgres", "elasticsearch"]),
72
+ source: z.enum(["deployment", "admin"]),
73
+ settings: searchSettingsSchema.omit({
74
+ apiKey: true,
75
+ password: true
76
+ }).nullable(),
77
+ secretConfigured: z.boolean(),
78
+ status: z.enum([
79
+ "builtin",
80
+ "indexing",
81
+ "ready",
82
+ "unavailable"
83
+ ]),
84
+ cursor: z.string(),
85
+ error: z.string().nullable()
86
+ }),
87
+ broker: z.object({
88
+ provider: z.enum(["postgres", "rabbitmq"]),
89
+ source: z.enum(["deployment", "admin"]),
90
+ settings: z.object({
91
+ endpoint: z.string(),
92
+ exchange: z.string()
93
+ }).nullable(),
94
+ secretConfigured: z.boolean(),
95
+ status: z.enum([
96
+ "builtin",
97
+ "connecting",
98
+ "ready",
99
+ "unavailable"
100
+ ]),
101
+ error: z.string().nullable()
102
+ }),
103
+ deployment: z.object({
104
+ url: z.string(),
105
+ oidc: z.object({
106
+ name: z.string(),
107
+ discoveryUrl: z.string(),
108
+ clientId: z.string()
109
+ }).nullable(),
110
+ push: z.boolean(),
111
+ version: z.string()
112
+ }),
113
+ locations: z.array(z.object({
114
+ id: z.uuid(),
115
+ bucket: z.string(),
116
+ endpoint: z.string(),
117
+ prefix: z.string(),
118
+ objects: z.number().int()
119
+ }))
120
+ });
121
+ const photoInputSchema = z.object({
122
+ data: z.string().max(7e5),
123
+ contentType: z.enum([
124
+ "image/png",
125
+ "image/jpeg",
126
+ "image/webp"
127
+ ])
128
+ }).strict();
129
+ const photoResultSchema = z.object({ image: z.string().nullable() });
130
+ function searchAuthentication(settings) {
131
+ return settings.auth ?? (settings.apiKey ? "apiKey" : settings.username && settings.password ? "basic" : "none");
132
+ }
4
133
  //#endregion
5
134
  //#region ../../packages/contracts/src/i18n/en-US/index.ts
6
135
  var en_US_default = {
@@ -1136,7 +1265,7 @@ var en_US_default = {
1136
1265
  release: "Release my claim",
1137
1266
  releaseDescription: "Release ownership after your worker has stopped writing?",
1138
1267
  recover: "Recover expired claim",
1139
- recoverHelp: "Recovery requires project administrator access and an expired claim. Stop the worker first.",
1268
+ recoverHelp: "Confirm the worker has stopped first.",
1140
1269
  reason: "Recovery reason",
1141
1270
  confirmed: "I have confirmed the worker has stopped",
1142
1271
  submit: "Recover ownership"
@@ -2477,7 +2606,7 @@ var en_US_default = {
2477
2606
  },
2478
2607
  recover: {
2479
2608
  action: "Recover expired claim",
2480
- explanation: "Only a project administrator can recover an expired claim. Confirm the worker has stopped first.",
2609
+ explanation: "Confirm the worker has stopped first.",
2481
2610
  reason: "Recovery reason",
2482
2611
  confirm: "Worker stopped · recover"
2483
2612
  }
@@ -2724,6 +2853,8 @@ const priorityLabels = labelTable(priorities, (value) => t(`common.priority.${va
2724
2853
  const id = z.string().min(1).max(80);
2725
2854
  const timestamp = z.iso.datetime();
2726
2855
  const version = z.number().int().positive();
2856
+ const claimLeaseSecondsSchema = z.number().int().min(30).max(2147483647);
2857
+ const defaultClaimMaxLeaseSeconds = 86400;
2727
2858
  const text = z.string().trim().min(1);
2728
2859
  const dueDate = z.iso.datetime().refine((value) => new Date(value).getUTCFullYear() >= 1, "Use a date in year 1 or later");
2729
2860
  const tags = z.array(text.max(40)).max(30).overwrite((values) => [...new Set(values)]);
@@ -4527,12 +4658,12 @@ const operations = {
4527
4658
  ...mutation,
4528
4659
  workerId: text.max(200),
4529
4660
  expectedVersion: version,
4530
- leaseSeconds: z.number().int().min(30).max(3600).default(300)
4661
+ leaseSeconds: claimLeaseSecondsSchema.optional()
4531
4662
  }).strict(), claimSchema, "POST", "/projects/{projectId}/tickets/{ticketId}/claim", "claim", "Atomically claim ready work. Expired claims require explicit recovery."),
4532
4663
  renew_claim: op(ticketInput.extend({
4533
4664
  ...mutation,
4534
4665
  claimId: z.uuid(),
4535
- leaseSeconds: z.number().int().min(30).max(3600).default(300)
4666
+ leaseSeconds: claimLeaseSecondsSchema.optional()
4536
4667
  }).strict(), claimSchema, "POST", "/projects/{projectId}/tickets/{ticketId}/claim/renew", "claim", "Renew the caller's unexpired claim."),
4537
4668
  release_claim: op(ticketInput.extend({
4538
4669
  ...mutation,
@@ -4542,8 +4673,14 @@ const operations = {
4542
4673
  ...mutation,
4543
4674
  claimId: z.uuid(),
4544
4675
  reason: text.min(10).max(2e3),
4545
- confirmedStopped: z.literal(true)
4546
- }).strict(), okSchema, "POST", "/projects/{projectId}/tickets/{ticketId}/claim/recover", "admin", "Recover an expired claim only after confirming the worker stopped."),
4676
+ confirmedStopped: z.literal(true),
4677
+ cancelActive: z.boolean().optional(),
4678
+ reschedule: z.boolean().optional(),
4679
+ expectedVersion: version.optional()
4680
+ }).strict().refine((input) => !input.reschedule || input.expectedVersion !== void 0, {
4681
+ message: "expectedVersion is required to reschedule recovered work",
4682
+ path: ["expectedVersion"]
4683
+ }), okSchema, "POST", "/projects/{projectId}/tickets/{ticketId}/claim/recover", "claim", "Recover an expired claim after confirming the worker stopped. Optionally reschedule it to To do at its expectedVersion. Project managers with admin scope may explicitly cancel an active claim."),
4547
4684
  set_subscription: op(ticketInput.extend({
4548
4685
  ...mutation,
4549
4686
  enabled: z.boolean()
@@ -4815,4 +4952,4 @@ function parseOutput(name, value) {
4815
4952
  return operations[name].output.parse(value);
4816
4953
  }
4817
4954
  //#endregion
4818
- export { permissions as $, importProviderDefinitions as A, notificationIdsInput as B, eventLabels as C, ticketFilter as Ct, formatEvent as D, workflowOrder as Dt, filterList as E, ticketSchema as Et, isPresetColor as F, okSchema as G, notificationPreferencesSchema as H, isPublicOperation as I, parseCustomFieldFilter as J, operationPermission as K, isSeededRole as L, invitationStatuses as M, isHexColor as N, hasAdminRole as O, workspaceSchema as Ot, isOperation as P, permissionScope as Q, memberSchema as R, eventCategories as S, ticketExportFormat as St, filterKey as T, ticketPredicates as Tt, notificationReadInput as U, notificationPreferencesInput as V, notificationsSchema as W, parsePublicOutput as X, parseOutput as Y, permissionLabels as Z, deliverySettingsSchema as _, snapshotSchema as _t, checkpointSchema as a, remoteKinds as at, difficulties as b, states as bt, credentialProjectsSchema as c, repositorySecretFields as ct, customFieldValue as d, roleLabels as dt, priorities as et, customFieldValueSchema as f, roles as ft, deliverySecretFields as g, signInMethodLabels as gt, deletedAccountName as h, seededPermissions as ht, channelRouteAllows as i, pushDeviceInput as it, importSecretFields as j, importLimits as k, customFieldFilterTokens as l, resourceProvider as lt, defaultWorkflow as m, searchResultTypes as mt, attachmentLimit as n, projectSchema as nt, closedStates as o, repositoryProviderDefinitions as ot, defaultOrder as p, scopes as pt, operations as q, channelKinds as r, publicOperations as rt, credentialInput as s, repositoryProviders as st, ApiError as t, priorityLabels as tt, customFieldSchema as u, roleCategory as ut, destinationEventKeys as v, stagedUploadLifetime as vt, eventSchema as w, ticketImportSchema as wt, errorSchema as x, streamErrorSchema as xt, destinationKinds as y, stateLabels as yt, mentionScheme as z };
4955
+ export { permissionLabels as $, hasAdminRole as A, workspaceSchema as At, memberSchema as B, errorSchema as C, streamErrorSchema as Ct, filterKey as D, ticketPredicates as Dt, eventSchema as E, ticketImportSchema as Et, isHexColor as F, photoInputSchema as Ft, notificationReadInput as G, notificationIdsInput as H, isOperation as I, photoResultSchema as It, operationPermission as J, notificationsSchema as K, isPresetColor as L, s3SettingsSchema as Lt, importProviderDefinitions as M, authenticationPolicySchema as Mt, importSecretFields as N, brokerSettingsSchema as Nt, filterList as O, ticketSchema as Ot, invitationStatuses as P, instanceUpdateSchema as Pt, parsePublicOutput as Q, isPublicOperation as R, searchAuthentication as Rt, difficulties as S, states as St, eventLabels as T, ticketFilter as Tt, notificationPreferencesInput as U, mentionScheme as V, notificationPreferencesSchema as W, parseCustomFieldFilter as X, operations as Y, parseOutput as Z, deletedAccountName as _, seededPermissions as _t, checkpointSchema as a, publicOperations as at, destinationEventKeys as b, stagedUploadLifetime as bt, credentialInput as c, repositoryProviderDefinitions as ct, customFieldSchema as d, resourceProvider as dt, permissionScope as et, customFieldValue as f, roleCategory as ft, defaultWorkflow as g, searchResultTypes as gt, defaultOrder as h, scopes as ht, channelRouteAllows as i, projectSchema as it, importLimits as j, adminInstanceSchema as jt, formatEvent as k, workflowOrder as kt, credentialProjectsSchema as l, repositoryProviders as lt, defaultClaimMaxLeaseSeconds as m, roles as mt, attachmentLimit as n, priorities as nt, claimLeaseSecondsSchema as o, pushDeviceInput as ot, customFieldValueSchema as p, roleLabels as pt, okSchema as q, channelKinds as r, priorityLabels as rt, closedStates as s, remoteKinds as st, ApiError as t, permissions as tt, customFieldFilterTokens as u, repositorySecretFields as ut, deliverySecretFields as v, signInMethodLabels as vt, eventCategories as w, ticketExportFormat as wt, destinationKinds as x, stateLabels as xt, deliverySettingsSchema as y, snapshotSchema as yt, isSeededRole as z, searchSettingsSchema as zt };
@@ -1 +1 @@
1
- import{Ga as e,_a as t,ba as n,ya as r}from"./search-ZaQmVnj1.js";import{i}from"./forms-C3pNy-qY.js";var a={name:`chevrons-up-down`,size:24,node:[[`path`,{d:`m7 15 5 5 5-5`,key:`1hf1tw`}],[`path`,{d:`m7 9 5-5 5 5`,key:`sgt6xg`}]]};a.node;var o=e(a),s={name:`pencil`,size:24,node:[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}],[`path`,{d:`m15 5 4 4`,key:`1mk7zo`}]]};s.node;var c=e(s),l={name:`trash`,size:24,node:[[`path`,{d:`M10 11v6`,key:`nco0om`}],[`path`,{d:`M14 11v6`,key:`outv1u`}],[`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6`,key:`miytrc`}],[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`,key:`e791ji`}]],aliases:[`trash-2`]};l.node;var u=e(l);function d(e){let{render:a,className:o,style:s,state:c=n,props:l=r,refs:u=r,metadata:d,stateAttributesMapping:f,tag:p=`div`,...m}=e,{compositeProps:h,compositeRef:g}=i({metadata:d});return t(p,e,{state:c,ref:[g,...u],props:[h,...l,m],stateAttributesMapping:f})}export{o as i,u as n,c as r,d as t};
1
+ import{Ga as e,_a as t,ba as n,ya as r}from"./search-B3-w3oCd.js";import{i}from"./forms-BbWAl0BZ.js";var a={name:`chevrons-up-down`,size:24,node:[[`path`,{d:`m7 15 5 5 5-5`,key:`1hf1tw`}],[`path`,{d:`m7 9 5-5 5 5`,key:`sgt6xg`}]]};a.node;var o=e(a),s={name:`pencil`,size:24,node:[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}],[`path`,{d:`m15 5 4 4`,key:`1mk7zo`}]]};s.node;var c=e(s),l={name:`trash`,size:24,node:[[`path`,{d:`M10 11v6`,key:`nco0om`}],[`path`,{d:`M14 11v6`,key:`outv1u`}],[`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6`,key:`miytrc`}],[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`,key:`e791ji`}]],aliases:[`trash-2`]};l.node;var u=e(l);function d(e){let{render:a,className:o,style:s,state:c=n,props:l=r,refs:u=r,metadata:d,stateAttributesMapping:f,tag:p=`div`,...m}=e,{compositeProps:h,compositeRef:g}=i({metadata:d});return t(p,e,{state:c,ref:[g,...u],props:[h,...l,m],stateAttributesMapping:f})}export{o as i,u as n,c as r,d as t};
@@ -1 +1 @@
1
- import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{Nn as t,hn as n}from"./default-BgvtI7HK.js";import{Ga as r}from"./search-ZaQmVnj1.js";import{c as i}from"./item-Cj8xpMLk.js";var a={name:`archive`,size:24,node:[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8`,key:`1s80jp`}],[`path`,{d:`M10 12h4`,key:`a56b0p`}]]};a.node;var o=r(a),s={name:`bell`,size:24,node:[[`path`,{d:`M10.268 21a2 2 0 0 0 3.464 0`,key:`vwvbt9`}],[`path`,{d:`M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326`,key:`11g9vi`}]]};s.node;var c=r(s),l=e(t()),u={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,"!doctype":!0,"!DOCTYPE":!0},d=/\s([^'"/\s><]+?)[\s/>]|([^\s=]+)=\s?("[^"]*"|'[^']*')/g;function f(e){let t={type:`tag`,name:``,voidElement:!1,attrs:{},children:[]},n=e.match(/<\/?([^\s]+?)[/\s>]/);if(n&&(t.name=n[1],(u[n[1]]||e.charAt(e.length-2)===`/`)&&(t.voidElement=!0),t.name.startsWith(`!--`))){let t=e.indexOf(`-->`);return{type:`comment`,comment:t===-1?``:e.slice(4,t)}}let r=new RegExp(d),i=null;for(;i=r.exec(e),i!==null;)if(i[0].trim()){if(i[1]){let e=i[1].trim(),n=[e,null],a=e.indexOf(`=`);a>-1&&(n=[e.slice(0,a),e.slice(a+1)]),t.attrs[n[0]]=n[1],r.lastIndex--}else i[2]&&(t.attrs[i[2]]=i[3].trim().substring(1,i[3].length-1))}return t}var p=/<!--[\s\S]*?-->|<[a-zA-Z0-9\-!/](?:"[^"]*"|'[^']*'|[^'">])*>/g,m=/<\/?([^\s]+?)[/\s>]/,h=/^\s*$/,g=/^(script|style)$/i,_=`\0`,v=Object.create(null);function y(e){e.forEach(function(e){if(e.type===`text`)e.content=e.content.split(_).join(`<`);else if(e.type===`comment`)e.comment=e.comment.split(_).join(`<`);else{for(let t in e.attrs){let n=e.attrs[t];typeof n==`string`&&n.indexOf(_)>-1&&(e.attrs[t]=n.split(_).join(`<`))}e.children.length&&y(e.children)}})}function b(e,t){let n=t&&t.components||v,r=t&&t.allowedTags,i=!1;if(r){let t=typeof r==`function`?r:function(e){return r.indexOf(e)>-1},n=``,a=0;p.lastIndex=0;let o;for(;o=p.exec(e);){let r=o[0];n+=e.slice(a,o.index);let s=r.match(m);r.startsWith(`<!--`)||s&&t(s[1])?(n+=r,a=o.index+r.length):(i=!0,n+=_,a=o.index+1,p.lastIndex=a)}e=n+e.slice(a)}let a=[],o=[],s,c=-1,l=!1,u=0,d;if(e.indexOf(`<`)!==0){let t=e.indexOf(`<`);a.push({type:`text`,content:t===-1?e:e.substring(0,t)})}let b=[],x;for(;x=p.exec(e);)b.push(x);return b.forEach(function(e,t){let n=e[0];if(!n||n.startsWith(`<!--`))return;let r=0,i=0,a=-1,o=null;for(let e=0;e<n.length;e++){let t=n.charAt(e);o?t===o&&(o=null):t===`"`||t===`'`?o=t:t===`<`?(r++,r===2&&(a=e)):t===`>`&&i++}let s=a>-1&&/[a-zA-Z0-9\-!/]/.test(n.charAt(a+1));if(r>i&&s){let e=n.substring(0,a),r=n.substring(e.length);b[t][0]=r,b[t].index+=e.length}}),b.forEach(function(t,r){let i=t[0];if(!i)return;let p=t.index;if(p<u)return;if(l){if(i!==`</`+s.name+`>`)return;l=!1}let m=i.charAt(1)!==`/`,_=i.startsWith(`<!--`),v=p+i.length,y=e.charAt(v),x=b[r+1],S;if(y===`<`&&x){let t=e.substring(v,x.index);S=t.split(`<`).length>t.split(`>`).length}let C;if(_){let t=f(i);if(c<0)return a.push(t),a;C=o[c],C.children.push(t);let n=e.slice(v,x?x.index:void 0);return n.length>0&&C.children.push({type:`text`,content:n}),a}if(m){c++,s=f(i),s.type===`tag`&&n[s.name]&&(s.type=`component`,l=!0);let t=!1;if(!l&&!s.voidElement&&g.test(s.name)){t=!0,d||=e.toLowerCase();let n=d.indexOf(`</`+s.name.toLowerCase()+`>`,v),r=n===-1?e.length:n,i=e.slice(v,r);i&&s.children.push({type:`text`,content:i}),u=r}!s.voidElement&&!l&&!t&&y&&y!==`<`&&s.children.push({type:`text`,content:e.slice(v,x?x.index:void 0)}),c===0&&a.push(s),C=o[c-1],C&&C.children.push(s),o[c]=s}if((!m||s.voidElement)&&(c>-1&&(s.voidElement||s.name===i.slice(2,-1))&&(c--,s=c===-1?a:o[c]),!l&&(y!==`<`||S)&&y)){C=c===-1?a:o[c].children;let t=x?x.index:-1,n=e.slice(v,t===-1?void 0:t);h.test(n)&&(n=` `),(t>-1&&c+C.length>=0||n!==` `)&&C.push({type:`text`,content:n})}}),i&&y(a),a}function x(e){let t=[];for(let n in e)e[n]===null?t.push(n):t.push(n+`="`+String(e[n]).replace(/"/g,`&quot;`)+`"`);return t.length?` `+t.join(` `):``}function S(e,t){switch(t.type){case`text`:return e+t.content;case`tag`:{let n=t.voidElement&&t.name.toLowerCase()!==`!doctype`?`/>`:`>`;return e+=`<`+t.name+(t.attrs?x(t.attrs):``)+n,t.voidElement?e:e+t.children.reduce(S,``)+`</`+t.name+`>`}case`comment`:return e+=`<!--`+t.comment+`-->`,e}}function C(e){return e.reduce(function(e,t){return e+S(``,t)},``)}var w={parse:b,stringify:C},T=(e,t,n,r)=>{let i=[n,{code:t,...r||{}}];if(e?.services?.logger?.forward)return e.services.logger.forward(i,`warn`,`react-i18next::`,!0);O(i[0])&&(i[0]=`react-i18next:: ${i[0]}`),e?.services?.logger?.warn?e.services.logger.warn(...i):console?.warn&&console.warn(...i)},E={},D=(e,t,n,r)=>{O(n)&&E[n]||(O(n)&&(E[n]=new Date),T(e,t,n,r))},O=e=>typeof e==`string`,k=e=>typeof e==`object`&&!!e,A=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,j={"&amp;":`&`,"&#38;":`&`,"&lt;":`<`,"&#60;":`<`,"&gt;":`>`,"&#62;":`>`,"&apos;":`'`,"&#39;":`'`,"&quot;":`"`,"&#34;":`"`,"&nbsp;":`\xA0`,"&#160;":`\xA0`,"&copy;":`©`,"&#169;":`©`,"&reg;":`®`,"&#174;":`®`,"&hellip;":`…`,"&#8230;":`…`,"&#x2F;":`/`,"&#47;":`/`},M=e=>j[e],N=e=>e.replace(A,M),P={bindI18n:`languageChanged`,bindI18nStore:``,transEmptyNodeValue:``,transSupportBasicHtmlNodes:!0,transWrapTextNodes:``,transKeepBasicHtmlNodesFor:[`br`,`strong`,`i`,`p`],useSuspense:!0,unescape:N,transDefaultProps:void 0},F=()=>P,I,L=()=>I,R=(e,t)=>{if(!e)return!1;let n=e.props?.children??e.children;return t?n.length>0:!!n},z=e=>{if(!e)return[];let t=e.props?.children??e.children;return e.props?.i18nIsDynamicList?V(t):t},B=e=>V(e).every(l.isValidElement),V=e=>Array.isArray(e)?e:[e],H=(e,t)=>{let n={...t};return n.props={...t.props,...e.props},n},U=e=>{let t={};if(!e)return t;let n=e=>{V(e).forEach(e=>{O(e)||(R(e)?n(z(e)):k(e)&&!(0,l.isValidElement)(e)&&Object.assign(t,e))})};return n(e),t},W=(e,t,n,r)=>{if(!e)return``;let i=``,a=V(e),o=t?.transSupportBasicHtmlNodes?t.transKeepBasicHtmlNodesFor??[]:[];return a.forEach((e,a)=>{if(O(e))i+=`${e}`;else if((0,l.isValidElement)(e)){let{props:s,type:c}=e,l=Object.keys(s).length,u=o.indexOf(c)>-1,d=s.children;if(!d&&u&&!l){i+=`<${c}/>`;return}if(!d&&(!u||l)||s.i18nIsDynamicList){i+=`<${a}></${a}>`;return}if(u&&l<=1){let e=O(d)?d:W(d,t,n,r);i+=`<${c}>${e}</${c}>`;return}let f=W(d,t,n,r);i+=`<${a}>${f}</${a}>`}else if(e===null)T(n,`TRANS_NULL_VALUE`,`Passed in a null value as child`,{i18nKey:r});else if(k(e)){let{format:t,...a}=e,o=Object.keys(a);if(o.length===1){let e=t?`${o[0]}, ${t}`:o[0];i+=`{{${e}}}`;return}T(n,`TRANS_INVALID_OBJ`,`Invalid child - Object should only have keys {{ value, format }} (format is optional).`,{i18nKey:r,child:e})}else T(n,`TRANS_INVALID_VAR`,`Passed in a variable like {number} - pass variables for interpolation as full objects like {{number}}.`,{i18nKey:r,child:e})}),i},G=(e,t,n,r,i,a,o)=>{if(n===``)return[];let s=i.transKeepBasicHtmlNodesFor||[],c=n&&new RegExp(s.map(e=>`<${e}`).join(`|`)).test(n);if(!e&&!t&&!c&&!o)return[n];let u=t??{},d=e=>{V(e).forEach(e=>{O(e)||(R(e)?d(z(e)):k(e)&&!(0,l.isValidElement)(e)&&Object.assign(u,e))})};d(e);let f=Object.keys(u),p=w.parse(`<0>${n}</0>`,{allowedTags:e=>/^\d+$/.test(e)||s.indexOf(e)>-1||f.indexOf(e)>-1}),m={...u,...a},h=(e,t,n)=>{let r=z(e),i=_(r,t.children,n);return B(r)&&i.length===0||e.props?.i18nIsDynamicList?r:i},g=(e,t,n,r,i)=>{e.dummy?(e.children=t,n.push((0,l.cloneElement)(e,{key:r},i?void 0:t))):n.push(...l.Children.map([e],e=>{if(e.type===l.Fragment||e.props?.i18nIsDynamicList!==void 0){let n={key:r};return e&&e.props&&Object.keys(e.props).forEach(t=>{t!==`children`&&t!==`i18nIsDynamicList`&&(n[t]=e.props[t])}),(0,l.createElement)(e.type,n,i?null:t)}let n={key:r};return e&&e.props&&Object.keys(e.props).forEach(t=>{t!==`ref`&&t!==`children`&&(n[t]=e.props[t])}),(0,l.cloneElement)(e,n,i?null:t)}))},_=(e,n,a)=>{let u=V(e),d=V(n),f={};return d.reduce((e,n,d)=>{let p=n.children?.[0]?.content&&r.services.interpolator.interpolate(n.children[0].content,m,r.language);if(n.type===`tag`){let v=u[parseInt(n.name,10)];!v&&t&&(v=t[n.name]),a.length===1&&!v&&(v=a[0][n.name]),v||={};let y={...n.attrs};o&&Object.keys(y).forEach(e=>{let t=y[e];O(t)&&(y[e]=N(t))});let b=Object.keys(y).length===0?v:H({props:y},v),x=(0,l.isValidElement)(b),S=x&&R(n,!0)&&!n.voidElement,C=c&&k(b)&&b.dummy&&!x,w=k(t)&&Object.hasOwnProperty.call(t,n.name);if(O(b)){let t=r.services.interpolator.interpolate(b,m,r.language);e.push(t)}else if(R(b)||S){let t=h(b,n,a);g(b,t,e,d)}else if(C){let t=_(u,n.children,a);g(b,t,e,d)}else if(Number.isNaN(parseFloat(n.name))){if(w){let t=h(b,n,a);g(b,t,e,d,n.voidElement)}else if(i.transSupportBasicHtmlNodes&&s.indexOf(n.name)>-1){if(n.voidElement)e.push((0,l.createElement)(n.name,{key:`${n.name}-${d}`}));else{let t=f[n.name]||0;f[n.name]=t+1;let r,i=0;for(let e=0;e<u.length;e+=1){let a=u[e];if((0,l.isValidElement)(a)&&a.type===n.name){if(i===t){r=a;break}i+=1}}let o=r?V(z(r)):u,s=_(o,n.children,a);e.push((0,l.createElement)(n.name,{key:`${n.name}-${d}`},s))}}else if(n.voidElement)e.push(`<${n.name} />`);else{let t=_(u,n.children,a);e.push(`<${n.name}>${t}</${n.name}>`)}}else if(k(b)&&!x){let t=n.children[0]?p:null;t&&e.push(t)}else g(b,p,e,d,n.children.length!==1||!p)}else if(n.type===`text`){let t=i.transWrapTextNodes,a=typeof i.unescape==`function`?i.unescape:F().unescape,s=o?a(r.services.interpolator.interpolate(n.content,m,r.language)):r.services.interpolator.interpolate(n.content,m,r.language);t?e.push((0,l.createElement)(t,{key:`${n.name}-${d}`},s)):e.push(s)}return e},[])};return z(_([{dummy:!0,children:e||[]}],p,V(e||[]))[0])},K=(e,t,n)=>{let r=e.key||t,i=(0,l.cloneElement)(e,{key:r});if(!i.props||!i.props.children||n.indexOf(`${t}/>`)<0&&n.indexOf(`${t} />`)<0)return i;function a(){return(0,l.createElement)(l.Fragment,null,i)}return(0,l.createElement)(a,{key:r})},q=(e,t)=>e.map((e,n)=>K(e,n,t)),J=(e,t)=>{let n={};return Object.keys(e).forEach(r=>{Object.assign(n,{[r]:K(e[r],r,t)})}),n},Y=(e,t,n,r)=>e?Array.isArray(e)?q(e,t):k(e)?J(e,t):(D(n,`TRANS_INVALID_COMPONENTS`,`<Trans /> "components" prop expects an object or array`,{i18nKey:r}),null):null,X=e=>!k(e)||Array.isArray(e)?!1:Object.keys(e).reduce((e,t)=>e&&Number.isNaN(Number.parseFloat(t)),!0);function Z({children:e,count:t,parent:r,i18nKey:i,context:a,tOptions:o={},values:s,defaults:c,components:u,ns:d,i18n:f,t:p,shouldUnescape:m,...h}){let g=f||L();if(!g)return D(g,`NO_I18NEXT_INSTANCE`,`Trans: You need to pass in an i18next instance using initReactI18next or by passing it via props or context. In monorepo setups, make sure there is only one instance of react-i18next.`,{i18nKey:i}),e;let _=p||g.t.bind(g)||(e=>e),v={...F(),...g.options?.react},y=d||(_.ns?void 0:g.options?.defaultNS||`translation`);O(y)&&(y=[y]);let{transDefaultProps:b}=v,x=b?.tOptions?{...b.tOptions,...o}:o,S=m??b?.shouldUnescape,C=b?.values?{...b.values,...s}:s,w=b?.components?{...b.components,...u}:u,T=W(e,v,g,i),E=c||x?.defaultValue||T||v.transEmptyNodeValue||(typeof i==`function`?n(i):i),{hashTransKey:k}=v,A=i||(k?k(T||E):T||E);s=g.options?.interpolation?.defaultVariables?{...g.options.interpolation.defaultVariables,...C}:C;let j=U(e);j&&typeof j.count==`number`&&t===void 0&&(t=j.count);let M=s||t!==void 0&&!g.options?.interpolation?.alwaysFormat||!e?x.interpolation:{interpolation:{...x.interpolation,prefix:`#$?`,suffix:`?$#`}},N={...x,context:a||x.context,count:t,...s,...M,defaultValue:E,ns:y},P=A?_(A,N):E;P===A&&E&&(P=E);let I=Y(w,P,g,i),R=I||e,z=null;X(I)&&(z=I,R=e);let B=G(R,z,P,g,v,N,S),V=r??v.defaultTransParent;return V?(0,l.createElement)(V,h,B):B}function Q({children:e,count:t,parent:n,i18nKey:r,context:a,tOptions:o={},values:s,defaults:c,components:u,ns:d,i18n:f,t:p,shouldUnescape:m,...h}){let{i18n:g,defaultNS:_}=(0,l.useContext)(i)||{},v=f||g||L(),y=p||v?.t.bind(v);return Z({children:e,count:t,parent:n,i18nKey:r,context:a,tOptions:o,values:s,defaults:c,components:u,ns:d||(y?.ns?void 0:_||v?.options?.defaultNS),i18n:v,t:p,shouldUnescape:m,...h})}export{c as n,o as r,Q as t};
1
+ import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{Nn as t,hn as n}from"./default-6QIAyMq2.js";import{Ga as r}from"./search-B3-w3oCd.js";import{c as i}from"./item-DED0Ikqi.js";var a={name:`archive`,size:24,node:[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8`,key:`1s80jp`}],[`path`,{d:`M10 12h4`,key:`a56b0p`}]]};a.node;var o=r(a),s={name:`bell`,size:24,node:[[`path`,{d:`M10.268 21a2 2 0 0 0 3.464 0`,key:`vwvbt9`}],[`path`,{d:`M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326`,key:`11g9vi`}]]};s.node;var c=r(s),l=e(t()),u={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,"!doctype":!0,"!DOCTYPE":!0},d=/\s([^'"/\s><]+?)[\s/>]|([^\s=]+)=\s?("[^"]*"|'[^']*')/g;function f(e){let t={type:`tag`,name:``,voidElement:!1,attrs:{},children:[]},n=e.match(/<\/?([^\s]+?)[/\s>]/);if(n&&(t.name=n[1],(u[n[1]]||e.charAt(e.length-2)===`/`)&&(t.voidElement=!0),t.name.startsWith(`!--`))){let t=e.indexOf(`-->`);return{type:`comment`,comment:t===-1?``:e.slice(4,t)}}let r=new RegExp(d),i=null;for(;i=r.exec(e),i!==null;)if(i[0].trim()){if(i[1]){let e=i[1].trim(),n=[e,null],a=e.indexOf(`=`);a>-1&&(n=[e.slice(0,a),e.slice(a+1)]),t.attrs[n[0]]=n[1],r.lastIndex--}else i[2]&&(t.attrs[i[2]]=i[3].trim().substring(1,i[3].length-1))}return t}var p=/<!--[\s\S]*?-->|<[a-zA-Z0-9\-!/](?:"[^"]*"|'[^']*'|[^'">])*>/g,m=/<\/?([^\s]+?)[/\s>]/,h=/^\s*$/,g=/^(script|style)$/i,_=`\0`,v=Object.create(null);function y(e){e.forEach(function(e){if(e.type===`text`)e.content=e.content.split(_).join(`<`);else if(e.type===`comment`)e.comment=e.comment.split(_).join(`<`);else{for(let t in e.attrs){let n=e.attrs[t];typeof n==`string`&&n.indexOf(_)>-1&&(e.attrs[t]=n.split(_).join(`<`))}e.children.length&&y(e.children)}})}function b(e,t){let n=t&&t.components||v,r=t&&t.allowedTags,i=!1;if(r){let t=typeof r==`function`?r:function(e){return r.indexOf(e)>-1},n=``,a=0;p.lastIndex=0;let o;for(;o=p.exec(e);){let r=o[0];n+=e.slice(a,o.index);let s=r.match(m);r.startsWith(`<!--`)||s&&t(s[1])?(n+=r,a=o.index+r.length):(i=!0,n+=_,a=o.index+1,p.lastIndex=a)}e=n+e.slice(a)}let a=[],o=[],s,c=-1,l=!1,u=0,d;if(e.indexOf(`<`)!==0){let t=e.indexOf(`<`);a.push({type:`text`,content:t===-1?e:e.substring(0,t)})}let b=[],x;for(;x=p.exec(e);)b.push(x);return b.forEach(function(e,t){let n=e[0];if(!n||n.startsWith(`<!--`))return;let r=0,i=0,a=-1,o=null;for(let e=0;e<n.length;e++){let t=n.charAt(e);o?t===o&&(o=null):t===`"`||t===`'`?o=t:t===`<`?(r++,r===2&&(a=e)):t===`>`&&i++}let s=a>-1&&/[a-zA-Z0-9\-!/]/.test(n.charAt(a+1));if(r>i&&s){let e=n.substring(0,a),r=n.substring(e.length);b[t][0]=r,b[t].index+=e.length}}),b.forEach(function(t,r){let i=t[0];if(!i)return;let p=t.index;if(p<u)return;if(l){if(i!==`</`+s.name+`>`)return;l=!1}let m=i.charAt(1)!==`/`,_=i.startsWith(`<!--`),v=p+i.length,y=e.charAt(v),x=b[r+1],S;if(y===`<`&&x){let t=e.substring(v,x.index);S=t.split(`<`).length>t.split(`>`).length}let C;if(_){let t=f(i);if(c<0)return a.push(t),a;C=o[c],C.children.push(t);let n=e.slice(v,x?x.index:void 0);return n.length>0&&C.children.push({type:`text`,content:n}),a}if(m){c++,s=f(i),s.type===`tag`&&n[s.name]&&(s.type=`component`,l=!0);let t=!1;if(!l&&!s.voidElement&&g.test(s.name)){t=!0,d||=e.toLowerCase();let n=d.indexOf(`</`+s.name.toLowerCase()+`>`,v),r=n===-1?e.length:n,i=e.slice(v,r);i&&s.children.push({type:`text`,content:i}),u=r}!s.voidElement&&!l&&!t&&y&&y!==`<`&&s.children.push({type:`text`,content:e.slice(v,x?x.index:void 0)}),c===0&&a.push(s),C=o[c-1],C&&C.children.push(s),o[c]=s}if((!m||s.voidElement)&&(c>-1&&(s.voidElement||s.name===i.slice(2,-1))&&(c--,s=c===-1?a:o[c]),!l&&(y!==`<`||S)&&y)){C=c===-1?a:o[c].children;let t=x?x.index:-1,n=e.slice(v,t===-1?void 0:t);h.test(n)&&(n=` `),(t>-1&&c+C.length>=0||n!==` `)&&C.push({type:`text`,content:n})}}),i&&y(a),a}function x(e){let t=[];for(let n in e)e[n]===null?t.push(n):t.push(n+`="`+String(e[n]).replace(/"/g,`&quot;`)+`"`);return t.length?` `+t.join(` `):``}function S(e,t){switch(t.type){case`text`:return e+t.content;case`tag`:{let n=t.voidElement&&t.name.toLowerCase()!==`!doctype`?`/>`:`>`;return e+=`<`+t.name+(t.attrs?x(t.attrs):``)+n,t.voidElement?e:e+t.children.reduce(S,``)+`</`+t.name+`>`}case`comment`:return e+=`<!--`+t.comment+`-->`,e}}function C(e){return e.reduce(function(e,t){return e+S(``,t)},``)}var w={parse:b,stringify:C},T=(e,t,n,r)=>{let i=[n,{code:t,...r||{}}];if(e?.services?.logger?.forward)return e.services.logger.forward(i,`warn`,`react-i18next::`,!0);O(i[0])&&(i[0]=`react-i18next:: ${i[0]}`),e?.services?.logger?.warn?e.services.logger.warn(...i):console?.warn&&console.warn(...i)},E={},D=(e,t,n,r)=>{O(n)&&E[n]||(O(n)&&(E[n]=new Date),T(e,t,n,r))},O=e=>typeof e==`string`,k=e=>typeof e==`object`&&!!e,A=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,j={"&amp;":`&`,"&#38;":`&`,"&lt;":`<`,"&#60;":`<`,"&gt;":`>`,"&#62;":`>`,"&apos;":`'`,"&#39;":`'`,"&quot;":`"`,"&#34;":`"`,"&nbsp;":`\xA0`,"&#160;":`\xA0`,"&copy;":`©`,"&#169;":`©`,"&reg;":`®`,"&#174;":`®`,"&hellip;":`…`,"&#8230;":`…`,"&#x2F;":`/`,"&#47;":`/`},M=e=>j[e],N=e=>e.replace(A,M),P={bindI18n:`languageChanged`,bindI18nStore:``,transEmptyNodeValue:``,transSupportBasicHtmlNodes:!0,transWrapTextNodes:``,transKeepBasicHtmlNodesFor:[`br`,`strong`,`i`,`p`],useSuspense:!0,unescape:N,transDefaultProps:void 0},F=()=>P,I,L=()=>I,R=(e,t)=>{if(!e)return!1;let n=e.props?.children??e.children;return t?n.length>0:!!n},z=e=>{if(!e)return[];let t=e.props?.children??e.children;return e.props?.i18nIsDynamicList?V(t):t},B=e=>V(e).every(l.isValidElement),V=e=>Array.isArray(e)?e:[e],H=(e,t)=>{let n={...t};return n.props={...t.props,...e.props},n},U=e=>{let t={};if(!e)return t;let n=e=>{V(e).forEach(e=>{O(e)||(R(e)?n(z(e)):k(e)&&!(0,l.isValidElement)(e)&&Object.assign(t,e))})};return n(e),t},W=(e,t,n,r)=>{if(!e)return``;let i=``,a=V(e),o=t?.transSupportBasicHtmlNodes?t.transKeepBasicHtmlNodesFor??[]:[];return a.forEach((e,a)=>{if(O(e))i+=`${e}`;else if((0,l.isValidElement)(e)){let{props:s,type:c}=e,l=Object.keys(s).length,u=o.indexOf(c)>-1,d=s.children;if(!d&&u&&!l){i+=`<${c}/>`;return}if(!d&&(!u||l)||s.i18nIsDynamicList){i+=`<${a}></${a}>`;return}if(u&&l<=1){let e=O(d)?d:W(d,t,n,r);i+=`<${c}>${e}</${c}>`;return}let f=W(d,t,n,r);i+=`<${a}>${f}</${a}>`}else if(e===null)T(n,`TRANS_NULL_VALUE`,`Passed in a null value as child`,{i18nKey:r});else if(k(e)){let{format:t,...a}=e,o=Object.keys(a);if(o.length===1){let e=t?`${o[0]}, ${t}`:o[0];i+=`{{${e}}}`;return}T(n,`TRANS_INVALID_OBJ`,`Invalid child - Object should only have keys {{ value, format }} (format is optional).`,{i18nKey:r,child:e})}else T(n,`TRANS_INVALID_VAR`,`Passed in a variable like {number} - pass variables for interpolation as full objects like {{number}}.`,{i18nKey:r,child:e})}),i},G=(e,t,n,r,i,a,o)=>{if(n===``)return[];let s=i.transKeepBasicHtmlNodesFor||[],c=n&&new RegExp(s.map(e=>`<${e}`).join(`|`)).test(n);if(!e&&!t&&!c&&!o)return[n];let u=t??{},d=e=>{V(e).forEach(e=>{O(e)||(R(e)?d(z(e)):k(e)&&!(0,l.isValidElement)(e)&&Object.assign(u,e))})};d(e);let f=Object.keys(u),p=w.parse(`<0>${n}</0>`,{allowedTags:e=>/^\d+$/.test(e)||s.indexOf(e)>-1||f.indexOf(e)>-1}),m={...u,...a},h=(e,t,n)=>{let r=z(e),i=_(r,t.children,n);return B(r)&&i.length===0||e.props?.i18nIsDynamicList?r:i},g=(e,t,n,r,i)=>{e.dummy?(e.children=t,n.push((0,l.cloneElement)(e,{key:r},i?void 0:t))):n.push(...l.Children.map([e],e=>{if(e.type===l.Fragment||e.props?.i18nIsDynamicList!==void 0){let n={key:r};return e&&e.props&&Object.keys(e.props).forEach(t=>{t!==`children`&&t!==`i18nIsDynamicList`&&(n[t]=e.props[t])}),(0,l.createElement)(e.type,n,i?null:t)}let n={key:r};return e&&e.props&&Object.keys(e.props).forEach(t=>{t!==`ref`&&t!==`children`&&(n[t]=e.props[t])}),(0,l.cloneElement)(e,n,i?null:t)}))},_=(e,n,a)=>{let u=V(e),d=V(n),f={};return d.reduce((e,n,d)=>{let p=n.children?.[0]?.content&&r.services.interpolator.interpolate(n.children[0].content,m,r.language);if(n.type===`tag`){let v=u[parseInt(n.name,10)];!v&&t&&(v=t[n.name]),a.length===1&&!v&&(v=a[0][n.name]),v||={};let y={...n.attrs};o&&Object.keys(y).forEach(e=>{let t=y[e];O(t)&&(y[e]=N(t))});let b=Object.keys(y).length===0?v:H({props:y},v),x=(0,l.isValidElement)(b),S=x&&R(n,!0)&&!n.voidElement,C=c&&k(b)&&b.dummy&&!x,w=k(t)&&Object.hasOwnProperty.call(t,n.name);if(O(b)){let t=r.services.interpolator.interpolate(b,m,r.language);e.push(t)}else if(R(b)||S){let t=h(b,n,a);g(b,t,e,d)}else if(C){let t=_(u,n.children,a);g(b,t,e,d)}else if(Number.isNaN(parseFloat(n.name))){if(w){let t=h(b,n,a);g(b,t,e,d,n.voidElement)}else if(i.transSupportBasicHtmlNodes&&s.indexOf(n.name)>-1){if(n.voidElement)e.push((0,l.createElement)(n.name,{key:`${n.name}-${d}`}));else{let t=f[n.name]||0;f[n.name]=t+1;let r,i=0;for(let e=0;e<u.length;e+=1){let a=u[e];if((0,l.isValidElement)(a)&&a.type===n.name){if(i===t){r=a;break}i+=1}}let o=r?V(z(r)):u,s=_(o,n.children,a);e.push((0,l.createElement)(n.name,{key:`${n.name}-${d}`},s))}}else if(n.voidElement)e.push(`<${n.name} />`);else{let t=_(u,n.children,a);e.push(`<${n.name}>${t}</${n.name}>`)}}else if(k(b)&&!x){let t=n.children[0]?p:null;t&&e.push(t)}else g(b,p,e,d,n.children.length!==1||!p)}else if(n.type===`text`){let t=i.transWrapTextNodes,a=typeof i.unescape==`function`?i.unescape:F().unescape,s=o?a(r.services.interpolator.interpolate(n.content,m,r.language)):r.services.interpolator.interpolate(n.content,m,r.language);t?e.push((0,l.createElement)(t,{key:`${n.name}-${d}`},s)):e.push(s)}return e},[])};return z(_([{dummy:!0,children:e||[]}],p,V(e||[]))[0])},K=(e,t,n)=>{let r=e.key||t,i=(0,l.cloneElement)(e,{key:r});if(!i.props||!i.props.children||n.indexOf(`${t}/>`)<0&&n.indexOf(`${t} />`)<0)return i;function a(){return(0,l.createElement)(l.Fragment,null,i)}return(0,l.createElement)(a,{key:r})},q=(e,t)=>e.map((e,n)=>K(e,n,t)),J=(e,t)=>{let n={};return Object.keys(e).forEach(r=>{Object.assign(n,{[r]:K(e[r],r,t)})}),n},Y=(e,t,n,r)=>e?Array.isArray(e)?q(e,t):k(e)?J(e,t):(D(n,`TRANS_INVALID_COMPONENTS`,`<Trans /> "components" prop expects an object or array`,{i18nKey:r}),null):null,X=e=>!k(e)||Array.isArray(e)?!1:Object.keys(e).reduce((e,t)=>e&&Number.isNaN(Number.parseFloat(t)),!0);function Z({children:e,count:t,parent:r,i18nKey:i,context:a,tOptions:o={},values:s,defaults:c,components:u,ns:d,i18n:f,t:p,shouldUnescape:m,...h}){let g=f||L();if(!g)return D(g,`NO_I18NEXT_INSTANCE`,`Trans: You need to pass in an i18next instance using initReactI18next or by passing it via props or context. In monorepo setups, make sure there is only one instance of react-i18next.`,{i18nKey:i}),e;let _=p||g.t.bind(g)||(e=>e),v={...F(),...g.options?.react},y=d||(_.ns?void 0:g.options?.defaultNS||`translation`);O(y)&&(y=[y]);let{transDefaultProps:b}=v,x=b?.tOptions?{...b.tOptions,...o}:o,S=m??b?.shouldUnescape,C=b?.values?{...b.values,...s}:s,w=b?.components?{...b.components,...u}:u,T=W(e,v,g,i),E=c||x?.defaultValue||T||v.transEmptyNodeValue||(typeof i==`function`?n(i):i),{hashTransKey:k}=v,A=i||(k?k(T||E):T||E);s=g.options?.interpolation?.defaultVariables?{...g.options.interpolation.defaultVariables,...C}:C;let j=U(e);j&&typeof j.count==`number`&&t===void 0&&(t=j.count);let M=s||t!==void 0&&!g.options?.interpolation?.alwaysFormat||!e?x.interpolation:{interpolation:{...x.interpolation,prefix:`#$?`,suffix:`?$#`}},N={...x,context:a||x.context,count:t,...s,...M,defaultValue:E,ns:y},P=A?_(A,N):E;P===A&&E&&(P=E);let I=Y(w,P,g,i),R=I||e,z=null;X(I)&&(z=I,R=e);let B=G(R,z,P,g,v,N,S),V=r??v.defaultTransParent;return V?(0,l.createElement)(V,h,B):B}function Q({children:e,count:t,parent:n,i18nKey:r,context:a,tOptions:o={},values:s,defaults:c,components:u,ns:d,i18n:f,t:p,shouldUnescape:m,...h}){let{i18n:g,defaultNS:_}=(0,l.useContext)(i)||{},v=f||g||L(),y=p||v?.t.bind(v);return Z({children:e,count:t,parent:n,i18nKey:r,context:a,tOptions:o,values:s,defaults:c,components:u,ns:d||(y?.ns?void 0:_||v?.options?.defaultNS),i18n:v,t:p,shouldUnescape:m,...h})}export{c as n,o as r,Q as t};