local-operator-ui 0.39.6 → 0.39.8

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 (92) hide show
  1. package/out/main/index.js +405 -30
  2. package/out/preload/index.js +11 -1
  3. package/out/renderer/assets/{_basePickBy-CEM-62na.js → _basePickBy-DHPhZCA_.js} +1 -1
  4. package/out/renderer/assets/{_baseUniq-DKUG2lEn.js → _baseUniq-CEysnucn.js} +1 -1
  5. package/out/renderer/assets/{agent-details-page-uwmizvcA.js → agent-details-page-B-86aijV.js} +1 -1
  6. package/out/renderer/assets/{agent-hub-page-DY0hrFjh.js → agent-hub-page-BcE7cjZA.js} +1 -1
  7. package/out/renderer/assets/{agents-page-B82GhyEm.js → agents-page-CAw2yx4E.js} +3 -3
  8. package/out/renderer/assets/{arc-CwS59wEx.js → arc-CHzPG6NW.js} +1 -1
  9. package/out/renderer/assets/{architectureDiagram-IEHRJDOE-CrSOPHPj.js → architectureDiagram-IEHRJDOE-BJ3tht1i.js} +1 -1
  10. package/out/renderer/assets/{blockDiagram-JOT3LUYC-DOKW2aS1.js → blockDiagram-JOT3LUYC-B99Xv7BZ.js} +1 -1
  11. package/out/renderer/assets/{book-open-BrVlmR50.js → book-open-DFWmbD9W.js} +1 -1
  12. package/out/renderer/assets/browser-page-DaXgSgru.js +1 -0
  13. package/out/renderer/assets/{browser-webauthn-prompt-D4Pmblc_.js → browser-webauthn-prompt-Dw85slb5.js} +1 -1
  14. package/out/renderer/assets/{building-2-BbJxBV3t.js → building-2-CYyIaJBN.js} +1 -1
  15. package/out/renderer/assets/{c4Diagram-VJAJSXHY-BNZOSwVL.js → c4Diagram-VJAJSXHY-C1pdKX_l.js} +1 -1
  16. package/out/renderer/assets/channel-BEYhBY3Q.js +1 -0
  17. package/out/renderer/assets/{chunk-4BMEZGHF-DatYJ8Pc.js → chunk-4BMEZGHF-C-BgaYzx.js} +1 -1
  18. package/out/renderer/assets/{chunk-A2AXSNBT-kofNI-nh.js → chunk-A2AXSNBT-DacD51Pw.js} +1 -1
  19. package/out/renderer/assets/{chunk-AEK57VVT-RG-vyDkt.js → chunk-AEK57VVT-C1LDIbWD.js} +1 -1
  20. package/out/renderer/assets/{chunk-D6G4REZN-DbgxdXuD.js → chunk-D6G4REZN-zKqzm1Fc.js} +1 -1
  21. package/out/renderer/assets/{chunk-RZ5BOZE2-Pwbky5G7.js → chunk-RZ5BOZE2-COMOaHrE.js} +1 -1
  22. package/out/renderer/assets/{chunk-XZIHB7SX-nMQwH5Ev.js → chunk-XZIHB7SX-BvOCuAGM.js} +1 -1
  23. package/out/renderer/assets/classDiagram-GIVACNV2-Dy5mXAMG.js +1 -0
  24. package/out/renderer/assets/classDiagram-v2-COTLJTTW-Dy5mXAMG.js +1 -0
  25. package/out/renderer/assets/clone-ORue-pxx.js +1 -0
  26. package/out/renderer/assets/{console-mirror-B7HDmLVb.js → console-mirror-c5UE-myF.js} +14 -14
  27. package/out/renderer/assets/{consoleCapture-wuvuMPlf.js → consoleCapture-DuZA4r4V.js} +1 -1
  28. package/out/renderer/assets/{conversation-input-sync-DeQTtOSG.js → conversation-input-sync-DnJ8rwD3.js} +4 -4
  29. package/out/renderer/assets/{dagre-OKDRZEBW-BXF3VqDs.js → dagre-OKDRZEBW-DDIe0sXd.js} +1 -1
  30. package/out/renderer/assets/{diagram-SSKATNLV-C6ZzdCUp.js → diagram-SSKATNLV-DIZoy4ar.js} +1 -1
  31. package/out/renderer/assets/{diagram-VNBRO52H-ND-gVRs3.js → diagram-VNBRO52H-BmbTUCP7.js} +1 -1
  32. package/out/renderer/assets/{erDiagram-Q7BY3M3F-DJ8vCpMT.js → erDiagram-Q7BY3M3F-BDuxU-l2.js} +1 -1
  33. package/out/renderer/assets/{error-boundary-D81PAlVn.js → error-boundary-DtxCuvus.js} +1 -1
  34. package/out/renderer/assets/{flowDiagram-4HSFHLVR-C0lG2NYg.js → flowDiagram-4HSFHLVR-DZD7CEMt.js} +1 -1
  35. package/out/renderer/assets/{ganttDiagram-APWFNJXF-BBxt5Pgj.js → ganttDiagram-APWFNJXF-sIzmsZR9.js} +1 -1
  36. package/out/renderer/assets/{gitGraphDiagram-7IBYFJ6S-B5eei6E_.js → gitGraphDiagram-7IBYFJ6S-CfsigYLP.js} +1 -1
  37. package/out/renderer/assets/{graph-lWFNtwh7.js → graph-Cd4rdBHc.js} +1 -1
  38. package/out/renderer/assets/{hash-3k6_lTgk.js → hash-g37EdE9w.js} +1 -1
  39. package/out/renderer/assets/index-1TUQWJ6R.js +57 -0
  40. package/out/renderer/assets/{index-tyh1i-0R.js → index-A6KCjnE7.js} +1 -1
  41. package/out/renderer/assets/{index-BtI7uak5.js → index-B8F8dXxx.js} +194 -194
  42. package/out/renderer/assets/{index-ZC-NNW64.css → index-CXsn7x-M.css} +1 -1
  43. package/out/renderer/assets/{index-FqHXqlQT.js → index-DEpDOZ5B.js} +1 -1
  44. package/out/renderer/assets/{infoDiagram-PH2N3AL5-DfdIGj2q.js → infoDiagram-PH2N3AL5-4mNxt66m.js} +1 -1
  45. package/out/renderer/assets/{installer-OLhNHLbA.js → installer-p8L5oHJJ.js} +1 -1
  46. package/out/renderer/assets/{journeyDiagram-U35MCT3I-DY36aDPm.js → journeyDiagram-U35MCT3I-CHFBk0nL.js} +1 -1
  47. package/out/renderer/assets/{kanban-definition-NDS4AKOZ-DkmkP4pt.js → kanban-definition-NDS4AKOZ-COmnjqTV.js} +1 -1
  48. package/out/renderer/assets/{layout-Wh_eVbud.js → layout-CuSBEVFA.js} +1 -1
  49. package/out/renderer/assets/{legacy-agents-page-m5-4VKbu.js → legacy-agents-page-DQvyD51p.js} +1 -1
  50. package/out/renderer/assets/{library-page-vUP7gWsI.js → library-page-B9lgNg45.js} +3 -3
  51. package/out/renderer/assets/{mermaid.core-CIUeSke9.js → mermaid.core-CewojVRF.js} +5 -5
  52. package/out/renderer/assets/{mesh-page-CoUCZ19i.js → mesh-page-BhbouWc4.js} +1 -1
  53. package/out/renderer/assets/{mindmap-definition-ALO5MXBD-E7Cl2drf.js → mindmap-definition-ALO5MXBD-DwFas2ix.js} +1 -1
  54. package/out/renderer/assets/{mini-D6HdkQvd.js → mini-D0hYsF4Y.js} +1 -1
  55. package/out/renderer/assets/{notebook-pen-CiUgTpp-.js → notebook-pen-CG3SG58i.js} +1 -1
  56. package/out/renderer/assets/{org-access-DMUk8SEr.js → org-access-Bdty9bY1.js} +1 -1
  57. package/out/renderer/assets/{org-surface-gate-DdKUA8S8.js → org-surface-gate-D6nrFZGY.js} +1 -1
  58. package/out/renderer/assets/{page-header-DyRHEB-L.js → page-header-DysvpDyJ.js} +1 -1
  59. package/out/renderer/assets/{pieDiagram-IB7DONF6-C3KFzuOU.js → pieDiagram-IB7DONF6-Dq6TjFed.js} +1 -1
  60. package/out/renderer/assets/{projects-page-BdU99VZf.js → projects-page-Dwk8fTRp.js} +1 -1
  61. package/out/renderer/assets/{publication-validation-Cv6lnH83.js → publication-validation-BHs0kne8.js} +1 -1
  62. package/out/renderer/assets/{quadrantDiagram-7GDLP6J5-DommBk0z.js → quadrantDiagram-7GDLP6J5-BVLv2vHo.js} +1 -1
  63. package/out/renderer/assets/{radar-MK3ICKWK-D5VUcmjY.js → radar-MK3ICKWK-D_oonYMe.js} +1 -1
  64. package/out/renderer/assets/{radient-auth-buttons-BXc5xVU7.js → radient-auth-buttons-frGm4bTw.js} +1 -1
  65. package/out/renderer/assets/{requirementDiagram-KVF5MWMF-RSR1-rSs.js → requirementDiagram-KVF5MWMF-fxCXjqlC.js} +1 -1
  66. package/out/renderer/assets/{sankeyDiagram-QLVOVGJD-Caojpkpm.js → sankeyDiagram-QLVOVGJD-DnTFr800.js} +1 -1
  67. package/out/renderer/assets/{schedules-page-BWM0NUo9.js → schedules-page-CmHgL3u3.js} +1 -1
  68. package/out/renderer/assets/{sequenceDiagram-X6HHIX6F-CrZCUpMQ.js → sequenceDiagram-X6HHIX6F-B8wkqfL8.js} +1 -1
  69. package/out/renderer/assets/settings-page-jrapatoZ.js +287 -0
  70. package/out/renderer/assets/{smartart-BJStpUh7.js → smartart-CcbzfE85.js} +1 -1
  71. package/out/renderer/assets/{stateDiagram-DGXRK772-PFp2Dzsd.js → stateDiagram-DGXRK772-pBreQo8f.js} +1 -1
  72. package/out/renderer/assets/stateDiagram-v2-YXO3MK2T-BQCYRzUG.js +1 -0
  73. package/out/renderer/assets/{team-bridge-page-pZkYpCnA.js → team-bridge-page-BclyCGPd.js} +1 -1
  74. package/out/renderer/assets/{timeline-definition-BDJGKUSR-BI2T4N_q.js → timeline-definition-BDJGKUSR-Bh7YlHts.js} +1 -1
  75. package/out/renderer/assets/ui-preferences-store-B55tTIxk.js +1 -0
  76. package/out/renderer/assets/{use-download-agent-mutation-B3ghS441.js → use-download-agent-mutation-thVr_RZe.js} +1 -1
  77. package/out/renderer/assets/{use-session-snapshot-BbulmIXL.js → use-session-snapshot-Dkz_K7sg.js} +1 -1
  78. package/out/renderer/assets/{xychartDiagram-VJFVF3MP-CuNt7ik-.js → xychartDiagram-VJFVF3MP-DxmxrN_J.js} +1 -1
  79. package/out/renderer/console-capture.html +5 -5
  80. package/out/renderer/index.html +7 -7
  81. package/out/renderer/installer.html +4 -4
  82. package/out/renderer/mini.html +7 -7
  83. package/package.json +1 -1
  84. package/out/renderer/assets/browser-page-kxT2NYqz.js +0 -1
  85. package/out/renderer/assets/channel-D2-Cirxc.js +0 -1
  86. package/out/renderer/assets/classDiagram-GIVACNV2-D1u4IPED.js +0 -1
  87. package/out/renderer/assets/classDiagram-v2-COTLJTTW-D1u4IPED.js +0 -1
  88. package/out/renderer/assets/clone-D45gbF22.js +0 -1
  89. package/out/renderer/assets/index-DsY6xpO9.js +0 -57
  90. package/out/renderer/assets/settings-page-sXBnyGof.js +0 -287
  91. package/out/renderer/assets/stateDiagram-v2-YXO3MK2T-DhzpDrem.js +0 -1
  92. package/out/renderer/assets/ui-preferences-store-BZs48Tq1.js +0 -1
