pilotswarm 0.5.36 → 0.5.38

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 (86) hide show
  1. package/package.json +3 -3
  2. package/tui/src/app.js +0 -4
  3. package/tui/src/index.js +0 -9
  4. package/ui/core/src/canvas-actions.js +148 -0
  5. package/ui/core/src/commands.js +0 -1
  6. package/ui/core/src/controller.js +296 -21
  7. package/ui/core/src/history.js +134 -1
  8. package/ui/core/src/index.js +1 -0
  9. package/ui/core/src/reducer.js +407 -19
  10. package/ui/core/src/selectors.js +223 -154
  11. package/ui/core/src/state.js +139 -2
  12. package/ui/core/src/themes/index.js +1 -1
  13. package/ui/react/src/components.js +1 -7
  14. package/ui/react/src/web-app.js +1719 -366
  15. package/web/auth/config.js +3 -0
  16. package/web/auth/index.js +8 -1
  17. package/web/auth/normalize/proxy.js +48 -0
  18. package/web/auth/providers/proxy.js +141 -0
  19. package/web/dist/assets/{abnfDiagram-VRR7QNED-LOLCtsns.js → abnfDiagram-VRR7QNED-DrJhXhSQ.js} +1 -1
  20. package/web/dist/assets/{arc-BE-jVDEi.js → arc-BEaG9DWd.js} +1 -1
  21. package/web/dist/assets/{architectureDiagram-ZJ3FMSHR-CdmUjwtj.js → architectureDiagram-ZJ3FMSHR-D9fc1Imx.js} +1 -1
  22. package/web/dist/assets/{blockDiagram-677ZJIJ3-NZ4TOa8L.js → blockDiagram-677ZJIJ3-rS5Eikvt.js} +1 -1
  23. package/web/dist/assets/{c4Diagram-LMCZKHZV-9ubX8uGA.js → c4Diagram-LMCZKHZV-HKLlX5cR.js} +1 -1
  24. package/web/dist/assets/channel-DRy7FvyF.js +1 -0
  25. package/web/dist/assets/{chunk-2Q5K7J3B-DNDnjbP6.js → chunk-2Q5K7J3B-kq0TyLSB.js} +1 -1
  26. package/web/dist/assets/{chunk-32BRIVSS-iilfiffr.js → chunk-32BRIVSS-O-LMarT5.js} +1 -1
  27. package/web/dist/assets/{chunk-5VM5RSS4-BakOMFmf.js → chunk-5VM5RSS4-Di4h0CAu.js} +1 -1
  28. package/web/dist/assets/{chunk-EX3LRPZG-BhluhGyZ.js → chunk-EX3LRPZG-C8rgqUOt.js} +1 -1
  29. package/web/dist/assets/{chunk-JWPE2WC7-B6GKLlNb.js → chunk-JWPE2WC7-BSH41q4T.js} +1 -1
  30. package/web/dist/assets/{chunk-MOJQB5TN-CXmt8msF.js → chunk-MOJQB5TN-BAFuQHAC.js} +1 -1
  31. package/web/dist/assets/{chunk-RYQCIY6F-Bu58-SDr.js → chunk-RYQCIY6F-DAg6JOs7.js} +1 -1
  32. package/web/dist/assets/{chunk-V7JOEXUC-AQdyoYHL.js → chunk-V7JOEXUC-DbVrT8BG.js} +1 -1
  33. package/web/dist/assets/{chunk-VR4S4FIN-DeM5iMsE.js → chunk-VR4S4FIN-C6f5_Grp.js} +1 -1
  34. package/web/dist/assets/{chunk-XXDRQBXY-DjGjajy1.js → chunk-XXDRQBXY-CqcCYpqA.js} +1 -1
  35. package/web/dist/assets/classDiagram-OUVF2IWQ-C35RhB8X.js +1 -0
  36. package/web/dist/assets/classDiagram-v2-EOCWNBFH-C35RhB8X.js +1 -0
  37. package/web/dist/assets/{cose-bilkent-JH36ORCC-BGi4_egJ.js → cose-bilkent-JH36ORCC-DJw04eFh.js} +1 -1
  38. package/web/dist/assets/{cynefin-VYW2F7L2-CcgV1ve4.js → cynefin-VYW2F7L2-CpjwdEIU.js} +1 -1
  39. package/web/dist/assets/{cynefinDiagram-TSTJHNR4-BRDEsbBG.js → cynefinDiagram-TSTJHNR4-RqEIWoT0.js} +1 -1
  40. package/web/dist/assets/{dagre-VKFMJZFB-OjuC8dJB.js → dagre-VKFMJZFB-C1eGQNK2.js} +1 -1
  41. package/web/dist/assets/{diagram-FQU43EPY-CGdROWYh.js → diagram-FQU43EPY-BODLQ7dz.js} +1 -1
  42. package/web/dist/assets/{diagram-G47NLZAW-B5J0EUfS.js → diagram-G47NLZAW-DlhmukMC.js} +1 -1
  43. package/web/dist/assets/{diagram-NH7WQ7WH-zmb4-cP2.js → diagram-NH7WQ7WH-Ba_jZoCN.js} +1 -1
  44. package/web/dist/assets/{diagram-OA4YK3LP-j514bgaH.js → diagram-OA4YK3LP-DnSiAJBG.js} +1 -1
  45. package/web/dist/assets/{diagram-WEI45ONY-h5G459mZ.js → diagram-WEI45ONY-B3KoQ7_W.js} +1 -1
  46. package/web/dist/assets/{ebnfDiagram-CCIWWBDH-GnMgbuFk.js → ebnfDiagram-CCIWWBDH-ChnFc5gf.js} +1 -1
  47. package/web/dist/assets/{erDiagram-Q63AITRT-BFgH3UQp.js → erDiagram-Q63AITRT-D2KkJXLZ.js} +1 -1
  48. package/web/dist/assets/{flowDiagram-23GEKE2U-BsbQ_VXV.js → flowDiagram-23GEKE2U-CmybZufj.js} +1 -1
  49. package/web/dist/assets/{ganttDiagram-NO4QXBWP-C_fjo2sf.js → ganttDiagram-NO4QXBWP-BzPurW_v.js} +1 -1
  50. package/web/dist/assets/{gitGraphDiagram-IHSO6WYX-BUoXrAI9.js → gitGraphDiagram-IHSO6WYX-DAbXl4gO.js} +1 -1
  51. package/web/dist/assets/{index-ONJimzcx.js → index-CRY94nFp.js} +6 -6
  52. package/web/dist/assets/index-DtL0lbis.css +1 -0
  53. package/web/dist/assets/{infoDiagram-FWYZ7A6U-CJiSANyk.js → infoDiagram-FWYZ7A6U-C6qGjNA1.js} +1 -1
  54. package/web/dist/assets/{ishikawaDiagram-FXEZZL3T-BKoQ-a2c.js → ishikawaDiagram-FXEZZL3T-D2d1tO-9.js} +1 -1
  55. package/web/dist/assets/{journeyDiagram-5HDEW3XC-Db6Crcd3.js → journeyDiagram-5HDEW3XC-fP13w1b7.js} +1 -1
  56. package/web/dist/assets/{kanban-definition-HUTT4EX6-B9GaB0UJ.js → kanban-definition-HUTT4EX6-BJfWAXZ0.js} +1 -1
  57. package/web/dist/assets/{linear-BXwRb8MN.js → linear-CltApkHf.js} +1 -1
  58. package/web/dist/assets/{mermaid.core-DwzXN6up.js → mermaid.core-B1Dwetk3.js} +4 -4
  59. package/web/dist/assets/{mindmap-definition-LN4V7U3C-DKC_C_OY.js → mindmap-definition-LN4V7U3C-CdRUD7LF.js} +1 -1
  60. package/web/dist/assets/{papaparse.min-Cm1Pr54l.js → papaparse.min-C1y3wBH1.js} +1 -1
  61. package/web/dist/assets/{pegDiagram-2B236MQR-IeawbZPt.js → pegDiagram-2B236MQR-CeQkqN6Q.js} +1 -1
  62. package/web/dist/assets/{pieDiagram-ENE6RG2P-BOdsYBt8.js → pieDiagram-ENE6RG2P-Dqgc87jA.js} +1 -1
  63. package/web/dist/assets/pilotswarm-DayYdi39.js +96 -0
  64. package/web/dist/assets/{quadrantDiagram-ABIIQ3AL-Cr5yoN7C.js → quadrantDiagram-ABIIQ3AL-CD7f-w6m.js} +1 -1
  65. package/web/dist/assets/{railroadDiagram-RFXS5EU6-E7wuFBuk.js → railroadDiagram-RFXS5EU6-CcsAijSC.js} +1 -1
  66. package/web/dist/assets/{requirementDiagram-TGXJPOKE-sZCKiuDs.js → requirementDiagram-TGXJPOKE-BkzF80pL.js} +1 -1
  67. package/web/dist/assets/{sankeyDiagram-HTMAVEWB-B_EWziUR.js → sankeyDiagram-HTMAVEWB-D9XOFw7Y.js} +1 -1
  68. package/web/dist/assets/{sequenceDiagram-DBY2YBRQ-D2mN7onX.js → sequenceDiagram-DBY2YBRQ-BFfaS_Sz.js} +1 -1
  69. package/web/dist/assets/{sizeCapture-X5ZJPWSS-CEL9Ly2T.js → sizeCapture-X5ZJPWSS-CDJV16tP.js} +1 -1
  70. package/web/dist/assets/{stateDiagram-2N3HPSRC-C7ejJoeN.js → stateDiagram-2N3HPSRC-C0E-MPXO.js} +1 -1
  71. package/web/dist/assets/stateDiagram-v2-6OUMAXLB-BMqXeMJu.js +1 -0
  72. package/web/dist/assets/{swimlanes-5IMT3BWC-Ck3pbFxk.js → swimlanes-5IMT3BWC-n5Vsv7n9.js} +2 -2
  73. package/web/dist/assets/swimlanesDiagram-G3AALYLV-CGl4gRnH.js +8 -0
  74. package/web/dist/assets/{timeline-definition-FHXFAJF6-K3H8Yuyr.js → timeline-definition-FHXFAJF6-DW2gV8-n.js} +1 -1
  75. package/web/dist/assets/{vennDiagram-L72KCM5P-C3NKjSv9.js → vennDiagram-L72KCM5P-D9dbDm08.js} +1 -1
  76. package/web/dist/assets/{wardleyDiagram-EHGQE667-CeeVuFiO.js → wardleyDiagram-EHGQE667-CIcG7fiC.js} +1 -1
  77. package/web/dist/assets/{xychartDiagram-FW5EYKEG-CF-vCvEq.js → xychartDiagram-FW5EYKEG-elEIFsc9.js} +1 -1
  78. package/web/dist/index.html +4 -4
  79. package/web/runtime.js +20 -1
  80. package/web/dist/assets/channel-BhHZnKdH.js +0 -1
  81. package/web/dist/assets/classDiagram-OUVF2IWQ-CM_bKBKz.js +0 -1
  82. package/web/dist/assets/classDiagram-v2-EOCWNBFH-CM_bKBKz.js +0 -1
  83. package/web/dist/assets/index-CnH1Yv_d.css +0 -1
  84. package/web/dist/assets/pilotswarm-kCQFVjJm.js +0 -99
  85. package/web/dist/assets/stateDiagram-v2-6OUMAXLB-UaVDt_gU.js +0 -1
  86. package/web/dist/assets/swimlanesDiagram-G3AALYLV-CqO_fF5t.js +0 -8
