@maudecode/kanvil 0.4.1 → 0.4.3

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-CnAQzKyq.mjs} +48 -17
  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 +4 -4
  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";
@@ -1701,11 +1700,10 @@ async function rememberLabelColor(ctx, color) {
1701
1700
  async function changeLabelUsage(ctx, name, replacement) {
1702
1701
  const affected = await ctx.db.select().from(tickets).where(and(eq(tickets.projectId, project(ctx).id), sql`${name} = ANY(${tickets.labels})`));
1703
1702
  const pending = [];
1704
- for (const ticket of affected) pending.push((await updateTicketRow(ctx, {
1705
- projectId: project(ctx).id,
1703
+ for (const ticket of affected) pending.push((await updateTicketLabelsForDefinition(ctx, {
1706
1704
  ticketId: ticket.id,
1707
1705
  expectedVersion: ticket.version,
1708
- changes: { labels: [...new Set(replacement ? ticket.labels.map((tag) => tag === name ? replacement : tag) : ticket.labels.filter((tag) => tag !== name))] }
1706
+ labels: [...new Set(replacement ? ticket.labels.map((tag) => tag === name ? replacement : tag) : ticket.labels.filter((tag) => tag !== name))]
1709
1707
  })).event);
1710
1708
  await publishMany(ctx, pending);
1711
1709
  await rewriteViewFilters(ctx, "label", (tag) => tag !== name ? tag : replacement ?? null);
@@ -2222,6 +2220,14 @@ async function readinessMany(ctx, selected) {
2222
2220
  }
2223
2221
  return result;
2224
2222
  }
2223
+ function claimExpiry(ctx, requested) {
2224
+ const leaseSeconds = requested ?? Math.min(300, ctx.claimMaxLeaseSeconds);
2225
+ if (leaseSeconds > ctx.claimMaxLeaseSeconds) fail(400, "validation_error", "Claim lease exceeds the configured maximum", {
2226
+ path: "leaseSeconds",
2227
+ maximum: ctx.claimMaxLeaseSeconds
2228
+ });
2229
+ return new Date(Date.now() + leaseSeconds * 1e3);
2230
+ }
2225
2231
  async function readiness(ctx, ticket) {
2226
2232
  return requireRow((await readinessMany(ctx, [ticket])).get(ticket.id));
2227
2233
  }
@@ -2270,15 +2276,24 @@ async function updateTicketRow(ctx, input) {
2270
2276
  const current = await getTicket(ctx, input.ticketId);
2271
2277
  assertVersion(current, input.expectedVersion, "ticket");
2272
2278
  await assertWorkerClaim(ctx, current, input.claimId);
2273
- await validateReferences(ctx, current.id, input.changes);
2274
- const state = await resolveState(ctx, input.changes, current);
2275
- const { startAt, dueAt, customFields, ...changes } = input.changes, dates = dateColumns({
2279
+ return persistTicketChanges(ctx, current, input.changes);
2280
+ }
2281
+ async function updateTicketLabelsForDefinition(ctx, input) {
2282
+ if (!can(ctx, "project.manage") && !can(ctx, "workspace.manage")) fail(403, "forbidden", "Label administration permission is required");
2283
+ const current = await getTicket(ctx, input.ticketId);
2284
+ assertVersion(current, input.expectedVersion, "ticket");
2285
+ return persistTicketChanges(ctx, current, { labels: input.labels });
2286
+ }
2287
+ async function persistTicketChanges(ctx, current, changes) {
2288
+ await validateReferences(ctx, current.id, changes);
2289
+ const state = await resolveState(ctx, changes, current);
2290
+ const { startAt, dueAt, customFields, ...values } = changes, dates = dateColumns({
2276
2291
  startAt,
2277
2292
  dueAt
2278
2293
  });
2279
2294
  assertSchedule(dates.startAt === void 0 ? current.startAt : dates.startAt, dates.dueAt === void 0 ? current.dueAt : dates.dueAt, current.key);
2280
2295
  const row = one(await ctx.db.update(tickets).set({
2281
- ...changes,
2296
+ ...values,
2282
2297
  ...state,
2283
2298
  ...dates,
2284
2299
  ...customFields && { customFields: applyCustomFieldValues(await projectCustomFields(ctx), current.customFields, customFields) },
@@ -2293,7 +2308,7 @@ async function updateTicketRow(ctx, input) {
2293
2308
  ticketId: row.id,
2294
2309
  data: {
2295
2310
  version: row.version,
2296
- changedFields: [.../* @__PURE__ */ new Set([...Object.keys(input.changes), ...state ? ["status", "stateId"] : []])]
2311
+ changedFields: [.../* @__PURE__ */ new Set([...Object.keys(changes), ...state ? ["status", "stateId"] : []])]
2297
2312
  }
2298
2313
  }
2299
2314
  };
@@ -2885,7 +2900,7 @@ const ticketHandlers = {
2885
2900
  actorId: ctx.actor.id,
2886
2901
  ownerId: ctx.actor.ownerId,
2887
2902
  workerId: input.workerId,
2888
- expiresAt: new Date(Date.now() + input.leaseSeconds * 1e3)
2903
+ expiresAt: claimExpiry(ctx, input.leaseSeconds)
2889
2904
  }).returning());
2890
2905
  const row = one(await ctx.db.update(tickets).set({
2891
2906
  ...await resolveState(ctx, { status: "in_progress" }, ticket),
@@ -2904,7 +2919,7 @@ const ticketHandlers = {
2904
2919
  const ticket = await getTicket(ctx, input.ticketId);
2905
2920
  const current = one(await ctx.db.select().from(claims).where(and(eq(claims.id, input.claimId), eq(claims.ticketId, ticket.id))));
2906
2921
  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());
2922
+ const claim = one(await ctx.db.update(claims).set({ expiresAt: claimExpiry(ctx, input.leaseSeconds) }).where(eq(claims.id, current.id)).returning());
2908
2923
  await publish(ctx, "claim.renewed", ticket.id, {
2909
2924
  claimId: claim.id,
2910
2925
  expiresAt: claim.expiresAt.toISOString()
@@ -2914,7 +2929,7 @@ const ticketHandlers = {
2914
2929
  async release_claim(ctx, input) {
2915
2930
  const ticket = await getTicket(ctx, input.ticketId);
2916
2931
  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.");
2932
+ if (!ownsLiveClaim(ctx, current)) fail(409, "claim_conflict", "Only the owning worker can release an unexpired claim. Expired claims require explicit recovery.");
2918
2933
  await ctx.db.delete(claims).where(eq(claims.id, current.id));
2919
2934
  await publish(ctx, "claim.released", ticket.id, { claimId: current.id });
2920
2935
  return { ok: true };
@@ -2922,12 +2937,26 @@ const ticketHandlers = {
2922
2937
  async recover_claim(ctx, input) {
2923
2938
  const ticket = await getTicket(ctx, input.ticketId);
2924
2939
  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");
2940
+ if (input.cancelActive && !can(ctx, "project.manage")) fail(403, "forbidden", "Cancelling an active claim requires project management access and admin scope");
2941
+ if (current.expiresAt > /* @__PURE__ */ new Date() && !input.cancelActive) fail(409, "claim_not_expired", "The current claim has not expired");
2942
+ if (input.reschedule && input.expectedVersion !== void 0) {
2943
+ assertVersion(ticket, input.expectedVersion, "ticket", "rescheduling recovered work");
2944
+ const row = one(await ctx.db.update(tickets).set({
2945
+ ...await resolveState(ctx, { status: "todo" }, ticket),
2946
+ version: ticket.version + 1,
2947
+ updatedAt: /* @__PURE__ */ new Date()
2948
+ }).where(eq(tickets.id, ticket.id)).returning());
2949
+ await publish(ctx, "ticket.updated", ticket.id, {
2950
+ version: row.version,
2951
+ changedFields: ["status", "stateId"]
2952
+ });
2953
+ }
2926
2954
  await ctx.db.delete(claims).where(eq(claims.id, current.id));
2927
2955
  await publish(ctx, "claim.recovered", ticket.id, {
2928
2956
  claimId: current.id,
2929
2957
  reason: input.reason,
2930
- confirmedStopped: true
2958
+ confirmedStopped: true,
2959
+ ...input.cancelActive && { cancelActive: true }
2931
2960
  });
2932
2961
  return { ok: true };
2933
2962
  }
@@ -6775,7 +6804,8 @@ const baseContext = (db, actor) => ({
6775
6804
  search: builtinSearch,
6776
6805
  secrets: noSecrets,
6777
6806
  publicUrl: "http://localhost",
6778
- sources: noSources
6807
+ sources: noSources,
6808
+ claimMaxLeaseSeconds: defaultClaimMaxLeaseSeconds
6779
6809
  });
6780
6810
  const publicActor = {
6781
6811
  id: "",
@@ -7042,6 +7072,7 @@ function createDomain(database, services = {}) {
7042
7072
  if (services.secrets) ctx.secrets = services.secrets;
7043
7073
  if (services.publicUrl) ctx.publicUrl = services.publicUrl;
7044
7074
  if (services.sources) ctx.sources = services.sources;
7075
+ if (services.claimMaxLeaseSeconds !== void 0) ctx.claimMaxLeaseSeconds = services.claimMaxLeaseSeconds;
7045
7076
  return ctx;
7046
7077
  };
7047
7078
  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-CnAQzKyq.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.3";
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-CnAQzKyq.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};