local-operator-ui 0.39.9 → 0.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/out/main/index.js +407 -36
  2. package/out/preload/index.js +24 -2
  3. package/out/renderer/assets/{_basePickBy-op663AbZ.js → _basePickBy-DpS1gi-o.js} +1 -1
  4. package/out/renderer/assets/{_baseUniq-BmA1_2me.js → _baseUniq-BU_W0zZ3.js} +1 -1
  5. package/out/renderer/assets/{agent-details-page-DD95Pj8m.js → agent-details-page-mS7IJBVP.js} +2 -2
  6. package/out/renderer/assets/{agent-hub-page-KqbaZ4jt.js → agent-hub-page-CWGw4Aok.js} +2 -2
  7. package/out/renderer/assets/agents-page-CzMpVd20.js +7 -0
  8. package/out/renderer/assets/arc-T0TkGR-7.js +1 -0
  9. package/out/renderer/assets/architectureDiagram-IEHRJDOE-FOFq1O67.js +36 -0
  10. package/out/renderer/assets/{blockDiagram-JOT3LUYC-BbL6rC8t.js → blockDiagram-JOT3LUYC-Dbo2qDB8.js} +6 -6
  11. package/out/renderer/assets/{book-open-C5VnLNlM.js → book-open-Dt6NrEVH.js} +1 -1
  12. package/out/renderer/assets/browser-page-4D5CfHGL.js +1 -0
  13. package/out/renderer/assets/browser-webauthn-prompt-CwtoTzl0.js +1 -0
  14. package/out/renderer/assets/{building-2-BinkVpHL.js → building-2-C1lADJ7I.js} +1 -1
  15. package/out/renderer/assets/{c4Diagram-VJAJSXHY-TY6fUFKt.js → c4Diagram-VJAJSXHY-B5h8VwBj.js} +1 -1
  16. package/out/renderer/assets/channel-ChMTCIo9.js +1 -0
  17. package/out/renderer/assets/{chunk-4BMEZGHF-dLL3W7IZ.js → chunk-4BMEZGHF-MR8YxQC8.js} +1 -1
  18. package/out/renderer/assets/{chunk-A2AXSNBT-D78WiLnh.js → chunk-A2AXSNBT-DCwZuOlD.js} +1 -1
  19. package/out/renderer/assets/{chunk-AEK57VVT-BKmfkMGW.js → chunk-AEK57VVT-DiUHgqSA.js} +1 -1
  20. package/out/renderer/assets/{chunk-D6G4REZN-CZre37TG.js → chunk-D6G4REZN-BLBf1anZ.js} +1 -1
  21. package/out/renderer/assets/{chunk-RZ5BOZE2-BVFKaoz8.js → chunk-RZ5BOZE2-8iG8Y9sJ.js} +1 -1
  22. package/out/renderer/assets/{chunk-XZIHB7SX-C4B9nFg3.js → chunk-XZIHB7SX-BUzPkuyD.js} +1 -1
  23. package/out/renderer/assets/classDiagram-GIVACNV2-olxpExNZ.js +1 -0
  24. package/out/renderer/assets/classDiagram-v2-COTLJTTW-olxpExNZ.js +1 -0
  25. package/out/renderer/assets/clone-BH-xWYVr.js +1 -0
  26. package/out/renderer/assets/console-mirror-VlsurRTu.js +44 -0
  27. package/out/renderer/assets/consoleCapture-BAEbuUE1.js +1 -0
  28. package/out/renderer/assets/{conversation-input-sync-Drf7pG8h.js → conversation-input-sync-D8QfxmnI.js} +250 -307
  29. package/out/renderer/assets/dagre-OKDRZEBW-BVOSa9Ir.js +4 -0
  30. package/out/renderer/assets/diagram-SSKATNLV-Cd2OUAVJ.js +43 -0
  31. package/out/renderer/assets/diagram-VNBRO52H-CtrjNGKr.js +24 -0
  32. package/out/renderer/assets/{erDiagram-Q7BY3M3F-CbYsJOXr.js → erDiagram-Q7BY3M3F-DfVP3bcN.js} +1 -1
  33. package/out/renderer/assets/error-boundary-B3EFBlFF.js +126 -0
  34. package/out/renderer/assets/{flowDiagram-4HSFHLVR-xksRM4qL.js → flowDiagram-4HSFHLVR-CGAjhZfs.js} +1 -1
  35. package/out/renderer/assets/ganttDiagram-APWFNJXF-Drljtxgq.js +257 -0
  36. package/out/renderer/assets/gitGraphDiagram-7IBYFJ6S-BHemdXzF.js +65 -0
  37. package/out/renderer/assets/{graph-F4dHmEZ9.js → graph-CHQd8w8o.js} +1 -1
  38. package/out/renderer/assets/hash-CgPb_SeD.js +6 -0
  39. package/out/renderer/assets/heart-NsStSoql.js +6 -0
  40. package/out/renderer/assets/index-BkGcHmBa.css +1 -0
  41. package/out/renderer/assets/index-CGOyAbPs.js +7 -0
  42. package/out/renderer/assets/index-DAftzhq_.js +57 -0
  43. package/out/renderer/assets/index-Y7gJQGpG.js +1 -0
  44. package/out/renderer/assets/index-ew1hMKtY.js +835 -0
  45. package/out/renderer/assets/infoDiagram-PH2N3AL5-DAlyVNJm.js +2 -0
  46. package/out/renderer/assets/{installer-AUhVnro1.js → installer-BUHF69aB.js} +1 -1
  47. package/out/renderer/assets/{journeyDiagram-U35MCT3I-BKYQCvNS.js → journeyDiagram-U35MCT3I-1EO-cM2S.js} +1 -1
  48. package/out/renderer/assets/{kanban-definition-NDS4AKOZ-Af9PLtCI.js → kanban-definition-NDS4AKOZ-BjWHx1j6.js} +1 -1
  49. package/out/renderer/assets/{layout-DArRUuWc.js → layout-BITZWXG5.js} +1 -1
  50. package/out/renderer/assets/legacy-agents-page-EkXsYE5Y.js +33 -0
  51. package/out/renderer/assets/library-page-A0nXlev9.js +157 -0
  52. package/out/renderer/assets/{mermaid.core-DeacZbEh.js → mermaid.core-BoximGnF.js} +5 -5
  53. package/out/renderer/assets/mesh-page-CbJ0YzZR.js +1 -0
  54. package/out/renderer/assets/mindmap-definition-ALO5MXBD-CtxUEaL0.js +95 -0
  55. package/out/renderer/assets/mini-B95cJkWv.js +1 -0
  56. package/out/renderer/assets/{notebook-pen-CAaIu5ma.js → notebook-pen-BxTTwLf8.js} +1 -1
  57. package/out/renderer/assets/org-access-BO4A2FAr.js +1 -0
  58. package/out/renderer/assets/org-surface-gate-Bp_arWAv.js +1 -0
  59. package/out/renderer/assets/{page-header-DxdkMDUw.js → page-header-DhME4jBY.js} +1 -1
  60. package/out/renderer/assets/path-utils-DXMoAzHL.js +58 -0
  61. package/out/renderer/assets/{pieDiagram-IB7DONF6-BAijqzhx.js → pieDiagram-IB7DONF6-BET_kuRa.js} +2 -2
  62. package/out/renderer/assets/{projects-page-CyQadeH9.js → projects-page-CrvzCjsd.js} +4 -4
  63. package/out/renderer/assets/publication-validation-BSKuV2BJ.js +1 -0
  64. package/out/renderer/assets/{quadrantDiagram-7GDLP6J5-B9gsMu2n.js → quadrantDiagram-7GDLP6J5-Wn0SqLL-.js} +1 -1
  65. package/out/renderer/assets/{radar-MK3ICKWK-f4VBDN4e.js → radar-MK3ICKWK-DrM9X8dD.js} +1 -1
  66. package/out/renderer/assets/radient-auth-buttons-DQnvQV0I.js +1 -0
  67. package/out/renderer/assets/{requirementDiagram-KVF5MWMF-CPNfG1Zx.js → requirementDiagram-KVF5MWMF-BdDYpNvz.js} +1 -1
  68. package/out/renderer/assets/sankeyDiagram-QLVOVGJD-C5mpSMB8.js +10 -0
  69. package/out/renderer/assets/{schedules-page-CroQduzq.js → schedules-page-C4tiK1q4.js} +4 -4
  70. package/out/renderer/assets/{sequenceDiagram-X6HHIX6F-BptLOcCw.js → sequenceDiagram-X6HHIX6F-B3Cs3RcE.js} +1 -1
  71. package/out/renderer/assets/settings-page-BZEp-NUB.js +287 -0
  72. package/out/renderer/assets/smartart-0y9MEJnm.js +1 -0
  73. package/out/renderer/assets/stateDiagram-DGXRK772-TzXzPiSs.js +1 -0
  74. package/out/renderer/assets/stateDiagram-v2-YXO3MK2T-CvQ7ch2C.js +1 -0
  75. package/out/renderer/assets/team-bridge-page-ybfd-TgP.js +26 -0
  76. package/out/renderer/assets/{timeline-definition-BDJGKUSR-mfxv2tvk.js → timeline-definition-BDJGKUSR-D9poGZsh.js} +1 -1
  77. package/out/renderer/assets/use-download-agent-mutation-CpziX3j_.js +56 -0
  78. package/out/renderer/assets/use-session-snapshot-uuzUNGgk.js +1 -0
  79. package/out/renderer/assets/{xychartDiagram-VJFVF3MP-DU7xqK3g.js → xychartDiagram-VJFVF3MP-Bpq99cbF.js} +1 -1
  80. package/out/renderer/console-capture.html +5 -5
  81. package/out/renderer/index.html +7 -7
  82. package/out/renderer/installer.html +4 -4
  83. package/out/renderer/mini.html +7 -7
  84. package/package.json +2 -2
  85. package/out/renderer/assets/agents-page-BuW5YXsO.js +0 -7
  86. package/out/renderer/assets/arc-BDKgui3b.js +0 -1
  87. package/out/renderer/assets/architectureDiagram-IEHRJDOE-DQ-ywUWn.js +0 -36
  88. package/out/renderer/assets/browser-page-Blp9VxzI.js +0 -1
  89. package/out/renderer/assets/browser-webauthn-prompt-CIVC5zZy.js +0 -1
  90. package/out/renderer/assets/channel-BXgHvdBf.js +0 -1
  91. package/out/renderer/assets/classDiagram-GIVACNV2-DqhUybG_.js +0 -1
  92. package/out/renderer/assets/classDiagram-v2-COTLJTTW-DqhUybG_.js +0 -1
  93. package/out/renderer/assets/clone-Dy0JmXpj.js +0 -1
  94. package/out/renderer/assets/console-mirror-CPwb8uF3.js +0 -44
  95. package/out/renderer/assets/consoleCapture-HmARhax8.js +0 -1
  96. package/out/renderer/assets/dagre-OKDRZEBW-Dh0W2jNu.js +0 -4
  97. package/out/renderer/assets/diagram-SSKATNLV-DRCrONrr.js +0 -43
  98. package/out/renderer/assets/diagram-VNBRO52H-BV4nGPJx.js +0 -24
  99. package/out/renderer/assets/error-boundary-Cxrbe_jr.js +0 -126
  100. package/out/renderer/assets/ganttDiagram-APWFNJXF-mPElU2p8.js +0 -257
  101. package/out/renderer/assets/gitGraphDiagram-7IBYFJ6S-GsnNXRGz.js +0 -65
  102. package/out/renderer/assets/hash-DY3q9E3o.js +0 -6
  103. package/out/renderer/assets/index-D2xD4O43.js +0 -835
  104. package/out/renderer/assets/index-DOY6mKnp.js +0 -1
  105. package/out/renderer/assets/index-DecxvzI1.js +0 -57
  106. package/out/renderer/assets/index-OxbcfWJz.css +0 -1
  107. package/out/renderer/assets/index-n0UKEmyA.js +0 -7
  108. package/out/renderer/assets/infoDiagram-PH2N3AL5-Bj2irJ1P.js +0 -2
  109. package/out/renderer/assets/legacy-agents-page-DoDPY_st.js +0 -33
  110. package/out/renderer/assets/library-page-CCZamoeo.js +0 -157
  111. package/out/renderer/assets/mesh-page-b0Arx7SZ.js +0 -1
  112. package/out/renderer/assets/mindmap-definition-ALO5MXBD-D7Dx3AOZ.js +0 -95
  113. package/out/renderer/assets/mini-BCNMkGXS.js +0 -1
  114. package/out/renderer/assets/org-access-BnJqhAjv.js +0 -1
  115. package/out/renderer/assets/org-surface-gate-C2iuuUmY.js +0 -1
  116. package/out/renderer/assets/publication-validation-BLE_XzAT.js +0 -1
  117. package/out/renderer/assets/radient-auth-buttons-ukARjoyK.js +0 -1
  118. package/out/renderer/assets/sankeyDiagram-QLVOVGJD-BlICGCPu.js +0 -10
  119. package/out/renderer/assets/settings-page-B6GsvZtx.js +0 -287
  120. package/out/renderer/assets/smartart-54M0TKRG.js +0 -1
  121. package/out/renderer/assets/stateDiagram-DGXRK772-LIFxYM21.js +0 -1
  122. package/out/renderer/assets/stateDiagram-v2-YXO3MK2T-DfyWsnvp.js +0 -1
  123. package/out/renderer/assets/team-bridge-page-CG0IpAuo.js +0 -16
  124. package/out/renderer/assets/ui-preferences-store-BA52R-Fw.js +0 -1
  125. package/out/renderer/assets/use-download-agent-mutation-BxernpiS.js +0 -61
  126. package/out/renderer/assets/use-session-snapshot-sSI_vLQL.js +0 -1