@@ -73,11 +73,23 @@ export function normalizeStoredLayoutAdjustments(layoutAdjustments) {
73
73
  const sessionPaneAdjust = Number(candidate.sessionPaneAdjust);
74
74
  const portalSessionColumnAdjust = Number(candidate.portalSessionColumnAdjust);
75
75
  const activityPaneAdjust = Number(candidate.activityPaneAdjust);
76
+ // Canvas is a column of its own now rather than a face the right column
77
+ // wears, so it needs its own remembered width. Same mechanism as the rest:
78
+ // a pixel delta from the computed base, persisted per user.
79
+ const canvasPaneAdjust = Number(candidate.canvasPaneAdjust);
80
+ const diagnosticsPaneAdjust = Number(candidate.diagnosticsPaneAdjust);
81
+ const diagnosticsSplitAdjust = Number(candidate.diagnosticsSplitAdjust);
76
82
  return {
77
83
  paneAdjust: Number.isFinite(paneAdjust) ? Math.trunc(paneAdjust) : 0,
78
84
  sessionPaneAdjust: Number.isFinite(sessionPaneAdjust) ? Math.trunc(sessionPaneAdjust) : 0,
79
85
  portalSessionColumnAdjust: Number.isFinite(portalSessionColumnAdjust) ? Math.trunc(portalSessionColumnAdjust) : 0,
80
86
  activityPaneAdjust: Number.isFinite(activityPaneAdjust) ? Math.trunc(activityPaneAdjust) : 0,
87
+ canvasPaneAdjust: Number.isFinite(canvasPaneAdjust) ? Math.trunc(canvasPaneAdjust) : 0,
88
+ diagnosticsPaneAdjust: Number.isFinite(diagnosticsPaneAdjust) ? Math.trunc(diagnosticsPaneAdjust) : 0,
89
+ // The inspector/activity seam inside Diagnostics, in PIXELS from an
90
+ // even split. The old row-quantized TUI adjust made browser drags
91
+ // jump in ~20px notches.
92
+ diagnosticsSplitAdjust: Number.isFinite(diagnosticsSplitAdjust) ? Math.trunc(diagnosticsSplitAdjust) : 0,
81
93
  };
82
94
  }