package/out/main/index.js CHANGED
@@ -81,6 +81,15 @@ const agentMessagesRefusalSchema = zod.z.object({
81
81
  details: zod.z.record(zod.z.unknown()).optional(),
82
82
  retry_after_seconds: zod.z.number().optional()
83
83
  }).passthrough();
84
+ const agentMessagesDeliveryHoldSchema = zod.z.object({
85
+ code: zod.z.string().min(1),
86
+ count: zod.z.number().int().nonnegative(),
87
+ /*
88
+ * Its own `.catch` (review R1-2): a bad session id degrades only the
89
+ * "Message chief of staff" target, never the count the owner must see.
90
+ */
91
+ session: zod.z.string().min(1).nullable().optional().catch(null)
92
+ }).passthrough().nullable().optional().catch(null);
84
93
  zod.z.object({
85
94
  capability: zod.z.number(),
86
95
  // Missing on frozen H1: absence forbids consent writes, not status reads.
@@ -119,7 +128,8 @@ zod.z.object({
119
128
  // F's posture: the server admits only safety-increasing edits. The
120
129
  // section gates the reach editor's controls rather than letting a reader
121
130
  // press a Save the server will refuse.
122
- read_only: zod.z.boolean().optional()
131
+ read_only: zod.z.boolean().optional(),
132
+ delivery_hold: agentMessagesDeliveryHoldSchema
123
133
  }).passthrough();
124
134
  const consentRecordSchema = zod.z.object({
125
135
  version: zod.z.string().min(1),
@@ -24765,7 +24775,7 @@ function consoleCompletionHooks(deps) {
24765
24775
  const state2 = deps.host()?.state();
24766
24776
  return state2?.displayed_surface === surface;
24767
24777
  };
24768
- const completionFor = (surface, exitCode, key) => {
24778
+ const completionFor = (surface, exitCode, key, exitSignal = null) => {
24769
24779
  const described = describe2(surface);
24770
24780
  if (!described) return null;
24771
24781
  return {
@@ -24773,6 +24783,7 @@ function consoleCompletionHooks(deps) {
24773
24783
  surface,
24774
24784
  surfaceName: described.command,
24775
24785
  exitCode,
24786
+ exitSignal,
24776
24787
  displayed: displayed(surface),
24777
24788
  key
24778
24789
  };
@@ -24826,7 +24837,8 @@ function consoleCompletionHooks(deps) {
24826
24837
  */
24827
24838
  onExit: ({
24828
24839
  surface,
24829
- exitCode
24840
+ exitCode,
24841
+ exitSignal
24830
24842
  }) => {
24831
24843
  const key = exitKey(surface);
24832
24844
  const previous = lastBanner.get(surface);
@@ -24836,7 +24848,7 @@ function consoleCompletionHooks(deps) {
24836
24848
  );
24837
24849
  return;
24838
24850
  }
24839
- const notice = completionFor(surface, exitCode, key);
24851
+ const notice = completionFor(surface, exitCode, key, exitSignal ?? null);
24840
24852
  if (notice) announce(notice, "exit");
24841
24853
  }
24842
24854
  };
@@ -25426,6 +25438,7 @@ class ConsoleRegistry {
25426
25438
  rows: input.rows,
25427
25439
  running: input.live !== false,
25428
25440
  exitCode: null,
25441
+ exitSignal: null,
25429
25442
  lastActivity: this.now(),
25430
25443
  live: input.live !== false,
25431
25444
  retain: input.retain,
@@ -25549,6 +25562,18 @@ const PERSIST_FLUSH_MS = 250;
25549
25562
  const PERSIST_FLUSH_BYTES = 256 * 1024;
25550
25563
  const FRAME_RETRY_DELAY_MS = 120;
25551
25564
  const CLOSE_GRACE_MS = 1500;
25565
+ const QUIT_EXIT_CAPTURE_MS = 400;
25566
+ function signalName(signal) {
25567
+ if (typeof signal === "string") {
25568
+ if (signal.length === 0) return null;
25569
+ return signal.startsWith("SIG") ? signal : `SIG${signal}`;
25570
+ }
25571
+ if (typeof signal !== "number" || signal <= 0) return null;
25572
+ for (const [name, number] of Object.entries(os.constants.signals))
25573
+ if (number === signal) return name;
25574
+ return `SIG${signal}`;
25575
+ }
25576
+ const QUIT_SIGNAL_GRACE_MS = 900;
25552
25577
  const SURFACE_ENV_MARKER = "LOCAL_OPERATOR_CONSOLE_SURFACE";
25553
25578
  const SESSION_ENV_MARKER = "LOCAL_OPERATOR_CONSOLE_SESSION";
25554
25579
  const SURFACE_TERM = "xterm-256color";
@@ -25624,6 +25649,12 @@ class ConsoleHost {
25624
25649
  * removes the record rather than leaving a surface that lists as running.
25625
25650
  */
25626
25651
  create(options) {
25652
+ if (this.disposing)
25653
+ throw new ConsoleError(
25654
+ "console_unavailable",
25655
+ "The console host is shutting down",
25656
+ { reason: "host_disposing" }
25657
+ );
25627
25658
  if (this.failedAllocations.size)
25628
25659
  throw new ConsoleError(
25629
25660
  "console_unavailable",
@@ -25708,7 +25739,9 @@ class ConsoleHost {
25708
25739
  };
25709
25740
  this.registry.attach(surface, runtime);
25710
25741
  pty.onData((data) => this.consume(surface, data));
25711
- pty.onExit((event) => this.exited(surface, event.exitCode));
25742
+ pty.onExit(
25743
+ (event) => this.exited(surface, event.exitCode, signalName(event.signal))
25744
+ );
25712
25745
  if (options.input) pty.write(options.input);
25713
25746
  if (entry.record.retain) this.flush(surface);
25714
25747
  this.options.log(
@@ -25810,10 +25843,13 @@ class ConsoleHost {
25810
25843
  meta.surface,
25811
25844
  Number.isFinite(meta.exit_epoch) ? meta.exit_epoch : 0
25812
25845
  );
25846
+ if (meta.end_reason === "app_quit")
25847
+ this.endReasons.set(meta.surface, "app_quit");
25813
25848
  if (!existing)
25814
25849
  this.registry.update(meta.surface, {
25815
25850
  running: false,
25816
25851
  exitCode: meta.exit_code,
25852
+ exitSignal: meta.exit_signal,
25817
25853
  live: false,
25818
25854
  secure: meta.secure === true,
25819
25855
  lastActivity: meta.last_seen_at
@@ -25872,6 +25908,7 @@ class ConsoleHost {
25872
25908
  this.registry.update(entry.record.surface, {
25873
25909
  running: false,
25874
25910
  exitCode: meta.exit_code,
25911
+ exitSignal: meta.exit_signal,
25875
25912
  live: false,
25876
25913
  lastActivity: meta.last_seen_at
25877
25914
  });
@@ -25913,6 +25950,12 @@ class ConsoleHost {
25913
25950
  rows: record.rows,
25914
25951
  running: record.running,
25915
25952
  exit_code: record.exitCode,
25953
+ exit_signal: record.exitSignal,
25954
+ /* Why the end happened when no code was observable (§7.3). Only the quit
25955
+ * path writes one, and it is the difference between "nobody could have
25956
+ * seen this" and main's old silence, which the pane read as an unknown
25957
+ * status. */
25958
+ end_reason: this.endReasons.get(record.surface) ?? null,
25916
25959
  last_activity: record.lastActivity,
25917
25960
  live: record.live,
25918
25961
  agent_owned: record.origin === "agent",
@@ -25947,6 +25990,8 @@ class ConsoleHost {
25947
25990
  return {
25948
25991
  running: entry.record.running,
25949
25992
  exit_code: entry.record.exitCode,
25993
+ exit_signal: entry.record.exitSignal,
25994
+ end_reason: this.endReasons.get(surface) ?? null,
25950
25995
  // The retention layer's counter, bumped once per `process_exited` (§7.3,
25951
25996
  // §10.2). Read from the host's live view of it: the sidecar is what makes
25952
25997
  // it survive a relaunch, and this is what the running process reports.
@@ -26430,14 +26475,16 @@ class ConsoleHost {
26430
26475
  }, OUTPUT_COALESCE_MS);
26431
26476
  runtime.pendingTimer.unref?.();
26432
26477
  }
26433
- exited(surface, exitCode) {
26478
+ exited(surface, exitCode, exitSignal = null) {
26434
26479
  const entry = this.registry.find(surface);
26435
26480
  if (!entry || !entry.runtime) return;
26436
26481
  this.registry.update(surface, {
26437
26482
  running: false,
26438
26483
  exitCode,
26484
+ exitSignal,
26439
26485
  lastActivity: this.now()
26440
26486
  });
26487
+ this.endReasons.delete(surface);
26441
26488
  this.bumpExitEpoch(entry);
26442
26489
  if (entry.record.retain) this.flush(surface);
26443
26490
  const runtime = entry.runtime;
@@ -26446,18 +26493,20 @@ class ConsoleHost {
26446
26493
  if (!runtime.exitDelivered) {
26447
26494
  runtime.exitDelivered = true;
26448
26495
  for (const subscriber of runtime.subscribers) {
26449
- subscriber.exit({ surface, exitCode });
26496
+ subscriber.exit({ surface, exitCode, exitSignal });
26450
26497
  }
26451
26498
  }
26452
26499
  this.options.log(
26453
- `[console] surface ${redactSurface(surface)} exited ${exitCode}`
26500
+ `[console] surface ${redactSurface(surface)} exited ${exitCode}${exitSignal === null ? "" : ` by ${exitSignal}`}`
26454
26501
  );
26455
26502
  this.options.onChanged?.();
26456
- this.options.onExit?.({
26457
- surface,
26458
- sessionId: entry.record.sessionId,
26459
- exitCode
26460
- });
26503
+ if (!this.disposing)
26504
+ this.options.onExit?.({
26505
+ surface,
26506
+ sessionId: entry.record.sessionId,
26507
+ exitCode,
26508
+ exitSignal
26509
+ });
26461
26510
  void runtime.emulator.whenIdle().then(() => {
26462
26511
  const current = this.registry.find(surface);
26463
26512
  if (!current || current.runtime !== runtime || current.record.running || !current.record.retain || current.record.secure || current.runtime.subscribers.size || surface === this.displayed || !this.options.history)
@@ -26812,6 +26861,8 @@ class ConsoleHost {
26812
26861
  created_at: this.createdAt.get(surface) ?? this.now(),
26813
26862
  last_seen_at: record.lastActivity,
26814
26863
  exit_code: record.exitCode,
26864
+ exit_signal: record.exitSignal,
26865
+ end_reason: this.endReasons.get(surface) ?? null,
26815
26866
  truncated: runtime.log.truncated,
26816
26867
  exit_epoch: this.exitEpoch.get(surface) ?? 0,
26817
26868
  secure: record.secure,
@@ -26926,10 +26977,62 @@ class ConsoleHost {
26926
26977
  this.persistedBytes.delete(surface);
26927
26978
  this.metaSignatures.delete(surface);
26928
26979
  this.exitEpoch.delete(surface);
26980
+ this.endReasons.delete(surface);
26929
26981
  this.options.onChanged?.();
26930
26982
  }
26983
+ /**
26984
+ * Let the quit path OBSERVE a surface's exit instead of killing it blind (§7.3).
26985
+ *
26986
+ * THE DEFECT THIS CLOSES: `dispose` used to persist the sidecar (with
26987
+ * `exit_code: null`) and then kill the pty, so the next launch restored "exit
26988
+ * code not observed" for a surface the app itself closed — a status the app
26989
+ * could have had, reported as one nobody could have. The order is now flush,
26990
+ * signal, wait, and let the exit land in the record before the final persist.
26991
+ *
26992
+ * BOUNDED TWICE, AND IN PARALLEL ACROSS SURFACES (`dispose` awaits them all at
26993
+ * once): SIGTERM gets the same grace a user-initiated close does, SIGKILL gets
26994
+ * `QUIT_EXIT_CAPTURE_MS` for the event loop to deliver its `onExit`, and only
26995
+ * after BOTH fail is the end recorded as `app_quit` — the honest sentence for a
26996
+ * status that genuinely could not be observed, and distinguishable from a legacy
26997
+ * sidecar that never looked.
26998
+ */
26999
+ async settleOnQuit(entry, persistHistory) {
27000
+ const runtime = entry.runtime;
27001
+ if (!runtime || !entry.record.running || !runtime.pty) return;
27002
+ if (persistHistory && entry.record.retain) this.persist(entry, runtime);
27003
+ const pty = runtime.pty;
27004
+ const exit = new Promise((resolve) => {
27005
+ runtime.exitWaiters.push(resolve);
27006
+ });
27007
+ let signalled = true;
27008
+ try {
27009
+ pty.kill();
27010
+ } catch {
27011
+ signalled = false;
27012
+ }
27013
+ const observed = await Promise.race([
27014
+ exit,
27015
+ delay(QUIT_SIGNAL_GRACE_MS).then(() => null)
27016
+ ]);
27017
+ if (observed !== null) return;
27018
+ try {
27019
+ pty.kill("SIGKILL");
27020
+ } catch {
27021
+ }
27022
+ const killed = await Promise.race([
27023
+ exit,
27024
+ delay(QUIT_EXIT_CAPTURE_MS).then(() => null)
27025
+ ]);
27026
+ if (killed === null) {
27027
+ this.endReasons.set(entry.record.surface, "app_quit");
27028
+ this.options.log(
27029
+ `[console] surface ${redactSurface(entry.record.surface)} did not report an exit within the quit bound${signalled ? "" : " (the signal itself was refused)"}; recording app_quit`
27030
+ );
27031
+ }
27032
+ }
26931
27033
  /** Stop everything: every pty, every record, every subscriber. */
26932
- dispose(persistHistory = true) {
27034
+ async dispose(persistHistory = true) {
27035
+ this.disposing = true;
26933
27036
  const allocationFailures = [...this.failedAllocations].flatMap(
26934
27037
  (allocation) => this.releaseFailedAllocation(allocation)
26935
27038
  );
@@ -26980,21 +27083,31 @@ class ConsoleHost {
26980
27083
  failures,
26981
27084
  "Partial console runtime cleanup incomplete."
26982
27085
  );
26983
- } else
26984
- for (const entry of this.registry.clear()) {
27086
+ } else {
27087
+ const entries = this.registry.list();
27088
+ for (const entry of entries) {
26985
27089
  const runtime = entry.runtime;
26986
27090
  if (!runtime) continue;
26987
27091
  if (runtime.pendingTimer) clearTimeout(runtime.pendingTimer);
26988
27092
  if (runtime.persistTimer) clearTimeout(runtime.persistTimer);
26989
27093
  runtime.subscribers.clear();
27094
+ }
27095
+ await Promise.all(
27096
+ entries.map((entry) => this.settleOnQuit(entry, persistHistory))
27097
+ );
27098
+ for (const entry of entries) {
27099
+ const runtime = entry.runtime;
27100
+ if (!runtime) continue;
26990
27101
  if (persistHistory && entry.record.retain) this.persist(entry, runtime);
26991
- if (entry.record.running) runtime.pty?.kill();
26992
27102
  runtime.emulator.dispose();
26993
27103
  }
27104
+ this.registry.clear();
27105
+ }
26994
27106
  this.createdAt.clear();
26995
27107
  this.persistedBytes.clear();
26996
27108
  this.metaSignatures.clear();
26997
27109
  this.exitEpoch.clear();
27110
+ this.endReasons.clear();
26998
27111
  if (allocationFailures.length)
26999
27112
  throw new AggregateError(
27000
27113
  allocationFailures,
@@ -27012,10 +27125,23 @@ class ConsoleHost {
27012
27125
  metaSignatures = /* @__PURE__ */ new Map();
27013
27126
  /** Each surface's exit generation, seeded from the sidecar on restore (§7.3). */
27014
27127
  exitEpoch = /* @__PURE__ */ new Map();
27128
+ /**
27129
+ * Why a surface's end could not be observed, when the quit path itself ended it.
27130
+ *
27131
+ * A SEPARATE MAP FROM THE RECORD, like `exitEpoch`: the reason has to outlive the
27132
+ * process that owns the record (it is persisted into the sidecar and read back on
27133
+ * the next launch), and it is cleared the moment a real exit is observed so a
27134
+ * subsequent run under the same handle cannot inherit the previous ending.
27135
+ */
27136
+ endReasons = /* @__PURE__ */ new Map();
27137
+ /** True from the first line of `dispose`; refuses creates and suppresses the
27138
+ * completion seam for the whole teardown (M-1, m-2). */
27139
+ disposing = false;
27015
27140
  }
27016
27141
  function metaSignature(meta) {
27017
27142
  return [
27018
27143
  meta.exit_code,
27144
+ meta.end_reason ?? "",
27019
27145
  meta.truncated,
27020
27146
  meta.cols,
27021
27147
  meta.rows,
@@ -27639,6 +27765,9 @@ class ConsoleHistory {
27639
27765
  function parseMeta(raw) {
27640
27766
  const meta = JSON.parse(raw);
27641
27767
  if (typeof meta.exit_epoch !== "number") meta.exit_epoch = 0;
27768
+ if (meta.end_reason !== "app_quit") meta.end_reason = null;
27769
+ if (typeof meta.exit_signal !== "string" || !/^SIG[A-Z0-9]+$/.test(meta.exit_signal))
27770
+ meta.exit_signal = null;
27642
27771
  return meta;
27643
27772
  }
27644
27773
  function enforceModes(path2) {
@@ -28171,12 +28300,12 @@ async function startConsoleHost(options) {
28171
28300
  let policyWatcher = null;
28172
28301
  let capacityProbe = null;
28173
28302
  let rollbackOwners = [];
28174
- const cleanupStartupOwners = () => {
28303
+ const cleanupStartupOwners = async () => {
28175
28304
  const pending = [];
28176
28305
  const failures = [];
28177
28306
  for (const release of rollbackOwners.splice(0).reverse()) {
28178
28307
  try {
28179
- release();
28308
+ await release();
28180
28309
  } catch (error) {
28181
28310
  pending.unshift(release);
28182
28311
  failures.push(error);
@@ -28326,13 +28455,13 @@ async function startConsoleHost(options) {
28326
28455
  capacityProbe?.stop();
28327
28456
  unregisterConsoleIpc();
28328
28457
  capture?.dispose();
28329
- readyHost.dispose();
28458
+ await readyHost.dispose();
28330
28459
  log2("[console] host stopped");
28331
28460
  }
28332
28461
  };
28333
28462
  } catch (error) {
28334
28463
  try {
28335
- cleanupStartupOwners();
28464
+ await cleanupStartupOwners();
28336
28465
  } catch (cleanupError) {
28337
28466
  log2(
28338
28467
  `[console] partial cleanup retained for stop: ${String(cleanupError)}`
@@ -28350,7 +28479,7 @@ async function startConsoleHost(options) {
28350
28479
  policyWatcher?.stop();
28351
28480
  capacityProbe?.stop();
28352
28481
  unregisterConsoleIpc();
28353
- cleanupStartupOwners();
28482
+ await cleanupStartupOwners();
28354
28483
  }
28355
28484
  };
28356
28485
  }
@@ -34959,7 +35088,10 @@ const enUiAgentMessagesSettings = {
34959
35088
  "ui.agentMessages.settings.allowlist.person_id": "Person ID",
34960
35089
  "ui.agentMessages.settings.allowlist.identifier_help_agent": "Enter an agent ID (bep_…)",
34961
35090
  "ui.agentMessages.settings.allowlist.identifier_help_person": "Enter a person ID (acc_…)",
34962
- "ui.agentMessages.settings.error.no_changes": "No settings were changed. Try again to check the current status."
35091
+ "ui.agentMessages.settings.error.no_changes": "No settings were changed. Try again to check the current status.",
35092
+ "ui.agentMessages.settings.hold.chief_of_staff": "{count, plural, one {{count} message is waiting for your chief of staff. Send one message in that conversation to receive it.} other {{count} messages are waiting for your chief of staff. Send one message in that conversation to receive them.}}",
35093
+ "ui.agentMessages.settings.hold.chief_of_staff_unlinked": "{count, plural, one {{count} message is waiting for your chief of staff. Find that conversation in the sidebar and send one message to receive it.} other {{count} messages are waiting for your chief of staff. Find that conversation in the sidebar and send one message to receive them.}}",
35094
+ "ui.agentMessages.settings.hold.open": "Message chief of staff"
34963
35095
  };
34964
35096
  const enUiAgentsDialogs = {
34965
35097
  "ui.agents.dialogs.create.title": "Create new agent",
@@ -36236,6 +36368,7 @@ const enUiConsole = {
36236
36368
  "ui.console.empty.detail": "A console runs a program in this conversation's directory and keeps its output, whether or not this pane is open.",
36237
36369
  "ui.console.empty.title": "No console in this session",
36238
36370
  "ui.console.ended.exit_code": "exit code {code}",
36371
+ "ui.console.ended.exit_signal": "killed by {signal}",
36239
36372
  "ui.console.ended.exit_unknown": "exit code not observed",
36240
36373
  "ui.console.ended.live": "This terminal has ended",
36241
36374
  "ui.console.ended.restored": "This terminal has ended and its history was restored",
@@ -36256,6 +36389,7 @@ const enUiConsole = {
36256
36389
  "ui.console.unavailable.title": "The console is not available in this app",
36257
36390
  "ui.console.unavailable.unknown.detail": "This window could not reach the console, and did not say why. The app's log carries the reason.",
36258
36391
  "ui.console.tab.ended": "ended",
36392
+ "ui.console.tab.exit_code": "exit {code}",
36259
36393
  "ui.console.tab.agent_opened": "An agent opened this console",
36260
36394
  "ui.console.tab.agent_typed": "An agent has typed into this console",
36261
36395
  "ui.console.tab.close_label": "Close {title}, tab {index, number, ::group-off} of {total, number, ::group-off}",
@@ -36266,7 +36400,11 @@ const enUiConsole = {
36266
36400
  "ui.console.secure_toggle.start_tooltip": "Secure input: stop recording this terminal",
36267
36401
  "ui.console.close.cancel": "Cancel",
36268
36402
  "ui.console.terminal.prompt_label": "Terminal input",
36269
- "ui.console.terminal.too_much_output": "Too much output to announce, navigate to rows manually to read"
36403
+ "ui.console.terminal.too_much_output": "Too much output to announce, navigate to rows manually to read",
36404
+ "ui.console.ended.app_quit": "the app closed it when it quit",
36405
+ "ui.console.ended.marker": "End of history",
36406
+ "ui.console.ended.marker_detail": "This terminal is read-only. Select text to copy it.",
36407
+ "ui.console.ended.input_blocked": "This terminal has ended, so that key was not sent. Open a new console to type again."
36270
36408
  };
36271
36409
  const enUiHubComments = {
36272
36410
  "ui.hub.comments.delete.confirm": "Are you sure you want to delete this comment?",
@@ -38692,7 +38830,10 @@ const esUiAgentMessagesSettings = {
38692
38830
  "ui.agentMessages.settings.allowlist.person_id": "ID de la persona",
38693
38831
  "ui.agentMessages.settings.allowlist.identifier_help_agent": "Escribe un ID de agente (bep_…)",
38694
38832
  "ui.agentMessages.settings.allowlist.identifier_help_person": "Escribe un ID de persona (acc_…)",
38695
- "ui.agentMessages.settings.error.no_changes": "No se cambió ningún ajuste. Inténtalo de nuevo para comprobar el estado actual."
38833
+ "ui.agentMessages.settings.error.no_changes": "No se cambió ningún ajuste. Inténtalo de nuevo para comprobar el estado actual.",
38834
+ "ui.agentMessages.settings.hold.chief_of_staff": "{count, plural, one {{count} mensaje está esperando a tu jefa de gabinete. Basta con escribirle una vez en su conversación para recibirlo.} many {{count} de mensajes están esperando a tu jefa de gabinete. Basta con escribirle una vez en su conversación para recibirlos.} other {{count} mensajes están esperando a tu jefa de gabinete. Basta con escribirle una vez en su conversación para recibirlos.}}",
38835
+ "ui.agentMessages.settings.hold.chief_of_staff_unlinked": "{count, plural, one {{count} mensaje está esperando a tu jefa de gabinete. Busca su conversación en la barra lateral y escríbele una vez para recibirlo.} many {{count} de mensajes están esperando a tu jefa de gabinete. Busca su conversación en la barra lateral y escríbele una vez para recibirlos.} other {{count} mensajes están esperando a tu jefa de gabinete. Busca su conversación en la barra lateral y escríbele una vez para recibirlos.}}",
38836
+ "ui.agentMessages.settings.hold.open": "Escribir a tu jefa de gabinete"
38696
38837
  };
38697
38838
  const esUiAgentsDialogs = {
38698
38839
  "ui.agents.dialogs.create.title": "Crear un agente",
@@ -39816,9 +39957,14 @@ const esUiConsole = {
39816
39957
  "ui.console.create_failed.title": "No se pudo iniciar la consola en esta sesión",
39817
39958
  "ui.console.empty.detail": "Una consola ejecuta un programa en la carpeta de esta conversación y conserva su salida, aunque este panel esté cerrado.",
39818
39959
  "ui.console.empty.title": "No hay ninguna consola en esta sesión",
39960
+ "ui.console.ended.app_quit": "la app la cerró al salir",
39819
39961
  "ui.console.ended.exit_code": "código de salida {code}",
39962
+ "ui.console.ended.exit_signal": "terminada por {signal}",
39820
39963
  "ui.console.ended.exit_unknown": "código de salida no observado",
39964
+ "ui.console.ended.input_blocked": "Esta terminal ha finalizado, así que esa tecla no se envió. Abre una nueva consola para volver a escribir.",
39821
39965
  "ui.console.ended.live": "Esta terminal ha finalizado",
39966
+ "ui.console.ended.marker": "Fin del historial",
39967
+ "ui.console.ended.marker_detail": "Esta terminal es de solo lectura. Selecciona el texto para copiarlo.",
39822
39968
  "ui.console.ended.restored": "Esta terminal ha finalizado y se ha restaurado su historial",
39823
39969
  "ui.console.loading.create": "Iniciando una consola",
39824
39970
  "ui.console.loading.read": "Leyendo la consola de esta sesión",
@@ -39837,6 +39983,7 @@ const esUiConsole = {
39837
39983
  "ui.console.unavailable.title": "La consola no está disponible en esta app",
39838
39984
  "ui.console.unavailable.unknown.detail": "Esta ventana no pudo acceder a la consola y no indicó por qué. El registro de la app contiene el motivo.",
39839
39985
  "ui.console.tab.ended": "finalizada",
39986
+ "ui.console.tab.exit_code": "código {code}",
39840
39987
  "ui.console.tab.agent_opened": "Un agente abrió esta consola",
39841
39988
  "ui.console.tab.agent_typed": "Un agente ha escrito en esta consola",
39842
39989
  "ui.console.tab.close_label": "Cerrar {title}, pestaña {index, number, ::group-off} de {total, number, ::group-off}",
@@ -42273,7 +42420,10 @@ const frUiAgentMessagesSettings = {
42273
42420
  "ui.agentMessages.settings.allowlist.person_id": "ID de la personne",
42274
42421
  "ui.agentMessages.settings.allowlist.identifier_help_agent": "Saisissez un ID d’agent (bep_…)",
42275
42422
  "ui.agentMessages.settings.allowlist.identifier_help_person": "Saisissez un ID de personne (acc_…)",
42276
- "ui.agentMessages.settings.error.no_changes": "Aucun paramètre n’a été modifié. Réessayez pour vérifier l’état actuel."
42423
+ "ui.agentMessages.settings.error.no_changes": "Aucun paramètre n’a été modifié. Réessayez pour vérifier l’état actuel.",
42424
+ "ui.agentMessages.settings.hold.chief_of_staff": "{count, plural, one {{count} message attend votre cheffe de cabinet. Envoyez un message dans sa conversation pour le recevoir.} many {{count} de messages attendent votre cheffe de cabinet. Envoyez un message dans sa conversation pour les recevoir.} other {{count} messages attendent votre cheffe de cabinet. Envoyez un message dans sa conversation pour les recevoir.}}",
42425
+ "ui.agentMessages.settings.hold.chief_of_staff_unlinked": "{count, plural, one {{count} message attend votre cheffe de cabinet. Retrouvez sa conversation dans la barre latérale et envoyez-y un message pour le recevoir.} many {{count} de messages attendent votre cheffe de cabinet. Retrouvez sa conversation dans la barre latérale et envoyez-y un message pour les recevoir.} other {{count} messages attendent votre cheffe de cabinet. Retrouvez sa conversation dans la barre latérale et envoyez-y un message pour les recevoir.}}",
42426
+ "ui.agentMessages.settings.hold.open": "Écrire à la cheffe de cabinet"
42277
42427
  };
42278
42428
  const frUiAgentsDialogs = {
42279
42429
  "ui.agents.dialogs.create.title": "Créer un agent",
@@ -43382,9 +43532,14 @@ const frUiConsole = {
43382
43532
  "ui.console.create_failed.title": "Impossible de démarrer la console dans cette session",
43383
43533
  "ui.console.empty.detail": "Une console exécute un programme dans le dossier de cette conversation et conserve sa sortie, même si ce volet est fermé.",
43384
43534
  "ui.console.empty.title": "Aucune console dans cette session",
43535
+ "ui.console.ended.app_quit": "l’application l’a fermé en quittant",
43385
43536
  "ui.console.ended.exit_code": "code de sortie {code}",
43537
+ "ui.console.ended.exit_signal": "tué par {signal}",
43386
43538
  "ui.console.ended.exit_unknown": "code de sortie non observé",
43539
+ "ui.console.ended.input_blocked": "Ce terminal est terminé : cette touche n’a pas été envoyée. Ouvrez une nouvelle console pour saisir à nouveau.",
43387
43540
  "ui.console.ended.live": "Ce terminal est terminé",
43541
+ "ui.console.ended.marker": "Fin de l’historique",
43542
+ "ui.console.ended.marker_detail": "Ce terminal est en lecture seule. Sélectionnez le texte à copier.",
43388
43543
  "ui.console.ended.restored": "Ce terminal est terminé, historique restauré",
43389
43544
  "ui.console.loading.create": "Démarrage d’une console",
43390
43545
  "ui.console.loading.read": "Lecture de la console de cette session",
@@ -43418,6 +43573,7 @@ const frUiConsole = {
43418
43573
  "ui.console.dismiss.title": "Effacer ce terminal ?",
43419
43574
  "ui.console.dismiss.confirm": "Effacer le terminal",
43420
43575
  "ui.console.tab.ended": "terminé",
43576
+ "ui.console.tab.exit_code": "sortie {code}",
43421
43577
  "ui.console.tab.agent_opened": "Un agent a ouvert cette console",
43422
43578
  "ui.console.tab.agent_typed": "Un agent a saisi du texte dans cette console",
43423
43579
  "ui.console.tab.close_label": "Fermer {title}, onglet {index, number, ::group-off} sur {total, number, ::group-off}",
@@ -45854,7 +46010,10 @@ const hiUiAgentMessagesSettings = {
45854
46010
  "ui.agentMessages.settings.allowlist.person_id": "व्यक्ति ID",
45855
46011
  "ui.agentMessages.settings.allowlist.identifier_help_agent": "एजेंट ID दर्ज करें (bep_…)",
45856
46012
  "ui.agentMessages.settings.allowlist.identifier_help_person": "व्यक्ति ID दर्ज करें (acc_…)",
45857
- "ui.agentMessages.settings.error.no_changes": "कोई सेटिंग नहीं बदली गई। मौजूदा स्थिति जाँचने के लिए फिर कोशिश करें।"
46013
+ "ui.agentMessages.settings.error.no_changes": "कोई सेटिंग नहीं बदली गई। मौजूदा स्थिति जाँचने के लिए फिर कोशिश करें।",
46014
+ "ui.agentMessages.settings.hold.chief_of_staff": "{count, plural, one {आपकी चीफ़ ऑफ़ स्टाफ के लिए {count} संदेश इंतज़ार में है। उसे पाने के लिए उस बातचीत में एक संदेश भेजें।} other {आपकी चीफ़ ऑफ़ स्टाफ के लिए {count} संदेश इंतज़ार में हैं। उन्हें पाने के लिए उस बातचीत में एक संदेश भेजें।}}",
46015
+ "ui.agentMessages.settings.hold.chief_of_staff_unlinked": "{count, plural, one {आपकी चीफ़ ऑफ़ स्टाफ के लिए {count} संदेश इंतज़ार में है। उसे पाने के लिए साइडबार में वह बातचीत खोजें और उसमें एक संदेश भेजें।} other {आपकी चीफ़ ऑफ़ स्टाफ के लिए {count} संदेश इंतज़ार में हैं। उन्हें पाने के लिए साइडबार में वह बातचीत खोजें और उसमें एक संदेश भेजें।}}",
46016
+ "ui.agentMessages.settings.hold.open": "चीफ़ ऑफ़ स्टाफ को संदेश भेजें"
45858
46017
  };
45859
46018
  const hiUiAgentsDialogs = {
45860
46019
  "ui.agents.dialogs.create.title": "नया एजेंट बनाएँ",
@@ -46947,9 +47106,14 @@ const hiUiConsole = {
46947
47106
  "ui.console.create_failed.title": "इस सत्र में कंसोल शुरू नहीं हो सका",
46948
47107
  "ui.console.empty.detail": "कंसोल इस बातचीत के फ़ोल्डर में प्रोग्राम चलाता है और उसका आउटपुट रखता है, चाहे यह पैनल खुला हो या नहीं।",
46949
47108
  "ui.console.empty.title": "इस सत्र में कोई कंसोल नहीं है",
47109
+ "ui.console.ended.app_quit": "ऐप बंद होने पर इसे बंद किया गया",
46950
47110
  "ui.console.ended.exit_code": "एग्ज़िट कोड {code}",
47111
+ "ui.console.ended.exit_signal": "{signal} से बंद किया गया",
46951
47112
  "ui.console.ended.exit_unknown": "एग्ज़िट कोड उपलब्ध नहीं है",
47113
+ "ui.console.ended.input_blocked": "यह टर्मिनल समाप्त हो चुका है, इसलिए वह कुंजी नहीं भेजी गई। फिर से टाइप करने के लिए नया कंसोल खोलें।",
46952
47114
  "ui.console.ended.live": "यह टर्मिनल समाप्त हो चुका है",
47115
+ "ui.console.ended.marker": "इतिहास का अंत",
47116
+ "ui.console.ended.marker_detail": "यह टर्मिनल सिर्फ़ पढ़ने के लिए है। कॉपी करने के लिए टेक्स्ट चुनें।",
46953
47117
  "ui.console.ended.restored": "यह टर्मिनल समाप्त हो चुका है और उसका इतिहास बहाल किया गया है",
46954
47118
  "ui.console.loading.create": "कंसोल शुरू हो रहा है",
46955
47119
  "ui.console.loading.read": "इस सत्र का कंसोल पढ़ा जा रहा है",
@@ -46968,6 +47132,7 @@ const hiUiConsole = {
46968
47132
  "ui.console.unavailable.title": "इस ऐप में कंसोल उपलब्ध नहीं है",
46969
47133
  "ui.console.unavailable.unknown.detail": "यह विंडो कंसोल से संपर्क नहीं कर सकी और इसकी वजह नहीं बताई। वजह ऐप के लॉग में दी गई है।",
46970
47134
  "ui.console.tab.ended": "समाप्त",
47135
+ "ui.console.tab.exit_code": "एग्ज़िट {code}",
46971
47136
  "ui.console.tab.agent_opened": "यह कंसोल किसी एजेंट ने खोला था",
46972
47137
  "ui.console.tab.agent_typed": "इस कंसोल में किसी एजेंट ने टाइप किया है",
46973
47138
  "ui.console.tab.close_label": "{title} बंद करें, टैब {index, number, ::group-off}, कुल {total, number, ::group-off}",
@@ -49214,6 +49379,95 @@ const ruUiAgentMessages = {
49214
49379
  "ui.agentMessages.dialog.validation_detail": "{field}: {rule}",
49215
49380
  "ui.agentMessages.dialog.validation_failure": "Запрос настройки не принят. Обновите Local Operator и повторите попытку."
49216
49381
  };
49382
+ const ruUiAgentMessagesSettings = {
49383
+ "ui.agentMessages.settings.section": "Сообщения агентов",
49384
+ "ui.agentMessages.settings.description": "Ваш агент может обмениваться сообщениями с агентами других участников вашей организации.",
49385
+ "ui.agentMessages.settings.off_by_default": "По умолчанию выключено.",
49386
+ "ui.agentMessages.settings.state.b_title": "Сообщения агентов выключены",
49387
+ "ui.agentMessages.settings.state.b_body": "Включите сообщения агентов, чтобы обмениваться заметками, вопросами и запросами на одобрение с агентами других участников вашей организации.",
49388
+ "ui.agentMessages.settings.state.c_title": "Включено",
49389
+ "ui.agentMessages.settings.state.c_body": "Ваш агент может отправлять сообщения участникам вашей организации и получать сообщения от них.",
49390
+ "ui.agentMessages.settings.state.d_title": "Приостановлено",
49391
+ "ui.agentMessages.settings.state.d_body": "Обмен сообщениями приостановлен в обоих направлениях. Сообщения в очереди сохраняются, а на ожидающие запросы по-прежнему можно ответить. Для возобновления новое согласие не требуется.",
49392
+ "ui.agentMessages.settings.state.e_title": "Отключено",
49393
+ "ui.agentMessages.settings.state.e_body": "Сообщения агентов отключены для этой учётной записи. При повторном включении согласие нужно будет дать заново.",
49394
+ "ui.agentMessages.settings.state.f_title": "Сообщения агентов отключены",
49395
+ "ui.agentMessages.settings.state.f_body": "Ваша организация отключила сообщения агентов. История остаётся доступной для чтения.",
49396
+ "ui.agentMessages.settings.state.turned_off_title": "Сообщения агентов отключены",
49397
+ "ui.agentMessages.settings.state.turned_off_org": "Отключено вашей организацией",
49398
+ "ui.agentMessages.settings.state.read_only": "Эта запись о согласии доступна только для чтения.",
49399
+ "ui.agentMessages.settings.action.enable": "Включить",
49400
+ "ui.agentMessages.settings.action.enable_again": "Включить снова",
49401
+ "ui.agentMessages.settings.action.pause": "Приостановить",
49402
+ "ui.agentMessages.settings.action.resume": "Возобновить",
49403
+ "ui.agentMessages.settings.action.turn_off": "Отключить",
49404
+ "ui.agentMessages.settings.local.label": "Включено на этом компьютере",
49405
+ "ui.agentMessages.settings.local.stays_enrolled": "Ваша регистрация остаётся активной для этой учётной записи и на других ваших компьютерах.",
49406
+ "ui.agentMessages.settings.saving": "Сохранение…",
49407
+ "ui.agentMessages.settings.consent.show": "Прочитать текст согласия",
49408
+ "ui.agentMessages.settings.consent.version": "Версия согласия",
49409
+ "ui.agentMessages.settings.consent.via": "Где получено",
49410
+ "ui.agentMessages.settings.consent.at": "Принято",
49411
+ "ui.agentMessages.settings.consent.via_dialog": "Окно согласия",
49412
+ "ui.agentMessages.settings.consent.via_settings": "Настройки",
49413
+ "ui.agentMessages.settings.consent.no_record": "Для этого endpoint нет записи о согласии.",
49414
+ "ui.agentMessages.settings.consent.renew": "Согласие нужно обновить. Прочитайте актуальный текст и включите снова.",
49415
+ "ui.agentMessages.settings.consent.unavailable": "Согласие недоступно. Сообщения агентов не включены.",
49416
+ "ui.agentMessages.settings.consent.changed": "Прочитайте актуальный текст согласия ниже и включите снова.",
49417
+ "ui.agentMessages.settings.allowlist.title": "Доступ",
49418
+ "ui.agentMessages.settings.allowlist.description": "Выберите, кто может писать вам и кому можете писать вы.",
49419
+ "ui.agentMessages.settings.allowlist.level": "Кто может писать",
49420
+ "ui.agentMessages.settings.allowlist.send": "Кому вы можете писать",
49421
+ "ui.agentMessages.settings.allowlist.receive": "Кто может писать вам",
49422
+ "ui.agentMessages.settings.allowlist.anyone": "Все в моей организации",
49423
+ "ui.agentMessages.settings.allowlist.listed_only": "Только выбранные агенты",
49424
+ "ui.agentMessages.settings.allowlist.cue_listed_only": "Если выбрать «Только выбранные агенты», новые разговоры в этом направлении будут ограничены этим списком.",
49425
+ "ui.agentMessages.settings.allowlist.cue_remove": "Удаление записи не прерывает открытый разговор, а блокировка — прерывает.",
49426
+ "ui.agentMessages.settings.allowlist.cue_deny": "Блокировка действует в обоих направлениях.",
49427
+ "ui.agentMessages.settings.allowlist.allowed_heading": "Разрешённые",
49428
+ "ui.agentMessages.settings.allowlist.allowed_empty": "Пока нет разрешённых агентов или людей.",
49429
+ "ui.agentMessages.settings.allowlist.blocked_heading": "Заблокированные",
49430
+ "ui.agentMessages.settings.allowlist.blocked_empty": "Никто не заблокирован.",
49431
+ "ui.agentMessages.settings.allowlist.add": "Добавить",
49432
+ "ui.agentMessages.settings.allowlist.add_allowed": "Разрешить агента или человека",
49433
+ "ui.agentMessages.settings.allowlist.add_blocked": "Заблокировать агента или человека",
49434
+ "ui.agentMessages.settings.allowlist.kind": "Тип",
49435
+ "ui.agentMessages.settings.allowlist.kind_agent": "Агент",
49436
+ "ui.agentMessages.settings.allowlist.kind_person": "Человек",
49437
+ "ui.agentMessages.settings.allowlist.identifier": "Идентификатор",
49438
+ "ui.agentMessages.settings.allowlist.identifier_empty": "Введите идентификатор.",
49439
+ "ui.agentMessages.settings.allowlist.identifier_long": "Идентификатор может содержать не более 128 символов.",
49440
+ "ui.agentMessages.settings.allowlist.identifier_invalid": "Идентификатор не может содержать пробелы и управляющие символы.",
49441
+ "ui.agentMessages.settings.allowlist.remove": "Удалить",
49442
+ "ui.agentMessages.settings.allowlist.save": "Сохранить настройки доступа",
49443
+ "ui.agentMessages.settings.allowlist.needs_entry": "Добавьте хотя бы одного агента или человека либо выберите «Все в моей организации».",
49444
+ "ui.agentMessages.settings.allowlist.unchanged": "Нет изменений для сохранения.",
49445
+ "ui.agentMessages.settings.session.title": "Сессия для новых сообщений",
49446
+ "ui.agentMessages.settings.session.help": "Сессия, которую можно пробуждать при новых сообщениях; пусто — только значок.",
49447
+ "ui.agentMessages.settings.session.none": "Без сессии — только значок",
49448
+ "ui.agentMessages.settings.session.unavailable": "Эта сессия больше недоступна.",
49449
+ "ui.agentMessages.settings.dark.title": "Пока недоступно",
49450
+ "ui.agentMessages.settings.dark.body": "Сообщения агентов пока недоступны.",
49451
+ "ui.agentMessages.settings.dark.nothing_enabled": "На этом компьютере ничего не включено.",
49452
+ "ui.agentMessages.settings.error.title": "Не удалось загрузить сообщения агентов",
49453
+ "ui.agentMessages.settings.error.retry": "Повторить",
49454
+ "ui.agentMessages.settings.error.unreadable": "Этот компьютер вернул ответ с настройками, который приложение не смогло прочитать.",
49455
+ "ui.agentMessages.settings.refusal.sign_in": "Войдите в Radient, чтобы управлять сообщениями агентов.",
49456
+ "ui.agentMessages.settings.refusal.not_available": "Сообщения агентов недоступны для этой учётной записи.",
49457
+ "ui.agentMessages.settings.refusal.disabled": "Ваша организация отключила сообщения агентов.",
49458
+ "ui.agentMessages.settings.refusal.rate_limited": "Слишком много запросов. Подождите немного и повторите попытку.",
49459
+ "ui.agentMessages.settings.refusal.invalid_request": "Изменение не принято. Проверьте запись и повторите попытку.",
49460
+ "ui.agentMessages.settings.refusal.generic": "Не удалось обновить сообщения агентов. Повторите попытку.",
49461
+ "ui.agentMessages.settings.allowlist.read_only": "Настройки доступа нельзя изменить, пока сообщения агентов отключены.",
49462
+ "ui.agentMessages.settings.allowlist.agent_id": "ID агента",
49463
+ "ui.agentMessages.settings.allowlist.person_id": "ID человека",
49464
+ "ui.agentMessages.settings.allowlist.identifier_help_agent": "Введите ID агента (bep_…)",
49465
+ "ui.agentMessages.settings.allowlist.identifier_help_person": "Введите ID человека (acc_…)",
49466
+ "ui.agentMessages.settings.error.no_changes": "Настройки не изменены. Повторите попытку, чтобы проверить текущее состояние.",
49467
+ "ui.agentMessages.settings.hold.chief_of_staff": "{count, plural, one {{count} сообщение ждёт вашего координатора. Чтобы получить его, отправьте одно сообщение в этом разговоре.} few {{count} сообщения ждут вашего координатора. Чтобы получить их, отправьте одно сообщение в этом разговоре.} many {{count} сообщений ждут вашего координатора. Чтобы получить их, отправьте одно сообщение в этом разговоре.} other {{count} сообщения ждут вашего координатора. Чтобы получить их, отправьте одно сообщение в этом разговоре.}}",
49468
+ "ui.agentMessages.settings.hold.chief_of_staff_unlinked": "{count, plural, one {{count} сообщение ждёт вашего координатора. Чтобы получить его, найдите этот разговор на боковой панели и отправьте в нём одно сообщение.} few {{count} сообщения ждут вашего координатора. Чтобы получить их, найдите этот разговор на боковой панели и отправьте в нём одно сообщение.} many {{count} сообщений ждут вашего координатора. Чтобы получить их, найдите этот разговор на боковой панели и отправьте в нём одно сообщение.} other {{count} сообщения ждут вашего координатора. Чтобы получить их, найдите этот разговор на боковой панели и отправьте в нём одно сообщение.}}",
49469
+ "ui.agentMessages.settings.hold.open": "Написать координатору"
49470
+ };
49217
49471
  const ruUiAgentsDialogs = {
49218
49472
  "ui.agents.dialogs.clear.cancel": "Отмена",
49219
49473
  "ui.agents.dialogs.clear.confirm": "Очистить",
@@ -50325,9 +50579,14 @@ const ruUiConsole = {
50325
50579
  "ui.console.create_failed.title": "Не удалось запустить консоль в этой сессии",
50326
50580
  "ui.console.empty.detail": "Консоль запускает программу в папке этого разговора и сохраняет её вывод, даже когда эта панель закрыта.",
50327
50581
  "ui.console.empty.title": "В этой сессии нет консоли",
50582
+ "ui.console.ended.app_quit": "приложение закрыло его при выходе",
50328
50583
  "ui.console.ended.exit_code": "код завершения {code}",
50584
+ "ui.console.ended.exit_signal": "остановлен сигналом {signal}",
50329
50585
  "ui.console.ended.exit_unknown": "код завершения не получен",
50586
+ "ui.console.ended.input_blocked": "Этот терминал завершил работу, поэтому нажатие не отправлено. Откройте новую консоль, чтобы снова вводить текст.",
50330
50587
  "ui.console.ended.live": "Этот терминал завершил работу",
50588
+ "ui.console.ended.marker": "Конец истории",
50589
+ "ui.console.ended.marker_detail": "Терминал только для чтения. Выделите текст, чтобы скопировать его.",
50331
50590
  "ui.console.ended.restored": "Этот терминал завершил работу; его история восстановлена",
50332
50591
  "ui.console.loading.create": "Запуск консоли",
50333
50592
  "ui.console.loading.read": "Чтение консоли этой сессии",
@@ -50346,6 +50605,7 @@ const ruUiConsole = {
50346
50605
  "ui.console.unavailable.title": "Консоль недоступна в этом приложении",
50347
50606
  "ui.console.unavailable.unknown.detail": "Это окно не смогло подключиться к консоли и не сообщило причину. Она указана в журнале приложения.",
50348
50607
  "ui.console.tab.ended": "завершён",
50608
+ "ui.console.tab.exit_code": "код {code}",
50349
50609
  "ui.console.tab.agent_opened": "Агент открыл эту консоль",
50350
50610
  "ui.console.tab.agent_typed": "Агент вводил текст в этой консоли",
50351
50611
  "ui.console.tab.close_label": "Закрыть {title}, вкладка {index, number, ::group-off} из {total, number, ::group-off}",
@@ -52676,7 +52936,10 @@ const urUiAgentMessagesSettings = {
52676
52936
  "ui.agentMessages.settings.allowlist.person_id": "شخص کی ID",
52677
52937
  "ui.agentMessages.settings.allowlist.identifier_help_agent": "ایجنٹ ID درج کریں (bep_…)",
52678
52938
  "ui.agentMessages.settings.allowlist.identifier_help_person": "شخص کی ID درج کریں (acc_…)",
52679
- "ui.agentMessages.settings.error.no_changes": "کوئی ترتیب تبدیل نہیں ہوئی۔ موجودہ حالت جانچنے کے لیے دوبارہ کوشش کریں۔"
52939
+ "ui.agentMessages.settings.error.no_changes": "کوئی ترتیب تبدیل نہیں ہوئی۔ موجودہ حالت جانچنے کے لیے دوبارہ کوشش کریں۔",
52940
+ "ui.agentMessages.settings.hold.chief_of_staff": "{count, plural, one {{count} پیغام آپ کی چیف آف اسٹاف کا منتظر ہے۔ اسے وصول کرنے کے لیے اس گفتگو میں ایک پیغام بھیجیں۔} other {{count} پیغامات آپ کی چیف آف اسٹاف کے منتظر ہیں۔ انہیں وصول کرنے کے لیے اس گفتگو میں ایک پیغام بھیجیں۔}}",
52941
+ "ui.agentMessages.settings.hold.chief_of_staff_unlinked": "{count, plural, one {{count} پیغام آپ کی چیف آف اسٹاف کا منتظر ہے۔ اسے وصول کرنے کے لیے سائیڈ بار میں وہ گفتگو تلاش کریں اور اس میں ایک پیغام بھیجیں۔} other {{count} پیغامات آپ کی چیف آف اسٹاف کے منتظر ہیں۔ انہیں وصول کرنے کے لیے سائیڈ بار میں وہ گفتگو تلاش کریں اور اس میں ایک پیغام بھیجیں۔}}",
52942
+ "ui.agentMessages.settings.hold.open": "چیف آف اسٹاف کو پیغام بھیجیں"
52680
52943
  };
52681
52944
  const urUiAgentsDialogs = {
52682
52945
  "ui.agents.dialogs.create.title": "نیا ایجنٹ بنائیں",
@@ -53789,9 +54052,14 @@ const urUiConsole = {
53789
54052
  "ui.console.create_failed.title": "اس سیشن میں کنسول شروع نہیں ہو سکا",
53790
54053
  "ui.console.empty.detail": "کنسول اس گفتگو کی ڈائریکٹری میں پروگرام چلاتا اور اس کا آؤٹ پٹ محفوظ رکھتا ہے، چاہے یہ پین کھلا ہو یا نہ ہو۔",
53791
54054
  "ui.console.empty.title": "اس سیشن میں کوئی کنسول نہیں",
54055
+ "ui.console.ended.app_quit": "ایپ کے بند ہونے پر اسے بند کر دیا گیا",
53792
54056
  "ui.console.ended.exit_code": "اخراج کوڈ {code}",
54057
+ "ui.console.ended.exit_signal": "{signal} کے ذریعے ختم کیا گیا",
53793
54058
  "ui.console.ended.exit_unknown": "اخراج کوڈ معلوم نہیں ہوا",
54059
+ "ui.console.ended.input_blocked": "یہ ٹرمینل ختم ہو چکا ہے، اس لیے وہ کلید نہیں بھیجی گئی۔ دوبارہ ٹائپ کرنے کے لیے نیا کنسول کھولیں۔",
53794
54060
  "ui.console.ended.live": "یہ ٹرمینل ختم ہو چکا ہے",
54061
+ "ui.console.ended.marker": "تاریخچے کا اختتام",
54062
+ "ui.console.ended.marker_detail": "یہ ٹرمینل صرف پڑھنے کے لیے ہے۔ اسے نقل کرنے کے لیے متن منتخب کریں۔",
53795
54063
  "ui.console.ended.restored": "یہ ٹرمینل ختم ہو چکا ہے اور اس کا تاریخچہ بحال ہو گیا",
53796
54064
  "ui.console.loading.create": "کنسول شروع ہو رہا ہے",
53797
54065
  "ui.console.loading.read": "اس سیشن کا کنسول پڑھا جا رہا ہے",
@@ -53810,6 +54078,7 @@ const urUiConsole = {
53810
54078
  "ui.console.unavailable.title": "اس ایپ میں کنسول دستیاب نہیں",
53811
54079
  "ui.console.unavailable.unknown.detail": "یہ ونڈو کنسول تک نہیں پہنچ سکی، اور وجہ نہیں بتائی۔ وجہ ایپ کے لاگ میں درج ہے۔",
53812
54080
  "ui.console.tab.ended": "ختم شدہ",
54081
+ "ui.console.tab.exit_code": "اخراج {code}",
53813
54082
  "ui.console.tab.agent_opened": "ایک ایجنٹ نے یہ کنسول کھولا",
53814
54083
  "ui.console.tab.agent_typed": "ایک ایجنٹ نے اس کنسول میں ٹائپ کیا ہے",
53815
54084
  "ui.console.tab.close_label": "{title} بند کریں، {total, number, ::group-off} میں سے ٹیب {index, number, ::group-off}",
@@ -56056,6 +56325,95 @@ const viUiAgentMessages = {
56056
56325
  "ui.agentMessages.dialog.validation_detail": "{field}: {rule}",
56057
56326
  "ui.agentMessages.dialog.validation_failure": "Yêu cầu thiết lập này không được chấp nhận. Hãy cập nhật Local Operator rồi thử lại."
56058
56327
  };
56328
+ const viUiAgentMessagesSettings = {
56329
+ "ui.agentMessages.settings.section": "Tin nhắn tác nhân",
56330
+ "ui.agentMessages.settings.description": "Tác nhân của bạn có thể trao đổi tin nhắn với tác nhân của các thành viên khác trong tổ chức.",
56331
+ "ui.agentMessages.settings.off_by_default": "Mặc định tắt.",
56332
+ "ui.agentMessages.settings.state.b_title": "Tin nhắn tác nhân đang tắt",
56333
+ "ui.agentMessages.settings.state.b_body": "Bật tin nhắn tác nhân để trao đổi ghi chú, câu hỏi và yêu cầu phê duyệt với tác nhân của các thành viên khác trong tổ chức.",
56334
+ "ui.agentMessages.settings.state.c_title": "Đang bật",
56335
+ "ui.agentMessages.settings.state.c_body": "Tác nhân của bạn có thể gửi và nhận tin nhắn với các thành viên trong tổ chức.",
56336
+ "ui.agentMessages.settings.state.d_title": "Đã tạm dừng",
56337
+ "ui.agentMessages.settings.state.d_body": "Tin nhắn ngừng gửi và nhận ở cả hai chiều. Tin nhắn trong hàng đợi vẫn được giữ và bạn vẫn có thể trả lời các yêu cầu đang chờ. Khi tiếp tục, bạn không cần chấp thuận lại.",
56338
+ "ui.agentMessages.settings.state.e_title": "Đã tắt",
56339
+ "ui.agentMessages.settings.state.e_body": "Tin nhắn tác nhân đang tắt cho tài khoản này. Khi bật lại, một lần chấp thuận mới sẽ được ghi nhận.",
56340
+ "ui.agentMessages.settings.state.f_title": "Tin nhắn tác nhân đã bị tắt",
56341
+ "ui.agentMessages.settings.state.f_body": "Tổ chức của bạn đã tắt tin nhắn tác nhân. Bạn vẫn có thể đọc lịch sử.",
56342
+ "ui.agentMessages.settings.state.turned_off_title": "Tin nhắn tác nhân đã bị tắt",
56343
+ "ui.agentMessages.settings.state.turned_off_org": "Do tổ chức của bạn tắt",
56344
+ "ui.agentMessages.settings.state.read_only": "Hồ sơ chấp thuận này ở chế độ chỉ đọc.",
56345
+ "ui.agentMessages.settings.action.enable": "Bật",
56346
+ "ui.agentMessages.settings.action.enable_again": "Bật lần nữa",
56347
+ "ui.agentMessages.settings.action.pause": "Tạm dừng",
56348
+ "ui.agentMessages.settings.action.resume": "Tiếp tục",
56349
+ "ui.agentMessages.settings.action.turn_off": "Tắt",
56350
+ "ui.agentMessages.settings.local.label": "Đã bật trên máy này",
56351
+ "ui.agentMessages.settings.local.stays_enrolled": "Bạn vẫn tham gia tin nhắn tác nhân trên tài khoản này và các máy khác của bạn.",
56352
+ "ui.agentMessages.settings.saving": "Đang lưu…",
56353
+ "ui.agentMessages.settings.consent.show": "Đọc nội dung chấp thuận",
56354
+ "ui.agentMessages.settings.consent.version": "Phiên bản chấp thuận",
56355
+ "ui.agentMessages.settings.consent.via": "Ghi nhận qua",
56356
+ "ui.agentMessages.settings.consent.at": "Chấp thuận lúc",
56357
+ "ui.agentMessages.settings.consent.via_dialog": "Hộp thoại làm quen",
56358
+ "ui.agentMessages.settings.consent.via_settings": "Cài đặt",
56359
+ "ui.agentMessages.settings.consent.no_record": "Endpoint này chưa có hồ sơ chấp thuận.",
56360
+ "ui.agentMessages.settings.consent.renew": "Cần chấp thuận lại. Đọc nội dung hiện tại rồi chọn Bật lần nữa.",
56361
+ "ui.agentMessages.settings.consent.unavailable": "Chưa có nội dung chấp thuận. Tin nhắn tác nhân chưa được bật.",
56362
+ "ui.agentMessages.settings.consent.changed": "Đọc nội dung chấp thuận hiện tại bên dưới, rồi chọn Bật lần nữa.",
56363
+ "ui.agentMessages.settings.allowlist.title": "Phạm vi liên lạc",
56364
+ "ui.agentMessages.settings.allowlist.description": "Chọn ai có thể nhắn tin cho bạn và bạn có thể nhắn tin cho ai.",
56365
+ "ui.agentMessages.settings.allowlist.level": "Ai được nhắn tin",
56366
+ "ui.agentMessages.settings.allowlist.send": "Bạn có thể nhắn cho ai",
56367
+ "ui.agentMessages.settings.allowlist.receive": "Ai có thể nhắn cho bạn",
56368
+ "ui.agentMessages.settings.allowlist.anyone": "Mọi người trong tổ chức của tôi",
56369
+ "ui.agentMessages.settings.allowlist.listed_only": "Chỉ tác nhân tôi chọn",
56370
+ "ui.agentMessages.settings.allowlist.cue_listed_only": "Chọn “Chỉ tác nhân tôi chọn” sẽ giới hạn các cuộc trò chuyện mới theo chiều đó trong danh sách này.",
56371
+ "ui.agentMessages.settings.allowlist.cue_remove": "Xóa một mục không dừng cuộc trò chuyện đang mở. Chặn thì có.",
56372
+ "ui.agentMessages.settings.allowlist.cue_deny": "Chặn có hiệu lực ở cả hai chiều.",
56373
+ "ui.agentMessages.settings.allowlist.allowed_heading": "Đã cho phép",
56374
+ "ui.agentMessages.settings.allowlist.allowed_empty": "Chưa cho phép tác nhân hay người dùng nào.",
56375
+ "ui.agentMessages.settings.allowlist.blocked_heading": "Đã chặn",
56376
+ "ui.agentMessages.settings.allowlist.blocked_empty": "Chưa chặn ai.",
56377
+ "ui.agentMessages.settings.allowlist.add": "Thêm",
56378
+ "ui.agentMessages.settings.allowlist.add_allowed": "Cho phép tác nhân hoặc người dùng",
56379
+ "ui.agentMessages.settings.allowlist.add_blocked": "Chặn tác nhân hoặc người dùng",
56380
+ "ui.agentMessages.settings.allowlist.kind": "Loại",
56381
+ "ui.agentMessages.settings.allowlist.kind_agent": "Tác nhân",
56382
+ "ui.agentMessages.settings.allowlist.kind_person": "Người dùng",
56383
+ "ui.agentMessages.settings.allowlist.identifier": "Mã định danh",
56384
+ "ui.agentMessages.settings.allowlist.identifier_empty": "Nhập mã định danh.",
56385
+ "ui.agentMessages.settings.allowlist.identifier_long": "Mã định danh dài tối đa 128 ký tự.",
56386
+ "ui.agentMessages.settings.allowlist.identifier_invalid": "Mã định danh không được chứa khoảng trắng hoặc ký tự điều khiển.",
56387
+ "ui.agentMessages.settings.allowlist.remove": "Xóa",
56388
+ "ui.agentMessages.settings.allowlist.save": "Lưu phạm vi liên lạc",
56389
+ "ui.agentMessages.settings.allowlist.needs_entry": "Thêm ít nhất một tác nhân hoặc người dùng, hoặc chọn Mọi người trong tổ chức của tôi.",
56390
+ "ui.agentMessages.settings.allowlist.unchanged": "Không có thay đổi nào để lưu.",
56391
+ "ui.agentMessages.settings.session.title": "Phiên nhận tin nhắn mới",
56392
+ "ui.agentMessages.settings.session.help": "Phiên có thể thức dậy khi có tin nhắn mới; để trống = chỉ hiện huy hiệu.",
56393
+ "ui.agentMessages.settings.session.none": "Không có phiên — chỉ hiện huy hiệu",
56394
+ "ui.agentMessages.settings.session.unavailable": "Phiên này không còn khả dụng.",
56395
+ "ui.agentMessages.settings.dark.title": "Chưa khả dụng",
56396
+ "ui.agentMessages.settings.dark.body": "Tin nhắn tác nhân chưa khả dụng.",
56397
+ "ui.agentMessages.settings.dark.nothing_enabled": "Chưa bật gì trên máy này.",
56398
+ "ui.agentMessages.settings.error.title": "Không tải được tin nhắn tác nhân",
56399
+ "ui.agentMessages.settings.error.retry": "Thử lại",
56400
+ "ui.agentMessages.settings.error.unreadable": "Máy này trả về phản hồi cài đặt mà ứng dụng không đọc được.",
56401
+ "ui.agentMessages.settings.refusal.sign_in": "Đăng nhập Radient để quản lý tin nhắn tác nhân.",
56402
+ "ui.agentMessages.settings.refusal.not_available": "Tin nhắn tác nhân không khả dụng cho tài khoản này.",
56403
+ "ui.agentMessages.settings.refusal.disabled": "Tổ chức của bạn đã tắt tin nhắn tác nhân.",
56404
+ "ui.agentMessages.settings.refusal.rate_limited": "Quá nhiều yêu cầu. Chờ một lát rồi thử lại.",
56405
+ "ui.agentMessages.settings.refusal.invalid_request": "Thay đổi đó không được chấp nhận. Kiểm tra mục nhập rồi thử lại.",
56406
+ "ui.agentMessages.settings.refusal.generic": "Không cập nhật được tin nhắn tác nhân. Hãy thử lại.",
56407
+ "ui.agentMessages.settings.allowlist.read_only": "Phạm vi liên lạc ở chế độ chỉ đọc khi tin nhắn tác nhân đang tắt.",
56408
+ "ui.agentMessages.settings.allowlist.agent_id": "ID tác nhân",
56409
+ "ui.agentMessages.settings.allowlist.person_id": "ID người dùng",
56410
+ "ui.agentMessages.settings.allowlist.identifier_help_agent": "Nhập ID tác nhân (bep_…)",
56411
+ "ui.agentMessages.settings.allowlist.identifier_help_person": "Nhập ID người dùng (acc_…)",
56412
+ "ui.agentMessages.settings.error.no_changes": "Không có cài đặt nào bị thay đổi. Hãy thử lại để kiểm tra trạng thái hiện tại.",
56413
+ "ui.agentMessages.settings.hold.chief_of_staff": "{count, plural, other {Có {count} tin nhắn đang chờ chánh văn phòng của bạn. Chỉ cần gửi một tin nhắn trong cuộc trò chuyện đó là sẽ nhận được.}}",
56414
+ "ui.agentMessages.settings.hold.chief_of_staff_unlinked": "{count, plural, other {Có {count} tin nhắn đang chờ chánh văn phòng của bạn. Tìm cuộc trò chuyện đó trong thanh bên rồi gửi một tin nhắn là sẽ nhận được.}}",
56415
+ "ui.agentMessages.settings.hold.open": "Nhắn chánh văn phòng"
56416
+ };
56059
56417
  const viUiAgentsDialogs = {
56060
56418
  "ui.agents.dialogs.create.title": "Tạo tác nhân mới",
56061
56419
  "ui.agents.dialogs.create.cancel": "Hủy",
@@ -57167,9 +57525,14 @@ const viUiConsole = {
57167
57525
  "ui.console.create_failed.title": "Không thể khởi động bảng lệnh trong phiên này",
57168
57526
  "ui.console.empty.detail": "Bảng lệnh chạy chương trình trong thư mục của cuộc trò chuyện này và giữ lại đầu ra, dù khung này có mở hay không.",
57169
57527
  "ui.console.empty.title": "Phiên này chưa có bảng lệnh",
57528
+ "ui.console.ended.app_quit": "ứng dụng đã đóng nó khi thoát",
57170
57529
  "ui.console.ended.exit_code": "mã thoát {code}",
57530
+ "ui.console.ended.exit_signal": "bị dừng bởi {signal}",
57171
57531
  "ui.console.ended.exit_unknown": "chưa ghi nhận mã thoát",
57532
+ "ui.console.ended.input_blocked": "Cửa sổ dòng lệnh này đã kết thúc nên phím đó không được gửi. Mở bảng lệnh mới để nhập lại.",
57172
57533
  "ui.console.ended.live": "Cửa sổ dòng lệnh này đã kết thúc",
57534
+ "ui.console.ended.marker": "Kết thúc lịch sử",
57535
+ "ui.console.ended.marker_detail": "Cửa sổ dòng lệnh này chỉ đọc. Chọn văn bản để sao chép.",
57173
57536
  "ui.console.ended.restored": "Cửa sổ dòng lệnh này đã kết thúc và lịch sử đã được khôi phục",
57174
57537
  "ui.console.loading.create": "Đang khởi động bảng lệnh",
57175
57538
  "ui.console.loading.read": "Đang đọc bảng lệnh của phiên này",
@@ -57188,6 +57551,7 @@ const viUiConsole = {
57188
57551
  "ui.console.unavailable.title": "Bảng lệnh không khả dụng trong ứng dụng này",
57189
57552
  "ui.console.unavailable.unknown.detail": "Cửa sổ này không truy cập được bảng lệnh và không cho biết lý do. Lý do có trong nhật ký ứng dụng.",
57190
57553
  "ui.console.tab.ended": "đã kết thúc",
57554
+ "ui.console.tab.exit_code": "mã thoát {code}",
57191
57555
  "ui.console.tab.agent_opened": "Một tác nhân đã mở bảng lệnh này",
57192
57556
  "ui.console.tab.agent_typed": "Một tác nhân đã nhập vào bảng lệnh này",
57193
57557
  "ui.console.tab.close_label": "Đóng {title}, thẻ {index, number, ::group-off} trên {total, number, ::group-off}",
@@ -59327,7 +59691,10 @@ const zhCNUiAgentMessagesSettings = {
59327
59691
  "ui.agentMessages.settings.allowlist.person_id": "人员ID",
59328
59692
  "ui.agentMessages.settings.allowlist.identifier_help_agent": "输入智能体ID(bep_…)",
59329
59693
  "ui.agentMessages.settings.allowlist.identifier_help_person": "输入人员ID(acc_…)",
59330
- "ui.agentMessages.settings.error.no_changes": "未更改任何设置。请重试以检查当前状态。"
59694
+ "ui.agentMessages.settings.error.no_changes": "未更改任何设置。请重试以检查当前状态。",
59695
+ "ui.agentMessages.settings.hold.chief_of_staff": "{count, plural, other {{count}条消息待你的首席助理接收。在其对话中发一条消息即可送达。}}",
59696
+ "ui.agentMessages.settings.hold.chief_of_staff_unlinked": "{count, plural, other {{count}条消息待你的首席助理接收。在侧边栏中找到其对话,发一条消息即可送达。}}",
59697
+ "ui.agentMessages.settings.hold.open": "给首席助理发消息"
59331
59698
  };
59332
59699
  const zhCNUiAgentsDialogs = {
59333
59700
  "ui.agents.dialogs.create.title": "新建智能体",
@@ -60451,9 +60818,14 @@ const zhCNUiConsole = {
60451
60818
  "ui.console.create_failed.title": "无法在此会话中启动控制台",
60452
60819
  "ui.console.empty.detail": "控制台在此对话的目录中运行程序,无论此面板是否打开,都会保留输出。",
60453
60820
  "ui.console.empty.title": "此会话中没有控制台",
60821
+ "ui.console.ended.app_quit": "应用退出时将其关闭",
60454
60822
  "ui.console.ended.exit_code": "退出码{code}",
60823
+ "ui.console.ended.exit_signal": "被{signal}终止",
60455
60824
  "ui.console.ended.exit_unknown": "未获取退出码",
60825
+ "ui.console.ended.input_blocked": "此终端已结束,因此该按键未被发送。打开新的控制台即可再次输入。",
60456
60826
  "ui.console.ended.live": "此终端已结束",
60827
+ "ui.console.ended.marker": "历史记录结束",
60828
+ "ui.console.ended.marker_detail": "此终端为只读状态。选中文本即可复制。",
60457
60829
  "ui.console.ended.restored": "此终端已结束,历史记录已恢复",
60458
60830
  "ui.console.loading.create": "正在启动控制台",
60459
60831
  "ui.console.loading.read": "正在读取此会话的控制台",
@@ -60472,6 +60844,7 @@ const zhCNUiConsole = {
60472
60844
  "ui.console.unavailable.title": "此应用中控制台不可用",
60473
60845
  "ui.console.unavailable.unknown.detail": "此窗口无法连接控制台,也未说明原因。原因记录在应用日志中。",
60474
60846
  "ui.console.tab.ended": "已结束",
60847
+ "ui.console.tab.exit_code": "退出{code}",
60475
60848
  "ui.console.tab.agent_opened": "此控制台由智能体打开",
60476
60849
  "ui.console.tab.agent_typed": "智能体已在此控制台中输入过内容",
60477
60850
  "ui.console.tab.close_label": "关闭{title},第{index, number, ::group-off}个标签页,共{total, number, ::group-off}个",
@@ -63071,6 +63444,7 @@ const bundledCatalogues = {
63071
63444
  },
63072
63445
  ru: {
63073
63446
  ...ruUiAgentMessages,
63447
+ ...ruUiAgentMessagesSettings,
63074
63448
  ...ruUiAgentsDialogs,
63075
63449
  ...ruUiAgents,
63076
63450
  ...ruUiAgentsModels,
@@ -63192,6 +63566,7 @@ const bundledCatalogues = {
63192
63566
  },
63193
63567
  vi: {
63194
63568
  ...viUiAgentMessages,
63569
+ ...viUiAgentMessagesSettings,
63195
63570
  ...viUiAgentsDialogs,
63196
63571
  ...viUiAgents,
63197
63572
  ...viUiAgentsModels,
@@ -73037,7 +73412,7 @@ class DesktopNotifier {
73037
73412
  notice.sessionId,
73038
73413
  notice.surfaceName,
73039
73414
  "",
73040
- notice.exitCode === null ? "Console finished" : `Console exited with code ${notice.exitCode}`,
73415
+ notice.exitSignal ? `Console killed by ${notice.exitSignal}` : notice.exitCode === null ? "Console finished" : `Console exited with code ${notice.exitCode}`,
73041
73416
  false,
73042
73417
  false,
73043
73418
  notice.surface