package/out/main/index.js CHANGED
@@ -2499,13 +2499,35 @@ const desktopRequestUnion = zod.z.discriminatedUnion("op", [
2499
2499
  before_seq: zod.z.number().int().nonnegative().optional(),
2500
2500
  endpoint_id: id$1.optional()
2501
2501
  }).strict(),
2502
+ zod.z.object({
2503
+ op: zod.z.literal("team_bridge.reactions.toggle"),
2504
+ conversation_id: id$1,
2505
+ message_id: id$1,
2506
+ tenant_id: id$1.optional(),
2507
+ emoji: zod.z.string().min(1),
2508
+ active: zod.z.boolean()
2509
+ }).strict(),
2502
2510
  zod.z.object({
2503
2511
  op: zod.z.literal("team_bridge.messages.send"),
2504
2512
  conversation_id: id$1,
2505
2513
  tenant_id: id$1.optional(),
2506
2514
  client_ref: id$1,
2507
2515
  body: zod.z.string().min(1),
2508
- agent_label: zod.z.string().min(1).max(64).optional()
2516
+ agent_label: zod.z.string().min(1).max(64).optional(),
2517
+ /* Reply in this root message's thread; the hub validates the root. */
2518
+ thread_root_id: id$1.optional()
2519
+ }).strict(),
2520
+ /*
2521
+ * One thread (root + replies, oldest-first) under the history gate. Paging
2522
+ * runs FORWARD with an inclusive `after_seq`, because a thread reads top-down.
2523
+ */
2524
+ zod.z.object({
2525
+ op: zod.z.literal("team_bridge.messages.replies"),
2526
+ conversation_id: id$1,
2527
+ message_id: id$1,
2528
+ tenant_id: id$1.optional(),
2529
+ limit: zod.z.number().int().min(1).max(100).optional(),
2530
+ after_seq: zod.z.number().int().nonnegative().optional()
2509
2531
  }).strict(),
