@wrongstack/webui 0.308.7 → 0.309.1

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 (105) hide show
  1. package/dist/assets/{AgentRosterView-z7sAuWGe.js → AgentRosterView-CBiLW8dV.js} +1 -1
  2. package/dist/assets/{AnalyticsDashboard-Ch1DX7tR.js → AnalyticsDashboard-Grpp3QKX.js} +1 -1
  3. package/dist/assets/{AudienceMemoryPanel-Cec0V4--.js → AudienceMemoryPanel-DU3hUuUl.js} +1 -1
  4. package/dist/assets/{ChangesView-CzvRJS2F.js → ChangesView-DOrw4udd.js} +1 -1
  5. package/dist/assets/ChronicleDashboard-DlCuQRB8.js +1 -0
  6. package/dist/assets/CodeEditor-CU6zP0r8.js +2 -0
  7. package/dist/assets/CodeMap-BkJqVDg2.js +1 -0
  8. package/dist/assets/{ConfirmModal-i2BGY0ev.js → ConfirmModal-BJOVE-JI.js} +1 -1
  9. package/dist/assets/{CronJobsPanel-D4VNa-Kl.js → CronJobsPanel-B3UJP0mn.js} +1 -1
  10. package/dist/assets/{DeadCodeScanPanel-DyV2LHm_.js → DeadCodeScanPanel-_iUu5-90.js} +1 -1
  11. package/dist/assets/{DebugDashboard-C_T68C0f.js → DebugDashboard-NTiN0je2.js} +1 -1
  12. package/dist/assets/{DesignGalleryView-CVmV-AU2.js → DesignGalleryView-BG2Nr8wy.js} +1 -1
  13. package/dist/assets/{GoalView-DQa9PklT.js → GoalView-Dakf9ZR8.js} +1 -1
  14. package/dist/assets/KanbanView-BR07PhbR.js +3 -0
  15. package/dist/assets/{MailboxDetailView-D7aRTWS8.js → MailboxDetailView-D31IhaK_.js} +1 -1
  16. package/dist/assets/{MemoryDrawer-Bivx9AXj.js → MemoryDrawer-6n0Etoz4.js} +1 -1
  17. package/dist/assets/MemoryManager-7DSVhxZf.js +1 -0
  18. package/dist/assets/{ModelPicker-MpC6-gWQ.js → ModelPicker-C72kprRH.js} +1 -1
  19. package/dist/assets/OfficeMapPanel-Ce7myLNH.css +1 -0
  20. package/dist/assets/OfficeMapPanel-Dc8-4CiU.js +4 -0
  21. package/dist/assets/{ProcessMonitor-C8GH1q2B.js → ProcessMonitor-BGLc3yNM.js} +1 -1
  22. package/dist/assets/{PromptJournalView-BdOYPAjU.js → PromptJournalView-CxDiqUkN.js} +1 -1
  23. package/dist/assets/{QueuePanel-RBW9Sh9b.js → QueuePanel-B2f1HbN0.js} +1 -1
  24. package/dist/assets/{RefreshDebugView-1lZduXKE.js → RefreshDebugView-D8F95QxF.js} +1 -1
  25. package/dist/assets/{RequirementIntakeView-BtKuq_F4.js → RequirementIntakeView-BRolSCpk.js} +1 -1
  26. package/dist/assets/{SageTabs-D2_mTlcJ.js → SageTabs-DblSyqzB.js} +2 -2
  27. package/dist/assets/{SddFlowGraph-BdaItHkB.js → SddFlowGraph-YOPsSaFc.js} +1 -1
  28. package/dist/assets/SddHub-IusMUP2D.js +2 -0
  29. package/dist/assets/{SessionInspectView-xchxZrHA.js → SessionInspectView-B633Bi0X.js} +1 -1
  30. package/dist/assets/SessionList-BCE6NSCu.js +1 -0
  31. package/dist/assets/{SessionsDashboard-6QJsVGap.js → SessionsDashboard-N__p7_i5.js} +1 -1
  32. package/dist/assets/SetupScreen-B06asuJC.js +1 -0
  33. package/dist/assets/SkillDetailView-BxpQcgfh.js +3 -0
  34. package/dist/assets/{SpecsView-D-qbN6F5.js → SpecsView-Ddbow1sn.js} +1 -1
  35. package/dist/assets/TechStackView-HTZUTbuu.js +2 -0
  36. package/dist/assets/{TerminalPanel-DZs5mkPP.js → TerminalPanel-Bi3CmRvI.js} +1 -1
  37. package/dist/assets/{Toaster-ChF897Tc.js → Toaster-COVFFUKo.js} +1 -1
  38. package/dist/assets/{activity-DYwBIByU.js → activity-7Sj9fdO-.js} +2 -2
  39. package/dist/assets/{activity-CA5G03Kw.js → activity-B-LcgiXm.js} +2 -2
  40. package/dist/assets/{activity-CezOSNBd.js → activity-B7hiQ_IX.js} +2 -2
  41. package/dist/assets/{activity-C6pIBHte.js → activity-Cq0Lqtgz.js} +2 -2
  42. package/dist/assets/{activity-CxnlCaZu.js → activity-DVuAYnoi.js} +2 -2
  43. package/dist/assets/{activity-l8lDAw8a.js → activity-Dt0RpmkN.js} +2 -2
  44. package/dist/assets/{activity-CkGBp_I-.js → activity-JmCi-KcX.js} +2 -2
  45. package/dist/assets/{button-DvpRpKkt.js → button-DAT5OnLL.js} +1 -1
  46. package/dist/assets/{chat-store-c0pGYczr.js → chat-store-CtIMb3sU.js} +1 -1
  47. package/dist/assets/{codemap-activity-store-BH7Mh4k9.js → codemap-activity-store-CA_14DHd.js} +1 -1
  48. package/dist/assets/codemap-index-store-BlPxA13l.js +1 -0
  49. package/dist/assets/{dialog-BJjDUqb3.js → dialog-BMrjwjA6.js} +1 -1
  50. package/dist/assets/{empty-state-Cefmzojx.js → empty-state-Bf05Z1d2.js} +1 -1
  51. package/dist/assets/{i18n-DiD9Wcep.js → i18n-CYYBUSJB.js} +2 -2
  52. package/dist/assets/{index-Cnerffls.js → index-cUeJ0FkT.js} +55 -54
  53. package/dist/assets/{input-BtoHcCl9.js → input-Ccsxvwz6.js} +1 -1
  54. package/dist/assets/{mailbox-store-bF96Ih2G.js → mailbox-store-BWD7JeF9.js} +1 -1
  55. package/dist/assets/{markdown-CIRD7kOg.js → markdown-Kp5uSgOw.js} +23 -23
  56. package/dist/assets/{roster-ws-XgkT9mo8.js → roster-ws-lMIf13ag.js} +1 -1
  57. package/dist/assets/session-store-D4PNeAGe.js +1 -0
  58. package/dist/assets/settings-B36QpLU8.js +1 -0
  59. package/dist/assets/settings-B8Hgh9_X.js +1 -0
  60. package/dist/assets/settings-B8uABeWU.js +1 -0
  61. package/dist/assets/settings-CSwU_zzD.js +1 -0
  62. package/dist/assets/settings-DfID_cS9.js +1 -0
  63. package/dist/assets/{settings-BPT8LWkU.js → settings-FXJ8SsEh.js} +1 -1
  64. package/dist/assets/settings-RQKnX4dA.js +1 -0
  65. package/dist/assets/{shared-B3czc2Dj.js → shared-Y6T3EEnd.js} +1 -1
  66. package/dist/assets/stores-BUtRik4k.js +7 -0
  67. package/dist/assets/{ui-store-xx1NssJI.js → ui-store-DxMnhARg.js} +1 -1
  68. package/dist/assets/useWebSocket-Ew1Bbjci.js +29 -0
  69. package/dist/assets/{utils-tsZEnrBH.js → utils-B5X3DKef.js} +1 -1
  70. package/dist/assets/{vector-memory-panel-C6iWDhkJ.js → vector-memory-panel-CnBqV6GK.js} +1 -1
  71. package/dist/assets/{vendor-C_zEzV4N.js → vendor-DLS502Zs.js} +3 -3
  72. package/dist/assets/{view-navigation-CZKugncK.js → view-navigation-Hd631M1W.js} +1 -1
  73. package/dist/assets/{ws-client-BVq0hf0a.js → ws-client-DYrfK01f.js} +1 -1
  74. package/dist/components/AgentOfficeView/model.d.ts +20 -0
  75. package/dist/components/AgentOfficeView.d.ts +10 -0
  76. package/dist/index.css +114 -7
  77. package/dist/index.html +23 -23
  78. package/dist/index.js +409 -101
  79. package/dist/stores/index.d.ts +1 -1
  80. package/dist/stores/office-map-store.d.ts +6 -0
  81. package/dist/stores/session-store.d.ts +7 -0
  82. package/dist/types/protocol-core.d.ts +4 -0
  83. package/package.json +15 -15
  84. package/dist/assets/ChronicleDashboard-Dc5cQH7A.js +0 -1
  85. package/dist/assets/CodeEditor-C1xScB5M.js +0 -2
  86. package/dist/assets/CodeMap-BMcY8qXe.js +0 -1
  87. package/dist/assets/KanbanView-CDp4gTML.js +0 -3
  88. package/dist/assets/MemoryManager-DOTxwo0l.js +0 -1
  89. package/dist/assets/OfficeMapPanel-D6yTfGIT.css +0 -1
  90. package/dist/assets/OfficeMapPanel-Q8nQfQVb.js +0 -4
  91. package/dist/assets/SddHub-DVO0JGWk.js +0 -2
  92. package/dist/assets/SessionList-2W7mKbcZ.js +0 -1
  93. package/dist/assets/SetupScreen-DM2KCb23.js +0 -1
  94. package/dist/assets/SkillDetailView-Cx2z8hyp.js +0 -3
  95. package/dist/assets/TechStackView-C7XFcAls.js +0 -2
  96. package/dist/assets/codemap-index-store-BFm1TzVW.js +0 -1
  97. package/dist/assets/session-store-BgiP4PnQ.js +0 -1
  98. package/dist/assets/settings-50uwXQIW.js +0 -1
  99. package/dist/assets/settings-BmJI-gam.js +0 -1
  100. package/dist/assets/settings-CqFe8Jtz.js +0 -1
  101. package/dist/assets/settings-DeM0wvCG.js +0 -1
  102. package/dist/assets/settings-DijFr-kZ.js +0 -1
  103. package/dist/assets/settings-L9mLQIIP.js +0 -1
  104. package/dist/assets/stores-CzgPPQlG.js +0 -7
  105. package/dist/assets/useWebSocket-DvMcAAgU.js +0 -29
