local-operator-ui 0.34.50 → 0.34.51

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 (90) hide show
  1. package/out/main/index.js +435 -1
  2. package/out/preload/index.js +89 -1
  3. package/out/renderer/assets/{_basePickBy-CSwEaqGH.js → _basePickBy-BBI090Ro.js} +1 -1
  4. package/out/renderer/assets/{_baseUniq-ClgJBEui.js → _baseUniq-y9eYAjJc.js} +1 -1
  5. package/out/renderer/assets/{agent-details-page-v9g-0tfN.js → agent-details-page-Danlk2zO.js} +2 -2
  6. package/out/renderer/assets/{agent-hub-page-i9l6Uv6w.js → agent-hub-page-A3Wue4nD.js} +2 -2
  7. package/out/renderer/assets/{agents-page-BEY9jzic.js → agents-page-bAs2li1H.js} +3 -3
  8. package/out/renderer/assets/{arc-Bp2vhvT8.js → arc-EdrxyDyX.js} +1 -1
  9. package/out/renderer/assets/{architectureDiagram-IEHRJDOE-mnxRnj85.js → architectureDiagram-IEHRJDOE-CFijMKZj.js} +1 -1
  10. package/out/renderer/assets/{blockDiagram-JOT3LUYC-Cy0bUbS1.js → blockDiagram-JOT3LUYC-C6H7Lqpk.js} +1 -1
  11. package/out/renderer/assets/{book-open-CwvcZLaU.js → book-open-DWHX0zOs.js} +1 -1
  12. package/out/renderer/assets/browser-page-tFPFpCOA.js +1 -0
  13. package/out/renderer/assets/browser-webauthn-prompt-ysRT3f9c.js +1 -0
  14. package/out/renderer/assets/{c4Diagram-VJAJSXHY-BLgwrX8R.js → c4Diagram-VJAJSXHY-CO2Zz-2B.js} +1 -1
  15. package/out/renderer/assets/channel-G1rkDF64.js +1 -0
  16. package/out/renderer/assets/{chunk-4BMEZGHF-BKbXn5lz.js → chunk-4BMEZGHF-D-tQMamL.js} +1 -1
  17. package/out/renderer/assets/{chunk-A2AXSNBT-huAEN9rv.js → chunk-A2AXSNBT-IlsswVGN.js} +1 -1
  18. package/out/renderer/assets/{chunk-AEK57VVT-CLlndZHa.js → chunk-AEK57VVT-CcXRuF87.js} +1 -1
  19. package/out/renderer/assets/{chunk-D6G4REZN-BQoQzkpH.js → chunk-D6G4REZN-NA6aMjOa.js} +1 -1
  20. package/out/renderer/assets/{chunk-RZ5BOZE2-BS-67Htk.js → chunk-RZ5BOZE2-D30p6MvF.js} +1 -1
  21. package/out/renderer/assets/{chunk-XZIHB7SX-B413LPHS.js → chunk-XZIHB7SX-DuGlTQyM.js} +1 -1
  22. package/out/renderer/assets/classDiagram-GIVACNV2-Cnz7pTLc.js +1 -0
  23. package/out/renderer/assets/classDiagram-v2-COTLJTTW-Cnz7pTLc.js +1 -0
  24. package/out/renderer/assets/clone-CorBC-J6.js +1 -0
  25. package/out/renderer/assets/{console-mirror-atIrzrKQ.js → console-mirror-6kLMvB-0.js} +1 -1
  26. package/out/renderer/assets/{consoleCapture-qbkQDsbk.js → consoleCapture-CfzJzLhS.js} +1 -1
  27. package/out/renderer/assets/{conversation-input-sync-B0j1FBwv.js → conversation-input-sync-BPcyjSvm.js} +256 -256
  28. package/out/renderer/assets/{dagre-OKDRZEBW-fZfOS2dk.js → dagre-OKDRZEBW-lUK01kt3.js} +1 -1
  29. package/out/renderer/assets/{diagram-SSKATNLV-alPaSAsa.js → diagram-SSKATNLV-p9gVP7bS.js} +1 -1
  30. package/out/renderer/assets/{diagram-VNBRO52H-12nwGS_H.js → diagram-VNBRO52H-CCftRDC_.js} +1 -1
  31. package/out/renderer/assets/{erDiagram-Q7BY3M3F-C0VQmN1m.js → erDiagram-Q7BY3M3F-BKi9l2Z-.js} +1 -1
  32. package/out/renderer/assets/{error-boundary-C0P2AR1t.js → error-boundary-DrP0vaXu.js} +1 -1
  33. package/out/renderer/assets/{flowDiagram-4HSFHLVR-yAA_68VC.js → flowDiagram-4HSFHLVR-BP7Ny2Be.js} +1 -1
  34. package/out/renderer/assets/{ganttDiagram-APWFNJXF-Cbk4f_uq.js → ganttDiagram-APWFNJXF-ISsPQchm.js} +1 -1
  35. package/out/renderer/assets/{gitGraphDiagram-7IBYFJ6S-C9o_Zz5H.js → gitGraphDiagram-7IBYFJ6S-SgeuOn3n.js} +1 -1
  36. package/out/renderer/assets/{graph-DUT-8BVr.js → graph-t6x189od.js} +1 -1
  37. package/out/renderer/assets/{index-B0uYixKz.js → index-2rX7wBIY.js} +1 -1
  38. package/out/renderer/assets/index-4n12XlDn.js +57 -0
  39. package/out/renderer/assets/{index-lYsxfVy0.js → index-B8oCfucM.js} +199 -199
  40. package/out/renderer/assets/{index-Cun5ZiJ8.js → index-BFjdZgP2.js} +1 -1
  41. package/out/renderer/assets/index-DAzaIteC.css +1 -0
  42. package/out/renderer/assets/{infoDiagram-PH2N3AL5-C4KvWN4_.js → infoDiagram-PH2N3AL5-DphTiVRC.js} +1 -1
  43. package/out/renderer/assets/{installer-CraQMM0S.js → installer-BRkp5wZg.js} +1 -1
  44. package/out/renderer/assets/{journeyDiagram-U35MCT3I-ClDn4ZZ_.js → journeyDiagram-U35MCT3I-DN4aJTUJ.js} +1 -1
  45. package/out/renderer/assets/{kanban-definition-NDS4AKOZ-DkZ2IqSy.js → kanban-definition-NDS4AKOZ-BN-JsNf0.js} +1 -1
  46. package/out/renderer/assets/{layout-B2ULRxc7.js → layout-zr9knmov.js} +1 -1
  47. package/out/renderer/assets/{legacy-agents-page-BHmNHE9c.js → legacy-agents-page-DrBberC9.js} +5 -5
  48. package/out/renderer/assets/{mermaid.core-DwfN45qZ.js → mermaid.core-C8wK03d9.js} +5 -5
  49. package/out/renderer/assets/mesh-page-Cznif7T9.js +1 -0
  50. package/out/renderer/assets/{mindmap-definition-ALO5MXBD-BaruaCsh.js → mindmap-definition-ALO5MXBD-kRmzBSCA.js} +1 -1
  51. package/out/renderer/assets/{mini-y-vZHWd4.js → mini-laXMgc8g.js} +1 -1
  52. package/out/renderer/assets/{notebook-pen-Bufwjei-.js → notebook-pen-DaklP6yV.js} +1 -1
  53. package/out/renderer/assets/{org-access-BHVNNfiF.js → org-access-CJhXZXGW.js} +1 -1
  54. package/out/renderer/assets/{org-surface-gate-Bu2ppyy0.js → org-surface-gate-CR9uyltG.js} +1 -1
  55. package/out/renderer/assets/{page-header-CzdhP1vT.js → page-header-CQRx3tBw.js} +1 -1
  56. package/out/renderer/assets/{pieDiagram-IB7DONF6-D6b-IA5_.js → pieDiagram-IB7DONF6-lJ1-pGOT.js} +1 -1
  57. package/out/renderer/assets/{projects-page-B2p6409_.js → projects-page-CdxIUECN.js} +5 -5
  58. package/out/renderer/assets/{publication-validation-DV7MFEnt.js → publication-validation-BP-55Qal.js} +1 -1
  59. package/out/renderer/assets/{quadrantDiagram-7GDLP6J5-BohSnqJt.js → quadrantDiagram-7GDLP6J5-BwX2blj8.js} +1 -1
  60. package/out/renderer/assets/{radar-MK3ICKWK-B8IyfRFK.js → radar-MK3ICKWK-CHfQEdqv.js} +1 -1
  61. package/out/renderer/assets/{radient-auth-buttons-CeAmJxoU.js → radient-auth-buttons-CpPCcIG3.js} +1 -1
  62. package/out/renderer/assets/{requirementDiagram-KVF5MWMF-CjxwfVmm.js → requirementDiagram-KVF5MWMF-CQPbhFhi.js} +1 -1
  63. package/out/renderer/assets/{sankeyDiagram-QLVOVGJD-Dmb58RjS.js → sankeyDiagram-QLVOVGJD-CTYu_uCM.js} +1 -1
  64. package/out/renderer/assets/{schedules-page-Dujbkmf1.js → schedules-page-DIv7xYku.js} +1 -1
  65. package/out/renderer/assets/{sequenceDiagram-X6HHIX6F-H7CVraeF.js → sequenceDiagram-X6HHIX6F-D1LnOKwi.js} +1 -1
  66. package/out/renderer/assets/{settings-page-tA2lkM1h.js → settings-page-CUX_P2c8.js} +1 -1
  67. package/out/renderer/assets/{stateDiagram-DGXRK772-DJN0Rf3F.js → stateDiagram-DGXRK772-BAJRIEa3.js} +1 -1
  68. package/out/renderer/assets/stateDiagram-v2-YXO3MK2T-CxmFrTkZ.js +1 -0
  69. package/out/renderer/assets/{timeline-definition-BDJGKUSR-0g8a7xFr.js → timeline-definition-BDJGKUSR-CBNE00Vi.js} +1 -1
  70. package/out/renderer/assets/ui-preferences-store-n9FM23w3.js +1 -0
  71. package/out/renderer/assets/{use-download-agent-mutation-Doz1TzJr.js → use-download-agent-mutation-NKo_cZoz.js} +2 -2
  72. package/out/renderer/assets/{use-memberships-query-CjMpjmh2.js → use-memberships-query-B4hJezFB.js} +1 -1
  73. package/out/renderer/assets/{use-session-snapshot-CoJrqYcV.js → use-session-snapshot-BrSeTlVQ.js} +1 -1
  74. package/out/renderer/assets/{xychartDiagram-VJFVF3MP-Cn4PWpai.js → xychartDiagram-VJFVF3MP-NqieI4kO.js} +1 -1
  75. package/out/renderer/console-capture.html +5 -5
  76. package/out/renderer/index.html +7 -7
  77. package/out/renderer/installer.html +4 -4
  78. package/out/renderer/mini.html +7 -7
  79. package/package.json +2 -2
  80. package/out/renderer/assets/browser-page-ffFPxvmW.js +0 -1
  81. package/out/renderer/assets/browser-webauthn-prompt-CVfiiYOR.js +0 -1
  82. package/out/renderer/assets/channel-H9kkayno.js +0 -1
  83. package/out/renderer/assets/classDiagram-GIVACNV2-CBQ7Tucl.js +0 -1
  84. package/out/renderer/assets/classDiagram-v2-COTLJTTW-CBQ7Tucl.js +0 -1
  85. package/out/renderer/assets/clone-D41kSeCw.js +0 -1
  86. package/out/renderer/assets/index-CNvQ9FNg.js +0 -57
  87. package/out/renderer/assets/index-D-RvJY1X.css +0 -1
  88. package/out/renderer/assets/mesh-page-BTaA4LA9.js +0 -1
  89. package/out/renderer/assets/stateDiagram-v2-YXO3MK2T-DTfdA0h1.js +0 -1
  90. package/out/renderer/assets/ui-preferences-store-B92Xh3eA.js +0 -1