83
95
 
@@ -128,13 +140,110 @@ export function normalizeStoredCollapsedSessionIds(value) {
128
140
  return out;
129
141
  }
130
142
 
143
+ /**
144
+ * Right-column mode: the inspector/activity split, or the session canvas.
145
+ * Anything unrecognized falls back to panes — a stored value from a newer
146
+ * build must not strand an older portal in a mode it cannot render.
147
+ *
148
+ * @deprecated Superseded by the independent `canvasOpen` / `diagnosticsOpen`
149
+ * booleans. Kept only to migrate a value written by an older build — see
150
+ * normalizeStoredDesktopPanes.
151
+ */
152
+ export function normalizeStoredRightPaneMode(value) {
153
+ return value === "canvas" ? "canvas" : "panes";
154
+ }
155
+
156
+ /**
157
+ * Which of the two optional desktop columns are on screen.
158
+ *
159
+ * Canvas and Diagnostics used to be one enum (`rightPaneMode`), so the right
160
+ * column could only ever wear one face. They are independent now: either, both,
161
+ * or neither. Diagnostics is the old inspector/activity split, moved out of the
162
+ * chat pane and travelling as one unit.
163
+ *
164
+ * Both default to OFF. A pane that is off has no width and no resizer — it is
165
+ * absent, not collapsed to nothing.
166
+ *
167
+ * Migrating a stored `rightPaneMode`:
168
+ * "canvas" -> canvas on. That was a deliberate choice, so it is honored.
169
+ * "panes" -> both off. "panes" was the default value rather than a choice,
170
+ * and the new default is a clean two-column workspace.
171
+ */
172
+ export function normalizeStoredDesktopPanes(value, legacyRightPaneMode) {
173
+ const candidate = value && typeof value === "object" ? value : null;
174
+ if (candidate && (typeof candidate.canvasOpen === "boolean" || typeof candidate.diagnosticsOpen === "boolean")) {
175
+ return {
176
+ canvasOpen: candidate.canvasOpen === true,
177
+ diagnosticsOpen: candidate.diagnosticsOpen === true,
178
+ // Zen: chat as a narrow rail, canvas as the workbench. Only
179
+ // meaningful with the canvas open.
180
+ zen: candidate.zen === true && candidate.canvasOpen === true,
181
+ };
182
+ }
183
+ return {
184
+ canvasOpen: legacyRightPaneMode === "canvas",
185
+ diagnosticsOpen: false,
186
+ zen: false,
187
+ };
188
+ }
189
+
190
+ /**
191
+ * The store key for one canvas surface. Slot 1 keeps the bare session id so
192
+ * every reader written before slots existed keeps working untouched; slots
193
+ * 2-5 append "#<slot>". Used for canvas.bySessionId AND canvas.prefs.
194
+ */
195
+ export function canvasKey(sessionId, slot) {
196
+ const id = String(sessionId || "");
197
+ const n = Number(slot);
198
+ return Number.isInteger(n) && n >= 2 && n <= 5 ? `${id}#${n}` : id;
199
+ }
200
+
201
+ /** The inverse: `sessionId#3` -> { sessionId, slot: 3 }; bare id -> slot 1. */
202
+ export function parseCanvasKey(key) {
203
+ const m = /^(.*)#([2-5])$/.exec(String(key || ""));
204
+ return m ? { sessionId: m[1], slot: Number(m[2]) } : { sessionId: String(key || ""), slot: 1 };
205
+ }
206
+
207
+ /**
208
+ * Per-session canvas preferences: what this user has chosen and seen.
209
+ *
210
+ * `optedOut` — the user manually left canvas mode this session, so agent
211
+ * draws badge instead of flipping. `lastViewedRev` — the highest revision
212
+ * this user has had on screen; the yellow badge is latestRev > lastViewedRev.
213
+ * Persisted (like pinned ids) so the overnight case lights the badge on
214
+ * reopen with no extra query.
215
+ */
216
+ export function normalizeStoredCanvasPrefs(value) {
217
+ if (!value || typeof value !== "object" || Array.isArray(value)) return {};
218
+ const out = {};
219
+ for (const [sessionId, entry] of Object.entries(value)) {
220
+ const id = String(sessionId || "").trim();
221
+ if (!id || !entry || typeof entry !== "object") continue;
222
+ const lastViewedRev = Number(entry.lastViewedRev);
223
+ const lastViewedDataRev = Number(entry.lastViewedDataRev);
224
+ const zenRailPx = Number(entry.zenRailPx);
225
+ out[id] = {
226
+ optedOut: entry.optedOut === true,
227
+ lastViewedRev: Number.isFinite(lastViewedRev) && lastViewedRev > 0 ? Math.floor(lastViewedRev) : 0,
228
+ lastViewedDataRev: Number.isFinite(lastViewedDataRev) && lastViewedDataRev > 0 ? Math.floor(lastViewedDataRev) : 0,
229
+ // Zen chat-rail width, remembered for THIS session only.
230
+ ...(Number.isFinite(zenRailPx) && zenRailPx > 0 ? { zenRailPx: Math.floor(zenRailPx) } : {}),
231
+ };
232
+ }
233
+ return out;
234
+ }
235
+
131
236
  export function normalizeStoredActiveSessionId(value) {
132
237
  if (value == null) return null;
133
238
  const id = String(value).trim();
134
239
  return id ? id : null;
135
240
  }