package/dist/index.js CHANGED
@@ -1591,6 +1591,8 @@ var require_activity = __commonJS({
1591
1591
  zoomControls: "Zoom controls",
1592
1592
  animateWires: "Animate wires",
1593
1593
  backgroundHeading: "Background",
1594
+ waitThresholdHeading: "Waiting threshold",
1595
+ waitThresholdHint: "Flag a live desk as waiting after this much silence",
1594
1596
  bgDots: "Dots",
1595
1597
  bgLines: "Lines",
1596
1598
  bgCross: "Cross",
@@ -2331,6 +2333,13 @@ var require_activity = __commonJS({
2331
2333
  syncWaiting: "waiting for sync",
2332
2334
  todoTelemetryWaiting: "Reconnect this terminal to receive the live todo list",
2333
2335
  taskNotReported: "Working, but no task description was reported",
2336
+ waitingForReply: 'Waiting for a reply to "{{subject}}" \u2014 sent {{duration}} ago',
2337
+ waitingMailFallback: "a recent message",
2338
+ waitingTelemetry: "Waiting \u2014 no telemetry from this terminal yet",
2339
+ waitingNoWork: "Waiting for work \u2014 no activity for {{duration}} (last: {{last}})",
2340
+ waitingNothingYet: "nothing yet",
2341
+ contextUsed: "Context window used",
2342
+ cost: "cost",
2334
2343
  noPrompt: "No prompt received in this session yet",
2335
2344
  activeTodos: "Active todos",
2336
2345
  todoProgress: "{{done}}/{{total}} done",
@@ -4616,7 +4625,8 @@ var require_settings = __commonJS({
4616
4625
  autonomyDelayMsLabel: "Auto-proceed delay",
4617
4626
  autonomyDelayMsHint: "Milliseconds before the agent auto-proceeds in Auto mode. 0 = immediate.",
4618
4627
  refineCountdownLabel: "Refine countdown",
4619
- refineCountdownHint: "Grace period before the refined prompt auto-sends (milliseconds)."
4628
+ refineCountdownHint: "Grace period before the refined prompt auto-sends (milliseconds).",
4629
+ reasoningEffortModelSet: "levels offered by the active model"
4620
4630
  },
4621
4631
  execution: {
4622
4632
  heading: "Execution",
@@ -6481,6 +6491,8 @@ var require_activity2 = __commonJS({
6481
6491
  zoomControls: "Zoom-Steuerung",
6482
6492
  animateWires: "Kabel animieren",
6483
6493
  backgroundHeading: "Hintergrund",
6494
+ waitThresholdHeading: "Warteschwelle",
6495
+ waitThresholdHint: "Live-Schreibtisch nach so viel Stille als wartend markieren",
6484
6496
  bgDots: "Punkte",
6485
6497
  bgLines: "Linien",
6486
6498
  bgCross: "Kreuz",
@@ -7221,6 +7233,13 @@ var require_activity2 = __commonJS({
7221
7233
  syncWaiting: "Warten auf Synchronisierung",
7222
7234
  todoTelemetryWaiting: "Terminal neu verbinden, um die Live-Aufgabenliste zu empfangen",
7223
7235
  taskNotReported: "Agent arbeitet, aber es wurde keine Aufgabenbeschreibung gemeldet",
7236
+ waitingForReply: "Wartet auf eine Antwort auf \u201E{{subject}}\u201C \u2014 vor {{duration}} gesendet",
7237
+ waitingMailFallback: "eine aktuelle Nachricht",
7238
+ waitingTelemetry: "Wartet \u2014 noch keine Telemetrie von diesem Terminal",
7239
+ waitingNoWork: "Wartet auf Arbeit \u2014 seit {{duration}} keine Aktivit\xE4t (zuletzt: {{last}})",
7240
+ waitingNothingYet: "noch nichts",
7241
+ contextUsed: "Belegtes Kontextfenster",
7242
+ cost: "Kosten",
7224
7243
  noPrompt: "In dieser Sitzung wurde noch kein Prompt empfangen",
7225
7244
  activeTodos: "Aktive Aufgaben",
7226
7245
  todoProgress: "{{done}}/{{total}} erledigt",
@@ -9511,7 +9530,8 @@ var require_settings2 = __commonJS({
9511
9530
  autonomyDelayMsLabel: "Verz\xF6gerung der automatischen Fortsetzung",
9512
9531
  autonomyDelayMsHint: "Millisekunden, bevor der Agent im Auto-Modus automatisch fortf\xE4hrt. 0 = sofort.",
9513
9532
  refineCountdownLabel: "Verfeinerungs-Countdown",
9514
- refineCountdownHint: "Gnadenfrist, bevor der verfeinerte Prompt automatisch gesendet wird (Millisekunden)."
9533
+ refineCountdownHint: "Gnadenfrist, bevor der verfeinerte Prompt automatisch gesendet wird (Millisekunden).",
9534
+ reasoningEffortModelSet: "Stufen des aktiven Modells"
9515
9535
  },
9516
9536
  execution: {
9517
9537
  heading: "Ausf\xFChrung",
@@ -11376,6 +11396,8 @@ var require_activity3 = __commonJS({
11376
11396
  zoomControls: "Controles de zoom",
11377
11397
  animateWires: "Animar cables",
11378
11398
  backgroundHeading: "Fondo",
11399
+ waitThresholdHeading: "Umbral de espera",
11400
+ waitThresholdHint: "Marcar un escritorio activo como en espera tras este silencio",
11379
11401
  bgDots: "Puntos",
11380
11402
  bgLines: "L\xEDneas",
11381
11403
  bgCross: "Cruz",
@@ -12116,6 +12138,13 @@ var require_activity3 = __commonJS({
12116
12138
  syncWaiting: "esperando sincronizaci\xF3n",
12117
12139
  todoTelemetryWaiting: "Reconecta este terminal para recibir la lista de tareas en vivo",
12118
12140
  taskNotReported: "El agente trabaja, pero no inform\xF3 una descripci\xF3n de la tarea",
12141
+ waitingForReply: "Esperando respuesta a \xAB{{subject}}\xBB \u2014 enviado hace {{duration}}",
12142
+ waitingMailFallback: "un mensaje reciente",
12143
+ waitingTelemetry: "Esperando \u2014 a\xFAn sin telemetr\xEDa de esta terminal",
12144
+ waitingNoWork: "Esperando trabajo \u2014 sin actividad durante {{duration}} (\xFAltimo: {{last}})",
12145
+ waitingNothingYet: "nada todav\xEDa",
12146
+ contextUsed: "Ventana de contexto usada",
12147
+ cost: "costo",
12119
12148
  noPrompt: "A\xFAn no se recibi\xF3 ning\xFAn prompt en esta sesi\xF3n",
12120
12149
  activeTodos: "Tareas activas",
12121
12150
  todoProgress: "{{done}}/{{total}} completadas",
@@ -14406,7 +14435,8 @@ var require_settings3 = __commonJS({
14406
14435
  autonomyDelayMsLabel: "Retraso de continuaci\xF3n autom\xE1tica",
14407
14436
  autonomyDelayMsHint: "Milisegundos antes de que el agente contin\xFAe autom\xE1ticamente en modo Auto. 0 = inmediato.",
14408
14437
  refineCountdownLabel: "Cuenta atr\xE1s de refinamiento",
14409
- refineCountdownHint: "Per\xEDodo de gracia antes del env\xEDo autom\xE1tico del prompt refinado (milisegundos)."
14438
+ refineCountdownHint: "Per\xEDodo de gracia antes del env\xEDo autom\xE1tico del prompt refinado (milisegundos).",
14439
+ reasoningEffortModelSet: "niveles del modelo activo"
14410
14440
  },
14411
14441
  execution: {
14412
14442
  heading: "Ejecuci\xF3n",
@@ -16271,6 +16301,8 @@ var require_activity4 = __commonJS({
16271
16301
  zoomControls: "Contr\xF4les zoom",
16272
16302
  animateWires: "Animer les fils",
16273
16303
  backgroundHeading: "Arri\xE8re-plan",
16304
+ waitThresholdHeading: "Seuil d'attente",
16305
+ waitThresholdHint: "Marquer un bureau actif comme en attente apr\xE8s ce silence",
16274
16306
  bgDots: "Points",
16275
16307
  bgLines: "Lignes",
16276
16308
  bgCross: "Croix",
@@ -17012,6 +17044,13 @@ D\xE9clencheurs : l'utilisateur dit "mot-cl\xE9", "autre".`,
17012
17044
  syncWaiting: "synchronisation en attente",
17013
17045
  todoTelemetryWaiting: "Reconnectez ce terminal pour recevoir la liste des t\xE2ches en direct",
17014
17046
  taskNotReported: "L\u2019agent travaille, mais aucune description de t\xE2che n\u2019a \xE9t\xE9 signal\xE9e",
17047
+ waitingForReply: "En attente d\u2019une r\xE9ponse \xE0 \xAB {{subject}} \xBB \u2014 envoy\xE9 il y a {{duration}}",
17048
+ waitingMailFallback: "un message r\xE9cent",
17049
+ waitingTelemetry: "En attente \u2014 aucune t\xE9l\xE9m\xE9trie de ce terminal pour l\u2019instant",
17050
+ waitingNoWork: "En attente de travail \u2014 aucune activit\xE9 depuis {{duration}} (dernier : {{last}})",
17051
+ waitingNothingYet: "rien pour l\u2019instant",
17052
+ contextUsed: "Fen\xEAtre de contexte utilis\xE9e",
17053
+ cost: "co\xFBt",
17015
17054
  noPrompt: "Aucun prompt re\xE7u dans cette session",
17016
17055
  activeTodos: "T\xE2ches actives",
17017
17056
  todoProgress: "{{done}}/{{total}} termin\xE9es",
@@ -19302,7 +19341,8 @@ var require_settings4 = __commonJS({
19302
19341
  autonomyDelayMsLabel: "D\xE9lai de reprise automatique",
19303
19342
  autonomyDelayMsHint: "Millisecondes avant que l'agent reprenne automatiquement en mode Auto. 0 = imm\xE9diat.",
19304
19343
  refineCountdownLabel: "Compte \xE0 rebours d'affinage",
19305
- refineCountdownHint: "D\xE9lai de gr\xE2ce avant l'envoi automatique du prompt affin\xE9 (millisecondes)."
19344
+ refineCountdownHint: "D\xE9lai de gr\xE2ce avant l'envoi automatique du prompt affin\xE9 (millisecondes).",
19345
+ reasoningEffortModelSet: "niveaux du mod\xE8le actif"
19306
19346
  },
19307
19347
  execution: {
19308
19348
  heading: "Ex\xE9cution",
@@ -21167,6 +21207,8 @@ var require_activity5 = __commonJS({
21167
21207
  zoomControls: "Controlli zoom",
21168
21208
  animateWires: "Anima fili",
21169
21209
  backgroundHeading: "Sfondo",
21210
+ waitThresholdHeading: "Soglia di attesa",
21211
+ waitThresholdHint: "Contrassegna una scrivania attiva come in attesa dopo questo silenzio",
21170
21212
  bgDots: "Punti",
21171
21213
  bgLines: "Linee",
21172
21214
  bgCross: "Croce",
@@ -21908,6 +21950,13 @@ Trigger: l'utente dice "parola chiave", "altra".`,
21908
21950
  syncWaiting: "sincronizzazione in attesa",
21909
21951
  todoTelemetryWaiting: "Riconnetti questo terminale per ricevere l\u2019elenco attivit\xE0 live",
21910
21952
  taskNotReported: "L\u2019agente sta lavorando, ma non ha segnalato una descrizione dell\u2019attivit\xE0",
21953
+ waitingForReply: "In attesa di una risposta a \xAB{{subject}}\xBB \u2014 inviata {{duration}} fa",
21954
+ waitingMailFallback: "un messaggio recente",
21955
+ waitingTelemetry: "In attesa \u2014 nessuna telemetria da questo terminale",
21956
+ waitingNoWork: "In attesa di lavoro \u2014 nessuna attivit\xE0 da {{duration}} (ultima: {{last}})",
21957
+ waitingNothingYet: "ancora niente",
21958
+ contextUsed: "Finestra di contesto usata",
21959
+ cost: "costo",
21911
21960
  noPrompt: "Nessun prompt ancora ricevuto in questa sessione",
21912
21961
  activeTodos: "Attivit\xE0 attive",
21913
21962
  todoProgress: "{{done}}/{{total}} completate",
@@ -24198,7 +24247,8 @@ var require_settings5 = __commonJS({
24198
24247
  autonomyDelayMsLabel: "Ritardo di avanzamento automatico",
24199
24248
  autonomyDelayMsHint: "Millisecondi prima che l'agente proceda automaticamente in modalit\xE0 Auto. 0 = immediato.",
24200
24249
  refineCountdownLabel: "Conto alla rovescia affinamento",
24201
- refineCountdownHint: "Periodo di grazia prima dell'invio automatico del prompt affinato (millisecondi)."
24250
+ refineCountdownHint: "Periodo di grazia prima dell'invio automatico del prompt affinato (millisecondi).",
24251
+ reasoningEffortModelSet: "livelli del modello attivo"
24202
24252
  },
24203
24253
  execution: {
24204
24254
  heading: "Esecuzione",
@@ -26063,6 +26113,8 @@ var require_activity6 = __commonJS({
26063
26113
  zoomControls: "Controles de zoom",
26064
26114
  animateWires: "Animar fios",
26065
26115
  backgroundHeading: "Fundo",
26116
+ waitThresholdHeading: "Limiar de espera",
26117
+ waitThresholdHint: "Marcar uma mesa ativa como aguardando ap\xF3s este sil\xEAncio",
26066
26118
  bgDots: "Pontos",
26067
26119
  bgLines: "Linhas",
26068
26120
  bgCross: "Cruz",
@@ -26803,6 +26855,13 @@ var require_activity6 = __commonJS({
26803
26855
  syncWaiting: "aguardando sincroniza\xE7\xE3o",
26804
26856
  todoTelemetryWaiting: "Reconecte este terminal para receber a lista de tarefas ao vivo",
26805
26857
  taskNotReported: "O agente est\xE1 trabalhando, mas nenhuma descri\xE7\xE3o de tarefa foi informada",
26858
+ waitingForReply: 'Aguardando uma resposta para "{{subject}}" \u2014 mensagem enviada h\xE1 {{duration}}',
26859
+ waitingMailFallback: "uma mensagem recente",
26860
+ waitingTelemetry: "Aguardando \u2014 ainda sem telemetria deste terminal",
26861
+ waitingNoWork: "Aguardando trabalho \u2014 sem atividade por {{duration}} (\xFAltima: {{last}})",
26862
+ waitingNothingYet: "nada ainda",
26863
+ contextUsed: "Janela de contexto usada",
26864
+ cost: "custo",
26806
26865
  noPrompt: "Nenhum prompt recebido nesta sess\xE3o",
26807
26866
  activeTodos: "Tarefas ativas",
26808
26867
  todoProgress: "{{done}}/{{total}} conclu\xEDdas",
@@ -29093,7 +29152,8 @@ var require_settings6 = __commonJS({
29093
29152
  autonomyDelayMsLabel: "Atraso de continua\xE7\xE3o autom\xE1tica",
29094
29153
  autonomyDelayMsHint: "Milissegundos antes de o agente continuar automaticamente no modo Auto. 0 = imediato.",
29095
29154
  refineCountdownLabel: "Contagem regressiva de refinamento",
29096
- refineCountdownHint: "Per\xEDodo de car\xEAncia antes do envio autom\xE1tico do prompt refinado (milissegundos)."
29155
+ refineCountdownHint: "Per\xEDodo de car\xEAncia antes do envio autom\xE1tico do prompt refinado (milissegundos).",
29156
+ reasoningEffortModelSet: "n\xEDveis do modelo ativo"
29097
29157
  },
29098
29158
  execution: {
29099
29159
  heading: "Execu\xE7\xE3o",
@@ -30958,6 +31018,8 @@ var require_activity7 = __commonJS({
30958
31018
  zoomControls: "Yak\u0131nla\u015Ft\u0131rma kontrolleri",
30959
31019
  animateWires: "Ba\u011Flant\u0131lar\u0131 animasyonla",
30960
31020
  backgroundHeading: "Arka plan",
31021
+ waitThresholdHeading: "Bekleme e\u015Fi\u011Fi",
31022
+ waitThresholdHint: "Canl\u0131 bir masay\u0131 bu kadar sessizlikten sonra bekliyor olarak i\u015Faretle",
30961
31023
  bgDots: "Noktalar",
30962
31024
  bgLines: "\xC7izgiler",
30963
31025
  bgCross: "\xC7apraz",
@@ -31699,6 +31761,13 @@ var require_activity7 = __commonJS({
31699
31761
  todoTelemetryWaiting: "Canl\u0131 todo listesi i\xE7in bu terminali yeniden ba\u011Flay\u0131n",
31700
31762
  taskNotReported: "\xC7al\u0131\u015F\u0131yor ancak g\xF6rev a\xE7\u0131klamas\u0131 bildirilmedi",
31701
31763
  noPrompt: "Bu oturumda hen\xFCz prompt al\u0131nmad\u0131",
31764
+ waitingForReply: '"{{subject}}" yan\u0131t bekliyor \u2014 {{duration}} \xF6nce g\xF6nderildi',
31765
+ waitingMailFallback: "yak\u0131n tarihli bir mesaj",
31766
+ waitingTelemetry: "Bekliyor \u2014 bu terminalden hen\xFCz telemetri yok",
31767
+ waitingNoWork: "\u0130\u015F bekliyor \u2014 {{duration}}dir etkinlik yok (son: {{last}})",
31768
+ waitingNothingYet: "hen\xFCz bir \u015Fey yok",
31769
+ contextUsed: "Kullan\u0131lan ba\u011Flam penceresi",
31770
+ cost: "maliyet",
31702
31771
  activeTodos: "Aktif yap\u0131lacaklar",
31703
31772
  todoProgress: "{{done}}/{{total}} tamamland\u0131",
31704
31773
  allTodosDone: "T\xFCm i\u015Fler tamamland\u0131",
@@ -33988,7 +34057,8 @@ var require_settings7 = __commonJS({
33988
34057
  autonomyDelayMsLabel: "Otomatik devam gecikmesi",
33989
34058
  autonomyDelayMsHint: "Auto modunda ajan\u0131n otomatik devam etmeden \xF6nce bekleme s\xFCresi (milisaniye). 0 = an\u0131nda.",
33990
34059
  refineCountdownLabel: "\u0130yile\u015Ftirme geri say\u0131m\u0131",
33991
- refineCountdownHint: "\u0130yile\u015Ftirilmi\u015F istemin otomatik g\xF6nderilmeden \xF6nceki bekleme s\xFCresi (milisaniye)."
34060
+ refineCountdownHint: "\u0130yile\u015Ftirilmi\u015F istemin otomatik g\xF6nderilmeden \xF6nceki bekleme s\xFCresi (milisaniye).",
34061
+ reasoningEffortModelSet: "aktif modelin destekledi\u011Fi seviyeler"
33992
34062
  },
33993
34063
  execution: {
33994
34064
  heading: "Y\xFCr\xFCtme",
@@ -35384,7 +35454,13 @@ var init_session_store = __esm({
35384
35454
  // Clear cache snapshot on provider/model switch — a stale
35385
35455
  // reading from the previous provider can never apply to the
35386
35456
  // new prompt cache. Same lifecycle as `contextLimitWarning`.
35387
- ...sessionOrRouteChanged ? { contextLimitWarning: null, cacheStats: null } : {}
35457
+ // `reasoningEffortLevels` follows: a new model's effort set is
35458
+ // unknown until the next session.start repopulates it.
35459
+ ...sessionOrRouteChanged ? {
35460
+ contextLimitWarning: null,
35461
+ cacheStats: null,
35462
+ reasoningEffortLevels: void 0
35463
+ } : {}
35388
35464
  };
35389
35465
  }),
35390
35466
  updateUsage: (usage) => set((state) => {
@@ -35412,7 +35488,8 @@ var init_session_store = __esm({
35412
35488
  lastVisitedAt: Date.now(),
35413
35489
  droppedTools: 0,
35414
35490
  contextLimitWarning: null,
35415
- cacheStats: null
35491
+ cacheStats: null,
35492
+ reasoningEffortLevels: void 0
35416
35493
  }),
35417
35494
  endSession: () => set({
35418
35495
  session: null,
@@ -35420,7 +35497,8 @@ var init_session_store = __esm({
35420
35497
  iteration: null,
35421
35498
  droppedTools: 0,
35422
35499
  contextLimitWarning: null,
35423
- cacheStats: null
35500
+ cacheStats: null,
35501
+ reasoningEffortLevels: void 0
35424
35502
  // Note: we intentionally do NOT clear lastVisitedAt here. The
35425
35503
  // verifier view uses it to show "previous activity at …" even
35426
35504
  // when the user explicitly ended a session.
@@ -35434,7 +35512,13 @@ var init_session_store = __esm({
35434
35512
  contextMode: env.contextMode ?? state.contextMode,
35435
35513
  inputCost: env.inputCost ?? state.inputCost,
35436
35514
  outputCost: env.outputCost ?? state.outputCost,
35437
- cacheReadCost: env.cacheReadCost ?? state.cacheReadCost
35515
+ cacheReadCost: env.cacheReadCost ?? state.cacheReadCost,
35516
+ // Key-presence, not `??`: the server OMITS the field when the new
35517
+ // model advertises no effort list, and a `??` fallback would keep
35518
+ // the previous model's list alive across the switch (the same
35519
+ // stale-leak pattern cacheStats guards against). Present-but-
35520
+ // undefined means "no list" and must overwrite.
35521
+ reasoningEffortLevels: "reasoningEffortLevels" in env ? env.reasoningEffortLevels : state.reasoningEffortLevels
35438
35522
  })),
35439
35523
  setIteration: (iteration) => set({ iteration }),
35440
35524
  setContextUsage: (tokens, maxContext) => set((state) => ({
@@ -40398,7 +40482,7 @@ var init_monitor_store = __esm({
40398
40482
  break;
40399
40483
  }
40400
40484
  for (let j = 0; j < aa.length; j++) {
40401
- if (aa[j].id !== ba[j].id || aa[j].name !== ba[j].name || aa[j].status !== ba[j].status || aa[j].currentTool !== ba[j].currentTool || aa[j].iterations !== ba[j].iterations || aa[j].toolCalls !== ba[j].toolCalls || aa[j].ctxPct !== ba[j].ctxPct || aa[j].recentTools?.[0]?.id !== ba[j].recentTools?.[0]?.id || aa[j].recentMail?.[0]?.id !== ba[j].recentMail?.[0]?.id || aa[j].activity?.reads !== ba[j].activity?.reads || aa[j].activity?.writes !== ba[j].activity?.writes || aa[j].activity?.edits !== ba[j].activity?.edits || aa[j].activity?.terminalCalls !== ba[j].activity?.terminalCalls || aa[j].activity?.mailReceived !== ba[j].activity?.mailReceived || aa[j].activity?.mailSent !== ba[j].activity?.mailSent || aa[j].activity?.linesAdded !== ba[j].activity?.linesAdded || aa[j].activity?.linesRemoved !== ba[j].activity?.linesRemoved) {
40485
+ if (aa[j].id !== ba[j].id || aa[j].name !== ba[j].name || aa[j].status !== ba[j].status || aa[j].currentTool !== ba[j].currentTool || aa[j].iterations !== ba[j].iterations || aa[j].toolCalls !== ba[j].toolCalls || aa[j].ctxPct !== ba[j].ctxPct || aa[j].tokensIn !== ba[j].tokensIn || aa[j].tokensOut !== ba[j].tokensOut || aa[j].costUsd !== ba[j].costUsd || aa[j].recentTools?.[0]?.id !== ba[j].recentTools?.[0]?.id || aa[j].recentMail?.[0]?.id !== ba[j].recentMail?.[0]?.id || aa[j].activity?.reads !== ba[j].activity?.reads || aa[j].activity?.writes !== ba[j].activity?.writes || aa[j].activity?.edits !== ba[j].activity?.edits || aa[j].activity?.terminalCalls !== ba[j].activity?.terminalCalls || aa[j].activity?.mailReceived !== ba[j].activity?.mailReceived || aa[j].activity?.mailSent !== ba[j].activity?.mailSent || aa[j].activity?.linesAdded !== ba[j].activity?.linesAdded || aa[j].activity?.linesRemoved !== ba[j].activity?.linesRemoved) {
40402
40486
  same = false;
40403
40487
  break;
40404
40488
  }
@@ -40451,10 +40535,12 @@ var init_monitor_store = __esm({
40451
40535
  // src/stores/office-map-store.ts
40452
40536
  import { create as create21 } from "zustand";
40453
40537
  import { persist as persist6 } from "zustand/middleware";
40454
- var useOfficeMapStore;
40538
+ var WAIT_THRESHOLD_PRESETS, DEFAULT_WAIT_THRESHOLD_MS, useOfficeMapStore;
40455
40539
  var init_office_map_store = __esm({
40456
40540
  "src/stores/office-map-store.ts"() {
40457
40541
  "use strict";
40542
+ WAIT_THRESHOLD_PRESETS = [3e4, 6e4, 12e4, 3e5, 6e5];
40543
+ DEFAULT_WAIT_THRESHOLD_MS = 12e4;
40458
40544
  useOfficeMapStore = create21()(
40459
40545
  persist6(
40460
40546
  (set) => ({
@@ -40466,6 +40552,7 @@ var init_office_map_store = __esm({
40466
40552
  animateEdges: true,
40467
40553
  showFeed: true,
40468
40554
  background: "dots",
40555
+ waitThresholdMs: DEFAULT_WAIT_THRESHOLD_MS,
40469
40556
  setViewMode: (v) => set({ viewMode: v }),
40470
40557
  setShowHud: (v) => set({ showHud: v }),
40471
40558
  setShowLegend: (v) => set({ showLegend: v }),
@@ -40473,7 +40560,8 @@ var init_office_map_store = __esm({
40473
40560
  setShowControls: (v) => set({ showControls: v }),
40474
40561
  setAnimateEdges: (v) => set({ animateEdges: v }),
40475
40562
  setShowFeed: (v) => set({ showFeed: v }),
40476
- setBackground: (v) => set({ background: v })
40563
+ setBackground: (v) => set({ background: v }),
40564
+ setWaitThresholdMs: (v) => set({ waitThresholdMs: Number.isFinite(v) && v > 0 ? Math.round(v) : DEFAULT_WAIT_THRESHOLD_MS })
40477
40565
  }),
40478
40566
  { name: "wrongstack-officemap" }
40479
40567
  )
@@ -44049,7 +44137,10 @@ function handleSessionStart(msg) {
44049
44137
  contextMode: payload.contextMode,
44050
44138
  inputCost: payload.inputCost,
44051
44139
  outputCost: payload.outputCost,
44052
- cacheReadCost: payload.cacheReadCost
44140
+ cacheReadCost: payload.cacheReadCost,
44141
+ // Always pass the key (even undefined) so the store's key-presence
44142
+ // semantics replace a previous model's list on switch.
44143
+ reasoningEffortLevels: payload.reasoningEffortLevels
44053
44144
  });
44054
44145
  useConfigStore.getState().setConfig({ provider, model });
44055
44146
  if (isReset) {
@@ -50098,7 +50189,7 @@ var init_AgentRosterCatalogTab = __esm({
50098
50189
  import {
50099
50190
  Bot as Bot14,
50100
50191
  CheckCircle2 as CheckCircle218,
50101
- Clock as Clock12,
50192
+ Clock as Clock13,
50102
50193
  Crown as Crown5,
50103
50194
  LayoutGrid as LayoutGrid4,
50104
50195
  Trash2 as Trash215,
@@ -50505,7 +50596,7 @@ var init_AgentRosterLiveTab = __esm({
50505
50596
  timeout: {
50506
50597
  led: "bg-warning",
50507
50598
  badge: "bg-muted text-muted-foreground",
50508
- icon: /* @__PURE__ */ jsx153(Clock12, { className: "h-3.5 w-3.5" }),
50599
+ icon: /* @__PURE__ */ jsx153(Clock13, { className: "h-3.5 w-3.5" }),
50509
50600
  color: "text-warning"
50510
50601
  },
50511
50602
  stopped: {
@@ -58066,7 +58157,7 @@ import {
58066
58157
  Activity as Activity16,
58067
58158
  AlertCircle as AlertCircle2,
58068
58159
  BarChart3 as BarChart35,
58069
- Clock as Clock13,
58160
+ Clock as Clock14,
58070
58161
  Eye as Eye8,
58071
58162
  FileWarning,
58072
58163
  Gauge as Gauge4,
@@ -58197,7 +58288,7 @@ function DebugDashboard() {
58197
58288
  ] })
58198
58289
  ] }) }),
58199
58290
  data.lastUpdated && /* @__PURE__ */ jsxs169("div", { className: "flex items-center gap-2 rounded-lg border border-border/60 bg-card/55 px-3 py-2 text-sm text-muted-foreground", children: [
58200
- /* @__PURE__ */ jsx178(Clock13, { className: "w-4 h-4" }),
58291
+ /* @__PURE__ */ jsx178(Clock14, { className: "w-4 h-4" }),
58201
58292
  t("activity:debug.lastUpdated", { time: data.lastUpdated.toLocaleTimeString() })
58202
58293
  ] }),
58203
58294
  data.error && /* @__PURE__ */ jsxs169("div", { className: "flex items-center gap-3 rounded-xl border border-destructive/25 bg-destructive/10 p-4 text-destructive", children: [
@@ -58281,7 +58372,7 @@ function DebugDashboard() {
58281
58372
  title: t("activity:debug.avgDebounce"),
58282
58373
  value: `${(data.fileWatcher?.averageDebounceDelayMs ?? 0).toFixed(1)}ms`,
58283
58374
  subtitle: t("activity:debug.actualDelay"),
58284
- icon: Clock13,
58375
+ icon: Clock14,
58285
58376
  color: "text-warning"
58286
58377
  }
58287
58378
  ),
@@ -58349,7 +58440,7 @@ function DebugDashboard() {
58349
58440
  title: t("activity:debugDash.serverUptime"),
58350
58441
  value: formatUptime(data.system?.uptime ?? 0),
58351
58442
  subtitle: t("activity:debugDash.sinceProcessStart"),
58352
- icon: Clock13,
58443
+ icon: Clock14,
58353
58444
  color: "text-primary"
58354
58445
  }
58355
58446
  )
@@ -59088,7 +59179,7 @@ var init_DesignGalleryView = __esm({
59088
59179
  });
59089
59180
 
59090
59181
  // src/components/TaskCard.tsx
59091
- import { CheckCircle2 as CheckCircle219, Circle as Circle9, Clock as Clock14, Pause as Pause6, RotateCcw as RotateCcw10, UserCog, XCircle as XCircle8 } from "lucide-react";
59182
+ import { CheckCircle2 as CheckCircle219, Circle as Circle9, Clock as Clock15, Pause as Pause6, RotateCcw as RotateCcw10, UserCog, XCircle as XCircle8 } from "lucide-react";
59092
59183
  import { useState as useState101 } from "react";
59093
59184
  import { jsx as jsx180, jsxs as jsxs171 } from "react/jsx-runtime";
59094
59185
  function formatTime4(ms) {
@@ -59140,7 +59231,7 @@ function TaskCard({
59140
59231
  running ? "bg-primary/15 text-primary" : "bg-muted text-muted-foreground"
59141
59232
  ),
59142
59233
  children: [
59143
- running && /* @__PURE__ */ jsx180(Clock14, { className: "w-3 h-3 animate-spin", "aria-label": t("common:status.working") }),
59234
+ running && /* @__PURE__ */ jsx180(Clock15, { className: "w-3 h-3 animate-spin", "aria-label": t("common:status.working") }),
59144
59235
  /* @__PURE__ */ jsx180("span", { children: task.assignee })
59145
59236
  ]
59146
59237
  }
@@ -59236,7 +59327,7 @@ var init_TaskCard = __esm({
59236
59327
  init_i18n();
59237
59328
  TASK_STATUS_CONFIG = {
59238
59329
  pending: { icon: /* @__PURE__ */ jsx180(Circle9, { className: "w-4 h-4" }), color: "text-muted-foreground" },
59239
- in_progress: { icon: /* @__PURE__ */ jsx180(Clock14, { className: "w-4 h-4 animate-spin" }), color: "text-primary" },
59330
+ in_progress: { icon: /* @__PURE__ */ jsx180(Clock15, { className: "w-4 h-4 animate-spin" }), color: "text-primary" },
59240
59331
  blocked: { icon: /* @__PURE__ */ jsx180(Pause6, { className: "w-4 h-4" }), color: "text-warning" },
59241
59332
  failed: { icon: /* @__PURE__ */ jsx180(XCircle8, { className: "w-4 h-4" }), color: "text-destructive" },
59242
59333
  review: { icon: /* @__PURE__ */ jsx180(RotateCcw10, { className: "w-4 h-4" }), color: "text-info" },
@@ -68227,7 +68318,7 @@ __export(MailboxDetailView_exports, {
68227
68318
  import {
68228
68319
  ArrowLeft as ArrowLeft4,
68229
68320
  CheckCircle2 as CheckCircle225,
68230
- Clock as Clock15,
68321
+ Clock as Clock16,
68231
68322
  Mail as Mail4,
68232
68323
  Tag as Tag2,
68233
68324
  User as User3,
@@ -68362,7 +68453,7 @@ function MailboxDetailView({ className }) {
68362
68453
  ] }),
68363
68454
  /* @__PURE__ */ jsx213("span", { className: "opacity-40", children: "\u2022" }),
68364
68455
  /* @__PURE__ */ jsxs203("span", { className: "inline-flex items-center gap-1", children: [
68365
- /* @__PURE__ */ jsx213(Clock15, { className: "h-3 w-3" }),
68456
+ /* @__PURE__ */ jsx213(Clock16, { className: "h-3 w-3" }),
68366
68457
  fmtRelative(msg.timestamp)
68367
68458
  ] })
68368
68459
  ] })
@@ -68396,7 +68487,7 @@ function MailboxDetailView({ className }) {
68396
68487
  /* @__PURE__ */ jsx213("span", { className: "truncate", children: recipientScopeLabel })
68397
68488
  ] }),
68398
68489
  /* @__PURE__ */ jsxs203("div", { className: "flex items-center gap-1.5 text-muted-foreground", children: [
68399
- /* @__PURE__ */ jsx213(Clock15, { className: "h-3 w-3 shrink-0" }),
68490
+ /* @__PURE__ */ jsx213(Clock16, { className: "h-3 w-3 shrink-0" }),
68400
68491
  /* @__PURE__ */ jsx213("span", { children: fmtTime3(msg.timestamp) })
68401
68492
  ] }),
68402
68493
  msg.replyTo && /* @__PURE__ */ jsxs203("div", { className: "flex items-center gap-1.5 text-muted-foreground col-span-2", children: [
@@ -69551,6 +69642,59 @@ function shortPath4(value, max = 46) {
69551
69642
  const tail = parts.slice(-2).join("/");
69552
69643
  return tail.length <= max ? `\u2026/${tail}` : `\u2026${value.slice(-(max - 1))}`;
69553
69644
  }
69645
+ function deskWaitState(model, now, thresholdMs = 12e4) {
69646
+ const { agent, client: client2, current, history, mail } = model;
69647
+ const active = agent.status === "active" || agent.status === "streaming";
69648
+ const lastToolAt = current?.startedAt ?? history[0]?.completedAt ?? history[0]?.startedAt;
69649
+ const lastMailAt = mail[0]?.timestampMs;
69650
+ const candidates = [lastToolAt, lastMailAt].filter((value) => value !== void 0);
69651
+ const startedMs = Date.parse(client2.startedAt ?? "");
69652
+ const floor = Number.isFinite(startedMs) ? startedMs : 0;
69653
+ const lastActivityAt = candidates.length > 0 ? Math.max(...candidates, floor) : floor > 0 ? floor : void 0;
69654
+ const idleMs = lastActivityAt === void 0 ? Number.POSITIVE_INFINITY : Math.max(0, now - lastActivityAt);
69655
+ if (!active || current !== void 0 || idleMs < thresholdMs) {
69656
+ return {
69657
+ waiting: false,
69658
+ idleMs,
69659
+ reason: "no-work",
69660
+ anchor: "",
69661
+ anchorId: void 0,
69662
+ anchorAt: lastActivityAt
69663
+ };
69664
+ }
69665
+ if (client2.todos === void 0 && agent.toolCalls === 0) {
69666
+ return {
69667
+ waiting: true,
69668
+ idleMs,
69669
+ reason: "telemetry",
69670
+ anchor: agent.currentTask ?? "",
69671
+ anchorId: void 0,
69672
+ anchorAt: lastActivityAt
69673
+ };
69674
+ }
69675
+ const newest = mail[0];
69676
+ const pendingReply = newest !== void 0 && newest.direction === "outgoing" && (lastToolAt === void 0 || newest.timestampMs > lastToolAt) ? newest : void 0;
69677
+ if (pendingReply !== void 0) {
69678
+ return {
69679
+ waiting: true,
69680
+ idleMs,
69681
+ reason: "mail-reply",
69682
+ anchor: pendingReply.subject,
69683
+ anchorId: pendingReply.id,
69684
+ anchorAt: lastActivityAt
69685
+ };
69686
+ }
69687
+ return {
69688
+ waiting: true,
69689
+ idleMs,
69690
+ reason: "no-work",
69691
+ // Empty string means "not reported" everywhere else in the view — treat it
69692
+ // as absent here too so the last completed action becomes the anchor.
69693
+ anchor: agent.currentTask || history[0]?.summary || "",
69694
+ anchorId: void 0,
69695
+ anchorAt: lastActivityAt
69696
+ };
69697
+ }
69554
69698
  function relativeTime(timestamp2, now) {
69555
69699
  const seconds = Math.max(0, Math.floor((now - timestamp2) / 1e3));
69556
69700
  if (seconds < 5) return "now";
@@ -70048,16 +70192,28 @@ function AgentLane({
70048
70192
  routedMailIds
70049
70193
  }) {
70050
70194
  const { t } = useTranslation();
70195
+ const waitThresholdMs = useOfficeMapStore((s) => s.waitThresholdMs);
70051
70196
  const { agent, client: client2, current, display, history, mail } = model;
70052
70197
  const active = agent.status === "active" || agent.status === "streaming";
70053
70198
  const failed = agent.status === "error";
70054
70199
  const latestMail = mail[0];
70055
70200
  const visualRole = agentVisualRole(agent);
70056
70201
  const desk = deskPersonality(`${client2.sessionId}:${agent.serverId}:${agent.name}`, visualRole);
70057
- const latestMailIsFresh = latestMail && now - latestMail.timestampMs < 3e4 && !routedMailIds?.has(latestMail.id);
70202
+ const wait = deskWaitState(model, now, waitThresholdMs);
70203
+ const waitActionable = wait.reason === "mail-reply" ? mail.some((item) => item.id === wait.anchorId) : Boolean(agent.currentTask);
70204
+ const waitIdleLabel = Number.isFinite(wait.idleMs) ? relativeTime(now - wait.idleMs, now) : "\u2014";
70205
+ const waitTitle = wait.waiting ? wait.reason === "mail-reply" ? t("activity:agentOffice.waitingForReply", {
70206
+ subject: wait.anchor || t("activity:agentOffice.waitingMailFallback"),
70207
+ duration: waitIdleLabel
70208
+ }) : wait.reason === "telemetry" ? t("activity:agentOffice.waitingTelemetry") : t("activity:agentOffice.waitingNoWork", {
70209
+ duration: waitIdleLabel,
70210
+ last: wait.anchor || t("activity:agentOffice.waitingNothingYet")
70211
+ }) : void 0;
70212
+ const latestMailIsFresh = latestMail && now - latestMail.timestampMs < 3e4 && !routedMailIds?.has(latestMail.id) && wait.anchorId !== latestMail.id;
70058
70213
  const recentWork = history.slice(0, 6);
70059
70214
  const latestActivityAt = recentWork[0]?.completedAt ?? recentWork[0]?.startedAt ?? display?.completedAt ?? display?.startedAt;
70060
70215
  const activeToolClass = current ? `is-tool-${current.kind}` : void 0;
70216
+ const actionLine = current ? current.summary : display ? display.summary : wait.waiting ? waitTitle ?? t("activity:agentOffice.waiting") : active ? t("activity:agentOffice.preparing") : t("activity:agentOffice.waiting");
70061
70217
  return /* @__PURE__ */ jsxs205(
70062
70218
  "article",
70063
70219
  {
@@ -70067,7 +70223,8 @@ function AgentLane({
70067
70223
  `is-layout-${desk.layout}`,
70068
70224
  `is-clutter-${desk.clutter}`,
70069
70225
  active && "is-active",
70070
- failed && "is-failed"
70226
+ failed && "is-failed",
70227
+ wait.waiting && "is-waiting"
70071
70228
  ),
70072
70229
  children: [
70073
70230
  /* @__PURE__ */ jsxs205("div", { className: "agent-office__identity", children: [
@@ -70091,6 +70248,48 @@ function AgentLane({
70091
70248
  }
70092
70249
  )
70093
70250
  ] }),
70251
+ wait.waiting && waitActionable && /* @__PURE__ */ jsxs205(
70252
+ "button",
70253
+ {
70254
+ type: "button",
70255
+ className: cn("agent-office__wait-badge", `is-${wait.reason}`),
70256
+ title: waitTitle,
70257
+ "aria-label": waitTitle,
70258
+ onClick: () => {
70259
+ if (wait.reason === "mail-reply") {
70260
+ const pending = mail.find((item) => item.id === wait.anchorId);
70261
+ if (pending) onSelect({ kind: "mail", mail: pending, agentName: agent.name });
70262
+ return;
70263
+ }
70264
+ if (!agent.currentTask) return;
70265
+ onSelect({
70266
+ kind: "task",
70267
+ task: agent.currentTask,
70268
+ taskId: agent.taskId,
70269
+ agentName: agent.name
70270
+ });
70271
+ },
70272
+ children: [
70273
+ /* @__PURE__ */ jsx215(Clock37, { "aria-hidden": "true" }),
70274
+ /* @__PURE__ */ jsx215("span", { children: waitIdleLabel })
70275
+ ]
70276
+ }
70277
+ ),
70278
+ wait.waiting && !waitActionable && // No anchor to open (no task, no resolvable mail) — render as pure
70279
+ // status so keyboard/screen-reader users aren't offered a dead button.
70280
+ /* @__PURE__ */ jsxs205(
70281
+ "span",
70282
+ {
70283
+ role: "status",
70284
+ className: cn("agent-office__wait-badge", `is-${wait.reason}`),
70285
+ title: waitTitle,
70286
+ "aria-label": waitTitle,
70287
+ children: [
70288
+ /* @__PURE__ */ jsx215(Clock37, { "aria-hidden": "true" }),
70289
+ /* @__PURE__ */ jsx215("span", { children: waitIdleLabel })
70290
+ ]
70291
+ }
70292
+ ),
70094
70293
  /* @__PURE__ */ jsx215("span", { className: "agent-office__role", children: agent.role ?? (agent.serverId === "leader" || agent.serverId.startsWith("leader@") ? t("activity:agentOffice.leadAgent") : t("activity:agentOffice.agent")) }),
70095
70294
  /* @__PURE__ */ jsxs205("div", { className: "agent-office__agent-meta", children: [
70096
70295
  /* @__PURE__ */ jsx215("span", { children: client2.branch ? `\u2387 ${client2.branch}` : client2.type.toUpperCase() }),
@@ -70229,6 +70428,55 @@ function AgentLane({
70229
70428
  },
70230
70429
  `tool:${call.id}`
70231
70430
  )) : /* @__PURE__ */ jsx215("span", { className: "agent-office__history-empty", children: agent.toolCalls > 0 && agent.recentTools === void 0 && agent.activity === void 0 ? t("activity:agentOffice.telemetryReconnect") : t("activity:agentOffice.noCalls") }) })
70431
+ ] }),
70432
+ /* @__PURE__ */ jsxs205("div", { className: "agent-office__desk-metrics", children: [
70433
+ /* @__PURE__ */ jsxs205(
70434
+ "span",
70435
+ {
70436
+ className: "agent-office__metric",
70437
+ title: `${t("activity:agentOffice.tokens")}: in ${fmtTok(agent.tokensIn)} / out ${fmtTok(agent.tokensOut)}`,
70438
+ children: [
70439
+ /* @__PURE__ */ jsx215("strong", { children: fmtTok(agent.tokensIn + agent.tokensOut) }),
70440
+ /* @__PURE__ */ jsx215("small", { children: "TOK" })
70441
+ ]
70442
+ }
70443
+ ),
70444
+ /* @__PURE__ */ jsxs205("span", { className: "agent-office__metric", title: t("activity:agentOffice.cost"), children: [
70445
+ /* @__PURE__ */ jsx215("strong", { children: fmtCost(agent.costUsd) }),
70446
+ /* @__PURE__ */ jsx215("small", { children: "COST" })
70447
+ ] }),
70448
+ /* @__PURE__ */ jsxs205(
70449
+ "span",
70450
+ {
70451
+ className: "agent-office__metric",
70452
+ title: t("activity:agentOffice.contextUsed"),
70453
+ children: [
70454
+ /* @__PURE__ */ jsx215("strong", { children: agent.ctxPct !== void 0 ? `${Math.round(agent.ctxPct)}%` : "\u2014" }),
70455
+ /* @__PURE__ */ jsx215("small", { children: "CTX" }),
70456
+ agent.ctxPct !== void 0 && /* @__PURE__ */ jsx215(
70457
+ "i",
70458
+ {
70459
+ className: cn(
70460
+ "agent-office__ctx-bar",
70461
+ agent.ctxPct >= 80 && "is-high"
70462
+ ),
70463
+ children: /* @__PURE__ */ jsx215("b", { style: { width: `${Math.min(100, Math.max(0, agent.ctxPct))}%` } })
70464
+ }
70465
+ )
70466
+ ]
70467
+ }
70468
+ ),
70469
+ /* @__PURE__ */ jsxs205(
70470
+ "span",
70471
+ {
70472
+ className: "agent-office__metric agent-office__metric-action",
70473
+ title: actionLine,
70474
+ children: [
70475
+ /* @__PURE__ */ jsx215(Activity20, { "aria-hidden": "true" }),
70476
+ /* @__PURE__ */ jsx215("small", { children: actionLine })
70477
+ ]
70478
+ }
70479
+ )
70232
70480
  ] })
70233
70481
  ]
70234
70482
  }
@@ -70488,6 +70736,7 @@ var init_AgentOfficeView2 = __esm({
70488
70736
  "src/components/AgentOfficeView.tsx"() {
70489
70737
  "use strict";
70490
70738
  init_i18n();
70739
+ init_agent_status();
70491
70740
  init_agent_office();
70492
70741
  init_utils();
70493
70742
  init_stores();
@@ -70500,7 +70749,7 @@ var init_AgentOfficeView2 = __esm({
70500
70749
  });
70501
70750
 
70502
70751
  // src/components/WatchMessageBubble.tsx
70503
- import { AlertCircle as AlertCircle4, Bot as Bot20, Clock as Clock16, Terminal as Terminal9, User as User4 } from "lucide-react";
70752
+ import { AlertCircle as AlertCircle4, Bot as Bot20, Clock as Clock17, Terminal as Terminal9, User as User4 } from "lucide-react";
70504
70753
  import remarkGfm3 from "remark-gfm";
70505
70754
  import { jsx as jsx216, jsxs as jsxs206 } from "react/jsx-runtime";
70506
70755
  function fmtDuration5(durationMs) {
@@ -70522,7 +70771,7 @@ function WatchBubbleContent({ entry }) {
70522
70771
  /* @__PURE__ */ jsx216(Terminal9, { className: "h-3 w-3" }),
70523
70772
  /* @__PURE__ */ jsx216("span", { className: "font-mono", children: entry.tool ?? t("activity:watch.toolFallback") }),
70524
70773
  entry.durationMs !== void 0 && /* @__PURE__ */ jsxs206("span", { className: "ml-auto text-[10px] text-muted-foreground font-normal tabular-nums", children: [
70525
- /* @__PURE__ */ jsx216(Clock16, { className: "h-3 w-3 inline mr-0.5 align-text-bottom" }),
70774
+ /* @__PURE__ */ jsx216(Clock17, { className: "h-3 w-3 inline mr-0.5 align-text-bottom" }),
70526
70775
  fmtDuration5(entry.durationMs)
70527
70776
  ] })
70528
70777
  ] }),
@@ -78793,7 +79042,7 @@ import {
78793
79042
  Activity as Activity24,
78794
79043
  ArrowLeft as ArrowLeft8,
78795
79044
  Check as Check38,
78796
- Clock as Clock17,
79045
+ Clock as Clock18,
78797
79046
  FileText as FileText19,
78798
79047
  GitBranch as GitBranch17,
78799
79048
  Maximize2 as Maximize26,
@@ -78938,7 +79187,7 @@ function SddTaskDrawer({
78938
79187
  /* @__PURE__ */ jsx249(Meta, { label: t("activity:sddTask.metaPriority"), children: /* @__PURE__ */ jsx249("span", { className: cn("font-medium uppercase", priorityStyle(task.priority).text), children: task.priority }) }),
78939
79188
  /* @__PURE__ */ jsx249(Meta, { label: t("activity:sddTask.metaType"), children: task.type }),
78940
79189
  elapsed && /* @__PURE__ */ jsx249(Meta, { label: task.completedAt ? t("activity:sddTask.metaDuration") : t("activity:sddTask.metaElapsed"), children: /* @__PURE__ */ jsxs239("span", { className: "flex items-center gap-1", children: [
78941
- /* @__PURE__ */ jsx249(Clock17, { className: "h-3 w-3 text-muted-foreground" }),
79190
+ /* @__PURE__ */ jsx249(Clock18, { className: "h-3 w-3 text-muted-foreground" }),
78942
79191
  elapsed
78943
79192
  ] }) }),
78944
79193
  task.retries ? /* @__PURE__ */ jsx249(Meta, { label: t("activity:sddTask.metaRetries"), children: /* @__PURE__ */ jsxs239("span", { className: "flex items-center gap-1 text-destructive", children: [
@@ -80676,7 +80925,7 @@ import {
80676
80925
  CheckCircle2 as CheckCircle229,
80677
80926
  ChevronRight as ChevronRight25,
80678
80927
  Circle as Circle11,
80679
- Clock as Clock18,
80928
+ Clock as Clock19,
80680
80929
  Loader2 as Loader245,
80681
80930
  Lock as Lock4,
80682
80931
  RotateCcw as RotateCcw18,
@@ -80759,7 +81008,7 @@ var init_DependencyGraph = __esm({
80759
81008
  STATUS2 = {
80760
81009
  completed: { icon: /* @__PURE__ */ jsx252(CheckCircle229, { className: "h-3.5 w-3.5" }), text: "text-success", ring: "border-success/35" },
80761
81010
  in_progress: { icon: /* @__PURE__ */ jsx252(Loader245, { className: "h-3.5 w-3.5 animate-spin" }), text: "text-primary", ring: "border-primary/45" },
80762
- queued: { icon: /* @__PURE__ */ jsx252(Clock18, { className: "h-3.5 w-3.5" }), text: "text-warning", ring: "border-warning/35" },
81011
+ queued: { icon: /* @__PURE__ */ jsx252(Clock19, { className: "h-3.5 w-3.5" }), text: "text-warning", ring: "border-warning/35" },
80763
81012
  blocked: { icon: /* @__PURE__ */ jsx252(Lock4, { className: "h-3.5 w-3.5" }), text: "text-destructive", ring: "border-destructive/30" },
80764
81013
  pending: { icon: /* @__PURE__ */ jsx252(Circle11, { className: "h-3.5 w-3.5" }), text: "text-muted-foreground", ring: "border-border/70" },
80765
81014
  review: { icon: /* @__PURE__ */ jsx252(RotateCcw18, { className: "h-3.5 w-3.5" }), text: "text-primary", ring: "border-primary/35" },
@@ -81897,7 +82146,7 @@ import {
81897
82146
  Activity as Activity27,
81898
82147
  AlertCircle as AlertCircle5,
81899
82148
  CheckCircle2 as CheckCircle231,
81900
- Clock as Clock19,
82149
+ Clock as Clock20,
81901
82150
  Cpu as Cpu21,
81902
82151
  FolderGit2,
81903
82152
  History as HistoryIcon2,
@@ -81938,7 +82187,7 @@ function agentMeta(status) {
81938
82187
  };
81939
82188
  case "waiting_user":
81940
82189
  return {
81941
- icon: /* @__PURE__ */ jsx256(Clock19, { className: "h-3.5 w-3.5" }),
82190
+ icon: /* @__PURE__ */ jsx256(Clock20, { className: "h-3.5 w-3.5" }),
81942
82191
  cls: "text-warning"
81943
82192
  };
81944
82193
  case "error":
@@ -81974,7 +82223,7 @@ function sessionMeta(status) {
81974
82223
  };
81975
82224
  case "closing":
81976
82225
  return {
81977
- icon: /* @__PURE__ */ jsx256(Clock19, { className: "h-3.5 w-3.5" }),
82226
+ icon: /* @__PURE__ */ jsx256(Clock20, { className: "h-3.5 w-3.5" }),
81978
82227
  cls: "text-warning",
81979
82228
  badge: "border-warning/25 bg-warning/10 text-warning"
81980
82229
  };
@@ -82236,7 +82485,7 @@ function LiveSessionsDashboard() {
82236
82485
  /* @__PURE__ */ jsx256("span", { className: "truncate font-mono", children: s.gitBranch })
82237
82486
  ] }) : null,
82238
82487
  /* @__PURE__ */ jsxs246("span", { className: "inline-flex items-center gap-1", children: [
82239
- /* @__PURE__ */ jsx256(Clock19, { className: "h-3.5 w-3.5" }),
82488
+ /* @__PURE__ */ jsx256(Clock20, { className: "h-3.5 w-3.5" }),
82240
82489
  fmtDuration6(s.startedAt)
82241
82490
  ] }),
82242
82491
  /* @__PURE__ */ jsx256("span", { className: "font-mono", children: t("activity:liveSessions.pidLabel", { pid: s.pid }) })
@@ -87281,7 +87530,7 @@ var CronJobsPanel_exports = {};
87281
87530
  __export(CronJobsPanel_exports, {
87282
87531
  CronJobsPanel: () => CronJobsPanel
87283
87532
  });
87284
- import { Clock as Clock20, PauseCircle as PauseCircle2, PlayCircle, RotateCw as RotateCw8 } from "lucide-react";
87533
+ import { Clock as Clock21, PauseCircle as PauseCircle2, PlayCircle, RotateCw as RotateCw8 } from "lucide-react";
87285
87534
  import { useCallback as useCallback82 } from "react";
87286
87535
  import { jsx as jsx271, jsxs as jsxs261 } from "react/jsx-runtime";
87287
87536
  function fmtInterval(ms) {
@@ -87319,7 +87568,7 @@ function StatusBadge3({ enabled, overdue }) {
87319
87568
  t("activity:cronJobs.statusDisabled")
87320
87569
  ] });
87321
87570
  if (overdue) return /* @__PURE__ */ jsxs261(Badge, { variant: "destructive", className: "gap-1", children: [
87322
- /* @__PURE__ */ jsx271(Clock20, { className: "h-3 w-3" }),
87571
+ /* @__PURE__ */ jsx271(Clock21, { className: "h-3 w-3" }),
87323
87572
  t("activity:cronJobs.statusOverdue")
87324
87573
  ] });
87325
87574
  return /* @__PURE__ */ jsxs261(Badge, { variant: "outline", className: "gap-1 border-success/30 bg-success/10 text-success", children: [
@@ -87361,7 +87610,7 @@ function CronJobsPanel({ open, onClose }) {
87361
87610
  /* @__PURE__ */ jsx271("span", { className: "text-muted-foreground/60", children: t("activity:cronJobs.maxConcurrent", { count: maxConcurrent }) })
87362
87611
  ] }),
87363
87612
  count === 0 && /* @__PURE__ */ jsxs261("div", { className: "flex flex-col items-center gap-2 py-12 text-muted-foreground", children: [
87364
- /* @__PURE__ */ jsx271(Clock20, { className: "h-8 w-8 opacity-40" }),
87613
+ /* @__PURE__ */ jsx271(Clock21, { className: "h-8 w-8 opacity-40" }),
87365
87614
  /* @__PURE__ */ jsx271("p", { className: "text-sm", children: t("activity:cronJobs.emptyTitle") }),
87366
87615
  /* @__PURE__ */ jsxs261("p", { className: "text-xs", children: [
87367
87616
  t("activity:cronJobs.emptyUse"),
@@ -91721,10 +91970,7 @@ function pickToolIcon(toolName) {
91721
91970
  if (/fetch|http|web|curl|request/i.test(toolName)) return Globe2;
91722
91971
  return Wrench4;
91723
91972
  }
91724
- function SmartInputPreview({
91725
- toolName,
91726
- input
91727
- }) {
91973
+ function SmartInputPreview({ toolName, input }) {
91728
91974
  const { t } = useTranslation();
91729
91975
  const diff = diffFromToolInput(toolName, input);
91730
91976
  if (diff) {
@@ -91734,12 +91980,17 @@ function SmartInputPreview({
91734
91980
  const obj = input;
91735
91981
  const cmd = obj.command ?? obj.cmd ?? obj.script;
91736
91982
  if (typeof cmd === "string" && cmd.trim().length > 0) {
91983
+ const consumed = /* @__PURE__ */ new Set(["command", "cmd", "script"]);
91984
+ const rest = Object.entries(obj).filter(
91985
+ ([k, v]) => !consumed.has(k) && v !== void 0 && v !== null && v !== ""
91986
+ );
91737
91987
  return /* @__PURE__ */ jsxs21("div", { className: "rounded-lg border bg-background/40 overflow-hidden", children: [
91738
91988
  /* @__PURE__ */ jsxs21("div", { className: "px-3 py-1.5 text-[10px] uppercase tracking-wider text-muted-foreground border-b bg-muted/40 flex items-center gap-1.5", children: [
91739
91989
  /* @__PURE__ */ jsx26(Terminal2, { className: "h-3 w-3" }),
91740
91990
  /* @__PURE__ */ jsx26("span", { children: t("confirm.command") })
91741
91991
  ] }),
91742
- /* @__PURE__ */ jsx26("pre", { className: "px-3 py-2 text-xs font-mono whitespace-pre-wrap break-all max-h-40 overflow-auto", children: cmd })
91992
+ /* @__PURE__ */ jsx26("pre", { className: "px-3 py-2 text-xs font-mono whitespace-pre-wrap break-all max-h-40 overflow-auto", children: cmd }),
91993
+ rest.length > 0 && /* @__PURE__ */ jsx26("pre", { className: "px-3 py-2 text-xs font-mono whitespace-pre-wrap break-all max-h-40 overflow-auto border-t bg-muted/20", children: rest.map(([k, v]) => `${k}: ${typeof v === "string" ? v : JSON.stringify(v)}`).join("\n") })
91743
91994
  ] });
91744
91995
  }
91745
91996
  const url = obj.url;
@@ -91935,19 +92186,11 @@ function ConfirmDialog() {
91935
92186
  ]
91936
92187
  }
91937
92188
  ),
91938
- /* @__PURE__ */ jsxs21(
91939
- Button,
91940
- {
91941
- size: "sm",
91942
- onClick: () => handleConfirm("yes"),
91943
- title: t("confirm.yesTitle"),
91944
- children: [
91945
- t("action.yes"),
91946
- " ",
91947
- /* @__PURE__ */ jsx26("kbd", { className: "ml-1 text-[10px] border rounded px-1 bg-background/80", children: "y" })
91948
- ]
91949
- }
91950
- )
92189
+ /* @__PURE__ */ jsxs21(Button, { size: "sm", onClick: () => handleConfirm("yes"), title: t("confirm.yesTitle"), children: [
92190
+ t("action.yes"),
92191
+ " ",
92192
+ /* @__PURE__ */ jsx26("kbd", { className: "ml-1 text-[10px] border rounded px-1 bg-background/80", children: "y" })
92193
+ ] })
91951
92194
  ] })
91952
92195
  ]
91953
92196
  }
@@ -97210,7 +97453,7 @@ function Banner({ ok, children }) {
97210
97453
  init_utils();
97211
97454
  init_i18n();
97212
97455
  init_stores();
97213
- import { Activity as Activity3, Bot as Bot5, Cpu as Cpu6, Users as Users3, Zap as Zap8 } from "lucide-react";
97456
+ import { Activity as Activity3, Bot as Bot5, Clock3, Cpu as Cpu6, Users as Users3, Zap as Zap8 } from "lucide-react";
97214
97457
  import { useShallow as useShallow4 } from "zustand/react/shallow";
97215
97458
  import { jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
97216
97459
  function Toggle({
@@ -97263,12 +97506,14 @@ function OfficeMapSettingsPanel() {
97263
97506
  showControls,
97264
97507
  animateEdges,
97265
97508
  background,
97509
+ waitThresholdMs,
97266
97510
  setShowHud,
97267
97511
  setShowLegend,
97268
97512
  setShowMinimap,
97269
97513
  setShowControls,
97270
97514
  setAnimateEdges,
97271
- setBackground
97515
+ setBackground,
97516
+ setWaitThresholdMs
97272
97517
  } = useOfficeMapStore(
97273
97518
  useShallow4((s) => ({
97274
97519
  showHud: s.showHud,
@@ -97277,12 +97522,14 @@ function OfficeMapSettingsPanel() {
97277
97522
  showControls: s.showControls,
97278
97523
  animateEdges: s.animateEdges,
97279
97524
  background: s.background,
97525
+ waitThresholdMs: s.waitThresholdMs,
97280
97526
  setShowHud: s.setShowHud,
97281
97527
  setShowLegend: s.setShowLegend,
97282
97528
  setShowMinimap: s.setShowMinimap,
97283
97529
  setShowControls: s.setShowControls,
97284
97530
  setAnimateEdges: s.setAnimateEdges,
97285
- setBackground: s.setBackground
97531
+ setBackground: s.setBackground,
97532
+ setWaitThresholdMs: s.setWaitThresholdMs
97286
97533
  }))
97287
97534
  );
97288
97535
  const { clientCounts, currentSession, totalAgents, activeAgents } = useMonitorStore(
@@ -97372,9 +97619,33 @@ function OfficeMapSettingsPanel() {
97372
97619
  },
97373
97620
  b.value
97374
97621
  )) })
97622
+ ] }),
97623
+ /* @__PURE__ */ jsxs41("div", { children: [
97624
+ /* @__PURE__ */ jsxs41("div", { className: "flex items-center gap-1.5 mb-1.5 px-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide", children: [
97625
+ /* @__PURE__ */ jsx46(Clock3, { className: "h-3 w-3" }),
97626
+ t("activity:officeMap.waitThresholdHeading")
97627
+ ] }),
97628
+ /* @__PURE__ */ jsx46("p", { className: "mb-1.5 px-2 text-[11px] text-muted-foreground", children: t("activity:officeMap.waitThresholdHint") }),
97629
+ /* @__PURE__ */ jsx46("div", { className: "flex flex-wrap gap-1 px-2", children: WAIT_THRESHOLD_PRESETS.map((ms) => /* @__PURE__ */ jsx46(
97630
+ "button",
97631
+ {
97632
+ type: "button",
97633
+ onClick: () => setWaitThresholdMs(ms),
97634
+ className: cn(
97635
+ "px-2 py-1 text-xs rounded transition-colors font-mono",
97636
+ waitThresholdMs === ms ? "bg-primary text-primary-foreground" : "bg-muted text-muted-foreground hover:bg-accent"
97637
+ ),
97638
+ children: formatThreshold(ms)
97639
+ },
97640
+ ms
97641
+ )) })
97375
97642
  ] })
97376
97643
  ] });
97377
97644
  }
97645
+ function formatThreshold(ms) {
97646
+ const seconds = ms / 1e3;
97647
+ return seconds % 60 === 0 && seconds >= 60 ? `${seconds / 60}m` : `${seconds}s`;
97648
+ }
97378
97649
 
97379
97650
  // src/components/SidePanel/AgentsPanel.tsx
97380
97651
  init_utils();
@@ -99306,7 +99577,7 @@ init_i18n();
99306
99577
  init_utils();
99307
99578
  init_ws_client();
99308
99579
  init_stores();
99309
- import { CheckCircle2 as CheckCircle27, Circle as Circle5, Clock as Clock3, Trash2 as Trash26 } from "lucide-react";
99580
+ import { CheckCircle2 as CheckCircle27, Circle as Circle5, Clock as Clock4, Trash2 as Trash26 } from "lucide-react";
99310
99581
  import { useCallback as useCallback15, useEffect as useEffect39, useState as useState31 } from "react";
99311
99582
  import { jsx as jsx55, jsxs as jsxs50 } from "react/jsx-runtime";
99312
99583
  var STATUS_ORDER = {
@@ -99375,7 +99646,7 @@ function TodosPanel() {
99375
99646
  onClick: () => handleToggle(todo)
99376
99647
  }
99377
99648
  ),
99378
- /* @__PURE__ */ jsx55("span", { className: "pointer-events-none relative mt-0.5 shrink-0", children: isCompleted ? /* @__PURE__ */ jsx55(CheckCircle27, { className: "w-3.5 h-3.5 text-success" }) : isInProgress ? /* @__PURE__ */ jsx55(Clock3, { className: "w-3.5 h-3.5 text-warning animate-spin" }) : /* @__PURE__ */ jsx55(
99649
+ /* @__PURE__ */ jsx55("span", { className: "pointer-events-none relative mt-0.5 shrink-0", children: isCompleted ? /* @__PURE__ */ jsx55(CheckCircle27, { className: "w-3.5 h-3.5 text-success" }) : isInProgress ? /* @__PURE__ */ jsx55(Clock4, { className: "w-3.5 h-3.5 text-warning animate-spin" }) : /* @__PURE__ */ jsx55(
99379
99650
  Circle5,
99380
99651
  {
99381
99652
  className: cn(
@@ -99448,12 +99719,12 @@ function TodosPanel() {
99448
99719
  init_ws_client();
99449
99720
  init_utils();
99450
99721
  init_i18n();
99451
- import { CheckCircle2 as CheckCircle28, Circle as Circle6, Clock as Clock4, Pause as Pause3, XCircle as XCircle3, RotateCcw as RotateCcw4 } from "lucide-react";
99722
+ import { CheckCircle2 as CheckCircle28, Circle as Circle6, Clock as Clock5, Pause as Pause3, XCircle as XCircle3, RotateCcw as RotateCcw4 } from "lucide-react";
99452
99723
  import { useCallback as useCallback16, useEffect as useEffect40, useRef as useRef13, useState as useState32 } from "react";
99453
99724
  import { jsx as jsx56, jsxs as jsxs51 } from "react/jsx-runtime";
99454
99725
  var STATUS_CONFIG = {
99455
99726
  pending: { icon: /* @__PURE__ */ jsx56(Circle6, { className: "w-3.5 h-3.5" }), labelKey: "statusPending", color: "text-muted-foreground/70" },
99456
- in_progress: { icon: /* @__PURE__ */ jsx56(Clock4, { className: "w-3.5 h-3.5 animate-spin" }), labelKey: "statusInProgress", color: "text-warning" },
99727
+ in_progress: { icon: /* @__PURE__ */ jsx56(Clock5, { className: "w-3.5 h-3.5 animate-spin" }), labelKey: "statusInProgress", color: "text-warning" },
99457
99728
  blocked: { icon: /* @__PURE__ */ jsx56(Pause3, { className: "w-3.5 h-3.5" }), labelKey: "statusBlocked", color: "text-warning" },
99458
99729
  failed: { icon: /* @__PURE__ */ jsx56(XCircle3, { className: "w-3.5 h-3.5" }), labelKey: "statusFailed", color: "text-destructive" },
99459
99730
  review: { icon: /* @__PURE__ */ jsx56(RotateCcw4, { className: "w-3.5 h-3.5" }), labelKey: "statusReview", color: "text-info" },
@@ -99624,12 +99895,12 @@ function TasksPanel() {
99624
99895
  init_ws_client();
99625
99896
  init_utils();
99626
99897
  init_i18n();
99627
- import { CheckCircle2 as CheckCircle29, Circle as Circle7, Clock as Clock5 } from "lucide-react";
99898
+ import { CheckCircle2 as CheckCircle29, Circle as Circle7, Clock as Clock6 } from "lucide-react";
99628
99899
  import { useCallback as useCallback17, useEffect as useEffect41, useRef as useRef14, useState as useState33 } from "react";
99629
99900
  import { jsx as jsx57, jsxs as jsxs52 } from "react/jsx-runtime";
99630
99901
  var STATUS_CONFIG2 = {
99631
99902
  open: { icon: /* @__PURE__ */ jsx57(Circle7, { className: "w-3.5 h-3.5" }), labelKey: "statusOpen", color: "text-muted-foreground/70" },
99632
- in_progress: { icon: /* @__PURE__ */ jsx57(Clock5, { className: "w-3.5 h-3.5 animate-spin" }), labelKey: "statusInProgress", color: "text-warning" },
99903
+ in_progress: { icon: /* @__PURE__ */ jsx57(Clock6, { className: "w-3.5 h-3.5 animate-spin" }), labelKey: "statusInProgress", color: "text-warning" },
99633
99904
  done: { icon: /* @__PURE__ */ jsx57(CheckCircle29, { className: "w-3.5 h-3.5" }), labelKey: "statusDone", color: "text-success" }
99634
99905
  };
99635
99906
  function PlanPanel() {
@@ -100177,7 +100448,7 @@ import { VList as VList2 } from "virtua";
100177
100448
  init_i18n();
100178
100449
  init_memory_injector_store();
100179
100450
  init_utils();
100180
- import { Activity as Activity4, Brain as Brain3, Clock as Clock6, PanelRightClose, Tag } from "lucide-react";
100451
+ import { Activity as Activity4, Brain as Brain3, Clock as Clock7, PanelRightClose, Tag } from "lucide-react";
100181
100452
  import { memo as memo4, useEffect as useEffect44 } from "react";
100182
100453
  import { Fragment as Fragment12, jsx as jsx63, jsxs as jsxs58 } from "react/jsx-runtime";
100183
100454
  function formatTime3(at) {
@@ -100331,7 +100602,7 @@ var MemoryInjectorPanel = memo4(function MemoryInjectorPanel2({
100331
100602
  ] })
100332
100603
  ] }),
100333
100604
  /* @__PURE__ */ jsxs58("div", { className: "mt-1 flex items-center gap-2 text-[10px] text-muted-foreground/80", children: [
100334
- /* @__PURE__ */ jsx63(Clock6, { className: "size-3" }),
100605
+ /* @__PURE__ */ jsx63(Clock7, { className: "size-3" }),
100335
100606
  /* @__PURE__ */ jsx63("span", { children: formatTime3(latest.at) }),
100336
100607
  /* @__PURE__ */ jsx63("span", { className: "opacity-40", children: "\xB7" }),
100337
100608
  /* @__PURE__ */ jsx63("span", { className: "font-mono", children: latest.trigger }),
@@ -100423,7 +100694,7 @@ var MemoryInjectorPanel = memo4(function MemoryInjectorPanel2({
100423
100694
  className: "border-b border-border/30 px-4 py-2.5",
100424
100695
  children: [
100425
100696
  /* @__PURE__ */ jsxs58("div", { className: "flex items-center gap-2 text-[11px] tabular-nums", children: [
100426
- /* @__PURE__ */ jsx63(Clock6, { className: "size-3 text-muted-foreground/60" }),
100697
+ /* @__PURE__ */ jsx63(Clock7, { className: "size-3 text-muted-foreground/60" }),
100427
100698
  /* @__PURE__ */ jsx63("span", { className: "text-muted-foreground", children: formatTime3(trace.at) }),
100428
100699
  /* @__PURE__ */ jsx63("span", { className: "opacity-30", children: "\xB7" }),
100429
100700
  /* @__PURE__ */ jsx63("span", { className: "font-mono text-foreground/80", children: trace.trigger }),
@@ -100551,10 +100822,19 @@ function useAutoSubmitStreak() {
100551
100822
  }
100552
100823
  }, [sessionId]);
100553
100824
  useEffect45(() => {
100554
- if (prevAutonomyRef.current !== "auto" && autonomy === "auto") {
100825
+ const wasAuto = prevAutonomyRef.current === "auto";
100826
+ const isAuto = autonomy === "auto";
100827
+ if (!wasAuto && isAuto) {
100555
100828
  _capWarned = false;
100556
100829
  capWarnedRef.current = false;
100557
100830
  }
100831
+ if (wasAuto && !isAuto) {
100832
+ _streak = 0;
100833
+ streakRef.current = 0;
100834
+ _loopHalted = false;
100835
+ _loopGuard.reset();
100836
+ _continuationTracker.reset();
100837
+ }
100558
100838
  prevAutonomyRef.current = autonomy;
100559
100839
  }, [autonomy]);
100560
100840
  const canAutoSubmit = useCallback18(() => {
@@ -101131,17 +101411,28 @@ function NextStepsBar({
101131
101411
  document.addEventListener("chat:next-step-countdown", handler);
101132
101412
  return () => document.removeEventListener("chat:next-step-countdown", handler);
101133
101413
  }, [steps.length, autoFillActive, isLatest, sessionEndAutoFill]);
101414
+ const prevGateRef = useRef17(yoloMode && autoMode && canAutoSubmitProp);
101415
+ useEffect47(() => {
101416
+ const gateOpen2 = yoloMode && autoMode && canAutoSubmitProp;
101417
+ const wasOpen = prevGateRef.current;
101418
+ prevGateRef.current = gateOpen2;
101419
+ if (!autoFillActive) return;
101420
+ if (wasOpen && !gateOpen2) {
101421
+ setAutoFillActive(false);
101422
+ }
101423
+ }, [autoFillActive, yoloMode, autoMode, canAutoSubmitProp]);
101424
+ const gateOpen = yoloMode && autoMode && canAutoSubmitProp;
101134
101425
  const handleAutoFill = useCallback19(() => {
101135
101426
  if (steps.length > 0) {
101136
101427
  const step = steps[0];
101137
- if (step.auto && onAutoSubmit) {
101428
+ if (step.auto && onAutoSubmit && gateOpen) {
101138
101429
  onAutoSubmit(step.text);
101139
101430
  } else {
101140
101431
  fillInput(step.text);
101141
101432
  }
101142
101433
  }
101143
101434
  setAutoFillActive(false);
101144
- }, [steps, onAutoSubmit]);
101435
+ }, [steps, onAutoSubmit, gateOpen]);
101145
101436
  const stepsKey = steps.map((s) => `${s.index}:${s.text}`).join("|");
101146
101437
  useEffect47(() => {
101147
101438
  setSelectedIndices(/* @__PURE__ */ new Set());
@@ -101566,7 +101857,7 @@ init_utils();
101566
101857
  init_useWebSocket();
101567
101858
  init_button();
101568
101859
  import { useCallback as useCallback20, useEffect as useEffect50, useRef as useRef19, useState as useState41 } from "react";
101569
- import { AlertTriangle as AlertTriangle9, Check as Check10, ClipboardCopy, Clock as Clock7, Edit3, Globe as Globe3, Loader2 as Loader29, RotateCw as RotateCw4, Send as Send3, Sparkles as Sparkles7, X as X12, Zap as Zap11 } from "lucide-react";
101860
+ import { AlertTriangle as AlertTriangle9, Check as Check10, ClipboardCopy, Clock as Clock8, Edit3, Globe as Globe3, Loader2 as Loader29, RotateCw as RotateCw4, Send as Send3, Sparkles as Sparkles7, X as X12, Zap as Zap11 } from "lucide-react";
101570
101861
  import { Fragment as Fragment16, jsx as jsx72, jsxs as jsxs67 } from "react/jsx-runtime";
101571
101862
  function RefinePanel({
101572
101863
  original,
@@ -101734,7 +102025,7 @@ function RefinePanel({
101734
102025
  return /* @__PURE__ */ jsxs67("div", { className: "rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden animate-message", children: [
101735
102026
  /* @__PURE__ */ jsxs67("div", { className: "flex items-center justify-between px-4 py-2 border-b bg-muted/30", children: [
101736
102027
  /* @__PURE__ */ jsxs67("div", { className: "flex items-center gap-2", children: [
101737
- /* @__PURE__ */ jsx72(Clock7, { className: "h-4 w-4 text-primary" }),
102028
+ /* @__PURE__ */ jsx72(Clock8, { className: "h-4 w-4 text-primary" }),
101738
102029
  /* @__PURE__ */ jsx72("span", { className: "text-sm font-medium", children: t("activity:refine.countdownHeader") }),
101739
102030
  preRefineCountdown > 0 && /* @__PURE__ */ jsx72("span", { className: "ml-1 inline-flex items-center justify-center min-w-5 h-5 px-1.5 rounded-full bg-primary/15 text-primary text-xs font-bold tabular-nums", children: preRefineCountdown })
101740
102031
  ] }),
@@ -103734,7 +104025,7 @@ init_i18n();
103734
104025
  init_useWebSocket();
103735
104026
  init_stores();
103736
104027
  init_dialog();
103737
- import { Clock as Clock8, History as History2, Rewind } from "lucide-react";
104028
+ import { Clock as Clock9, History as History2, Rewind } from "lucide-react";
103738
104029
  import { useCallback as useCallback22, useEffect as useEffect55, useRef as useRef22, useState as useState44 } from "react";
103739
104030
  import { jsx as jsx77, jsxs as jsxs72 } from "react/jsx-runtime";
103740
104031
  function mapCheckpoint(cp) {
@@ -103801,7 +104092,7 @@ function CheckpointTimeline({
103801
104092
  ] }) }),
103802
104093
  /* @__PURE__ */ jsx77("div", { className: "border-b border-border/70 bg-muted/25 px-4 py-2.5 text-[10px] text-muted-foreground leading-relaxed", children: t("activity:checkpoint.description") }),
103803
104094
  /* @__PURE__ */ jsx77("div", { className: "min-h-0 min-w-0 flex-1 overflow-y-auto overscroll-contain", children: checkpoints.length === 0 ? /* @__PURE__ */ jsxs72("div", { className: "flex flex-col items-center justify-center py-16 gap-3 text-muted-foreground", children: [
103804
- /* @__PURE__ */ jsx77(Clock8, { className: "h-10 w-10 opacity-15" }),
104095
+ /* @__PURE__ */ jsx77(Clock9, { className: "h-10 w-10 opacity-15" }),
103805
104096
  /* @__PURE__ */ jsx77("p", { className: "text-sm font-medium", children: t("activity:checkpoint.emptyTitle") }),
103806
104097
  /* @__PURE__ */ jsx77("p", { className: "text-xs text-center max-w-xs", children: t("activity:checkpoint.emptyBody") })
103807
104098
  ] }) : /* @__PURE__ */ jsx77("div", { className: "py-1", children: [...checkpoints].reverse().map((cp, i) => {
@@ -104100,7 +104391,7 @@ import {
104100
104391
  CheckCircle2 as CheckCircle210,
104101
104392
  ChevronDown as ChevronDown6,
104102
104393
  ChevronRight as ChevronRight6,
104103
- Clock as Clock9,
104394
+ Clock as Clock10,
104104
104395
  FileText as FileText5,
104105
104396
  Loader2 as Loader210,
104106
104397
  Trash2 as Trash28,
@@ -104540,7 +104831,7 @@ function ContextWindowEditor({ open, onClose }) {
104540
104831
  ] })
104541
104832
  ] }),
104542
104833
  isLoading && /* @__PURE__ */ jsxs73("span", { className: "flex items-center gap-1 text-warning", children: [
104543
- /* @__PURE__ */ jsx78(Clock9, { className: "h-3 w-3" }),
104834
+ /* @__PURE__ */ jsx78(Clock10, { className: "h-3 w-3" }),
104544
104835
  t("activity:ctxEditor.agentRunningApplyDisabled")
104545
104836
  ] })
104546
104837
  ] }),
@@ -106355,7 +106646,7 @@ init_i18n();
106355
106646
  import {
106356
106647
  ChevronDown as ChevronDown12,
106357
106648
  ChevronRight as ChevronRight8,
106358
- Clock as Clock10,
106649
+ Clock as Clock11,
106359
106650
  Download as Download5,
106360
106651
  Loader2 as Loader211
106361
106652
  } from "lucide-react";
@@ -106858,7 +107149,7 @@ var ToolLedgerCard = memo7(function ToolLedgerCard2({
106858
107149
  expanded && /* @__PURE__ */ jsxs90("div", { className: "border-t border-border/40", children: [
106859
107150
  message.toolInput !== void 0 && (diff ? /* @__PURE__ */ jsx96("div", { className: "p-2", children: /* @__PURE__ */ jsx96(ToolDiffView, { diff }) }) : /* @__PURE__ */ jsxs90("div", { className: "overflow-x-auto bg-muted/30 p-2.5", children: [
106860
107151
  /* @__PURE__ */ jsxs90("div", { className: "mb-1.5 flex items-center gap-1 font-mono text-[10px] uppercase tracking-wide text-muted-foreground/70", children: [
106861
- /* @__PURE__ */ jsx96(Clock10, { className: "h-3 w-3" }),
107152
+ /* @__PURE__ */ jsx96(Clock11, { className: "h-3 w-3" }),
106862
107153
  /* @__PURE__ */ jsx96("span", { children: t("activity:message.inputLabel") })
106863
107154
  ] }),
106864
107155
  /* @__PURE__ */ jsx96(ToolInputView, { input: message.toolInput })
@@ -109092,6 +109383,7 @@ import { useShallow as useShallow12 } from "zustand/react/shallow";
109092
109383
  // src/components/SettingsPanel/AgentSettingsTab.tsx
109093
109384
  init_i18n();
109094
109385
  init_local_prefs();
109386
+ init_session_store();
109095
109387
  import { Activity as Activity8, Cpu as Cpu10, Zap as Zap15 } from "lucide-react";
109096
109388
  import { useState as useState65 } from "react";
109097
109389
 
@@ -109501,6 +109793,19 @@ function PreferenceToggle({
109501
109793
 
109502
109794
  // src/components/SettingsPanel/AgentSettingsTab.tsx
109503
109795
  import { jsx as jsx111, jsxs as jsxs105 } from "react/jsx-runtime";
109796
+ var ALL_EFFORTS = [
109797
+ "none",
109798
+ "minimal",
109799
+ "low",
109800
+ "medium",
109801
+ "high",
109802
+ "xhigh",
109803
+ "max"
109804
+ ];
109805
+ var EFFORT_SET = new Set(ALL_EFFORTS);
109806
+ function isEffort(value) {
109807
+ return EFFORT_SET.has(value);
109808
+ }
109504
109809
  function AgentSettingsTab({
109505
109810
  syncPref,
109506
109811
  switchAutonomy
@@ -109508,6 +109813,23 @@ function AgentSettingsTab({
109508
109813
  const { t } = useTranslation();
109509
109814
  const localPrefs = useLocalPrefs();
109510
109815
  const [refinerPickerOpen, setRefinerPickerOpen] = useState65(false);
109816
+ const EFFORT_LABEL_KEYS = {
109817
+ none: "settings:agent.reasoningEffortNone",
109818
+ minimal: "settings:agent.reasoningEffortMinimal",
109819
+ low: "settings:agent.reasoningEffortLow",
109820
+ medium: "settings:agent.reasoningEffortMedium",
109821
+ high: "settings:agent.reasoningEffortHigh",
109822
+ xhigh: "settings:agent.reasoningEffortXhigh",
109823
+ max: "settings:agent.reasoningEffortMax"
109824
+ };
109825
+ const effortLevels = useSessionStore((s) => s.reasoningEffortLevels);
109826
+ const narrowed = effortLevels?.length ? effortLevels.filter(isEffort) : [...ALL_EFFORTS];
109827
+ const current = localPrefs.reasoningEffort;
109828
+ if (isEffort(current) && !narrowed.includes(current)) narrowed.push(current);
109829
+ const effortOptions = narrowed.map((level) => ({
109830
+ value: level,
109831
+ label: t(EFFORT_LABEL_KEYS[level])
109832
+ }));
109511
109833
  return /* @__PURE__ */ jsxs105("div", { className: "space-y-6", children: [
109512
109834
  /* @__PURE__ */ jsxs105("div", { className: "rounded-xl border border-border/70 bg-card/80 p-5 shadow-sm", children: [
109513
109835
  /* @__PURE__ */ jsxs105("div", { className: "flex items-start gap-3 mb-4", children: [
@@ -109700,23 +110022,9 @@ function AgentSettingsTab({
109700
110022
  PreferenceSelect,
109701
110023
  {
109702
110024
  label: t("settings:agent.reasoningEffortLabel"),
109703
- hint: t("settings:agent.reasoningEffortHint"),
110025
+ hint: effortLevels ? `${t("settings:agent.reasoningEffortHint")} (${t("settings:agent.reasoningEffortModelSet")})` : t("settings:agent.reasoningEffortHint"),
109704
110026
  value: localPrefs.reasoningEffort,
109705
- options: [
109706
- { value: "none", label: t("settings:agent.reasoningEffortNone") },
109707
- {
109708
- value: "minimal",
109709
- label: t("settings:agent.reasoningEffortMinimal")
109710
- },
109711
- { value: "low", label: t("settings:agent.reasoningEffortLow") },
109712
- {
109713
- value: "medium",
109714
- label: t("settings:agent.reasoningEffortMedium")
109715
- },
109716
- { value: "high", label: t("settings:agent.reasoningEffortHigh") },
109717
- { value: "xhigh", label: t("settings:agent.reasoningEffortXhigh") },
109718
- { value: "max", label: t("settings:agent.reasoningEffortMax") }
109719
- ],
110027
+ options: effortOptions,
109720
110028
  onChange: (v) => syncPref("reasoningEffort", v)
109721
110029
  }
109722
110030
  ),
@@ -113583,7 +113891,7 @@ init_button();
113583
113891
  import {
113584
113892
  Brain as Brain9,
113585
113893
  Check as Check19,
113586
- Clock as Clock11,
113894
+ Clock as Clock12,
113587
113895
  DollarSign,
113588
113896
  Eye as Eye3,
113589
113897
  FileText as FileText9,
@@ -114256,7 +114564,7 @@ function ModelListEditor({
114256
114564
  row.name && row.name !== row.modelId && /* @__PURE__ */ jsx135("span", { className: "text-[11px] text-muted-foreground", children: row.name })
114257
114565
  ] }) }),
114258
114566
  /* @__PURE__ */ jsx135("td", { className: "px-3 py-2 text-xs text-muted-foreground", children: ctx2 ? /* @__PURE__ */ jsxs128("span", { className: "inline-flex items-center gap-1", children: [
114259
- /* @__PURE__ */ jsx135(Clock11, { className: "h-3 w-3" }),
114567
+ /* @__PURE__ */ jsx135(Clock12, { className: "h-3 w-3" }),
114260
114568
  ctx2
114261
114569
  ] }) : /* @__PURE__ */ jsx135("span", { className: "text-muted-foreground/40", children: "\u2014" }) }),
114262
114570
  /* @__PURE__ */ jsx135("td", { className: "px-3 py-2 text-xs text-muted-foreground", children: out ? /* @__PURE__ */ jsx135("span", { children: out }) : /* @__PURE__ */ jsx135("span", { className: "text-muted-foreground/40", children: "\u2014" }) }),