2510
2532
  zod.z.object({
2511
2533
  op: zod.z.literal("team_bridge.read"),
@@ -3420,6 +3442,7 @@ const READ_ONLY_OPS = /* @__PURE__ */ new Set([
3420
3442
  "team_bridge.conversations.list",
3421
3443
  "team_bridge.conversations.get",
3422
3444
  "team_bridge.messages.list",
3445
+ "team_bridge.messages.replies",
3423
3446
  "team_bridge.unread",
3424
3447
  "team_bridge.directory",
3425
3448
  "team_bridge.status",
@@ -5073,6 +5096,17 @@ function desktopEndpoint(request) {
5073
5096
  method: "GET"
5074
5097
  };
5075
5098
  }
5099
+ case "team_bridge.reactions.toggle": {
5100
+ const path2 = `/v1/desktop/team-bridge/conversations/${encodeURIComponent(request.conversation_id)}/messages/${encodeURIComponent(request.message_id)}/reactions/${encodeURIComponent(request.emoji)}`;
5101
+ return request.active ? {
5102
+ path: path2,
5103
+ method: "PUT",
5104
+ body: request.tenant_id ? { tenant_id: request.tenant_id } : {}
5105
+ } : {
5106
+ path: `${path2}${tenantQuery(request.tenant_id)}`,
5107
+ method: "DELETE"
5108
+ };
5109
+ }
5076
5110
  case "team_bridge.messages.send":
5077
5111
  return {
5078
5112
  path: `/v1/desktop/team-bridge/conversations/${encodeURIComponent(request.conversation_id)}/messages`,
@@ -5081,9 +5115,23 @@ function desktopEndpoint(request) {
5081
5115
  ...request.tenant_id ? { tenant_id: request.tenant_id } : {},
5082
5116
  client_ref: request.client_ref,
5083
5117
  body: request.body,
5084
- ...request.agent_label ? { agent_label: request.agent_label } : {}
5118
+ ...request.agent_label ? { agent_label: request.agent_label } : {},
5119
+ ...request.thread_root_id ? { thread_root_id: request.thread_root_id } : {}
5085
5120
  }
5086
5121
  };
5122
+ case "team_bridge.messages.replies": {
5123
+ const query = new URLSearchParams();
5124
+ if (request.tenant_id) query.set("tenant_id", request.tenant_id);
5125
+ if (request.limit !== void 0)
5126
+ query.set("limit", String(request.limit));
5127
+ if (request.after_seq !== void 0)
5128
+ query.set("after_seq", String(request.after_seq));
5129
+ const suffix = query.size > 0 ? `?${query.toString()}` : "";
5130
+ return {
5131
+ path: `/v1/desktop/team-bridge/conversations/${encodeURIComponent(request.conversation_id)}/messages/${encodeURIComponent(request.message_id)}/replies${suffix}`,
5132
+ method: "GET"
5133
+ };
5134
+ }
5087
5135
  case "team_bridge.read":
5088
5136
  return {
5089
5137
  path: `/v1/desktop/team-bridge/conversations/${encodeURIComponent(request.conversation_id)}/read`,
@@ -38688,6 +38736,10 @@ const enUiTeamBridge = {
38688
38736
  "ui.teamBridge.notify.title": "{conversation} ({organization})",
38689
38737
  "ui.teamBridge.notify.body": "{sender} sent a message",
38690
38738
  "ui.teamBridge.notify.body_fallback": "New message",
38739
+ "ui.teamBridge.notify.channel": "#{channel}",
38740
+ "ui.teamBridge.notify.subtitle": "{place} · {organization}",
38741
+ "ui.teamBridge.notify.count": "{count, plural, one {# new message} other {# new messages}}",
38742
+ "ui.teamBridge.notify.count_preview": "{count, plural, one {# new message: {preview}} other {# new messages: {preview}}}",
38691
38743
  "ui.teamBridge.people.title": "People",
38692
38744
  "ui.teamBridge.people.loading": "Loading people",
38693
38745
  "ui.teamBridge.people.error": "People could not be loaded.",
@@ -38743,6 +38795,35 @@ const enUiTeamBridge = {
38743
38795
  "ui.teamBridge.thread.intro_chief": "This is the beginning of your conversation with {name}, a teammate's chief of staff agent. It reads your messages as untrusted input and its owner decides what it acts on.",
38744
38796
  "ui.teamBridge.thread.intro_group": "Your first message starts a conversation with {names}.",
38745
38797
  "ui.teamBridge.list.error_pane": "Conversations couldn’t be loaded. Try again from the list on the left.",
38798
+ "ui.teamBridge.reactions.add": "Add reaction",
38799
+ "ui.teamBridge.reactions.search": "Search emoji",
38800
+ "ui.teamBridge.reactions.categories": "Emoji categories",
38801
+ "ui.teamBridge.reactions.all": "All emoji",
38802
+ "ui.teamBridge.reactions.frequent": "Frequently used",
38803
+ "ui.teamBridge.reactions.tone": "Skin tone",
38804
+ "ui.teamBridge.reactions.toneDefault": "Default skin tone",
38805
+ "ui.teamBridge.reactions.empty": "No emoji found",
38806
+ "ui.teamBridge.reactions.failed": "Reaction could not be saved. Try again.",
38807
+ "ui.teamBridge.reactions.category0": "Smileys and emotion",
38808
+ "ui.teamBridge.reactions.category1": "People and body",
38809
+ "ui.teamBridge.reactions.category2": "Animals and nature",
38810
+ "ui.teamBridge.reactions.category3": "Food and drink",
38811
+ "ui.teamBridge.reactions.category4": "Travel and places",
38812
+ "ui.teamBridge.reactions.category5": "Activities",
38813
+ "ui.teamBridge.reactions.category6": "Objects",
38814
+ "ui.teamBridge.reactions.category7": "Symbols",
38815
+ "ui.teamBridge.reactions.category8": "Flags",
38816
+ "ui.teamBridge.reactions.choose": "Choose an emoji",
38817
+ "ui.teamBridge.reactions.noResults": "No emoji found",
38818
+ "ui.teamBridge.replies.action": "Reply in thread",
38819
+ "ui.teamBridge.replies.title": "Thread",
38820
+ "ui.teamBridge.replies.close": "Close thread",
38821
+ "ui.teamBridge.replies.count": "{count, plural, one {# reply} other {# replies}}",
38822
+ "ui.teamBridge.replies.last": "last reply {time}",
38823
+ "ui.teamBridge.replies.empty": "No replies yet. Start the thread.",
38824
+ "ui.teamBridge.replies.placeholder": "Reply in thread",
38825
+ "ui.teamBridge.replies.more": "Load more replies",
38826
+ "ui.teamBridge.actions.label": "Message actions",
38746
38827
  "ui.teamBridge.sender.unknown_person": "Unknown person",
38747
38828
  "ui.teamBridge.sender.unknown_agent": "Unknown agent"
38748
38829
  };
@@ -42296,6 +42377,10 @@ const esUiTeamBridge = {
42296
42377
  "ui.teamBridge.notify.title": "{conversation} ({organization})",
42297
42378
  "ui.teamBridge.notify.body": "{sender} envió un mensaje",
42298
42379
  "ui.teamBridge.notify.body_fallback": "Mensaje nuevo",
42380
+ "ui.teamBridge.notify.channel": "#{channel}",
42381
+ "ui.teamBridge.notify.subtitle": "{place} · {organization}",
42382
+ "ui.teamBridge.notify.count": "{count, plural, one {# mensaje nuevo} many {# de mensajes nuevos} other {# mensajes nuevos}}",
42383
+ "ui.teamBridge.notify.count_preview": "{count, plural, one {# mensaje nuevo: {preview}} many {# de mensajes nuevos: {preview}} other {# mensajes nuevos: {preview}}}",
42299
42384
  "ui.teamBridge.people.title": "Personas",
42300
42385
  "ui.teamBridge.people.loading": "Cargando personas",
42301
42386
  "ui.teamBridge.people.error": "No se pudieron cargar las personas.",
@@ -42351,6 +42436,35 @@ const esUiTeamBridge = {
42351
42436
  "ui.teamBridge.thread.intro_chief": "Este es el comienzo de tu conversación con {name}, el agente jefe de gabinete de un miembro del equipo. Trata tus mensajes como información no confiable y su propietario decide qué hace con ellos.",
42352
42437
  "ui.teamBridge.thread.intro_group": "Tu primer mensaje inicia una conversación con {names}.",
42353
42438
  "ui.teamBridge.list.error_pane": "No se pudieron cargar las conversaciones. Inténtalo de nuevo desde la lista de la izquierda.",
42439
+ "ui.teamBridge.reactions.add": "Añadir reacción",
42440
+ "ui.teamBridge.reactions.search": "Buscar emojis",
42441
+ "ui.teamBridge.reactions.categories": "Categorías de emojis",
42442
+ "ui.teamBridge.reactions.all": "Todos los emojis",
42443
+ "ui.teamBridge.reactions.frequent": "Usados con frecuencia",
42444
+ "ui.teamBridge.reactions.tone": "Tono de piel",
42445
+ "ui.teamBridge.reactions.toneDefault": "Tono predeterminado",
42446
+ "ui.teamBridge.reactions.empty": "No se encontraron emojis",
42447
+ "ui.teamBridge.reactions.failed": "No se pudo guardar la reacción. Inténtalo de nuevo.",
42448
+ "ui.teamBridge.reactions.category0": "Caras y emociones",
42449
+ "ui.teamBridge.reactions.category1": "Personas y cuerpo",
42450
+ "ui.teamBridge.reactions.category2": "Animales y naturaleza",
42451
+ "ui.teamBridge.reactions.category3": "Comida y bebida",
42452
+ "ui.teamBridge.reactions.category4": "Viajes y lugares",
42453
+ "ui.teamBridge.reactions.category5": "Actividades",
42454
+ "ui.teamBridge.reactions.category6": "Objetos",
42455
+ "ui.teamBridge.reactions.category7": "Símbolos",
42456
+ "ui.teamBridge.reactions.category8": "Banderas",
42457
+ "ui.teamBridge.reactions.choose": "Elige un emoji",
42458
+ "ui.teamBridge.reactions.noResults": "No se encontraron emojis",
42459
+ "ui.teamBridge.replies.action": "Responder en el hilo",
42460
+ "ui.teamBridge.replies.title": "Hilo",
42461
+ "ui.teamBridge.replies.close": "Cerrar hilo",
42462
+ "ui.teamBridge.replies.count": "{count, plural, one {# respuesta} many {# de respuestas} other {# respuestas}}",
42463
+ "ui.teamBridge.replies.last": "última respuesta: {time}",
42464
+ "ui.teamBridge.replies.empty": "Aún no hay respuestas. Inicia el hilo.",
42465
+ "ui.teamBridge.replies.placeholder": "Responde en el hilo",
42466
+ "ui.teamBridge.replies.more": "Cargar más respuestas",
42467
+ "ui.teamBridge.actions.label": "Acciones del mensaje",
42354
42468
  "ui.teamBridge.sender.unknown_person": "Persona desconocida",
42355
42469
  "ui.teamBridge.sender.unknown_agent": "Agente desconocido"
42356
42470
  };
@@ -45904,6 +46018,10 @@ const frUiTeamBridge = {
45904
46018
  "ui.teamBridge.notify.title": "{conversation} ({organization})",
45905
46019
  "ui.teamBridge.notify.body": "{sender} a envoyé un message",
45906
46020
  "ui.teamBridge.notify.body_fallback": "Nouveau message",
46021
+ "ui.teamBridge.notify.channel": "#{channel}",
46022
+ "ui.teamBridge.notify.subtitle": "{place} · {organization}",
46023
+ "ui.teamBridge.notify.count": "{count, plural, one {# nouveau message} many {# de nouveaux messages} other {# nouveaux messages}}",
46024
+ "ui.teamBridge.notify.count_preview": "{count, plural, one {# nouveau message : {preview}} many {# de nouveaux messages : {preview}} other {# nouveaux messages : {preview}}}",
45907
46025
  "ui.teamBridge.people.title": "Personnes",
45908
46026
  "ui.teamBridge.people.loading": "Chargement des personnes",
45909
46027
  "ui.teamBridge.people.error": "Les personnes n’ont pas pu être chargées.",
@@ -45959,6 +46077,35 @@ const frUiTeamBridge = {
45959
46077
  "ui.teamBridge.thread.intro_chief": "Voici le début de votre conversation avec {name}, la cheffe de cabinet d’un membre de l’équipe. Cet agent considère vos messages comme des entrées non fiables ; c’est son propriétaire qui décide des suites à donner.",
45960
46078
  "ui.teamBridge.thread.intro_group": "Votre premier message démarrera une conversation avec {names}.",
45961
46079
  "ui.teamBridge.list.error_pane": "Les conversations n’ont pas pu être chargées. Réessayez depuis la liste de gauche.",
46080
+ "ui.teamBridge.reactions.add": "Ajouter une réaction",
46081
+ "ui.teamBridge.reactions.search": "Rechercher un émoji",
46082
+ "ui.teamBridge.reactions.categories": "Catégories d’émojis",
46083
+ "ui.teamBridge.reactions.all": "Tous les émojis",
46084
+ "ui.teamBridge.reactions.frequent": "Fréquemment utilisés",
46085
+ "ui.teamBridge.reactions.tone": "Teint",
46086
+ "ui.teamBridge.reactions.toneDefault": "Teint par défaut",
46087
+ "ui.teamBridge.reactions.empty": "Aucun émoji trouvé",
46088
+ "ui.teamBridge.reactions.failed": "La réaction n’a pas été enregistrée. Réessayez.",
46089
+ "ui.teamBridge.reactions.category0": "Smileys et émotions",
46090
+ "ui.teamBridge.reactions.category1": "Personnes et corps",
46091
+ "ui.teamBridge.reactions.category2": "Animaux et nature",
46092
+ "ui.teamBridge.reactions.category3": "Nourriture et boissons",
46093
+ "ui.teamBridge.reactions.category4": "Voyages et lieux",
46094
+ "ui.teamBridge.reactions.category5": "Activités",
46095
+ "ui.teamBridge.reactions.category6": "Objets",
46096
+ "ui.teamBridge.reactions.category7": "Symboles",
46097
+ "ui.teamBridge.reactions.category8": "Drapeaux",
46098
+ "ui.teamBridge.reactions.choose": "Choisir un émoji",
46099
+ "ui.teamBridge.reactions.noResults": "Aucun émoji trouvé",
46100
+ "ui.teamBridge.replies.action": "Répondre dans le fil",
46101
+ "ui.teamBridge.replies.title": "Fil de discussion",
46102
+ "ui.teamBridge.replies.close": "Fermer le fil",
46103
+ "ui.teamBridge.replies.count": "{count, plural, one {# réponse} many {# de réponses} other {# réponses}}",
46104
+ "ui.teamBridge.replies.last": "dernière réponse à {time}",
46105
+ "ui.teamBridge.replies.empty": "Aucune réponse pour l’instant. Lancez le fil.",
46106
+ "ui.teamBridge.replies.placeholder": "Répondre dans le fil",
46107
+ "ui.teamBridge.replies.more": "Charger plus de réponses",
46108
+ "ui.teamBridge.actions.label": "Actions sur le message",
45962
46109
  "ui.teamBridge.sender.unknown_person": "Personne inconnue",
45963
46110
  "ui.teamBridge.sender.unknown_agent": "Agent inconnu"
45964
46111
  };
@@ -49470,6 +49617,10 @@ const hiUiTeamBridge = {
49470
49617
  "ui.teamBridge.notify.title": "{conversation} ({organization})",
49471
49618
  "ui.teamBridge.notify.body": "{sender} ने एक संदेश भेजा",
49472
49619
  "ui.teamBridge.notify.body_fallback": "नया संदेश",
49620
+ "ui.teamBridge.notify.channel": "#{channel}",
49621
+ "ui.teamBridge.notify.subtitle": "{place} · {organization}",
49622
+ "ui.teamBridge.notify.count": "{count, plural, one {# नया संदेश} other {# नए संदेश}}",
49623
+ "ui.teamBridge.notify.count_preview": "{count, plural, one {# नया संदेश: {preview}} other {# नए संदेश: {preview}}}",
49473
49624
  "ui.teamBridge.people.title": "लोग",
49474
49625
  "ui.teamBridge.people.loading": "लोगों की सूची लोड हो रही है",
49475
49626
  "ui.teamBridge.people.error": "लोगों की सूची लोड नहीं हो सकी।",
@@ -49525,6 +49676,35 @@ const hiUiTeamBridge = {
49525
49676
  "ui.teamBridge.thread.intro_chief": "{name} किसी टीम सदस्य का चीफ़ ऑफ़ स्टाफ़ एजेंट है, और उसके साथ आपकी बातचीत यहाँ से शुरू होती है। यह आपके संदेशों को भरोसेमंद इनपुट नहीं मानता, और यह किस पर अमल करेगा, यह इसका मालिक तय करता है।",
49526
49677
  "ui.teamBridge.thread.intro_group": "आपके पहले संदेश से {names} के साथ बातचीत शुरू होगी।",
49527
49678
  "ui.teamBridge.list.error_pane": "बातचीतें लोड नहीं हो सकीं। बाईं ओर की सूची से फिर कोशिश करें।",
49679
+ "ui.teamBridge.reactions.add": "प्रतिक्रिया जोड़ें",
49680
+ "ui.teamBridge.reactions.search": "इमोजी खोजें",
49681
+ "ui.teamBridge.reactions.categories": "इमोजी श्रेणियाँ",
49682
+ "ui.teamBridge.reactions.all": "सभी इमोजी",
49683
+ "ui.teamBridge.reactions.frequent": "अक्सर इस्तेमाल किए गए",
49684
+ "ui.teamBridge.reactions.tone": "त्वचा का रंग",
49685
+ "ui.teamBridge.reactions.toneDefault": "डिफ़ॉल्ट रंग",
49686
+ "ui.teamBridge.reactions.empty": "कोई इमोजी नहीं मिला",
49687
+ "ui.teamBridge.reactions.failed": "प्रतिक्रिया सहेजी नहीं गई। फिर कोशिश करें।",
49688
+ "ui.teamBridge.reactions.category0": "स्माइली और भावनाएँ",
49689
+ "ui.teamBridge.reactions.category1": "लोग और शरीर",
49690
+ "ui.teamBridge.reactions.category2": "पशु और प्रकृति",
49691
+ "ui.teamBridge.reactions.category3": "खान-पान",
49692
+ "ui.teamBridge.reactions.category4": "यात्रा और स्थान",
49693
+ "ui.teamBridge.reactions.category5": "गतिविधियाँ",
49694
+ "ui.teamBridge.reactions.category6": "वस्तुएँ",
49695
+ "ui.teamBridge.reactions.category7": "चिह्न",
49696
+ "ui.teamBridge.reactions.category8": "झंडे",
49697
+ "ui.teamBridge.reactions.choose": "इमोजी चुनें",
49698
+ "ui.teamBridge.reactions.noResults": "कोई इमोजी नहीं मिला",
49699
+ "ui.teamBridge.replies.action": "थ्रेड में जवाब दें",
49700
+ "ui.teamBridge.replies.title": "थ्रेड",
49701
+ "ui.teamBridge.replies.close": "थ्रेड बंद करें",
49702
+ "ui.teamBridge.replies.count": "{count, plural, one {# जवाब} other {# जवाब}}",
49703
+ "ui.teamBridge.replies.last": "अंतिम जवाब {time}",
49704
+ "ui.teamBridge.replies.empty": "अभी कोई जवाब नहीं। थ्रेड शुरू करें।",
49705
+ "ui.teamBridge.replies.placeholder": "थ्रेड में जवाब लिखें",
49706
+ "ui.teamBridge.replies.more": "और जवाब लोड करें",
49707
+ "ui.teamBridge.actions.label": "संदेश की कार्रवाइयाँ",
49528
49708
  "ui.teamBridge.sender.unknown_person": "अज्ञात व्यक्ति",
49529
49709
  "ui.teamBridge.sender.unknown_agent": "अज्ञात एजेंट"
49530
49710
  };
@@ -53056,6 +53236,10 @@ const ruUiTeamBridge = {
53056
53236
  "ui.teamBridge.notify.title": "{conversation} ({organization})",
53057
53237
  "ui.teamBridge.notify.body": "{sender}: новое сообщение",
53058
53238
  "ui.teamBridge.notify.body_fallback": "Новое сообщение",
53239
+ "ui.teamBridge.notify.channel": "#{channel}",
53240
+ "ui.teamBridge.notify.subtitle": "{place} · {organization}",
53241
+ "ui.teamBridge.notify.count": "{count, plural, one {# новое сообщение} few {# новых сообщения} many {# новых сообщений} other {# нового сообщения}}",
53242
+ "ui.teamBridge.notify.count_preview": "{count, plural, one {# новое сообщение: {preview}} few {# новых сообщения: {preview}} many {# новых сообщений: {preview}} other {# нового сообщения: {preview}}}",
53059
53243
  "ui.teamBridge.people.title": "Люди",
53060
53244
  "ui.teamBridge.people.loading": "Загрузка списка людей",
53061
53245
  "ui.teamBridge.people.error": "Не удалось загрузить список людей.",
@@ -53111,6 +53295,35 @@ const ruUiTeamBridge = {
53111
53295
  "ui.teamBridge.thread.intro_chief": "Здесь начинается ваш разговор с агентом {name}, координатором одного из участников команды. Агент воспринимает ваши сообщения как недоверенные входные данные, а решения о действиях принимает его владелец.",
53112
53296
  "ui.teamBridge.thread.intro_group": "Первым сообщением вы начнёте разговор. Кому: {names}.",
53113
53297
  "ui.teamBridge.list.error_pane": "Не удалось загрузить разговоры. Повторите попытку в списке слева.",
53298
+ "ui.teamBridge.reactions.add": "Добавить реакцию",
53299
+ "ui.teamBridge.reactions.search": "Поиск эмодзи",
53300
+ "ui.teamBridge.reactions.categories": "Категории эмодзи",
53301
+ "ui.teamBridge.reactions.all": "Все эмодзи",
53302
+ "ui.teamBridge.reactions.frequent": "Часто используемые",
53303
+ "ui.teamBridge.reactions.tone": "Оттенок кожи",
53304
+ "ui.teamBridge.reactions.toneDefault": "По умолчанию",
53305
+ "ui.teamBridge.reactions.empty": "Эмодзи не найдены",
53306
+ "ui.teamBridge.reactions.failed": "Не удалось сохранить реакцию. Повторите попытку.",
53307
+ "ui.teamBridge.reactions.category0": "Смайлики и эмоции",
53308
+ "ui.teamBridge.reactions.category1": "Люди и части тела",
53309
+ "ui.teamBridge.reactions.category2": "Животные и природа",
53310
+ "ui.teamBridge.reactions.category3": "Еда и напитки",
53311
+ "ui.teamBridge.reactions.category4": "Путешествия и места",
53312
+ "ui.teamBridge.reactions.category5": "Занятия",
53313
+ "ui.teamBridge.reactions.category6": "Предметы",
53314
+ "ui.teamBridge.reactions.category7": "Символы",
53315
+ "ui.teamBridge.reactions.category8": "Флаги",
53316
+ "ui.teamBridge.reactions.choose": "Выберите эмодзи",
53317
+ "ui.teamBridge.reactions.noResults": "Эмодзи не найдены",
53318
+ "ui.teamBridge.replies.action": "Ответить в ветке",
53319
+ "ui.teamBridge.replies.title": "Ветка",
53320
+ "ui.teamBridge.replies.close": "Закрыть ветку",
53321
+ "ui.teamBridge.replies.count": "{count, plural, one {# ответ} few {# ответа} many {# ответов} other {# ответа}}",
53322
+ "ui.teamBridge.replies.last": "последний ответ: {time}",
53323
+ "ui.teamBridge.replies.empty": "Ответов пока нет. Начните ветку.",
53324
+ "ui.teamBridge.replies.placeholder": "Ответить в ветке",
53325
+ "ui.teamBridge.replies.more": "Загрузить ещё ответы",
53326
+ "ui.teamBridge.actions.label": "Действия с сообщением",
53114
53327
  "ui.teamBridge.sender.unknown_person": "Неизвестный пользователь",
53115
53328
  "ui.teamBridge.sender.unknown_agent": "Неизвестный агент"
53116
53329
  };
@@ -56642,6 +56855,10 @@ const urUiTeamBridge = {
56642
56855
  "ui.teamBridge.notify.title": "{conversation} ({organization})",
56643
56856
  "ui.teamBridge.notify.body": "{sender} نے پیغام بھیجا",
56644
56857
  "ui.teamBridge.notify.body_fallback": "نیا پیغام",
56858
+ "ui.teamBridge.notify.channel": "#{channel}",
56859
+ "ui.teamBridge.notify.subtitle": "{place} · {organization}",
56860
+ "ui.teamBridge.notify.count": "{count, plural, one {# نیا پیغام} other {# نئے پیغامات}}",
56861
+ "ui.teamBridge.notify.count_preview": "{count, plural, one {# نیا پیغام: {preview}} other {# نئے پیغامات: {preview}}}",
56645
56862
  "ui.teamBridge.people.title": "لوگ",
56646
56863
  "ui.teamBridge.people.loading": "لوگ لوڈ ہو رہے ہیں",
56647
56864
  "ui.teamBridge.people.error": "لوگ لوڈ نہیں ہو سکے۔",
@@ -56697,6 +56914,35 @@ const urUiTeamBridge = {
56697
56914
  "ui.teamBridge.thread.intro_chief": "یہ {name} کے ساتھ آپ کی گفتگو کا آغاز ہے، جو ٹیم کے ایک رکن کا چیف آف اسٹاف ایجنٹ ہے۔ یہ آپ کے پیغامات کو غیر معتبر ان پٹ سمجھتا ہے، اور اس کا مالک طے کرتا ہے کہ یہ کس بات پر عمل کرے۔",
56698
56915
  "ui.teamBridge.thread.intro_group": "آپ کا پہلا پیغام {names} کے ساتھ گفتگو شروع کرے گا۔",
56699
56916
  "ui.teamBridge.list.error_pane": "گفتگوئیں لوڈ نہیں ہو سکیں۔ دائیں جانب کی فہرست سے دوبارہ کوشش کریں۔",
56917
+ "ui.teamBridge.reactions.add": "ردعمل شامل کریں",
56918
+ "ui.teamBridge.reactions.search": "ایموجی تلاش کریں",
56919
+ "ui.teamBridge.reactions.categories": "ایموجی کے زمرے",
56920
+ "ui.teamBridge.reactions.all": "تمام ایموجی",
56921
+ "ui.teamBridge.reactions.frequent": "اکثر استعمال ہونے والے",
56922
+ "ui.teamBridge.reactions.tone": "جلد کی رنگت",
56923
+ "ui.teamBridge.reactions.toneDefault": "ڈیفالٹ رنگت",
56924
+ "ui.teamBridge.reactions.empty": "کوئی ایموجی نہیں ملا",
56925
+ "ui.teamBridge.reactions.failed": "ردعمل محفوظ نہیں ہو سکا۔ دوبارہ کوشش کریں۔",
56926
+ "ui.teamBridge.reactions.category0": "اسمائلیز اور جذبات",
56927
+ "ui.teamBridge.reactions.category1": "لوگ اور جسم",
56928
+ "ui.teamBridge.reactions.category2": "جانور اور فطرت",
56929
+ "ui.teamBridge.reactions.category3": "کھانا اور مشروبات",
56930
+ "ui.teamBridge.reactions.category4": "سفر اور مقامات",
56931
+ "ui.teamBridge.reactions.category5": "سرگرمیاں",
56932
+ "ui.teamBridge.reactions.category6": "اشیاء",
56933
+ "ui.teamBridge.reactions.category7": "علامات",
56934
+ "ui.teamBridge.reactions.category8": "پرچم",
56935
+ "ui.teamBridge.reactions.choose": "ایموجی منتخب کریں",
56936
+ "ui.teamBridge.reactions.noResults": "کوئی ایموجی نہیں ملا",
56937
+ "ui.teamBridge.replies.action": "تھریڈ میں جواب دیں",
56938
+ "ui.teamBridge.replies.title": "تھریڈ",
56939
+ "ui.teamBridge.replies.close": "تھریڈ بند کریں",
56940
+ "ui.teamBridge.replies.count": "{count, plural, one {# جواب} other {# جوابات}}",
56941
+ "ui.teamBridge.replies.last": "آخری جواب {time}",
56942
+ "ui.teamBridge.replies.empty": "ابھی کوئی جواب نہیں۔ تھریڈ شروع کریں۔",
56943
+ "ui.teamBridge.replies.placeholder": "تھریڈ میں جواب دیں",
56944
+ "ui.teamBridge.replies.more": "مزید جوابات لوڈ کریں",
56945
+ "ui.teamBridge.actions.label": "پیغام کے اقدامات",
56700
56946
  "ui.teamBridge.sender.unknown_person": "نامعلوم شخص",
56701
56947
  "ui.teamBridge.sender.unknown_agent": "نامعلوم ایجنٹ"
56702
56948
  };
@@ -60037,6 +60283,10 @@ const viUiTeamBridge = {
60037
60283
  "ui.teamBridge.notify.title": "{conversation} ({organization})",
60038
60284
  "ui.teamBridge.notify.body": "{sender} đã gửi một tin nhắn",
60039
60285
  "ui.teamBridge.notify.body_fallback": "Tin nhắn mới",
60286
+ "ui.teamBridge.notify.channel": "#{channel}",
60287
+ "ui.teamBridge.notify.subtitle": "{place} · {organization}",
60288
+ "ui.teamBridge.notify.count": "{count, plural, other {# tin nhắn mới}}",
60289
+ "ui.teamBridge.notify.count_preview": "{count, plural, other {# tin nhắn mới: {preview}}}",
60040
60290
  "ui.teamBridge.people.title": "Mọi người",
60041
60291
  "ui.teamBridge.people.loading": "Đang tải danh sách mọi người",
60042
60292
  "ui.teamBridge.people.error": "Không tải được danh sách mọi người.",
@@ -60092,6 +60342,35 @@ const viUiTeamBridge = {
60092
60342
  "ui.teamBridge.thread.intro_chief": "Đây là khởi đầu cuộc trò chuyện của bạn với {name}, tác nhân chánh văn phòng của một đồng nghiệp. Tác nhân này coi tin nhắn của bạn là đầu vào không tin cậy, và chủ sở hữu sẽ quyết định tác nhân làm theo điều gì.",
60093
60343
  "ui.teamBridge.thread.intro_group": "Tin nhắn đầu tiên của bạn sẽ bắt đầu cuộc trò chuyện với {names}.",
60094
60344
  "ui.teamBridge.list.error_pane": "Không tải được danh sách cuộc trò chuyện. Hãy thử lại từ danh sách bên trái.",
60345
+ "ui.teamBridge.reactions.add": "Thêm cảm xúc",
60346
+ "ui.teamBridge.reactions.search": "Tìm biểu tượng cảm xúc",
60347
+ "ui.teamBridge.reactions.categories": "Danh mục biểu tượng cảm xúc",
60348
+ "ui.teamBridge.reactions.all": "Tất cả biểu tượng cảm xúc",
60349
+ "ui.teamBridge.reactions.frequent": "Thường dùng",
60350
+ "ui.teamBridge.reactions.tone": "Tông màu da",
60351
+ "ui.teamBridge.reactions.toneDefault": "Tông màu da mặc định",
60352
+ "ui.teamBridge.reactions.empty": "Không tìm thấy biểu tượng cảm xúc",
60353
+ "ui.teamBridge.reactions.failed": "Không lưu được cảm xúc. Hãy thử lại.",
60354
+ "ui.teamBridge.reactions.category0": "Mặt cười và cảm xúc",
60355
+ "ui.teamBridge.reactions.category1": "Người và cơ thể",
60356
+ "ui.teamBridge.reactions.category2": "Động vật và thiên nhiên",
60357
+ "ui.teamBridge.reactions.category3": "Đồ ăn và thức uống",
60358
+ "ui.teamBridge.reactions.category4": "Du lịch và địa điểm",
60359
+ "ui.teamBridge.reactions.category5": "Hoạt động",
60360
+ "ui.teamBridge.reactions.category6": "Đồ vật",
60361
+ "ui.teamBridge.reactions.category7": "Biểu tượng",
60362
+ "ui.teamBridge.reactions.category8": "Cờ",
60363
+ "ui.teamBridge.reactions.choose": "Chọn biểu tượng cảm xúc",
60364
+ "ui.teamBridge.reactions.noResults": "Không tìm thấy biểu tượng cảm xúc",
60365
+ "ui.teamBridge.replies.action": "Trả lời trong luồng",
60366
+ "ui.teamBridge.replies.title": "Luồng trò chuyện",
60367
+ "ui.teamBridge.replies.close": "Đóng luồng trò chuyện",
60368
+ "ui.teamBridge.replies.count": "{count, plural, other {# câu trả lời}}",
60369
+ "ui.teamBridge.replies.last": "trả lời gần nhất lúc {time}",
60370
+ "ui.teamBridge.replies.empty": "Chưa có câu trả lời nào. Hãy bắt đầu luồng trò chuyện.",
60371
+ "ui.teamBridge.replies.placeholder": "Trả lời trong luồng",
60372
+ "ui.teamBridge.replies.more": "Tải thêm câu trả lời",
60373
+ "ui.teamBridge.actions.label": "Thao tác với tin nhắn",
60095
60374
  "ui.teamBridge.sender.unknown_person": "Người không xác định",
60096
60375
  "ui.teamBridge.sender.unknown_agent": "Tác nhân không xác định"
60097
60376
  };
@@ -63645,6 +63924,10 @@ const zhCNUiTeamBridge = {
63645
63924
  "ui.teamBridge.notify.title": "{conversation}({organization})",
63646
63925
  "ui.teamBridge.notify.body": "{sender}发来一条消息",
63647
63926
  "ui.teamBridge.notify.body_fallback": "新消息",
63927
+ "ui.teamBridge.notify.channel": "#{channel}",
63928
+ "ui.teamBridge.notify.subtitle": "{place} · {organization}",
63929
+ "ui.teamBridge.notify.count": "{count, plural, other {#条新消息}}",
63930
+ "ui.teamBridge.notify.count_preview": "{count, plural, other {#条新消息:{preview}}}",
63648
63931
  "ui.teamBridge.people.title": "成员",
63649
63932
  "ui.teamBridge.people.loading": "正在加载成员",
63650
63933
  "ui.teamBridge.people.error": "无法加载成员。",
@@ -63700,6 +63983,35 @@ const zhCNUiTeamBridge = {
63700
63983
  "ui.teamBridge.thread.intro_chief": "这是你与{name}对话的开始,对方是一位团队成员的首席助理。它会将你的消息视为不受信任的输入,是否据此行动由其所有者决定。",
63701
63984
  "ui.teamBridge.thread.intro_group": "发送第一条消息即可开始与{names}的对话。",
63702
63985
  "ui.teamBridge.list.error_pane": "无法加载对话。请在左侧列表中重试。",
63986
+ "ui.teamBridge.reactions.add": "添加表情回应",
63987
+ "ui.teamBridge.reactions.search": "搜索表情",
63988
+ "ui.teamBridge.reactions.categories": "表情类别",
63989
+ "ui.teamBridge.reactions.all": "全部表情",
63990
+ "ui.teamBridge.reactions.frequent": "常用",
63991
+ "ui.teamBridge.reactions.tone": "肤色",
63992
+ "ui.teamBridge.reactions.toneDefault": "默认肤色",
63993
+ "ui.teamBridge.reactions.empty": "未找到表情",
63994
+ "ui.teamBridge.reactions.failed": "表情回应未保存。请重试。",
63995
+ "ui.teamBridge.reactions.category0": "笑脸和情感",
63996
+ "ui.teamBridge.reactions.category1": "人物和身体",
63997
+ "ui.teamBridge.reactions.category2": "动物和自然",
63998
+ "ui.teamBridge.reactions.category3": "食物和饮料",
63999
+ "ui.teamBridge.reactions.category4": "旅行和地点",
64000
+ "ui.teamBridge.reactions.category5": "活动",
64001
+ "ui.teamBridge.reactions.category6": "物品",
64002
+ "ui.teamBridge.reactions.category7": "符号",
64003
+ "ui.teamBridge.reactions.category8": "旗帜",
64004
+ "ui.teamBridge.reactions.choose": "选择表情",
64005
+ "ui.teamBridge.reactions.noResults": "未找到表情",
64006
+ "ui.teamBridge.replies.action": "在讨论串中回复",
64007
+ "ui.teamBridge.replies.title": "讨论串",
64008
+ "ui.teamBridge.replies.close": "关闭讨论串",
64009
+ "ui.teamBridge.replies.count": "{count, plural, other {#条回复}}",
64010
+ "ui.teamBridge.replies.last": "最后回复于{time}",
64011
+ "ui.teamBridge.replies.empty": "还没有回复。发起讨论吧。",
64012
+ "ui.teamBridge.replies.placeholder": "在讨论串中回复",
64013
+ "ui.teamBridge.replies.more": "加载更多回复",
64014
+ "ui.teamBridge.actions.label": "消息操作",
63703
64015
  "ui.teamBridge.sender.unknown_person": "未知用户",
63704
64016
  "ui.teamBridge.sender.unknown_agent": "未知智能体"
63705
64017
  };
@@ -74375,7 +74687,7 @@ async function runWithLimit(items, limit, worker) {
74375
74687
  }
74376
74688
  await Promise.all(runners);
74377
74689
  }
74378
- async function probeFiles(asked, cwd, home, deps = fsProbeDeps, cache = sharedProbeCache) {
74690
+ async function probeFiles(asked, cwd, home, deps = fsProbeDeps, cache = sharedProbeCache, fresh = false) {
74379
74691
  const inputs = asked.slice(0, MAX_PROBE_PATHS);
74380
74692
  const realRootPromise = cwd ? probeRealRoot(resolveUserPath$1(cwd, void 0, home), deps) : Promise.resolve(null);
74381
74693
  const units = /* @__PURE__ */ new Map();
@@ -74389,8 +74701,9 @@ async function probeFiles(asked, cwd, home, deps = fsProbeDeps, cache = sharedPr
74389
74701
  for (const [key, unit] of units) {
74390
74702
  const entry = cache.get(key);
74391
74703
  if (entry === void 0) continue;
74392
- if (now - entry.at < entry.ttlMs) unit.facts = entry;
74393
- else cache.delete(key);
74704
+ if (now - entry.at < entry.ttlMs) {
74705
+ if (!fresh) unit.facts = entry;
74706
+ } else cache.delete(key);
74394
74707
  }
74395
74708
  await runWithLimit(
74396
74709
  [...units.entries()].filter(([, unit]) => unit.facts === null),
@@ -75157,17 +75470,16 @@ function installSupplementProtocol(fetchDocument, log2) {
75157
75470
  });
75158
75471
  }
75159
75472
  const TEAM_BRIDGE_NOTIFY_MAX_TITLE = 320;
75160
- const TEAM_BRIDGE_NOTIFY_MAX_BODY = 200;
75473
+ const TEAM_BRIDGE_NOTIFY_MAX_BODY = 360;
75474
+ const TEAM_BRIDGE_NOTIFY_MAX_SUBTITLE = 320;
75161
75475
  const MAX_SEQ = Number.MAX_SAFE_INTEGER;
75162
75476
  const SAFE_ID = /^[A-Za-z0-9_.:-]{1,128}$/;
75477
+ function unsafeBannerCharacter(character) {
75478
+ const code = character.codePointAt(0) ?? 0;
75479
+ return character === "<" || character === ">" || code < 32 || code >= 127 && code <= 159 || code === 1564 || code === 8206 || code === 8207 || code >= 8234 && code <= 8238 || code >= 8294 && code <= 8297 || code === 8232 || code === 8233;
75480
+ }
75163
75481
  function hasUnsafeText(value) {
75164
- for (const character of value) {
75165
- const code = character.codePointAt(0) ?? 0;
75166
- if (character === "<" || character === ">" || code < 32 || code === 127) {
75167
- return true;
75168
- }
75169
- }
75170
- return false;
75482
+ return Array.from(value).some(unsafeBannerCharacter);
75171
75483
  }
75172
75484
  function cleanId(value) {
75173
75485
  return typeof value === "string" && SAFE_ID.test(value) ? value : null;
@@ -75176,7 +75488,7 @@ function cleanText(value, max) {
75176
75488
  if (typeof value !== "string") return null;
75177
75489
  const trimmed = value.trim();
75178
75490
  if (trimmed.length === 0 || trimmed.length > max) return null;
75179
- if (hasUnsafeText(trimmed)) return null;
75491
+ if (hasUnsafeText(value)) return null;
75180
75492
  return trimmed;
75181
75493
  }
75182
75494
  function parseTeamBridgeNotifyRequest(value) {
@@ -75189,13 +75501,47 @@ function parseTeamBridgeNotifyRequest(value) {
75189
75501
  const title = cleanText(input.title, TEAM_BRIDGE_NOTIFY_MAX_TITLE);
75190
75502
  const body = cleanText(input.body, TEAM_BRIDGE_NOTIFY_MAX_BODY);
75191
75503
  const seq2 = input.seq;
75504
+ const subtitle = input.subtitle === void 0 ? void 0 : cleanText(input.subtitle, TEAM_BRIDGE_NOTIFY_MAX_SUBTITLE);
75505
+ const threadId = input.threadId === void 0 ? void 0 : cleanId(input.threadId);
75506
+ const viewing = input.viewing;
75507
+ if (subtitle === null || threadId === null || viewing !== void 0 && typeof viewing !== "boolean") {
75508
+ return null;
75509
+ }
75192
75510
  if (conversationId === null || tenantId === null || title === null || body === null || typeof seq2 !== "number" || !Number.isSafeInteger(seq2) || seq2 < 0 || seq2 > MAX_SEQ) {
75193
75511
  return null;
75194
75512
  }
75195
- return { conversationId, tenantId, title, body, seq: seq2 };
75513
+ return {
75514
+ conversationId,
75515
+ tenantId,
75516
+ title,
75517
+ body,
75518
+ seq: seq2,
75519
+ ...subtitle === void 0 ? {} : { subtitle },
75520
+ ...threadId === void 0 ? {} : { threadId },
75521
+ ...viewing === void 0 ? {} : { viewing }
75522
+ };
75523
+ }
75524
+ const TEAM_BRIDGE_COALESCE_MS = 1e4;
75525
+ function teamBridgeBannerId(conversationId) {
75526
+ return `team-bridge:${conversationId}`;
75527
+ }
75528
+ function teamBridgeBannerLines(request, platform) {
75529
+ if (!request.subtitle) return { title: request.title, body: request.body };
75530
+ if (platform === "darwin") {
75531
+ return {
75532
+ title: request.title,
75533
+ subtitle: request.subtitle,
75534
+ body: request.body
75535
+ };
75536
+ }
75537
+ return {
75538
+ title: request.title,
75539
+ body: `${request.subtitle} — ${request.body}`
75540
+ };
75196
75541
  }
75197
- function teamBridgeWindowIsQuiet(window) {
75542
+ function teamBridgeWindowIsQuiet(window, viewing) {
75198
75543
  if (!window) return false;
75544
+ if (viewing === false) return false;
75199
75545
  return !window.isDestroyed() && window.isVisible() && !window.isMinimized() && window.isFocused();
75200
75546
  }
75201
75547
  class TeamBridgeNotifier {
@@ -75206,6 +75552,8 @@ class TeamBridgeNotifier {
75206
75552
  }
75207
75553
  /** The live banner per conversation, so a new seq REPLACES it. */
75208
75554
  banners = /* @__PURE__ */ new Map();
75555
+ /** When each conversation's live banner was raised, for `COALESCE_MS`. */
75556
+ raisedAt = /* @__PURE__ */ new Map();
75209
75557
  /** The banners this process must keep reachable for their clicks to fire. */
75210
75558
  lifetime = new NotificationLifetime();
75211
75559
  pendingOpen = null;
@@ -75226,31 +75574,37 @@ class TeamBridgeNotifier {
75226
75574
  }
75227
75575
  if (this.options.show === "never") return { shown: false };
75228
75576
  if (!this.canNotify()) return { shown: false };
75229
- if (teamBridgeWindowIsQuiet(this.options.window())) {
75577
+ if (teamBridgeWindowIsQuiet(this.options.window(), request.viewing)) {
75230
75578
  return { shown: false };
75231
75579
  }
75232
75580
  const previous = this.options.store.notifiedSeq(request.conversationId);
75233
75581
  if (previous !== void 0 && request.seq <= previous) {
75234
75582
  return { shown: false };
75235
75583
  }
75584
+ const now = (this.options.now ?? Date.now)();
75585
+ const lastRaised = this.raisedAt.get(request.conversationId);
75586
+ const burst = this.banners.has(request.conversationId) && lastRaised !== void 0 && now - lastRaised < TEAM_BRIDGE_COALESCE_MS;
75236
75587
  this.replace(request.conversationId);
75237
75588
  const notification = this.createBanner({
75238
- title: request.title,
75239
- body: request.body,
75240
- silent: false,
75589
+ id: teamBridgeBannerId(request.conversationId),
75590
+ groupId: teamBridgeBannerId(request.conversationId),
75591
+ ...teamBridgeBannerLines(
75592
+ request,
75593
+ this.options.platform ?? process.platform
75594
+ ),
75595
+ silent: burst,
75241
75596
  ...this.options.icon ? { icon: this.options.icon } : {}
75242
75597
  });
75243
- this.lifetime.retain(notification, () => {
75244
- this.banners.delete(request.conversationId);
75245
- this.open(request);
75246
- });
75247
- notification.once("close", () => {
75248
- if (this.banners.get(request.conversationId) === notification) {
75249
- this.banners.delete(request.conversationId);
75250
- }
75251
- });
75598
+ const conversationId = request.conversationId;
75599
+ const target2 = {
75600
+ conversationId,
75601
+ tenantId: request.tenantId,
75602
+ ...request.threadId ? { threadId: request.threadId } : {}
75603
+ };
75604
+ this.retainTarget(notification, target2);
75252
75605
  notification.show();
75253
75606
  this.banners.set(request.conversationId, notification);
75607
+ this.raisedAt.set(request.conversationId, now);
75254
75608
  this.options.store.record(request.conversationId, request.seq);
75255
75609
  return { shown: true };
75256
75610
  }
@@ -75274,11 +75628,20 @@ class TeamBridgeNotifier {
75274
75628
  this.banners.delete(conversationId);
75275
75629
  previous.close?.();
75276
75630
  }
75277
- open(request) {
75278
- const target2 = {
75279
- conversationId: request.conversationId,
75280
- tenantId: request.tenantId
75281
- };
75631
+ /** Separate scope makes it impossible for handlers to retain the IPC request. */
75632
+ retainTarget(notification, target2) {
75633
+ const conversationId = target2.conversationId;
75634
+ this.lifetime.retain(notification, () => {
75635
+ this.banners.delete(conversationId);
75636
+ this.open(target2);
75637
+ });
75638
+ notification.once("close", () => {
75639
+ if (this.banners.get(conversationId) === notification) {
75640
+ this.banners.delete(conversationId);
75641
+ }
75642
+ });
75643
+ }
75644
+ open(target2) {
75282
75645
  this.pendingOpen = target2;
75283
75646
  const window = this.options.window();
75284
75647
  if (window && !window.isDestroyed()) {
@@ -85096,10 +85459,18 @@ electron.app.whenReady().then(async () => {
85096
85459
  };
85097
85460
  electron.ipcMain.handle(
85098
85461
  "probe-files",
85099
- async (event, paths, cwd) => {
85462
+ async (event, paths, cwd, options) => {
85100
85463
  authorizeLocalFileSender(event, "probe files");
85101
85464
  const asked = Array.isArray(paths) ? paths.filter((path2) => typeof path2 === "string") : [];
85102
- return await probeFiles(asked, cwd, electron.app.getPath("home"));
85465
+ const fresh = options?.fresh === true;
85466
+ return await probeFiles(
85467
+ asked,
85468
+ cwd,
85469
+ electron.app.getPath("home"),
85470
+ void 0,
85471
+ void 0,
85472
+ fresh
85473
+ );
85103
85474
  }
85104
85475
  );
85105
85476
  electron.ipcMain.handle(