package/out/main/index.js CHANGED
@@ -59,6 +59,67 @@ function relayNeedsRebuild(current, next) {
59
59
  function pairingHasRemedy(cause) {
60
60
  return cause !== "governed-elsewhere" && cause !== "pre-handshake";
61
61
  }
62
+ const agentMessagesBoundarySchema = zod.z.enum([
63
+ "app_start",
64
+ "sign_in",
65
+ "window_focus",
66
+ "surface_open"
67
+ ]);
68
+ const endpointSchema = zod.z.object({
69
+ id: zod.z.string().min(1),
70
+ state: zod.z.enum(["active", "paused", "disabled"])
71
+ }).passthrough();
72
+ const tenantSchema = zod.z.object({
73
+ tenant_id: zod.z.string().min(1),
74
+ tenant_name: zod.z.string().optional(),
75
+ eligible: zod.z.boolean(),
76
+ endpoint: endpointSchema.nullable()
77
+ }).passthrough();
78
+ const agentMessagesRefusalSchema = zod.z.object({
79
+ code: zod.z.string(),
80
+ message: zod.z.string(),
81
+ details: zod.z.record(zod.z.unknown()).optional(),
82
+ retry_after_seconds: zod.z.number().optional()
83
+ }).passthrough();
84
+ zod.z.object({
85
+ capability: zod.z.number(),
86
+ // Missing on frozen H1: absence forbids consent writes, not status reads.
87
+ consent_account_guard: zod.z.boolean().optional(),
88
+ state: zod.z.enum(["ready", "signed_out", "unavailable", "update_required"]),
89
+ account_id: zod.z.string().nullable(),
90
+ tenant_id: zod.z.string().nullable(),
91
+ surface_state: zod.z.enum(["A", "B", "C", "D", "E", "F", "G"]).nullable(),
92
+ visibility: zod.z.object({
93
+ settings: zod.z.boolean(),
94
+ inbox: zod.z.boolean(),
95
+ account_door: zod.z.boolean(),
96
+ onboarding: zod.z.boolean()
97
+ }),
98
+ update_required: zod.z.boolean(),
99
+ local: zod.z.object({
100
+ enabled: zod.z.boolean(),
101
+ onboarding: zod.z.string(),
102
+ session: zod.z.string()
103
+ }),
104
+ status: zod.z.object({
105
+ tenants: zod.z.array(tenantSchema)
106
+ }).passthrough().nullable(),
107
+ consent: zod.z.object({
108
+ version: zod.z.string().min(1).max(128),
109
+ text: zod.z.string().min(1).refine(
110
+ (text) => new TextEncoder().encode(text).length <= 2048,
111
+ "Consent exceeds the served-text contract"
112
+ ),
113
+ source: zod.z.enum(["served", "cached", "embedded"])
114
+ }).nullable(),
115
+ error: agentMessagesRefusalSchema.nullable()
116
+ }).passthrough();
117
+ zod.z.object({
118
+ endpoint: endpointSchema.extend({
119
+ account_id: zod.z.string().min(1),
120
+ tenant_id: zod.z.string().min(1)
121
+ })
122
+ }).passthrough();
62
123
  const JOURNAL_ORDER_QUERY_BYTES = 6 * 1024;
63
124
  const JOURNAL_ORDER_ID_LIMIT = 512;
64
125
  function appendJournalOrderIds(query, path2, ids) {
@@ -588,7 +649,18 @@ const desktopRequestUnion = zod.z.discriminatedUnion("op", [
588
649
  scope_kind: catalogueScopeKind.optional(),
589
650
  scope_name: catalogueScopeName.optional(),
590
651
  cursor: catalogueCursor.optional(),
591
- with_counts: zod.z.boolean().optional()
652
+ with_counts: zod.z.boolean().optional(),
653
+ /*
654
+ * THE ORDER THE PAGE IS READ IN (`session_catalogue_sort`), optional and
655
+ * gated on that capability for the same reason the paging four are: a daemon
656
+ * that predates the parameter IGNORES it silently, so an un-gated client
657
+ * would receive the rank order under a request that asked for the activity
658
+ * one - a page whose membership is a wake band, which is the exact defect
659
+ * this parameter exists to remove. `activity` is the one value today; a
660
+ * literal rather than a string so a typo is a type error here rather than a
661
+ * refusal from the route.
662
+ */
663
+ sort: zod.z.literal("activity").optional()
592
664
  }).strict(),
593
665
  /*
594
666
  * Acknowledge the one-time delegated-cleanup notice:
@@ -2071,6 +2143,22 @@ const desktopRequestUnion = zod.z.discriminatedUnion("op", [
2071
2143
  zod.z.object({ op: zod.z.literal("auth.cancel"), id: id$1 }).strict(),
2072
2144
  zod.z.object({ op: zod.z.literal("auth.key"), provider: id$1, value: secret }).strict(),
2073
2145
  zod.z.object({ op: zod.z.literal("auth.logout"), provider: id$1 }).strict(),
2146
+ /*
2147
+ * Local bearer only: the harness owns Radient OAuth and organization policy.
2148
+ * The account guard is local-only and is stripped before the hub write.
2149
+ */
2150
+ zod.z.object({
2151
+ op: zod.z.literal("agent_messages.status"),
2152
+ boundary: agentMessagesBoundarySchema
2153
+ }).strict(),
2154
+ zod.z.object({
2155
+ op: zod.z.literal("agent_messages.enable"),
2156
+ expected_account_id: id$1,
2157
+ tenant_id: id$1,
2158
+ state: zod.z.literal("active"),
2159
+ consent_version: zod.z.string().min(1).max(128),
2160
+ consented_via: zod.z.literal("dialog")
2161
+ }).strict(),
2074
2162
  zod.z.object({ op: zod.z.literal("settings.list") }).strict(),
2075
2163
  zod.z.object({
2076
2164
  op: zod.z.literal("settings.edit"),
@@ -2792,6 +2880,7 @@ const DESKTOP_DEADLINE_EXCEEDED_CODE = "deadline_exceeded";
2792
2880
  const DESKTOP_FOREGROUND_REQUIRED_MESSAGE = "View these completions in the foreground before marking them read.";
2793
2881
  const READ_ONLY_OPS = /* @__PURE__ */ new Set([
2794
2882
  "capabilities",
2883
+ "agent_messages.status",
2795
2884
  "accounts.list",
2796
2885
  "analytics.get",
2797
2886
  "analytics.models",
@@ -3259,6 +3348,7 @@ function desktopEndpoint(request) {
3259
3348
  if (request.cursor) params.set("cursor", request.cursor);
3260
3349
  if (request.with_counts) params.set("with_counts", "true");
3261
3350
  if (request.include_peers) params.set("include_peers", "true");
3351
+ if (request.sort) params.set("sort", request.sort);
3262
3352
  return {
3263
3353
  path: `/v1/desktop/sessions?${params}`,
3264
3354
  method: "GET"
@@ -4204,6 +4294,23 @@ function desktopEndpoint(request) {
4204
4294
  path: `/v1/auth/providers/${request.provider}/credentials`,
4205
4295
  method: "DELETE"
4206
4296
  };
4297
+ case "agent_messages.status":
4298
+ return {
4299
+ path: `/v1/desktop/team-bridge/status?boundary=${request.boundary}`,
4300
+ method: "GET"
4301
+ };
4302
+ case "agent_messages.enable":
4303
+ return {
4304
+ path: "/v1/desktop/team-bridge/settings",
4305
+ method: "PUT",
4306
+ body: {
4307
+ expected_account_id: request.expected_account_id,
4308
+ tenant_id: request.tenant_id,
4309
+ state: request.state,
4310
+ consent_version: request.consent_version,
4311
+ consented_via: request.consented_via
4312
+ }
4313
+ };
4207
4314
  case "settings.list":
4208
4315
  return { path: "/v1/settings", method: "GET" };
4209
4316
  case "settings.edit":
@@ -31705,6 +31812,24 @@ var IntlMessageFormat = class IntlMessageFormat2 {
31705
31812
  };
31706
31813
  }
31707
31814
  };
31815
+ const enUiAgentMessages = {
31816
+ "ui.agentMessages.dialog.title": "Agent messages on Radient",
31817
+ "ui.agentMessages.dialog.lead": "Your agent can exchange messages with other members' agents in your organization.",
31818
+ "ui.agentMessages.dialog.reach": "By default only agents of members in your organization can reach you; change this in Settings → Agent messages.",
31819
+ "ui.agentMessages.dialog.later": "You can enable this later in Settings → Agent messages.",
31820
+ "ui.agentMessages.dialog.activities": "Exchange notes, ask questions, and send approval requests.",
31821
+ "ui.agentMessages.dialog.enable": "Enable",
31822
+ "ui.agentMessages.dialog.enabling": "Enabling…",
31823
+ "ui.agentMessages.dialog.not_now": "Not now",
31824
+ "ui.agentMessages.dialog.close": "Close",
31825
+ "ui.agentMessages.dialog.consent_unavailable": "Consent is unavailable. Agent messages have not been enabled.",
31826
+ "ui.agentMessages.dialog.account_guard_unavailable": "This version cannot safely enable agent messages for your account. Update Local Operator, then try again.",
31827
+ "ui.agentMessages.dialog.failure": "Agent messages could not be enabled. Try again, or enable this later in Settings → Agent messages.",
31828
+ "ui.agentMessages.dialog.consent_changed": "Read the current consent text below, then choose Enable again.",
31829
+ "ui.agentMessages.dialog.local_failure": "Your consent was saved, but setup on this machine did not finish. Open Settings → Agent messages to finish setup.",
31830
+ "ui.agentMessages.dialog.validation_detail": "{field}: {rule}",
31831
+ "ui.agentMessages.dialog.validation_failure": "This setup request was not accepted. Update Local Operator, then try again."
31832
+ };
31708
31833
  const enUiAgentsDialogs = {
31709
31834
  "ui.agents.dialogs.create.title": "Create new agent",
31710
31835
  "ui.agents.dialogs.create.cancel": "Cancel",
@@ -34136,6 +34261,155 @@ const enUiShellRail = {
34136
34261
  "ui.shell.rail.console.tooltip": "{state, select, open {Close console{chord}} other {Open console{chord}}}",
34137
34262
  "ui.shell.rail.console.tooltip_count": "{state, select, open {Close console{chord}} other {Open console{chord}}} — {count, plural, one {{countText} finished since you looked} other {{countText} finished since you looked}}"
34138
34263
  };
34264
+ const esUiConsole = {
34265
+ "ui.console.capacity.summary": "{live, number, ::group-off} activas de {limit, number, ::group-off} en la app",
34266
+ "ui.console.capacity.summary_compact": "{live, number, ::group-off}/{limit, number, ::group-off} · {archived, plural, one {{archived, number, ::group-off} conservado} many {{archived, number, ::group-off} de conservados} other {{archived, number, ::group-off} conservados}}",
34267
+ "ui.console.capacity.summary_compact_bare": "{live, number, ::group-off}/{limit, number, ::group-off}",
34268
+ "ui.console.capacity.archived": " · {archived, plural, one {{archived, number, ::group-off} conservado} many {{archived, number, ::group-off} de conservados} other {{archived, number, ::group-off} conservados}}",
34269
+ "ui.console.capacity.full": " · sin plazas libres",
34270
+ "ui.console.capacity.help": "El recuento abarca toda la app y todas las conversaciones. El historial conservado no ocupa una plaza de proceso.",
34271
+ "ui.console.capacity.resources": "Almacenamiento gestionado estimado: {memory, number, ::group-off} MiB. Registros: {logs, number, ::group-off} MiB. Salida pendiente: {pending, number, ::group-off} MiB. Celdas de terminal: {cells, number, ::group-off}. Terminales protegidas: {protected, number, ::group-off}. No incluye la memoria de los procesos hijo.",
34272
+ "ui.console.cleanup.label": "Eliminar terminales de agentes finalizadas",
34273
+ "ui.console.cleanup.help": "Elimina las terminales de agentes finalizadas de esta conversación. Las que el agente pidió conservar siguen en el disco; las demás se cierran y su salida no se conserva. Las terminales que abriste tú y las que siguen en uso no se modifican.",
34274
+ "ui.console.cleanup.result": "{released, plural, one {Se eliminó {released, number, ::group-off} terminal de agente finalizada} many {Se eliminaron {released, number, ::group-off} de terminales de agentes finalizadas} other {Se eliminaron {released, number, ::group-off} terminales de agentes finalizadas}}. {protected, plural, =0 {} one {{protected, number, ::group-off} sigue en uso y se dejó abierta.} many {{protected, number, ::group-off} de terminales siguen en uso y se dejaron abiertas.} other {{protected, number, ::group-off} siguen en uso y se dejaron abiertas.}}",
34275
+ "ui.console.cleanup.result_none": "Nada que eliminar — no hay terminales de agentes finalizadas en esta conversación.",
34276
+ "ui.console.dismiss_history": "Eliminar terminal y borrar la salida conservada",
34277
+ "ui.console.dismiss.body": "Al eliminar esta terminal, se borra del disco la salida conservada, por lo que no se podrá restaurar al volver a iniciar la app.",
34278
+ "ui.console.dismiss.title": "¿Eliminar esta terminal?",
34279
+ "ui.console.dismiss.confirm": "Eliminar terminal",
34280
+ "ui.console.close.body": "Esto termina el programa que se ejecuta aquí y elimina su pestaña.",
34281
+ "ui.console.close.busy": "Cerrando…",
34282
+ "ui.console.close.confirm": "Cerrar terminal",
34283
+ "ui.console.close.kept": "Su salida se conserva.",
34284
+ "ui.console.close.title": "¿Cerrar esta terminal?",
34285
+ "ui.console.create_failed.detail": "El proceso de la consola está activo, pero ha rechazado iniciar un programa para esta conversación — ha fallado este intento, no se ha desactivado la consola. Primero, vuelve a intentarlo; si sigue fallando, el texto de abajo indica el motivo que dio ese proceso.",
34286
+ "ui.console.create_failed.retry": "Volver a intentar",
34287
+ "ui.console.create_failed.title": "No se pudo iniciar la consola en esta sesión",
34288
+ "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.",
34289
+ "ui.console.empty.title": "No hay ninguna consola en esta sesión",
34290
+ "ui.console.ended.exit_code": "código de salida {code}",
34291
+ "ui.console.ended.exit_unknown": "código de salida no observado",
34292
+ "ui.console.ended.live": "Esta terminal ha finalizado",
34293
+ "ui.console.ended.restored": "Esta terminal ha finalizado y se ha restaurado su historial",
34294
+ "ui.console.loading.create": "Iniciando una consola",
34295
+ "ui.console.loading.read": "Leyendo la consola de esta sesión",
34296
+ "ui.console.new": "Nueva consola",
34297
+ "ui.console.pane.blip": "Finalizó después de tu última consulta",
34298
+ "ui.console.pane.close": "Cerrar consola",
34299
+ "ui.console.pane.close_refusal": "No se pudo cerrar la terminal.",
34300
+ "ui.console.pane.label": "Consola",
34301
+ "ui.console.pane.needs_conversation.detail": "Una consola se ejecuta en la carpeta de trabajo de una conversación, así que aún no hay dónde crearla.",
34302
+ "ui.console.pane.needs_conversation.title": "La consola necesita una conversación",
34303
+ "ui.console.pane.surfaces": "Terminales de la consola",
34304
+ "ui.console.secure": "La entrada segura está activada: lo que escribes aquí no se registra.",
34305
+ "ui.console.unavailable.disabled.detail": "LOCAL_OPERATOR_UI_CONSOLE_HOST tiene el valor 0 en el entorno de esta app, por lo que no se inicia ninguna terminal ni se puede crear ninguna terminal de la consola. Elimina ese ajuste para volver a activar la consola.",
34306
+ "ui.console.unavailable.disabled.title": "La consola está desactivada en esta ejecución",
34307
+ "ui.console.unavailable.pty.detail": "No se cargó el soporte para terminales en esta ejecución. Se restaura al actualizar Local Operator; el registro de la app indica el motivo.",
34308
+ "ui.console.unavailable.title": "La consola no está disponible en esta app",
34309
+ "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.",
34310
+ "ui.console.tab.ended": "finalizada",
34311
+ "ui.console.tab.agent_opened": "Un agente abrió esta consola",
34312
+ "ui.console.tab.agent_typed": "Un agente ha escrito en esta consola",
34313
+ "ui.console.tab.close_label": "Cerrar {title}, pestaña {index, number, ::group-off} de {total, number, ::group-off}",
34314
+ "ui.console.tab.clear_label": "Eliminar {title}, pestaña {index, number, ::group-off} de {total, number, ::group-off}",
34315
+ "ui.console.tab.clear_label_retained": "Eliminar {title}, pestaña {index, number, ::group-off} de {total, number, ::group-off} — borra la salida conservada",
34316
+ "ui.console.secure_toggle.stop": "Desactivar la entrada segura",
34317
+ "ui.console.secure_toggle.start": "Entrada segura",
34318
+ "ui.console.secure_toggle.start_tooltip": "Entrada segura: dejar de registrar esta terminal",
34319
+ "ui.console.close.cancel": "Cancelar",
34320
+ "ui.console.terminal.prompt_label": "Entrada de la terminal",
34321
+ "ui.console.terminal.too_much_output": "Hay demasiada salida para leerla en voz alta. Recorre las filas manualmente para leerla."
34322
+ };
34323
+ const esUiOnboarding = {
34324
+ "ui.onboarding.connect.intro": "Local Operator necesita una cuenta de IA para funcionar. Radient es la opción más sencilla: inicia sesión en el navegador, sin copiar ni pegar nada. ¿Ya pagas por ChatGPT o Claude? Puedes usar esa cuenta. Abre la lista de proveedores de abajo para ver las demás opciones.",
34325
+ "ui.onboarding.default_model.block.loading_models": "Cargando la lista de modelos…",
34326
+ "ui.onboarding.default_model.block.pick_a_model": "Elige un modelo para continuar.",
34327
+ "ui.onboarding.default_model.change": "Cambiar",
34328
+ "ui.onboarding.default_model.connected_pick": "{brand} está conectado. Elige el modelo para los nuevos chats.",
34329
+ "ui.onboarding.default_model.empty_helper": "Aún no hay proveedores conectados. Vuelve al paso anterior para conectar uno.",
34330
+ "ui.onboarding.default_model.fallback_name": "Modelo predeterminado de {brand}",
34331
+ "ui.onboarding.default_model.intro": "Los nuevos chats usan este modelo. Cada agente puede elegir otro más adelante.",
34332
+ "ui.onboarding.default_model.loading": "Cargando tus modelos",
34333
+ "ui.onboarding.default_model.none_connected": "Aún no hay ningún proveedor conectado. Vuelve atrás para conectar uno, o salta la configuración y conéctalo luego desde el chat.",
34334
+ "ui.onboarding.default_model.nothing_saved": "No se guardará nada: tu Local Operator aún no puede listar los modelos de {brand}, así que la configuración termina sin un modelo predeterminado. Elige uno en Ajustes antes de enviar tu primer mensaje.",
34335
+ "ui.onboarding.default_model.provider_fallback": "este proveedor",
34336
+ "ui.onboarding.default_model.tag.applied": "tu modelo predeterminado",
34337
+ "ui.onboarding.default_model.tag.suggested": "sugerido para tu cuenta",
34338
+ "ui.onboarding.dialog.setup": "Configuración",
34339
+ "ui.onboarding.extras.greeting_done": "{name} es tu jefa de gabinete. Puedes retomar su conversación desde la barra lateral con solo pulsar una tecla. También puedes ir directamente a un nuevo chat.",
34340
+ "ui.onboarding.extras.greeting_owed": "{name} es tu jefa de gabinete. Ella te saludará primero, te preguntará cómo llamarte y en qué necesitas ayuda, y te enseñará a usar la app. También puedes ir directamente a un nuevo chat.",
34341
+ "ui.onboarding.extras.next_meet": "Siguiente: conocer a {name}",
34342
+ "ui.onboarding.modal.action.back": "Volver",
34343
+ "ui.onboarding.modal.action.continue": "Continuar",
34344
+ "ui.onboarding.modal.action.finish": "Finalizar",
34345
+ "ui.onboarding.modal.action.meet": "Conocer a {name}",
34346
+ "ui.onboarding.modal.action.skip": "Saltar",
34347
+ "ui.onboarding.modal.action.skip_for_now": "Saltar por ahora",
34348
+ "ui.onboarding.modal.action.skip_to_chat": "Ir al chat",
34349
+ "ui.onboarding.modal.error.aida_open_failed": "No se pudo abrir la conversación con {name}, así que estás en un nuevo chat.",
34350
+ "ui.onboarding.modal.title.connect_provider": "Conectar una cuenta de IA",
34351
+ "ui.onboarding.modal.title.default_model": "Tu modelo predeterminado",
34352
+ "ui.onboarding.modal.title.extras": "Búsqueda web (opcional)",
34353
+ "ui.onboarding.modal.title.extras_with_name": "Búsqueda web; después, conoce a {name}",
34354
+ "ui.onboarding.modal.title.fallback": "Configuración inicial",
34355
+ "ui.onboarding.search.each_key_saved": "Cada clave se guarda en tu dispositivo en cuanto sales de su campo.",
34356
+ "ui.onboarding.search.intro": "Los agentes pueden buscar información mientras trabajan — los precios de hoy, las noticias de esta semana — en vez de depender de lo que el modelo ya sabe.",
34357
+ "ui.onboarding.search.mode.free": "Gratis",
34358
+ "ui.onboarding.search.mode.free_detail": "Alterna entre proveedores gratuitos — DuckDuckGo, el plan gratuito de Tavily, Exa y Parallel. No necesitas ninguna clave; el servicio se comparte, así que las búsquedas pueden tardar más cuando hay mucha demanda.",
34359
+ "ui.onboarding.search.mode.keys": "Añadir claves de API",
34360
+ "ui.onboarding.search.mode.keys_detail": "Usa tus propias claves de los proveedores de búsqueda que utilizas.",
34361
+ "ui.onboarding.search.mode.label": "Configuración de búsqueda",
34362
+ "ui.onboarding.search.recommended": "Recomendado",
34363
+ "ui.onboarding.search.row.get_your": "Obtener {name}",
34364
+ "ui.onboarding.search.row.not_saved": "No guardada — {message}",
34365
+ "ui.onboarding.search.row.placeholder": "Pega tu clave de API",
34366
+ "ui.onboarding.search.row.save_failed": "No se pudo guardar la clave.",
34367
+ "ui.onboarding.search.row.saved": "Guardada",
34368
+ "ui.onboarding.search.row.saving": "Guardando {name}",
34369
+ "ui.onboarding.modal.step_of": "Paso {current, number, ::group-off} de {total, number, ::group-off}",
34370
+ "ui.onboarding.modal.steps_total": "{total, plural, one {{total, number, ::group-off} paso} many {{total, number, ::group-off} de pasos} other {{total, number, ::group-off} pasos}}"
34371
+ };
34372
+ const esUiSettings = {
34373
+ "ui.settings.language.dialog.description": "Se aplica a la app y a la terminal — es el mismo ajuste que se cambia en la página de ajustes.",
34374
+ "ui.settings.language.dialog.loading": "Cargando el ajuste actual…",
34375
+ "ui.settings.language.dialog.retry": "Reintentar",
34376
+ "ui.settings.language.dialog.retrying": "Reintentando",
34377
+ "ui.settings.language.dialog.save": "Guardar",
34378
+ "ui.settings.language.dialog.saved": "Guardado",
34379
+ "ui.settings.language.dialog.title": "Idioma de la interfaz",
34380
+ "ui.settings.language.dialog.unavailable": "El servicio conectado no ofrece los ajustes que se editan en este diálogo.",
34381
+ "ui.settings.language.effective": "Idioma activo: {locale}",
34382
+ "ui.settings.language.external_notice": "El idioma de la interfaz cambió desde otro lugar — ahora es {language}.",
34383
+ "ui.settings.language.general.description": "Elige el idioma de la app y la terminal. Los cambios se guardan al instante; las conversaciones existentes no se reescriben.",
34384
+ "ui.settings.language.general.effective": "Idioma activo de la app: {locale}",
34385
+ "ui.settings.language.general.last_known": "Último idioma sincronizado de la app: {locale}",
34386
+ "ui.settings.language.general.no_resolution": "Aún no se ha establecido el idioma de la app.",
34387
+ "ui.settings.language.general.pending": "Guardando el idioma…",
34388
+ "ui.settings.language.general.readback_error": "Se confirmó el cambio, pero no se pudo comprobar el ajuste actual. Vuelve a conectarte o reinténtalo antes de cambiarlo de nuevo.",
34389
+ "ui.settings.language.general.saved": "Idioma guardado.",
34390
+ "ui.settings.language.general.system": "Usar el del sistema",
34391
+ "ui.settings.language.general.unavailable_choice": "No disponible",
34392
+ "ui.settings.language.general.write_error": "No se guardó el idioma. Tu ajuste anterior no ha cambiado. {message}",
34393
+ "ui.settings.language.palette_action": "Cambiar el idioma de la interfaz",
34394
+ "ui.settings.page.title": "Ajustes",
34395
+ "ui.settings.profile.description_anonymous": "Los datos de tu perfil que se muestran en la app. No se comparten con los agentes.",
34396
+ "ui.settings.profile.description_authenticated": "Los datos de tu perfil que se muestran en la app. No se comparten con los agentes. Estos datos provienen de tu cuenta de Radient.",
34397
+ "ui.settings.profile.display_name.label": "Nombre visible",
34398
+ "ui.settings.profile.display_name.placeholder": "Escribe tu nombre…",
34399
+ "ui.settings.profile.email.label": "Correo electrónico",
34400
+ "ui.settings.profile.email.placeholder": "Escribe tu correo…",
34401
+ "ui.settings.profile.title": "Perfil de usuario",
34402
+ "ui.settings.section.interface_language.help": "Idioma de la interfaz, un ajuste compartido con la terminal. auto sigue el idioma del sistema operativo y usa el inglés si no está disponible.",
34403
+ "ui.settings.section.interface_language.label": "Idioma de la interfaz",
34404
+ "ui.settings.tour.action": "Iniciar el recorrido",
34405
+ "ui.settings.tour.description": "¿Te saltaste el recorrido inicial de la app o quieres repasarlo? Puedes volver a iniciarlo aquí.",
34406
+ "ui.settings.tour.title": "Recorrido de la app",
34407
+ "ui.settings.profile.account_checking": "Comprobando tu cuenta de Radient…",
34408
+ "ui.settings.profile.account_read_failed_retry": "No se pudo consultar tu cuenta de Radient, así que el nombre y el correo que aparecen abajo son datos de ejemplo, no los de tu cuenta. Reinténtalo.",
34409
+ "ui.settings.profile.account_read_failed_refused": "No se pudo consultar tu cuenta de Radient, así que el nombre y el correo que aparecen abajo son datos de ejemplo, no los de tu cuenta. Reinténtalo o vuelve a iniciar sesión en Radient.",
34410
+ "ui.settings.profile.retry": "Reintentar",
34411
+ "ui.settings.profile.retrying": "Reintentando"
34412
+ };
34139
34413
  const frUiConsole = {
34140
34414
  "ui.console.close.body": "Le programme en cours sera arrêté et son onglet supprimé.",
34141
34415
  "ui.console.close.busy": "Fermeture…",
@@ -34285,7 +34559,157 @@ const frUiSettings = {
34285
34559
  "ui.settings.profile.retry": "Réessayer",
34286
34560
  "ui.settings.profile.retrying": "Nouvel essai"
34287
34561
  };
34562
+ const ruUiConsole = {
34563
+ "ui.console.capacity.summary": "Активных терминалов в приложении: {live, number, ::group-off} из {limit, number, ::group-off}",
34564
+ "ui.console.capacity.summary_compact": "{live, number, ::group-off}/{limit, number, ::group-off} · сохранено: {archived, number, ::group-off}",
34565
+ "ui.console.capacity.summary_compact_bare": "{live, number, ::group-off}/{limit, number, ::group-off}",
34566
+ "ui.console.capacity.archived": " · сохранено: {archived, number, ::group-off}",
34567
+ "ui.console.capacity.full": " · лимит достигнут",
34568
+ "ui.console.capacity.help": "Общее число терминалов приложения во всех разговорах. Сохранённая история не занимает место для процесса.",
34569
+ "ui.console.capacity.resources": "Расчётный объём управляемого хранилища: {memory, number, ::group-off} MiB. Журналы: {logs, number, ::group-off} MiB. Вывод в ожидании: {pending, number, ::group-off} MiB. Ячейки терминала: {cells, number, ::group-off}. Защищённые терминалы: {protected, number, ::group-off}. Память дочерних процессов не учитывается.",
34570
+ "ui.console.cleanup.label": "Очистить завершённые терминалы агентов",
34571
+ "ui.console.cleanup.help": "Очищает завершённые терминалы агентов в этом разговоре. Если агент попросил сохранить завершённый терминал, тот остаётся на диске; остальные закрываются без сохранения вывода. Терминалы, открытые вами, и все используемые терминалы остаются без изменений.",
34572
+ "ui.console.cleanup.result": "Очищено: {released, plural, one {{released, number, ::group-off} завершённый терминал агента} few {{released, number, ::group-off} завершённых терминала агентов} many {{released, number, ::group-off} завершённых терминалов агентов} other {{released, number, ::group-off} завершённого терминала агентов}}. {protected, plural, =0 {} one {{protected, number, ::group-off} терминал ещё используется и оставлен открытым.} few {{protected, number, ::group-off} терминала ещё используются и оставлены открытыми.} many {{protected, number, ::group-off} терминалов ещё используются и оставлены открытыми.} other {{protected, number, ::group-off} терминала ещё используются и оставлены открытыми.}}",
34573
+ "ui.console.cleanup.result_none": "Нечего очищать — в этом разговоре нет завершённых терминалов агентов.",
34574
+ "ui.console.dismiss_history": "Очистить терминал и удалить сохранённый вывод",
34575
+ "ui.console.dismiss.body": "При очистке этого терминала сохранённый вывод удаляется с диска, поэтому после перезапуска его нельзя будет восстановить.",
34576
+ "ui.console.dismiss.title": "Очистить этот терминал?",
34577
+ "ui.console.dismiss.confirm": "Очистить терминал",
34578
+ "ui.console.close.body": "Это завершит работающую здесь программу и удалит её вкладку.",
34579
+ "ui.console.close.busy": "Закрытие…",
34580
+ "ui.console.close.confirm": "Закрыть терминал",
34581
+ "ui.console.close.kept": "Вывод программы сохранится.",
34582
+ "ui.console.close.title": "Закрыть этот терминал?",
34583
+ "ui.console.create_failed.detail": "Сервис консоли работает, но отказался запускать программу для этого разговора — не удалась одна попытка, а сама консоль не отключена. Сначала попробуйте ещё раз. Если ошибка повторится, ниже указана причина, которую сообщил сам сервис.",
34584
+ "ui.console.create_failed.retry": "Попробовать снова",
34585
+ "ui.console.create_failed.title": "Не удалось запустить консоль в этой сессии",
34586
+ "ui.console.empty.detail": "Консоль запускает программу в папке этого разговора и сохраняет её вывод, даже когда эта панель закрыта.",
34587
+ "ui.console.empty.title": "В этой сессии нет консоли",
34588
+ "ui.console.ended.exit_code": "код завершения {code}",
34589
+ "ui.console.ended.exit_unknown": "код завершения не получен",
34590
+ "ui.console.ended.live": "Этот терминал завершил работу",
34591
+ "ui.console.ended.restored": "Этот терминал завершил работу; его история восстановлена",
34592
+ "ui.console.loading.create": "Запуск консоли",
34593
+ "ui.console.loading.read": "Чтение консоли этой сессии",
34594
+ "ui.console.new": "Новая консоль",
34595
+ "ui.console.pane.blip": "Работа завершилась после последнего просмотра",
34596
+ "ui.console.pane.close": "Закрыть консоль",
34597
+ "ui.console.pane.close_refusal": "Не удалось закрыть терминал.",
34598
+ "ui.console.pane.label": "Консоль",
34599
+ "ui.console.pane.needs_conversation.detail": "Консоль запускается в рабочей папке разговора. Пока разговор не выбран, запустить её негде.",
34600
+ "ui.console.pane.needs_conversation.title": "Для консоли нужен разговор",
34601
+ "ui.console.pane.surfaces": "Терминалы консоли",
34602
+ "ui.console.secure": "Защищённый ввод включён: введённый здесь текст не записывается.",
34603
+ "ui.console.unavailable.disabled.detail": "В окружении приложения LOCAL_OPERATOR_UI_CONSOLE_HOST задано значение 0, поэтому терминалы не запускаются и создать новый терминал нельзя. Удалите эту настройку, чтобы снова включить консоль.",
34604
+ "ui.console.unavailable.disabled.title": "Консоль отключена в этом запуске",
34605
+ "ui.console.unavailable.pty.detail": "Поддержка терминала не загрузилась при этом запуске. Обновление Local Operator восстановит её; причина указана в журнале приложения.",
34606
+ "ui.console.unavailable.title": "Консоль недоступна в этом приложении",
34607
+ "ui.console.unavailable.unknown.detail": "Это окно не смогло подключиться к консоли и не сообщило причину. Она указана в журнале приложения.",
34608
+ "ui.console.tab.ended": "завершён",
34609
+ "ui.console.tab.agent_opened": "Агент открыл эту консоль",
34610
+ "ui.console.tab.agent_typed": "Агент вводил текст в этой консоли",
34611
+ "ui.console.tab.close_label": "Закрыть {title}, вкладка {index, number, ::group-off} из {total, number, ::group-off}",
34612
+ "ui.console.tab.clear_label": "Очистить {title}, вкладка {index, number, ::group-off} из {total, number, ::group-off}",
34613
+ "ui.console.tab.clear_label_retained": "Очистить {title}, вкладка {index, number, ::group-off} из {total, number, ::group-off} — сохранённый вывод будет удалён",
34614
+ "ui.console.secure_toggle.stop": "Выключить защищённый ввод",
34615
+ "ui.console.secure_toggle.start": "Защищённый ввод",
34616
+ "ui.console.secure_toggle.start_tooltip": "Защищённый ввод: отключить запись этого терминала",
34617
+ "ui.console.close.cancel": "Отмена",
34618
+ "ui.console.terminal.prompt_label": "Ввод в терминале",
34619
+ "ui.console.terminal.too_much_output": "Слишком много вывода для озвучивания. Для чтения переходите по строкам вручную."
34620
+ };
34621
+ const ruUiOnboarding = {
34622
+ "ui.onboarding.connect.intro": "Для работы Local Operator нужна учётная запись ИИ-сервиса. Проще всего с Radient: достаточно войти в браузере, ничего вставлять не нужно. Уже оплачиваете ChatGPT или Claude? Войдите через этот сервис. Откройте список провайдеров ниже, чтобы увидеть остальные варианты.",
34623
+ "ui.onboarding.default_model.block.loading_models": "Загрузка списка моделей…",
34624
+ "ui.onboarding.default_model.block.pick_a_model": "Выберите модель, чтобы продолжить.",
34625
+ "ui.onboarding.default_model.change": "Изменить",
34626
+ "ui.onboarding.default_model.connected_pick": "Подключение к {brand} настроено. Выберите модель для новых чатов.",
34627
+ "ui.onboarding.default_model.empty_helper": "Провайдеры ещё не подключены. Вернитесь на шаг назад, чтобы подключить один из них.",
34628
+ "ui.onboarding.default_model.fallback_name": "Модель по умолчанию — {brand}",
34629
+ "ui.onboarding.default_model.intro": "Эта модель используется в новых чатах. Позже каждый агент может выбрать другую.",
34630
+ "ui.onboarding.default_model.loading": "Загрузка ваших моделей",
34631
+ "ui.onboarding.default_model.none_connected": "Провайдеры ещё не подключены. Вернитесь и подключите один из них или пропустите настройку и подключите его позже из чата.",
34632
+ "ui.onboarding.default_model.nothing_saved": "Ничего не будет сохранено: Local Operator пока не может получить список моделей ({brand}), поэтому настройка завершится без модели по умолчанию. Выберите её в настройках до первого сообщения.",
34633
+ "ui.onboarding.default_model.provider_fallback": "этот провайдер",
34634
+ "ui.onboarding.default_model.tag.applied": "по умолчанию",
34635
+ "ui.onboarding.default_model.tag.suggested": "рекомендуется для вашей учётной записи",
34636
+ "ui.onboarding.dialog.setup": "Настройка",
34637
+ "ui.onboarding.extras.greeting_done": "{name} — ваш координатор. Продолжить общение можно в разговоре с ней: он доступен на боковой панели одним нажатием клавиши. Можно также сразу перейти к новому чату.",
34638
+ "ui.onboarding.extras.greeting_owed": "{name} — ваш координатор. Она первой поздоровается, спросит, как к вам обращаться и с чем помочь, и познакомит вас с приложением. Можно также сразу перейти к новому чату.",
34639
+ "ui.onboarding.extras.next_meet": "Далее — знакомство: {name}",
34640
+ "ui.onboarding.modal.action.back": "Назад",
34641
+ "ui.onboarding.modal.action.continue": "Продолжить",
34642
+ "ui.onboarding.modal.action.finish": "Завершить",
34643
+ "ui.onboarding.modal.action.meet": "Познакомиться с агентом «{name}»",
34644
+ "ui.onboarding.modal.action.skip": "Пропустить",
34645
+ "ui.onboarding.modal.action.skip_for_now": "Пока пропустить",
34646
+ "ui.onboarding.modal.action.skip_to_chat": "Перейти к чату",
34647
+ "ui.onboarding.modal.error.aida_open_failed": "Не удалось открыть разговор с агентом «{name}», поэтому вместо него открыт новый чат.",
34648
+ "ui.onboarding.modal.title.connect_provider": "Подключить учётную запись ИИ-сервиса",
34649
+ "ui.onboarding.modal.title.default_model": "Ваша модель по умолчанию",
34650
+ "ui.onboarding.modal.title.extras": "Поиск в интернете (необязательно)",
34651
+ "ui.onboarding.modal.title.extras_with_name": "Поиск в интернете, затем знакомство: {name}",
34652
+ "ui.onboarding.modal.title.fallback": "Первоначальная настройка",
34653
+ "ui.onboarding.search.each_key_saved": "Каждый ключ сохраняется на устройстве сразу, как только вы покидаете его поле ввода.",
34654
+ "ui.onboarding.search.intro": "Во время работы агенты могут искать актуальные сведения — цены на сегодня, новости за неделю — вместо того, чтобы полагаться лишь на знания модели.",
34655
+ "ui.onboarding.search.mode.free": "Бесплатно",
34656
+ "ui.onboarding.search.mode.free_detail": "Поиск поочерёдно использует бесплатные сервисы: DuckDuckGo, бесплатный тариф Tavily, Exa и Parallel. Ключ не нужен; сервисами пользуются и другие, поэтому при высокой нагрузке поиск может идти медленнее.",
34657
+ "ui.onboarding.search.mode.keys": "Добавить ключи API",
34658
+ "ui.onboarding.search.mode.keys_detail": "Добавьте свои ключи для поисковых сервисов, которыми пользуетесь.",
34659
+ "ui.onboarding.search.mode.label": "Настройка поиска",
34660
+ "ui.onboarding.search.recommended": "Рекомендуется",
34661
+ "ui.onboarding.search.row.get_your": "Получить: {name}",
34662
+ "ui.onboarding.search.row.not_saved": "Не сохранено — {message}",
34663
+ "ui.onboarding.search.row.placeholder": "Вставьте ключ API",
34664
+ "ui.onboarding.search.row.save_failed": "Не удалось сохранить ключ.",
34665
+ "ui.onboarding.search.row.saved": "Сохранено",
34666
+ "ui.onboarding.search.row.saving": "Сохранение: {name}",
34667
+ "ui.onboarding.modal.step_of": "Шаг {current, number, ::group-off} из {total, number, ::group-off}",
34668
+ "ui.onboarding.modal.steps_total": "{total, plural, one {{total, number, ::group-off} шаг} few {{total, number, ::group-off} шага} many {{total, number, ::group-off} шагов} other {{total, number, ::group-off} шага}}"
34669
+ };
34670
+ const ruUiSettings = {
34671
+ "ui.settings.language.dialog.description": "Применяется в приложении и терминале — это та же настройка, что и на странице настроек.",
34672
+ "ui.settings.language.dialog.loading": "Загрузка текущей настройки…",
34673
+ "ui.settings.language.dialog.retry": "Повторить",
34674
+ "ui.settings.language.dialog.retrying": "Повторная попытка",
34675
+ "ui.settings.language.dialog.save": "Сохранить",
34676
+ "ui.settings.language.dialog.saved": "Сохранено",
34677
+ "ui.settings.language.dialog.title": "Язык интерфейса",
34678
+ "ui.settings.language.dialog.unavailable": "Подключённый сервис не предоставляет настройки, которые меняются в этом окне.",
34679
+ "ui.settings.language.effective": "Текущий язык: {locale}",
34680
+ "ui.settings.language.external_notice": "Язык интерфейса изменён в другом месте — теперь {language}.",
34681
+ "ui.settings.language.general.description": "Выберите общий язык приложения и терминала. Изменения сохраняются сразу; текст прежних разговоров не меняется.",
34682
+ "ui.settings.language.general.effective": "Текущий язык приложения: {locale}",
34683
+ "ui.settings.language.general.last_known": "Последний синхронизированный язык приложения: {locale}",
34684
+ "ui.settings.language.general.no_resolution": "Язык приложения ещё не задан.",
34685
+ "ui.settings.language.general.pending": "Сохранение языка…",
34686
+ "ui.settings.language.general.readback_error": "Сохранение подтверждено, но проверить текущую настройку не удалось. Переподключитесь или повторите проверку, прежде чем менять её снова.",
34687
+ "ui.settings.language.general.saved": "Язык сохранён.",
34688
+ "ui.settings.language.general.system": "Как в системе",
34689
+ "ui.settings.language.general.unavailable_choice": "Недоступно",
34690
+ "ui.settings.language.general.write_error": "Язык не сохранён. Прежняя настройка не изменилась. {message}",
34691
+ "ui.settings.language.palette_action": "Изменить язык интерфейса",
34692
+ "ui.settings.page.title": "Настройки",
34693
+ "ui.settings.profile.description_anonymous": "Данные вашего профиля, отображаемые в приложении. Эти сведения не передаются агентам.",
34694
+ "ui.settings.profile.description_authenticated": "Данные вашего профиля, отображаемые в приложении. Эти сведения не передаются агентам. Они получены из вашей учётной записи Radient.",
34695
+ "ui.settings.profile.display_name.label": "Отображаемое имя",
34696
+ "ui.settings.profile.display_name.placeholder": "Введите имя…",
34697
+ "ui.settings.profile.email.label": "Адрес электронной почты",
34698
+ "ui.settings.profile.email.placeholder": "Введите адрес почты…",
34699
+ "ui.settings.profile.title": "Профиль пользователя",
34700
+ "ui.settings.section.interface_language.help": "Язык интерфейса — общая настройка приложения и терминала. auto использует язык операционной системы; если он недоступен, используется английский.",
34701
+ "ui.settings.section.interface_language.label": "Язык интерфейса",
34702
+ "ui.settings.tour.action": "Начать обзор",
34703
+ "ui.settings.tour.description": "Пропустили знакомство с приложением или хотите освежить память? Здесь можно запустить обзор заново.",
34704
+ "ui.settings.tour.title": "Обзор приложения",
34705
+ "ui.settings.profile.account_checking": "Проверка учётной записи Radient…",
34706
+ "ui.settings.profile.account_read_failed_retry": "Не удалось прочитать данные учётной записи Radient, поэтому имя и адрес почты ниже — лишь примеры, а не данные вашей учётной записи. Повторите попытку.",
34707
+ "ui.settings.profile.account_read_failed_refused": "Не удалось прочитать данные учётной записи Radient, поэтому имя и адрес почты ниже — лишь примеры, а не данные вашей учётной записи. Повторите попытку или войдите в Radient заново.",
34708
+ "ui.settings.profile.retry": "Повторить",
34709
+ "ui.settings.profile.retrying": "Повторная попытка"
34710
+ };
34288
34711
  const bundledEnglish = {
34712
+ ...enUiAgentMessages,
34289
34713
  ...enUiAgentsDialogs,
34290
34714
  ...enUiAgents,
34291
34715
  ...enUiAgentsModels,
@@ -34335,10 +34759,20 @@ const bundledEnglish = {
34335
34759
  };
34336
34760
  const bundledCatalogues = {
34337
34761
  en: bundledEnglish,
34762
+ es: {
34763
+ ...esUiConsole,
34764
+ ...esUiOnboarding,
34765
+ ...esUiSettings
34766
+ },
34338
34767
  fr: {
34339
34768
  ...frUiConsole,
34340
34769
  ...frUiOnboarding,
34341
34770
  ...frUiSettings
34771
+ },
34772
+ ru: {
34773
+ ...ruUiConsole,
34774
+ ...ruUiOnboarding,
34775
+ ...ruUiSettings
34342
34776
  }
34343
34777
  };
34344
34778
  const DEFAULT_LOCALE = "en";
@@ -87,6 +87,67 @@ function readTelemetryArgument(argv) {
87
87
  const BACKEND_STATUS_CHANNEL = "backend-status";
88
88
  const BACKEND_STATUS_EVENT = "backend-status-changed";
89
89
  const BACKEND_RECONNECT_CHANNEL = "backend-reconnect";
90
+ const agentMessagesBoundarySchema = zod.z.enum([
91
+ "app_start",
92
+ "sign_in",
93
+ "window_focus",
94
+ "surface_open"
95
+ ]);
96
+ const endpointSchema = zod.z.object({
97
+ id: zod.z.string().min(1),
98
+ state: zod.z.enum(["active", "paused", "disabled"])
99
+ }).passthrough();
100
+ const tenantSchema = zod.z.object({
101
+ tenant_id: zod.z.string().min(1),
102
+ tenant_name: zod.z.string().optional(),
103
+ eligible: zod.z.boolean(),
104
+ endpoint: endpointSchema.nullable()
105
+ }).passthrough();
106
+ const agentMessagesRefusalSchema = zod.z.object({
107
+ code: zod.z.string(),
108
+ message: zod.z.string(),
109
+ details: zod.z.record(zod.z.unknown()).optional(),
110
+ retry_after_seconds: zod.z.number().optional()
111
+ }).passthrough();
112
+ zod.z.object({
113
+ capability: zod.z.number(),
114
+ // Missing on frozen H1: absence forbids consent writes, not status reads.
115
+ consent_account_guard: zod.z.boolean().optional(),
116
+ state: zod.z.enum(["ready", "signed_out", "unavailable", "update_required"]),
117
+ account_id: zod.z.string().nullable(),
118
+ tenant_id: zod.z.string().nullable(),
119
+ surface_state: zod.z.enum(["A", "B", "C", "D", "E", "F", "G"]).nullable(),
120
+ visibility: zod.z.object({
121
+ settings: zod.z.boolean(),
122
+ inbox: zod.z.boolean(),
123
+ account_door: zod.z.boolean(),
124
+ onboarding: zod.z.boolean()
125
+ }),
126
+ update_required: zod.z.boolean(),
127
+ local: zod.z.object({
128
+ enabled: zod.z.boolean(),
129
+ onboarding: zod.z.string(),
130
+ session: zod.z.string()
131
+ }),
132
+ status: zod.z.object({
133
+ tenants: zod.z.array(tenantSchema)
134
+ }).passthrough().nullable(),
135
+ consent: zod.z.object({
136
+ version: zod.z.string().min(1).max(128),
137
+ text: zod.z.string().min(1).refine(
138
+ (text) => new TextEncoder().encode(text).length <= 2048,
139
+ "Consent exceeds the served-text contract"
140
+ ),
141
+ source: zod.z.enum(["served", "cached", "embedded"])
142
+ }).nullable(),
143
+ error: agentMessagesRefusalSchema.nullable()
144
+ }).passthrough();
145
+ zod.z.object({
146
+ endpoint: endpointSchema.extend({
147
+ account_id: zod.z.string().min(1),
148
+ tenant_id: zod.z.string().min(1)
149
+ })
150
+ }).passthrough();
90
151
  const id = zod.z.string().min(1).max(128).regex(/^[a-zA-Z0-9_-]+$/);
91
152
  const settingKey = zod.z.string().min(1).max(256).regex(/^[a-zA-Z0-9_][a-zA-Z0-9_.-]*$/);
92
153
  const secret = zod.z.string().min(1).max(32768);
@@ -595,7 +656,18 @@ const desktopRequestUnion = zod.z.discriminatedUnion("op", [
595
656
  scope_kind: catalogueScopeKind.optional(),
596
657
  scope_name: catalogueScopeName.optional(),
597
658
  cursor: catalogueCursor.optional(),
598
- with_counts: zod.z.boolean().optional()
659
+ with_counts: zod.z.boolean().optional(),
660
+ /*
661
+ * THE ORDER THE PAGE IS READ IN (`session_catalogue_sort`), optional and
662
+ * gated on that capability for the same reason the paging four are: a daemon
663
+ * that predates the parameter IGNORES it silently, so an un-gated client
664
+ * would receive the rank order under a request that asked for the activity
665
+ * one - a page whose membership is a wake band, which is the exact defect
666
+ * this parameter exists to remove. `activity` is the one value today; a
667
+ * literal rather than a string so a typo is a type error here rather than a
668
+ * refusal from the route.
669
+ */
670
+ sort: zod.z.literal("activity").optional()
599
671
  }).strict(),
600
672
  /*
601
673
  * Acknowledge the one-time delegated-cleanup notice:
@@ -2078,6 +2150,22 @@ const desktopRequestUnion = zod.z.discriminatedUnion("op", [
2078
2150
  zod.z.object({ op: zod.z.literal("auth.cancel"), id }).strict(),
2079
2151
  zod.z.object({ op: zod.z.literal("auth.key"), provider: id, value: secret }).strict(),
2080
2152
  zod.z.object({ op: zod.z.literal("auth.logout"), provider: id }).strict(),
2153
+ /*
2154
+ * Local bearer only: the harness owns Radient OAuth and organization policy.
2155
+ * The account guard is local-only and is stripped before the hub write.
2156
+ */
2157
+ zod.z.object({
2158
+ op: zod.z.literal("agent_messages.status"),
2159
+ boundary: agentMessagesBoundarySchema
2160
+ }).strict(),
2161
+ zod.z.object({
2162
+ op: zod.z.literal("agent_messages.enable"),
2163
+ expected_account_id: id,
2164
+ tenant_id: id,
2165
+ state: zod.z.literal("active"),
2166
+ consent_version: zod.z.string().min(1).max(128),
2167
+ consented_via: zod.z.literal("dialog")
2168
+ }).strict(),
2081
2169
  zod.z.object({ op: zod.z.literal("settings.list") }).strict(),
2082
2170
  zod.z.object({
2083
2171
  op: zod.z.literal("settings.edit"),