136
241
 
137
- export function createInitialState({ mode = "local", branding = null, docs = null, themeId = null, chatViewMode = null, sessionOwnerFilter = null, layoutAdjustments = null, pinnedSessionIds = null, collapsedSessionIds = null, activeSessionId = null, sessionOrder = null } = {}) {
242
+ export function createInitialState({ mode = "local", branding = null, docs = null, themeId = null, sessionOwnerFilter = null, layoutAdjustments = null, pinnedSessionIds = null, collapsedSessionIds = null, activeSessionId = null, sessionOrder = null, rightPaneMode = null, desktopPanes: storedDesktopPanes = null, canvasPrefs = null } = {}) {
243
+ const desktopPanes = normalizeStoredDesktopPanes(
244
+ storedDesktopPanes,
245
+ normalizeStoredRightPaneMode(rightPaneMode),
246
+ );
138
247
  const hasStoredSessionOwnerFilter = sessionOwnerFilter != null;
139
248
  const hasStoredCollapsedSessionIds = collapsedSessionIds != null;
140
249
  const initialLayoutAdjustments = normalizeStoredLayoutAdjustments(layoutAdjustments);
@@ -164,7 +273,23 @@ export function createInitialState({ mode = "local", branding = null, docs = nul
164
273
  sequenceSelectedTurn: null,
165
274
  // "rich" was retired as a view mode; a persisted "rich" falls
166
275
  // through to the transcript.
167
- chatViewMode: chatViewMode === "summary" ? "summary" : "transcript",
276
+ // Which face the right column wears: the inspector/activity panes
277
+ // or the session canvas. Persisted.
278
+ //
279
+ // @deprecated Read by nothing that decides layout any more — the
280
+ // two booleans below do that. Still derived so a build that rolls
281
+ // back, and anything still reading the old key, sees a sane value.
282
+ rightPaneMode: desktopPanes.canvasOpen ? "canvas" : "panes",
283
+ // The two optional desktop columns, independent of each other.
284
+ // Both off is the default workspace: sessions and chat only.
285
+ canvasOpen: desktopPanes.canvasOpen,
286
+ diagnosticsOpen: desktopPanes.diagnosticsOpen,
287
+ // Chat-rail + canvas-workbench mode. Persisted with the columns.
288
+ canvasZen: desktopPanes.zen,
289
+ // Canvas filling the workspace. Deliberately NOT persisted: it is
290
+ // a "look at this now" gesture, and returning to a portal with no
291
+ // chat and no session list would read as a broken app.
292
+ canvasMaximized: false,
168
293
  statsViewMode: "session",
169
294
  prompt: "",
170
295
  promptCursor: 0,
@@ -301,6 +426,18 @@ export function createInitialState({ mode = "local", branding = null, docs = nul
301
426
  query: "",
302
427
  },
303
428
  },
429
+ canvas: {
430
+ // Runtime knowledge of each session's canvas, fed by the
431
+ // selection-burst snapshot and then by canvas_updated events.
432
+ // { latestRev, note, sizeBytes, snapshotLoaded } per session.
433
+ bySessionId: {},
434
+ // Persisted per-user attention state — see normalizeStoredCanvasPrefs.
435
+ prefs: normalizeStoredCanvasPrefs(canvasPrefs),
436
+ // Ticks on every agent-driven flip. Hosts whose pane state lives
437
+ // outside ui.rightPaneMode (the phone's tab strip) watch this to
438
+ // bring their canvas surface forward.
439
+ flipSeq: 0,
440
+ },
304
441
  logs: {
305
442
  available: false,
306
443
  availabilityReason: "Log tailing disabled: no K8S_CONTEXT configured in the env file.",
@@ -61,7 +61,7 @@ const THEMES = Object.freeze([
61
61
 
62
62
  const THEME_MAP = new Map(THEMES.map((theme) => [theme.id, theme]));
63
63
 
64
- export const DEFAULT_THEME_ID = noctisObscuroTheme.id;
64
+ export const DEFAULT_THEME_ID = workspaceDarkTheme.id;
65
65
 
66
66
  export { THEME_GROUP_ORDER } from "./helpers.js";
67
67
 
@@ -353,7 +353,6 @@ const ChatPane = React.memo(function ChatPane({ controller, width, height, frame
353
353
  branding: state.branding,
354
354
  connectionError: state.connection.error,
355
355
  connectionMode: state.connection.mode,
356
- chatViewMode: state.ui.chatViewMode || "transcript",
357
356
  chatScroll: state.ui.scroll.chat,
358
357
  focused: state.ui.focusRegion === "chat",
359
358
  };
@@ -371,9 +370,7 @@ const ChatPane = React.memo(function ChatPane({ controller, width, height, frame
371
370
  error: chatView.connectionError,
372
371
  mode: chatView.connectionMode,
373
372
  },
374
- ui: {
375
- chatViewMode: chatView.chatViewMode,
376
- },
373
+ ui: {},
377
374
  sessions: {
378
375
  activeSessionId: chatView.activeSessionId,
379
376
  byId: buildSingleSessionMap(chatView.activeSessionId, chatView.activeSession),
@@ -398,7 +395,6 @@ const ChatPane = React.memo(function ChatPane({ controller, width, height, frame
398
395
  chatView.activeOutbox,
399
396
  chatView.authPrincipal,
400
397
  chatView.branding,
401
- chatView.chatViewMode,
402
398
  chatView.connectionError,
403
399
  chatView.connectionMode,
404
400
  ]);
@@ -966,7 +962,6 @@ const StatusBar = React.memo(function StatusBar({ controller }) {
966
962
  workersOnline: state.connection.workersOnline,
967
963
  focusRegion: state.ui.focusRegion,
968
964
  inspectorTab: state.ui.inspectorTab,
969
- chatViewMode: state.ui.chatViewMode || "transcript",
970
965
  fullscreenPane: state.ui.fullscreenPane || null,
971
966
  logsAvailable: state.logs.available,
972
967
  logsTailing: state.logs.tailing,
@@ -988,7 +983,6 @@ const StatusBar = React.memo(function StatusBar({ controller }) {
988
983
  ui: {
989
984
  focusRegion: statusState.focusRegion,
990
985
  inspectorTab: statusState.inspectorTab,
991
- chatViewMode: statusState.chatViewMode,
992
986
  fullscreenPane: statusState.fullscreenPane,
993
987
  statusText: statusState.statusText,
994
988
  modal: statusState.modal,