nterminal 1.2.75 → 1.2.77

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 (85) hide show
  1. package/.env.example +3 -0
  2. package/README.md +1 -1
  3. package/dist/client/assets/MarkdownPreview-D5NthhhG.js +1 -0
  4. package/dist/client/assets/{TranscriptMarkdownBody-B-RKybd7.js → TranscriptMarkdownBody-BkGu6YVq.js} +1 -1
  5. package/dist/client/assets/index-B3_mYQzf.css +1 -0
  6. package/dist/client/assets/{index-CH_JmAuw.js → index-Bgqck-vt.js} +1 -1
  7. package/dist/client/assets/index-gSePR0Ob.js +57 -0
  8. package/dist/client/index.html +2 -2
  9. package/dist/scripts/onboarding.js +106 -41
  10. package/dist/scripts/onboarding.js.map +1 -1
  11. package/dist/server/agent/agentProxy.d.ts +2 -2
  12. package/dist/server/agent/agentProxy.js.map +1 -1
  13. package/dist/server/agent/agentWebSocketProxy.d.ts +2 -2
  14. package/dist/server/agent/agentWebSocketProxy.js.map +1 -1
  15. package/dist/server/agent/outboundAgentClient.d.ts +21 -0
  16. package/dist/server/agent/outboundAgentClient.js +237 -0
  17. package/dist/server/agent/outboundAgentClient.js.map +1 -0
  18. package/dist/server/agent/outboundAgentRegistry.d.ts +25 -0
  19. package/dist/server/agent/outboundAgentRegistry.js +190 -0
  20. package/dist/server/agent/outboundAgentRegistry.js.map +1 -0
  21. package/dist/server/agent/socketWebSocketRelay.d.ts +6 -0
  22. package/dist/server/agent/socketWebSocketRelay.js +107 -0
  23. package/dist/server/agent/socketWebSocketRelay.js.map +1 -0
  24. package/dist/server/auth/authService.js +4 -1
  25. package/dist/server/auth/authService.js.map +1 -1
  26. package/dist/server/code/codeServerManager.d.ts +7 -1
  27. package/dist/server/code/codeServerManager.js +95 -38
  28. package/dist/server/code/codeServerManager.js.map +1 -1
  29. package/dist/server/config.d.ts +3 -0
  30. package/dist/server/config.js +33 -0
  31. package/dist/server/config.js.map +1 -1
  32. package/dist/server/http.d.ts +1 -0
  33. package/dist/server/http.js +18 -2
  34. package/dist/server/http.js.map +1 -1
  35. package/dist/server/index.js +21 -2
  36. package/dist/server/index.js.map +1 -1
  37. package/dist/server/notifications/agentCompletionMonitor.d.ts +4 -1
  38. package/dist/server/notifications/agentCompletionMonitor.js +23 -4
  39. package/dist/server/notifications/agentCompletionMonitor.js.map +1 -1
  40. package/dist/server/notifications/completionNotificationRouter.d.ts +2 -1
  41. package/dist/server/notifications/completionNotificationRouter.js +4 -2
  42. package/dist/server/notifications/completionNotificationRouter.js.map +1 -1
  43. package/dist/server/notifications/pushNotificationService.d.ts +20 -2
  44. package/dist/server/notifications/pushNotificationService.js +129 -14
  45. package/dist/server/notifications/pushNotificationService.js.map +1 -1
  46. package/dist/server/routes/agentLinkRoutes.d.ts +9 -0
  47. package/dist/server/routes/agentLinkRoutes.js +129 -0
  48. package/dist/server/routes/agentLinkRoutes.js.map +1 -0
  49. package/dist/server/routes/agentManagementRoutes.d.ts +2 -0
  50. package/dist/server/routes/agentManagementRoutes.js +147 -101
  51. package/dist/server/routes/agentManagementRoutes.js.map +1 -1
  52. package/dist/server/routes/codeServerRoutes.js +28 -31
  53. package/dist/server/routes/codeServerRoutes.js.map +1 -1
  54. package/dist/server/routes/httpProxyBody.d.ts +10 -0
  55. package/dist/server/routes/httpProxyBody.js +73 -0
  56. package/dist/server/routes/httpProxyBody.js.map +1 -0
  57. package/dist/server/routes/pushNotificationRoutes.js +31 -2
  58. package/dist/server/routes/pushNotificationRoutes.js.map +1 -1
  59. package/dist/server/runtimeState.js +9 -0
  60. package/dist/server/runtimeState.js.map +1 -1
  61. package/dist/server/storage/fileStore.d.ts +2 -1
  62. package/dist/server/storage/fileStore.js +7 -1
  63. package/dist/server/storage/fileStore.js.map +1 -1
  64. package/dist/server/terminal/TerminalManager.d.ts +2 -1
  65. package/dist/server/terminal/TerminalManager.js +27 -7
  66. package/dist/server/terminal/TerminalManager.js.map +1 -1
  67. package/dist/server/terminal/agentTranscriptStatus.d.ts +2 -2
  68. package/dist/server/terminal/agentTranscriptStatus.js +224 -38
  69. package/dist/server/terminal/agentTranscriptStatus.js.map +1 -1
  70. package/dist/server/update/packageUpdate.d.ts +1 -0
  71. package/dist/server/update/packageUpdate.js +34 -2
  72. package/dist/server/update/packageUpdate.js.map +1 -1
  73. package/dist/shared/agentLinkProtocol.d.ts +26 -0
  74. package/dist/shared/agentLinkProtocol.js +49 -0
  75. package/dist/shared/agentLinkProtocol.js.map +1 -0
  76. package/dist/shared/protocol.d.ts +18 -3
  77. package/dist/shared/protocol.js.map +1 -1
  78. package/dist/shared/types.d.ts +3 -1
  79. package/docs/configuration.md +3 -0
  80. package/docs/onboarding.md +9 -12
  81. package/package.json +1 -1
  82. package/scripts/nterminalctl +21 -0
  83. package/dist/client/assets/MarkdownPreview-CStdB1d5.js +0 -1
  84. package/dist/client/assets/index-DwmyYdjx.css +0 -1
  85. package/dist/client/assets/index-idJa2lVq.js +0 -57
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentLinkProtocol.js","sourceRoot":"","sources":["../../src/shared/agentLinkProtocol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AA6B1C,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;AACnD,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAEhD,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACpE,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,eAAe,KAAK,wBAAwB,IAAI,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC;YACtI,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE;YAC7F,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACjC,OAAO,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YACzG,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE;YACzE,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,KAAc;IAC3D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACpE,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,IAAI,EAAE;YAC1K,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE;YACjG,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,OAAO,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,mBAAmB,IAAI,MAAM,KAAK,kBAAkB,IAAI,MAAM,KAAK,mBAAmB,CAAC;YACxI,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE;YAC7D,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9E,CAAC"}
@@ -61,17 +61,26 @@ export interface TotpActivateRequest {
61
61
  export interface AgentSummary {
62
62
  id: string;
63
63
  name: string;
64
- url: string;
64
+ url: string | null;
65
+ transport?: 'direct' | 'outbound';
66
+ connected?: boolean;
65
67
  }
66
68
  export interface AgentListResponse {
67
69
  agents: AgentSummary[];
68
70
  serverOrder?: string[];
69
71
  }
70
- export interface AddAgentRequest {
72
+ export interface AddDirectAgentRequest {
71
73
  name: string;
74
+ transport?: 'direct';
72
75
  url: string;
73
76
  token: string;
74
77
  }
78
+ export interface AddOutboundAgentRequest {
79
+ name: string;
80
+ transport: 'outbound';
81
+ token: string;
82
+ }
83
+ export type AddAgentRequest = AddDirectAgentRequest | AddOutboundAgentRequest;
75
84
  export interface ReorderAgentsRequest {
76
85
  agentIds?: string[];
77
86
  serverIds?: string[];
@@ -138,7 +147,6 @@ export interface CodeServerInstanceSummary {
138
147
  id: string;
139
148
  cwd: string;
140
149
  url: string;
141
- port: number;
142
150
  createdAt: string;
143
151
  lastAccessedAt: string;
144
152
  displayTitle?: string;
@@ -281,6 +289,7 @@ export interface PushNotificationStatusResponse {
281
289
  supported: boolean;
282
290
  vapidPublicKey: string | null;
283
291
  currentDevice: PushNotificationDeviceSummary | null;
292
+ endpointRegistered: boolean | null;
284
293
  subscriptionCount: number;
285
294
  }
286
295
  export interface PushNotificationPrepareResponse {
@@ -333,6 +342,12 @@ export interface PushNotificationPresenceRequest {
333
342
  export interface PushNotificationPresenceResponse {
334
343
  ok: true;
335
344
  }
345
+ export interface PushNotificationTestRequest {
346
+ clientId: string;
347
+ }
348
+ export interface PushNotificationTestResponse {
349
+ ok: true;
350
+ }
336
351
  export interface FileRootRequest {
337
352
  terminalId?: TerminalId;
338
353
  path?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/shared/protocol.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AA0gBzC,MAAM,UAAU,0BAA0B,CAAC,GAAW;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,MASf,CAAC;QACF,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3G,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,GAAG,CAAC,OAAO,CAAC,oBAAoB,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACjF,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC7E,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;QACjE,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,IACE,OAAO,CAAC,IAAI,KAAK,QAAQ;YACzB,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ;YACtC,OAAO,IAAI,KAAK,QAAQ;YACxB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;YACtB,OAAO,IAAI,KAAK,QAAQ;YACxB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EACtB,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxE,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IACE,OAAO,CAAC,IAAI,KAAK,mBAAmB;YACpC,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ;YACtC,OAAO,KAAK,KAAK,QAAQ;YACzB,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;YACvB,KAAK,KAAK,CAAC;YACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,EACtB,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;QAC9E,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,mBAAmB,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YACnF,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;QACvE,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACjE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/shared/protocol.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AA6hBzC,MAAM,UAAU,0BAA0B,CAAC,GAAW;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,MASf,CAAC;QACF,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3G,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,GAAG,CAAC,OAAO,CAAC,oBAAoB,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACjF,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC7E,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;QACjE,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,IACE,OAAO,CAAC,IAAI,KAAK,QAAQ;YACzB,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ;YACtC,OAAO,IAAI,KAAK,QAAQ;YACxB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;YACtB,OAAO,IAAI,KAAK,QAAQ;YACxB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EACtB,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxE,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IACE,OAAO,CAAC,IAAI,KAAK,mBAAmB;YACpC,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ;YACtC,OAAO,KAAK,KAAK,QAAQ;YACzB,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;YACvB,KAAK,KAAK,CAAC;YACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,EACtB,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;QAC9E,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,mBAAmB,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YACnF,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;QACvE,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACjE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export type TerminalId = string;
2
+ export type TerminalCompletionOutcome = 'finished' | 'stopped';
2
3
  export interface TerminalSummary {
3
4
  id: TerminalId;
4
5
  title: string;
@@ -14,7 +15,8 @@ export interface TerminalSummary {
14
15
  currentCommand?: string | null;
15
16
  agentStatus?: {
16
17
  provider: 'codex' | 'claude';
17
- state: 'working' | 'done' | 'idle' | 'unknown';
18
+ sessionId?: string;
19
+ state: 'working' | 'done' | 'stopped' | 'idle' | 'unknown';
18
20
  };
19
21
  agentCache?: {
20
22
  source: {
@@ -32,6 +32,9 @@ Onboarding writes `.env` for you, including an absolute `NTERMINAL_STATE_PATH` s
32
32
  | `NTERMINAL_ALLOWED_ORIGINS` | local origins | Comma-separated browser origins allowed for mutating requests. |
33
33
  | `NTERMINAL_TRUST_PROXY` | `false` | Trust `X-Forwarded-For` for session IP binding. Use only behind a reverse proxy you control. |
34
34
  | `NTERMINAL_AGENT_TOKEN` | empty | Shared token used by the main server to reach a secondary server. Generated by secondary onboarding. |
35
+ | `NTERMINAL_AGENT_TRANSPORT` | `direct` | Secondary connection mode: `direct` lets main dial the secondary; `outbound` lets a NAT/mobile secondary maintain an encrypted WebSocket link to main. |
36
+ | `NTERMINAL_AGENT_ID` | empty | Main-issued secondary ID. Required and written by onboarding only for `outbound` mode. |
37
+ | `NTERMINAL_MAIN_URL` | empty | Public HTTPS URL of main. Required and written by onboarding only for `outbound` mode. |
35
38
  | `NTERMINAL_UPLOAD_MAX_FILES` | `1024` | Maximum files accepted in one drag-and-drop upload. |
36
39
  | `NTERMINAL_UPLOAD_MAX_FILE_BYTES` | `536870912` | Maximum bytes accepted for one uploaded file. |
37
40
  | `NTERMINAL_UPLOAD_MAX_BATCH_BYTES` | `2147483648` | Maximum total bytes accepted for one upload batch. |
@@ -42,21 +42,18 @@ nterminal onboarding
42
42
 
43
43
  Choose `secondary`.
44
44
 
45
- The secondary setup flow:
45
+ The secondary setup first asks for a connection mode:
46
46
 
47
- 1. Binds to `0.0.0.0` and picks a free port, preferring `3107`.
48
- 2. Suggests the URL the main server should use to reach this machine. If the local interface is private and a public IP can be detected, that public IP is offered as the default.
49
- 3. Asks for a display name.
50
- 4. Generates a session secret and `NTERMINAL_AGENT_TOKEN`, then writes `.env` with an absolute state path.
51
- 5. Prompts for the main server URL, password, and authenticator code.
52
- 6. Registers this secondary server with the main server automatically.
53
- 7. Optionally starts the installed package.
47
+ - **Direct**: main connects to the secondary's stable IP/domain. Onboarding binds to `0.0.0.0`, suggests a reachable URL, and can restrict the inbound port to the main server in `ufw` or `firewalld`.
48
+ - **Outbound**: the secondary maintains an authenticated WSS connection to main. This is intended for mobile networks, NAT, or changing IP addresses. It binds NTerminal to `127.0.0.1`, requires no inbound port, and requires the main's public HTTPS URL.
49
+
50
+ Both modes preserve the session secret and agent token on re-run, ask for a display name, authenticate once to main with password and TOTP, and register the secondary automatically. Outbound registration is required before the runtime can start because onboarding must save the main-issued agent ID.
54
51
 
55
52
  Onboard the main server first. The main must already have password and TOTP configured before a secondary server can register itself.
56
53
 
57
- The detected public IP is only a convenience default. NAT gateways, load balancers, Cloudflare tunnels, VPN/private networks, and cloud security groups can make that address wrong or unreachable, so override it with the URL/IP the main can actually reach when needed.
54
+ In direct mode, the detected public IP is only a convenience default. NAT gateways, load balancers, Cloudflare tunnels, VPN/private networks, and cloud security groups can make that address wrong or unreachable, so override it with the URL/IP the main can actually reach when needed.
58
55
 
59
- Logging into the main server from the secondary CLI counts as a login, so the single-active-session policy may revoke an open browser session. Log in again in the browser afterward.
56
+ The temporary CLI login is removed after registration. Existing browser and terminal/tmux sessions remain active.
60
57
 
61
58
  ## Proxy Setup
62
59
 
@@ -82,6 +79,6 @@ The "Main is ready" summary is printed only after the selected setup path has co
82
79
 
83
80
  You can re-run onboarding to refresh generated config or register a secondary server again.
84
81
 
85
- Existing `NTERMINAL_PORT`, `NTERMINAL_SESSION_SECRET`, and `NTERMINAL_AGENT_TOKEN` values are preserved on re-run. Main onboarding always forces `NTERMINAL_HOST=127.0.0.1` so public traffic goes through nginx/TLS; secondary onboarding preserves its existing bind host.
82
+ Existing `NTERMINAL_PORT`, `NTERMINAL_SESSION_SECRET`, `NTERMINAL_AGENT_TOKEN`, and connection mode values are preserved as defaults on re-run. Main onboarding always forces `NTERMINAL_HOST=127.0.0.1` so public traffic goes through nginx/TLS. Direct secondaries preserve their bind host; outbound secondaries force loopback.
86
83
 
87
- Registering the same secondary server URL again replaces the previous entry for that URL.
84
+ Re-registering with the same agent token updates the existing entry and preserves its layout. Direct registrations also merge duplicate entries that advertise the same URL.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nterminal",
3
- "version": "1.2.75",
3
+ "version": "1.2.77",
4
4
  "license": "GPL-3.0-only",
5
5
  "type": "module",
6
6
  "packageManager": "npm@10.9.7",
@@ -172,6 +172,27 @@ validate_required_env() {
172
172
  echo "missing or too-short env: NTERMINAL_AGENT_TOKEN"
173
173
  missing=1
174
174
  fi
175
+ local agent_transport="${NTERMINAL_AGENT_TRANSPORT:-direct}"
176
+ if [[ "$agent_transport" != "direct" && "$agent_transport" != "outbound" ]]; then
177
+ echo "invalid env: NTERMINAL_AGENT_TRANSPORT (expected direct or outbound)"
178
+ missing=1
179
+ elif [[ "$agent_transport" == "outbound" ]]; then
180
+ if [[ -z "${NTERMINAL_AGENT_ID:-}" ]]; then
181
+ echo "missing env for outbound secondary: NTERMINAL_AGENT_ID"
182
+ missing=1
183
+ fi
184
+ if [[ -z "${NTERMINAL_MAIN_URL:-}" ]]; then
185
+ echo "missing env for outbound secondary: NTERMINAL_MAIN_URL"
186
+ missing=1
187
+ elif [[ "${NTERMINAL_MAIN_URL}" != https://* ]]; then
188
+ echo "invalid env for outbound secondary: NTERMINAL_MAIN_URL must use https://"
189
+ missing=1
190
+ fi
191
+ if [[ "${NTERMINAL_HOST:-127.0.0.1}" != "127.0.0.1" ]]; then
192
+ echo "invalid env for outbound secondary: NTERMINAL_HOST must be 127.0.0.1"
193
+ missing=1
194
+ fi
195
+ fi
175
196
  fi
176
197
  return "$missing"
177
198
  }
@@ -1 +0,0 @@
1
- import{j as a}from"./index-idJa2lVq.js";import{M as e,r as o}from"./index-CH_JmAuw.js";function s({content:r}){return a.jsx(e,{remarkPlugins:[o],children:r})}export{s as default};
@@ -1 +0,0 @@
1
- .xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;inset:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;inset:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{font-family:monospace;-webkit-user-select:text;user-select:text;white-space:pre}.xterm .xterm-accessibility-tree>div{transform-origin:left;width:fit-content}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;background:#0000;transition:opacity .1s linear;z-index:11}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{position:absolute;display:none}.xterm .xterm-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow, #000) 0 6px 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px;box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}@font-face{font-family:MesloLGS NF;src:url(/assets/MesloLGS-NF-Regular-Cxr8pvCI.ttf) format("truetype");font-display:block;font-weight:400;font-style:normal}@font-face{font-family:MesloLGS NF;src:url(/assets/MesloLGS-NF-Bold-kN-HYz-g.ttf) format("truetype");font-display:block;font-weight:700;font-style:normal}@font-face{font-family:MesloLGS NF;src:url(/assets/MesloLGS-NF-Italic-CMg1T6-G.ttf) format("truetype");font-display:block;font-weight:400;font-style:italic}@font-face{font-family:MesloLGS NF;src:url(/assets/MesloLGS-NF-Bold-Italic-DwFsXcwX.ttf) format("truetype");font-display:block;font-weight:700;font-style:italic}:root{color:var(--nt-fg);background:var(--nt-bg);font-family:var(--nt-font-ui);font-synthesis:none;text-rendering:optimizeLegibility;text-size-adjust:100%;-webkit-text-size-adjust:100%;--nterminal-viewport-height: 100vh;--nterminal-keyboard-inset-bottom: 0px;--nterminal-safe-area-bottom: env(safe-area-inset-bottom, 0px);--nt-bg: #0a0d10;--nt-bg-2: #0d1216;--nt-bg-sidebar: #08090b;--nt-line: #1a2128;--nt-line-2: #2a3340;--nt-fg: #e2e8ee;--nt-fg-2: #8896a3;--nt-fg-3: #54616d;--nt-fg-4: #3f4a54;--nt-accent: #5eead4;--nt-accent-soft: rgba(94, 234, 212, .1);--nt-accent-glow: rgba(94, 234, 212, .55);--nt-on-accent: #062423;--nt-ok: #34d399;--nt-danger: #f87171;--nt-on-danger: #190607;--nt-danger-soft: rgba(248, 113, 113, .08);--nt-danger-line: rgba(248, 113, 113, .3);--nt-warning: #fbbf24;--nt-warn: #fbbf24;--nt-warning-soft: rgba(247, 217, 119, .075);--nt-warning-glow: rgba(245, 158, 11, .55);--nt-scrim: rgba(0, 0, 0, .55);--nt-scrim-soft: rgba(0, 0, 0, .28);--nt-shadow: rgba(0, 0, 0, .35);--nt-shadow-strong: rgba(0, 0, 0, .5);--nt-floating-bg: rgba(10, 13, 16, .86);--nt-floating-bg-strong: rgba(10, 13, 16, .96);--nt-floating-bg-hover: rgba(15, 23, 27, .94);--nt-subtle-fill: rgba(255, 255, 255, .018);--nt-hover-fill: rgba(255, 255, 255, .015);--nt-scrollbar-thumb: rgba(148, 163, 184, .5);--nt-scrollbar-thumb-hover: rgba(148, 163, 184, .7);--nt-transcript-user: #f7d977;--nt-transcript-assistant: #5eead4;--nt-transcript-tool: #9aa7b4;--nt-transcript-command: #8fd6ff;--nt-transcript-code: #c4f1ff;--nt-transcript-search: #f7d977;--nt-transcript-on-search: #121417;--nt-qr-bg: #ffffff;--nt-font-ui: "Inter", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;--nt-font-mono: "JetBrains Mono", "MesloLGS NF", ui-monospace, "SF Mono", monospace}@supports (height: 100dvh){:root{--nterminal-viewport-height: 100dvh}}*{box-sizing:border-box}html,body,#root{width:100%;min-width:320px;height:100%;min-height:100%;margin:0;overflow:hidden;overscroll-behavior:none}body{overflow:hidden;background:var(--nt-bg);touch-action:manipulation}button,input,textarea,select{font:inherit}button{color:inherit}button:disabled{cursor:not-allowed;opacity:.42}input{min-width:0;outline:none}textarea{min-width:0;resize:none;outline:none}.terminal-shell{display:grid;grid-template-columns:232px minmax(0,1fr);width:100%;height:var(--nterminal-viewport-height);min-height:0;overflow:hidden;padding-bottom:var(--nterminal-safe-area-bottom);background:var(--nt-bg);transition:grid-template-columns .16s ease}.terminal-shell[data-collapsed=true]{grid-template-columns:56px minmax(0,1fr)}.workspace-backdrop{display:none}.workspace-sidebar{display:grid;grid-template-rows:auto 1fr auto;min-width:0;min-height:0;border-right:1px solid var(--nt-line);background:var(--nt-bg-sidebar)}.workspace-brand{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;padding:16px 16px 14px}.terminal-shell[data-collapsed=true] .workspace-brand{grid-template-columns:1fr;justify-items:center;gap:6px;padding:14px 0 12px}.workspace-brand-name{color:var(--nt-fg);font-size:13px;font-weight:600;letter-spacing:.02em}.workspace-brand-lockup{display:flex;min-width:0;align-items:center;gap:8px}.terminal-shell[data-collapsed=true] .workspace-brand-lockup{justify-content:center}.workspace-preview-badge{display:inline-grid;place-items:center;height:18px;padding:0 6px;border:1px solid color-mix(in srgb,var(--nt-accent) 52%,var(--nt-line));border-radius:4px;color:var(--nt-accent);background:color-mix(in srgb,var(--nt-accent) 10%,transparent);font-size:10px;font-weight:700;line-height:1;text-transform:uppercase}.nterminal-mark,.nterminal-wordmark{display:block;flex:0 0 auto}.sidebar-collapse-button,.sidebar-drawer-close-button,.workspace-sidebar-header button,.mobile-menu-button,.tab-add-button,.pane-action-button,.icon-button,.workspace-footer-icon-button,.workspace-close-button,.terminal-pane-close,.empty-workspace button,.secondary-button{display:grid;place-items:center;border:1px solid transparent;padding:0;color:var(--nt-fg-3);background:transparent;cursor:pointer}.sidebar-collapse-button,.sidebar-drawer-close-button{width:22px;height:22px;border-radius:4px}.sidebar-drawer-close-button{display:none}.terminal-shell[data-collapsed=true] .sidebar-collapse-button{width:28px;height:24px}.sidebar-collapse-button:hover:not(:disabled),.sidebar-drawer-close-button:hover:not(:disabled),.workspace-sidebar-header button:hover:not(:disabled),.mobile-menu-button:hover:not(:disabled),.pane-action-button:hover:not(:disabled),.icon-button:hover:not(:disabled),.workspace-footer-icon-button:hover:not(:disabled),.empty-workspace button:hover:not(:disabled),.secondary-button:hover:not(:disabled){color:var(--nt-fg);background:var(--nt-bg-2)}.workspace-nav{display:grid;grid-template-rows:auto 1fr;min-height:0;overflow:auto;overscroll-behavior:contain;scrollbar-width:none;-webkit-overflow-scrolling:touch}.workspace-nav::-webkit-scrollbar{display:none}.workspace-sidebar-content{display:grid;grid-template-rows:auto minmax(0,1fr);min-width:0;min-height:0;overflow:hidden}.workspace-sidebar-content--files{grid-template-rows:auto minmax(0,1fr)}.workspace-sidebar-content--servers>.workspace-nav:only-child{grid-row:1 / -1}.workspace-sidebar-servers{border-bottom:1px solid var(--nt-line);padding:0 12px 10px}.server-list{display:flex;flex-direction:column;gap:6px;min-height:0}.server-list-section{position:relative;display:grid;gap:4px}.server-list-children{min-width:0;padding-left:28px}.server-list-toolbar{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:4px;padding:2px;border:1px solid var(--nt-line);border-radius:6px;background:var(--nt-bg)}.server-list-view-button{height:24px;border:1px solid transparent;border-radius:4px;background:transparent;color:var(--nt-fg-3);font-size:10px;font-weight:650;cursor:pointer}.server-list-view-button:hover{color:var(--nt-fg);background:var(--nt-bg-2)}.server-list-view-button[aria-pressed=true]{border-color:color-mix(in srgb,var(--nt-accent) 40%,transparent);color:var(--nt-accent);background:var(--nt-accent-soft)}.server-list-row{position:relative;display:flex;align-items:center;gap:4px}.server-list-row--dragging{opacity:.5}.server-list-row--drop-target .server-list-item{border-color:color-mix(in srgb,var(--nt-accent) 62%,transparent);background:var(--nt-accent-soft)}.server-list-section--drop-before:before,.server-list-section--drop-after:after{content:"";position:absolute;left:0;right:0;height:2px;border-radius:999px;background:var(--nt-accent);box-shadow:0 0 0 2px var(--nt-accent-soft);pointer-events:none;z-index:1}.server-list-section--drop-before:before{top:-4px}.server-list-section--drop-after:after{bottom:-4px}.server-list-item{display:grid;grid-template-rows:auto auto;gap:5px;flex:1;min-width:0;min-height:72px;padding:7px 8px;border:1px solid transparent;border-radius:5px;background:transparent;color:var(--nt-fg-3);font-size:12px;cursor:pointer;text-align:left}.server-list-item-header{display:flex;align-items:center;gap:7px;min-width:0}.server-list-drag-handle{appearance:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:32px;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;color:var(--nt-fg-3);font-size:10px;font-weight:700;letter-spacing:0;line-height:1;cursor:grab;user-select:none;touch-action:none;-webkit-user-select:none;flex:0 0 auto}.server-list-drag-handle:hover{color:var(--nt-fg);background:var(--nt-bg)}.server-list-drag-handle:focus-visible{outline:2px solid color-mix(in srgb,var(--nt-accent) 65%,transparent);outline-offset:2px}.server-list-row--dragging .server-list-drag-handle{cursor:grabbing}.server-list-drag-spacer{width:28px;height:32px;flex:0 0 auto}.server-list-item:hover{background:var(--nt-bg-2);color:var(--nt-fg)}.server-list-item--active{border-color:color-mix(in srgb,var(--nt-accent) 55%,transparent);color:var(--nt-accent);background:var(--nt-accent-soft)}.server-list-dot{width:7px;height:7px;border-radius:50%;background:currentColor;flex-shrink:0}.server-list-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.server-list-stats{font-size:10px;font-variant-numeric:tabular-nums;color:var(--nt-fg-3)}.server-list-stats-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:4px;width:100%}.server-list-stats--offline{display:flex;align-items:center;min-height:48px;padding:0 6px;border:1px solid var(--nt-line);border-radius:5px;color:var(--nt-danger);background:var(--nt-bg)}.server-list-stat-cell{min-width:0;padding:4px 6px;border:1px solid var(--nt-line);border-radius:5px;background:var(--nt-bg)}.server-list-stat-head,.server-list-stat-value,.server-list-stat-detail{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.server-list-stat-head{display:flex;align-items:baseline;justify-content:space-between;gap:4px;min-width:0}.server-list-stat-label{min-width:0;color:var(--nt-fg-3);font-size:9px;letter-spacing:0}.server-list-stat-value{flex:0 0 auto;color:var(--nt-fg);font-size:11px;font-weight:650}.server-list-stat-detail{display:block;margin-top:2px;color:var(--nt-fg-3);font-size:9px}.server-list-item--active .server-list-stats{color:var(--nt-accent)}.server-list-item--active .server-list-stat-cell{border-color:color-mix(in srgb,var(--nt-accent) 24%,var(--nt-line))}.server-list-item--active .server-list-stat-value{color:var(--nt-accent)}.server-list-stat-value[data-tone=warning]{color:var(--nt-warning)}.server-list-stat-value[data-tone=danger]{color:var(--nt-danger)}.server-list--list .server-list-item{grid-template-rows:auto;min-height:34px;padding:7px 8px}.server-list--compact{display:flex;flex-direction:column;align-items:center;gap:6px;padding:8px 0}.server-list-chip{position:relative;display:grid;place-items:center;width:36px;height:36px;border:1px solid transparent;border-radius:8px;background:var(--nt-bg-2);color:var(--nt-fg-3);font-size:14px;font-weight:600;cursor:pointer;padding:0}.server-list-chip:hover{color:var(--nt-fg);border-color:var(--nt-line)}.server-list-chip--active{border-color:color-mix(in srgb,var(--nt-accent) 55%,transparent);color:var(--nt-accent);background:var(--nt-accent-soft)}.server-list-chip-initial{line-height:1}.server-list-chip-pip{position:absolute;right:3px;bottom:3px;width:7px;height:7px;border-radius:50%;border:1px solid var(--nt-bg-sidebar)}.server-list-chip-pip[data-status=ok]{background:var(--nt-accent)}.server-list-chip-pip[data-status=offline]{background:var(--nt-danger)}.server-list-chip-pip[data-status=unknown]{background:var(--nt-fg-3);opacity:.4}.workspace-nav--collapsed{padding:0}.server-list-editor{flex:1 1 auto;display:flex;align-items:center;min-width:0}.server-list-editor input{width:100%;height:28px;padding:0 22px 0 10px;border-radius:6px;border:1px solid var(--nt-accent);background:var(--nt-bg-2);color:var(--nt-fg);font:inherit;outline:none}.server-list-remove{width:22px;height:22px;border:none;border-radius:4px;background:transparent;color:var(--nt-fg-3);font-size:16px;line-height:1;cursor:pointer;flex-shrink:0}.server-list-remove:hover{color:var(--nt-danger);background:var(--nt-bg-2)}.server-list-add{height:28px;border:1px dashed var(--nt-line);border-radius:5px;background:transparent;color:var(--nt-fg-3);font-size:11px;cursor:pointer}.server-list-add:hover{color:var(--nt-accent);border-color:color-mix(in srgb,var(--nt-accent) 55%,transparent)}.workspace-list-panel{display:grid;gap:5px;min-height:0;padding:2px 0 6px 8px;border-left:1px solid var(--nt-line)}.workspace-list-panel--active-server{border-left-color:color-mix(in srgb,var(--nt-accent) 42%,var(--nt-line))}.workspace-list-header{display:flex;align-items:center;justify-content:space-between;gap:6px;min-height:16px;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:9.5px;font-weight:650;line-height:12px;text-transform:uppercase}.workspace-list-header button,.workspace-list-edit,.workspace-list-delete{display:inline-flex;align-items:center;justify-content:center;border:1px solid transparent;border-radius:5px;background:transparent;color:var(--nt-fg-3);cursor:pointer}.workspace-list-header button{width:16px;height:16px;font-size:12px;line-height:1}.workspace-list-header button:hover,.workspace-list-edit:hover:not(:disabled),.workspace-list-delete:hover:not(:disabled){color:var(--nt-accent);background:var(--nt-bg-2)}.workspace-list-items{display:grid;gap:5px}.workspace-list-item{position:relative;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:stretch;gap:4px;border:1px solid transparent;border-radius:6px}.workspace-list-item--reorderable{grid-template-columns:24px minmax(0,1fr) auto}.workspace-list-item[data-drop-over=true]{border-color:color-mix(in srgb,var(--nt-accent) 60%,transparent);background:var(--nt-accent-soft)}.workspace-list-item--drop-target{border-color:color-mix(in srgb,var(--nt-accent) 62%,transparent)}.workspace-list-item--drop-before:before,.workspace-list-item--drop-after:after{content:"";position:absolute;left:6px;right:6px;height:2px;border-radius:999px;background:var(--nt-accent);pointer-events:none}.workspace-list-item--drop-before:before{top:-4px}.workspace-list-item--drop-after:after{bottom:-4px}.workspace-list-item--active{border-color:color-mix(in srgb,var(--nt-accent) 42%,transparent);background:var(--nt-accent-soft)}.workspace-list-item--dragging{opacity:.62}.workspace-list-drag-handle{display:inline-flex;align-items:center;justify-content:center;width:24px;min-width:24px;min-height:100%;border:0;border-radius:5px;background:transparent;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px;cursor:grab;touch-action:none}.workspace-list-drag-handle:hover,.workspace-list-drag-handle:focus-visible{color:var(--nt-accent);background:var(--nt-bg-2);outline:none}.workspace-list-drag-handle:active{cursor:grabbing}.workspace-list-select{display:grid;gap:2px;min-width:0;padding:7px 8px;border:0;border-radius:5px;background:transparent;color:var(--nt-fg-3);text-align:left;cursor:pointer}.workspace-list-select:hover{color:var(--nt-fg);background:var(--nt-bg-2)}.workspace-list-item--active .workspace-list-select{color:var(--nt-accent)}.workspace-list-name,.workspace-list-select small{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.workspace-list-name{font-size:12px;font-weight:650}.workspace-list-select small{color:var(--nt-fg-3);font-size:10px}.workspace-list-actions{display:flex;align-items:center;gap:2px;padding-right:4px}.workspace-list-edit,.workspace-list-delete{width:24px;min-width:24px;margin:4px 0;font-size:12px}.workspace-list-delete:hover:not(:disabled){color:var(--nt-danger)}.workspace-list-delete:disabled{cursor:default;opacity:.3}.workspace-list-placeholder{min-height:30px;border:1px dashed var(--nt-line);border-radius:5px;padding:0 8px;color:var(--nt-fg-3);background:transparent;font-size:11px;text-align:left;cursor:pointer}.workspace-list-placeholder:hover{color:var(--nt-fg);border-color:color-mix(in srgb,var(--nt-accent) 45%,transparent);background:var(--nt-accent-soft)}.workspace-list-placeholder--error{color:var(--nt-danger);border-color:var(--nt-danger-line);background:var(--nt-danger-soft)}.workspace-dialog{max-width:min(680px,calc(100vw - 28px));max-height:min(86vh,760px);padding:0;gap:0;overflow:hidden}.workspace-dialog .security-panel-header{flex:0 0 auto;padding:16px 18px;border-bottom:1px solid var(--nt-line)}.workspace-dialog-body{display:grid;gap:12px;min-height:0;overflow:auto;padding:16px 18px;-webkit-overflow-scrolling:touch}.workspace-dialog-field{display:grid;gap:6px;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px}.workspace-dialog-field input,.workspace-dialog-path-row input{min-width:0;height:32px;border:1px solid var(--nt-line);border-radius:5px;padding:0 9px;color:var(--nt-fg);background:var(--nt-bg);font:inherit;outline:none}.workspace-dialog-field input:focus,.workspace-dialog-path-row input:focus{border-color:color-mix(in srgb,var(--nt-accent) 58%,transparent);box-shadow:0 0 0 2px var(--nt-accent-soft)}.workspace-dialog-path-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:7px}.workspace-dialog-quick-actions,.workspace-dialog-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px}.workspace-dialog-quick-actions{justify-content:flex-start;flex-wrap:wrap}.workspace-dialog-body button,.workspace-dialog-actions button{min-height:30px;border:1px solid var(--nt-line);border-radius:5px;padding:0 10px;color:var(--nt-fg-2);background:transparent;font-family:var(--nt-font-mono);font-size:11px;cursor:pointer}.workspace-dialog-body button:hover:not(:disabled),.workspace-dialog-actions button:hover:not(:disabled){color:var(--nt-fg);border-color:color-mix(in srgb,var(--nt-accent) 50%,transparent);background:var(--nt-accent-soft)}.workspace-dialog-body button:disabled,.workspace-dialog-actions button:disabled{cursor:default;opacity:.45}.workspace-dialog-actions{flex:0 0 auto;border-top:1px solid var(--nt-line);padding:12px 18px}.workspace-dialog-actions .primary-button{color:var(--nt-on-accent);border-color:var(--nt-accent);background:var(--nt-accent)}.workspace-dialog-browser{display:grid;grid-template-rows:auto minmax(0,1fr);min-height:190px;max-height:260px;overflow:hidden;border:1px solid var(--nt-line);border-radius:7px;background:var(--nt-bg)}.workspace-dialog-browser-header{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;border-bottom:1px solid var(--nt-line);padding:7px 8px;color:var(--nt-fg-2);font-family:var(--nt-font-mono);font-size:11px}.workspace-dialog-browser-header span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.workspace-dialog-folder-list{display:grid;align-content:start;min-height:0;overflow:auto;padding:5px;-webkit-overflow-scrolling:touch}.workspace-dialog-folder-list button{display:grid;gap:2px;min-width:0;min-height:34px;border:0;padding:6px 8px;text-align:left}.workspace-dialog-folder-list button span,.workspace-dialog-folder-list button small{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.workspace-dialog-folder-list button span{color:var(--nt-fg)}.workspace-dialog-folder-list button small{color:var(--nt-fg-3);font-size:10px}.workspace-dialog-empty{display:grid;place-items:center;min-height:120px;color:var(--nt-fg-3);font-size:12px}.workspace-dialog-error{border:1px solid var(--nt-danger-line);border-radius:6px;padding:8px 10px;color:var(--nt-danger);background:var(--nt-danger-soft);font-size:11px}.server-add-form{display:flex;flex-direction:column;gap:6px;padding:8px 0 2px}.server-add-form input{height:28px;padding:0 8px;border:1px solid var(--nt-line);border-radius:5px;background:var(--nt-bg-2);color:var(--nt-fg);font-size:12px}.server-add-actions{display:flex;gap:6px}.server-add-actions button{flex:1;height:28px;font-size:11px}.totp-setup{display:flex;flex-direction:column;gap:14px}.totp-setup-instructions{color:var(--nt-fg-2);font-size:13px;line-height:1.5}.totp-qr-container{display:flex;justify-content:center;padding:12px;background:var(--nt-qr-bg);border-radius:8px;align-self:center}.totp-secret-details{font-size:12px;color:var(--nt-fg-3)}.totp-secret-text{margin-top:6px;padding:8px;border-radius:5px;background:var(--nt-bg-2);font-family:var(--nt-font-mono);letter-spacing:.1em;word-break:break-all;color:var(--nt-fg)}.auth-checkbox{display:inline-flex;flex-direction:row;align-items:center;gap:8px;font-size:12.5px;line-height:1.4;color:var(--nt-fg-2);cursor:pointer;-webkit-user-select:none;user-select:none}input[type=checkbox]{appearance:none;-webkit-appearance:none;width:16px;height:16px;margin:0;flex:0 0 16px;border:1px solid var(--nt-line-2);border-radius:4px;background:var(--nt-bg-2);cursor:pointer;position:relative;transition:border-color .12s ease,background .12s ease}input[type=checkbox]:hover{border-color:var(--nt-accent)}input[type=checkbox]:focus-visible{outline:none;border-color:var(--nt-accent);box-shadow:0 0 0 2px var(--nt-accent-soft)}input[type=checkbox]:checked{background:var(--nt-accent);border-color:var(--nt-accent)}input[type=checkbox]:checked:after{content:"";position:absolute;left:4px;top:1px;width:5px;height:9px;border:solid var(--nt-bg);border-width:0 2px 2px 0;transform:rotate(45deg)}input[type=checkbox]:disabled{opacity:.5;cursor:not-allowed}.workspace-sidebar-footer-actions{display:flex;flex:0 0 auto;gap:5px}.security-overlay{position:fixed;inset:0;background:var(--nt-scrim);display:flex;align-items:center;justify-content:center;z-index:50;padding:16px}.security-panel{width:100%;max-width:520px;max-height:85vh;overflow:auto;background:var(--nt-bg-2);border:1px solid var(--nt-line);border-radius:10px;padding:20px;display:flex;flex-direction:column;gap:18px}.settings-panel{max-width:min(1080px,calc(100vw - 32px));height:min(86vh,820px);max-height:min(86vh,820px);overflow:hidden;padding:0;gap:0}.settings-panel .security-panel-header{flex:0 0 auto;padding:18px 20px;border-bottom:1px solid var(--nt-line)}.settings-layout{display:grid;grid-template-columns:180px minmax(0,1fr);flex:1 1 auto;min-height:0;overflow:hidden}.settings-nav{display:flex;flex-direction:column;gap:4px;min-height:0;padding:12px;border-right:1px solid var(--nt-line);background:color-mix(in srgb,var(--nt-bg) 52%,transparent)}.settings-nav button{position:relative;height:32px;border:0;border-left:2px solid transparent;border-radius:5px;padding:0 10px;color:var(--nt-fg-2);background:transparent;text-align:left;font-size:12px;cursor:pointer}.settings-nav button:hover{color:var(--nt-fg);border-left-color:var(--nt-accent);background:var(--nt-accent-soft)}.settings-nav button[data-active=true]{color:var(--nt-accent);border-left-color:var(--nt-accent);background:var(--nt-accent-soft)}.settings-content{min-height:0;max-height:calc(min(86vh,820px) - 66px);overflow:auto;padding:18px 22px 22px;scroll-behavior:smooth;overscroll-behavior:contain}.settings-section,.settings-section-group>.security-section{scroll-margin-top:16px;padding-bottom:18px;border-bottom:1px solid var(--nt-line)}.settings-section+.settings-section,.settings-section+.settings-section-group,.settings-section-group+.settings-section-group{margin-top:18px}.settings-section-group:last-child>.security-section{border-bottom:0;padding-bottom:0}.settings-section-heading{display:flex;align-items:center;justify-content:space-between;gap:12px}.security-panel-header{display:flex;align-items:center;justify-content:space-between}.security-panel-header h2{margin:0;font-size:16px;color:var(--nt-fg)}.security-close{width:28px;height:28px;border:none;border-radius:5px;background:transparent;color:var(--nt-fg-2);font-size:20px;cursor:pointer}.security-close:hover{background:var(--nt-bg);color:var(--nt-fg)}.security-section h3{margin:0 0 4px;font-size:13px;color:var(--nt-fg)}.settings-control{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:center;margin-top:10px;color:var(--nt-fg-2);font-size:12px}.settings-control-value{color:var(--nt-accent);font-family:var(--nt-font-mono);font-size:12px;font-variant-numeric:tabular-nums}.settings-control-title{display:block;color:var(--nt-fg);font-size:12px;font-weight:600}.settings-control-description{margin:4px 0 0}.settings-control input[type=range]{grid-column:1 / -1;width:100%;accent-color:var(--nt-accent)}.settings-control select{grid-column:1 / -1;width:100%;height:30px;border:1px solid var(--nt-line-2);border-radius:5px;padding:0 8px;color:var(--nt-fg);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:12px}.settings-theme-picker{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:12px}.settings-theme-card{display:grid;min-width:0;gap:8px;border:1px solid var(--nt-line-2);border-radius:6px;padding:8px;color:var(--nt-fg-2);background:var(--nt-bg);text-align:left;cursor:pointer;transition:border-color .12s ease,box-shadow .12s ease,background .12s ease}.settings-theme-card:hover,.settings-theme-card:focus-visible{border-color:color-mix(in srgb,var(--settings-theme-accent) 58%,var(--nt-line-2));background:color-mix(in srgb,var(--settings-theme-accent) 4%,var(--nt-bg));outline:none}.settings-theme-card[data-active=true]{border-color:var(--settings-theme-accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--settings-theme-accent) 18%,transparent)}.settings-theme-preview{display:grid;grid-template-columns:28px minmax(0,1fr);min-width:0;height:78px;overflow:hidden;border:1px solid var(--settings-theme-line);border-radius:5px;background:var(--settings-theme-bg)}.settings-theme-preview-sidebar{display:grid;align-content:start;gap:6px;padding:9px 6px;border-right:1px solid var(--settings-theme-line);background:var(--settings-theme-sidebar)}.settings-theme-preview-sidebar span{display:block;height:4px;border-radius:999px;background:color-mix(in srgb,var(--settings-theme-fg-2) 60%,transparent)}.settings-theme-preview-sidebar span:first-child{background:var(--settings-theme-accent)}.settings-theme-preview-main{display:grid;grid-template-rows:18px minmax(0,1fr);min-width:0;background:var(--settings-theme-bg)}.settings-theme-preview-tabs{display:flex;align-items:end;gap:4px;min-width:0;border-bottom:1px solid var(--settings-theme-line);padding:3px 5px 0;background:var(--settings-theme-bg-2)}.settings-theme-preview-tabs span{display:block;width:30px;height:11px;border:1px solid var(--settings-theme-line);border-bottom:0;border-radius:4px 4px 0 0;background:var(--settings-theme-bg)}.settings-theme-preview-tabs span:first-child{border-color:var(--settings-theme-accent)}.settings-theme-preview-terminal{display:grid;align-content:start;gap:5px;min-width:0;margin:6px;border-radius:4px;padding:7px 8px;background:var(--settings-theme-xterm-bg)}.settings-theme-preview-terminal span{display:block;height:5px;border-radius:999px;background:color-mix(in srgb,var(--settings-theme-xterm-fg) 68%,transparent)}.settings-theme-preview-terminal span:nth-child(2){width:72%;background:var(--settings-theme-xterm-selection)}.settings-theme-preview-terminal span:nth-child(3){width:44%;background:var(--settings-theme-accent)}.settings-theme-card-copy{display:grid;min-width:0;gap:2px}.settings-theme-card-copy strong,.settings-theme-card-copy small{min-width:0;overflow:hidden;text-overflow:ellipsis}.settings-theme-card-copy strong{color:var(--nt-fg);font-size:12px}.settings-theme-card-copy small{color:var(--nt-fg-3);font-size:10.5px;line-height:1.35}.settings-checkbox{margin-top:12px}.settings-subsection{margin-top:12px;border-top:1px solid var(--nt-line);padding-top:12px}.settings-stepper-row{display:grid;grid-template-columns:32px minmax(72px,1fr) 32px 60px;gap:8px;align-items:center;margin-top:10px}.settings-duration-row{grid-template-columns:minmax(72px,1fr) 60px}.settings-stepper-row button{height:28px;border-radius:5px}.settings-stepper-button{width:32px;font-family:var(--nt-font-mono);font-size:13px;line-height:1}.settings-reset-button{padding:0 9px;font-family:var(--nt-font-mono);font-size:10.5px;letter-spacing:0}.settings-shortcut-list{display:grid;gap:8px;margin:12px 0 0;padding:0;list-style:none}.settings-shortcut-list li{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;min-height:42px;border:1px solid var(--nt-line);border-radius:6px;padding:8px 10px}.settings-shortcut-label{display:block;color:var(--nt-fg);font-size:12px}.settings-shortcut-group{display:block;margin-top:2px;color:var(--nt-fg-3);font-size:10.5px}.settings-shortcut-actions{display:flex;align-items:center;gap:6px}.settings-shortcut-recorder{min-width:148px;height:28px;border:1px solid var(--nt-line-2);border-radius:5px;padding:0 9px;color:var(--nt-accent);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:11px;cursor:pointer}.settings-shortcut-recorder[data-recording=true]{border-color:var(--nt-accent);background:var(--nt-accent-soft);box-shadow:0 0 0 2px color-mix(in srgb,var(--nt-accent) 16%,transparent)}.settings-shortcut-reset{height:28px;padding:0 9px;border-radius:5px;font-family:var(--nt-font-mono);font-size:10.5px}.settings-stepper-row input{width:100%;height:28px;border:1px solid var(--nt-line-2);border-radius:5px;padding:0 8px;color:var(--nt-fg);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:12px}.settings-assets-header{display:flex;justify-content:space-between;gap:10px;margin-top:14px;color:var(--nt-fg-2);font-size:12px}.settings-assets-header span:last-child{color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px}.settings-asset-input{display:none}.settings-upload-button{width:100%;height:30px;margin-top:8px;border-radius:5px;font-size:11px}.settings-error{margin:8px 0 0;color:var(--nt-danger);font-size:11px}.settings-status{margin:8px 0 0;color:var(--nt-fg-2);font-size:11px}.settings-status-error{color:var(--nt-danger)}.settings-asset-list{display:grid;gap:8px;margin:10px 0 0;padding:0;list-style:none}.settings-asset-list li{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;min-height:58px;border:1px solid var(--nt-line);border-radius:6px;padding:6px;background:var(--nt-subtle-fill)}.settings-asset-list li[data-enabled=true]{border-color:color-mix(in srgb,var(--nt-accent) 24%,transparent);background:color-mix(in srgb,var(--nt-accent) 3.5%,transparent)}.settings-asset-choice{display:grid;grid-template-columns:16px 64px minmax(0,1fr);align-items:center;gap:8px;min-width:0;cursor:pointer}.settings-asset-choice input{width:14px;height:14px;margin:0;accent-color:var(--nt-accent)}.settings-asset-list video{width:64px;height:46px;object-fit:contain;pointer-events:none}.settings-asset-copy,.settings-asset-copy span,.settings-asset-copy small{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.settings-asset-copy{display:grid;gap:3px}.settings-asset-copy span{color:var(--nt-fg);font-size:11px}.settings-asset-copy small{color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10px}.settings-asset-delete{display:grid;width:24px;height:24px;place-items:center;border-radius:4px;padding:0;font-size:11px}.settings-save-assets-button{width:100%;height:30px;margin-top:8px;border-radius:5px;font-size:11px}.security-list{list-style:none;margin:10px 0 0;padding:0;display:flex;flex-direction:column;gap:6px}.security-list li{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;border:1px solid var(--nt-line);border-radius:6px}.server-row-main{display:grid;min-width:0;gap:7px}.security-item-label{display:flex;align-items:center;gap:8px;color:var(--nt-fg);font-size:13px}.security-item-meta{display:block;color:var(--nt-fg-3);font-size:11px;margin-top:2px}.security-badge{font-size:10px;padding:1px 6px;border-radius:999px;background:var(--nt-accent-soft);color:var(--nt-accent)}.security-remove{border:1px solid var(--nt-line);border-radius:5px;background:transparent;color:var(--nt-danger);font-size:11px;padding:4px 10px;cursor:pointer}.security-remove:hover{background:var(--nt-bg)}.security-add-form{display:flex;gap:6px;margin-top:10px;flex-wrap:wrap}.security-add-form input{flex:1;min-width:120px;height:30px;padding:0 8px;border:1px solid var(--nt-line);border-radius:5px;background:var(--nt-bg);color:var(--nt-fg);font-size:12px}.security-add-form button{height:30px;padding:0 14px}.update-actions{display:flex;gap:8px}.update-actions button{height:30px;padding:0 14px;border-radius:5px;font-family:var(--nt-font-mono);font-size:12px;cursor:pointer;transition:color .12s ease,background .12s ease,border-color .12s ease,box-shadow .12s ease}.update-actions button:not(.secondary-button){border:1px solid var(--nt-accent);color:var(--nt-accent);background:var(--nt-accent-soft)}.update-actions button:not(.secondary-button):hover:not(:disabled){color:var(--nt-on-accent);background:var(--nt-accent);box-shadow:0 0 16px var(--nt-accent-glow)}.server-reload-required{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 10px;border:1px solid color-mix(in srgb,var(--nt-accent) 38%,transparent);border-radius:6px;color:var(--nt-fg);background:var(--nt-accent-soft);font-size:12px}.server-reload-required button{flex:0 0 auto;height:28px;padding:0 12px;border:1px solid var(--nt-accent);border-radius:5px;color:var(--nt-accent);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:11px;cursor:pointer}.server-addon-panel{display:grid;gap:10px;margin-top:10px;padding:10px;border:1px solid var(--nt-line);border-radius:6px;background:var(--nt-bg-2)}.server-addon-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.server-addon-toggle{flex:0 0 auto;margin-top:1px}.server-addon-workers{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:7px}.server-addon-worker{min-width:0;padding:6px 8px;border:1px solid var(--nt-line);border-radius:5px;background:var(--nt-bg)}.server-addon-worker span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.security-list .secondary-button{height:28px;padding:0 12px;border-radius:5px;font-family:var(--nt-font-mono);font-size:11px}.server-row-actions{display:flex;align-items:center;gap:6px;flex:0 0 auto}.server-code-addon{display:grid;gap:8px;margin-top:10px;padding:10px;border:1px solid var(--nt-line);border-radius:6px;background:var(--nt-bg-2)}.server-code-addon-log{max-height:92px;margin:0;overflow:auto;padding:8px;border:1px solid var(--nt-line);border-radius:4px;color:var(--nt-fg-2);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:10.5px;line-height:1.4;white-space:pre-wrap}.server-code-addon-actions{display:flex;flex-wrap:wrap;gap:8px}.server-manual-update{display:grid;max-width:min(460px,100%);gap:6px;color:var(--nt-warning);font-size:11px;line-height:1.35}.server-manual-command{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px}.server-manual-command code{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:1px solid var(--nt-line);border-radius:5px;padding:5px 6px;color:var(--nt-fg);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:10px}.server-delete-button{height:28px;border:1px solid color-mix(in srgb,var(--nt-danger) 42%,transparent);border-radius:5px;padding:0 12px;color:var(--nt-danger);background:transparent;font-family:var(--nt-font-mono);font-size:11px;cursor:pointer}.server-delete-button:hover:not(:disabled){color:var(--nt-on-danger);background:var(--nt-danger)}.workspace-sidebar-tabs{display:grid;grid-template-columns:1fr 1fr;gap:4px;border-bottom:1px solid var(--nt-line);padding:0 12px 10px}.workspace-sidebar-tabs button{height:26px;border:1px solid var(--nt-line);border-radius:5px;color:var(--nt-fg-3);background:transparent;font-size:11px;cursor:pointer}.workspace-sidebar-tabs button:hover:not(:disabled){color:var(--nt-fg);background:var(--nt-bg-2)}.workspace-sidebar-tabs button[aria-selected=true]{border-color:color-mix(in srgb,var(--nt-accent) 55%,transparent);color:var(--nt-accent);background:var(--nt-accent-soft)}.workspace-sidebar-header{display:flex;align-items:center;justify-content:space-between;padding:4px 16px 8px;color:var(--nt-fg-3);font-size:10.5px;letter-spacing:.06em}.workspace-sidebar-header button{width:20px;height:20px;border-radius:4px;font-size:16px}.workspace-sidebar-header button:hover:not(:disabled),.tab-add-button:hover:not(:disabled){color:var(--nt-accent)}.workspace-list{display:flex;min-height:0;flex-direction:column;overflow:auto;overscroll-behavior:contain;padding-bottom:8px;scrollbar-width:none;-webkit-overflow-scrolling:touch}.workspace-list::-webkit-scrollbar{display:none}.workspace-entry{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:stretch;min-width:0}.workspace-select-button,.workspace-name-editor{display:grid;min-width:0;gap:2px;border:0;border-left:2px solid transparent;border-radius:0;padding:7px 16px 7px 14px;color:var(--nt-fg-2);background:transparent;text-align:left}.workspace-select-button{cursor:pointer}.workspace-select-button:hover:not(:disabled){color:var(--nt-fg);background:var(--nt-hover-fill)}.workspace-entry[data-active=true] .workspace-select-button,.workspace-entry[data-active=true] .workspace-name-editor{color:var(--nt-fg);border-left-color:var(--nt-accent);background:linear-gradient(90deg,var(--nt-accent-soft),transparent 60%)}.workspace-entry strong{max-width:100%;overflow:hidden;color:currentColor;font-size:12.5px;font-weight:500;text-overflow:ellipsis;white-space:nowrap}.workspace-entry[data-active=true] strong{font-weight:600}.workspace-entry-meta{display:flex;min-width:0;justify-content:space-between;gap:8px;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10.5px}.workspace-entry-cwd{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.workspace-name-editor{background:var(--nt-bg-2);border-left-color:var(--nt-accent)}.workspace-name-editor input{width:100%;border:1px solid var(--nt-accent);border-radius:3px;padding:2px 6px;color:var(--nt-fg);background:var(--nt-bg);box-shadow:0 0 8px var(--nt-accent-soft);font-size:12.5px;font-weight:600}.workspace-close-button{align-self:center;width:22px;height:22px;margin-right:10px;border-radius:3px;opacity:0;transition:opacity .12s ease,color .12s ease,background .12s ease}.workspace-entry:hover .workspace-close-button{opacity:1}.workspace-close-button:hover:not(:disabled),.terminal-pane-close:hover:not(:disabled){color:var(--nt-danger);background:var(--nt-danger-soft)}.terminal-shell[data-collapsed=true] .workspace-list{align-items:center}.terminal-shell[data-collapsed=true] .workspace-entry{display:block}.terminal-shell[data-collapsed=true] .workspace-select-button{justify-items:center;border-left:0;padding:10px 0}.workspace-initial{display:grid;width:28px;height:28px;place-items:center;border:1px solid var(--nt-line);border-radius:6px;color:var(--nt-fg-2);background:var(--nt-bg-2);font-family:var(--nt-font-mono);font-size:12px;font-weight:700}.workspace-entry[data-active=true] .workspace-initial{border-color:var(--nt-accent);color:var(--nt-accent);background:var(--nt-accent-soft);box-shadow:0 0 12px var(--nt-accent-soft)}.workspace-sidebar-footer{display:flex;align-items:center;justify-content:space-between;gap:8px;border-top:1px solid var(--nt-line);padding:12px 16px;color:var(--nt-fg-3);font-size:10.5px}.terminal-shell[data-collapsed=true] .workspace-sidebar-footer{justify-content:center;padding:12px 0}.workspace-sidebar-footer>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.terminal-shell[data-collapsed=true] .workspace-sidebar-footer>span{display:none}.workspace-footer-icon-button{position:relative;width:26px;height:26px;border-color:var(--nt-line);border-radius:5px;color:var(--nt-fg-2);background:var(--nt-subtle-fill)}.workspace-footer-icon-button:hover:not(:disabled){border-color:color-mix(in srgb,var(--nt-accent) 40%,transparent);color:var(--nt-accent)}.workspace-footer-icon{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.update-pulse-dot{position:absolute;top:4px;right:4px;width:7px;height:7px;border-radius:50%;background:var(--nt-accent);box-shadow:0 0 color-mix(in srgb,var(--nt-accent) 45%,transparent);animation:update-pulse 1.4s ease-out infinite;pointer-events:none}.settings-update-dot{top:7px;right:8px}@keyframes update-pulse{0%{box-shadow:0 0 color-mix(in srgb,var(--nt-accent) 45%,transparent)}70%{box-shadow:0 0 0 7px transparent}to{box-shadow:0 0 0 0 transparent}}@media(prefers-reduced-motion:reduce){.update-pulse-dot{animation:none}}.file-explorer{display:grid;grid-template-rows:auto auto minmax(0,1fr);min-width:0;min-height:0;color:var(--nt-fg-2)}.file-explorer-header{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;border-bottom:1px solid var(--nt-line);padding:8px 10px 8px 12px}.file-explorer-path{min-width:0;overflow:hidden;color:var(--nt-fg-2);font-family:var(--nt-font-mono);font-size:10.5px;text-overflow:ellipsis;white-space:nowrap}.file-explorer-toolbar,.file-detail-actions,.file-mode-actions,.file-save-row{display:flex;align-items:center;gap:6px}.file-explorer-toolbar button,.file-detail-actions button,.file-mode-actions button,.file-save-row button,.file-conflict button{min-height:24px;border:1px solid var(--nt-line-2);border-radius:5px;padding:0 8px;color:var(--nt-fg-2);background:transparent;font-size:11px;cursor:pointer}.file-explorer-toolbar button{width:24px;padding:0}.file-explorer-toolbar button:hover:not(:disabled),.file-detail-actions button:hover:not(:disabled),.file-mode-actions button:hover:not(:disabled),.file-save-row button:hover:not(:disabled),.file-conflict button:hover:not(:disabled){border-color:color-mix(in srgb,var(--nt-accent) 55%,transparent);color:var(--nt-fg);background:var(--nt-accent-soft)}.file-explorer-alert,.file-conflict{border-bottom:1px solid var(--nt-danger-line);padding:7px 12px;color:var(--nt-danger);background:var(--nt-danger-soft);font-size:11px}.file-conflict{display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid var(--nt-danger-line);border-radius:6px}.file-explorer-layout{display:grid;grid-template-rows:minmax(110px,.7fr) minmax(0,1fr);min-width:0;min-height:0}.file-tree{min-width:0;min-height:0;overflow:auto;overscroll-behavior:contain;border-bottom:1px solid var(--nt-line);padding:6px 0;scrollbar-width:none;-webkit-overflow-scrolling:touch}.file-tree::-webkit-scrollbar{display:none}.file-tree-children{display:grid}.file-entry-button{display:grid;grid-template-columns:13px minmax(0,1fr) auto;align-items:center;gap:6px;width:100%;min-width:0;border:0;border-left:2px solid transparent;padding:6px 12px 6px calc(10px + (var(--file-tree-depth, 0) * 14px));color:var(--nt-fg-2);background:transparent;text-align:left;cursor:pointer}.file-entry-button:hover:not(:disabled),.file-entry-button[data-active=true]{color:var(--nt-fg);background:var(--nt-hover-fill)}.file-entry-button[data-active=true]{border-left-color:var(--nt-accent)}.file-entry-button[data-kind=directory][data-expanded=true]{background:color-mix(in srgb,var(--nt-accent) 4.5%,transparent)}.file-entry-button:disabled{opacity:.44}.file-entry-disclosure{width:13px;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10px;text-align:center}.file-entry-name{min-width:0;overflow:hidden;font-size:12px;text-overflow:ellipsis;white-space:nowrap}.file-entry-button small{color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10px}.file-entry-button[data-kind=directory] .file-entry-name{color:var(--nt-accent)}.file-detail{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:8px;min-width:0;min-height:0;overflow:auto;overscroll-behavior:contain;padding:10px 12px 12px;scrollbar-width:none;-webkit-overflow-scrolling:touch}.file-detail::-webkit-scrollbar{display:none}.file-detail-header,.file-save-row{display:flex;min-width:0;align-items:center;justify-content:space-between;gap:8px}.file-detail-header strong{min-width:0;overflow:hidden;color:var(--nt-fg);font-size:12px;text-overflow:ellipsis;white-space:nowrap}.file-detail-actions{flex:0 0 auto}.file-detail-empty{display:grid;min-height:92px;place-items:center;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px}.file-preview-frame{min-height:180px;overflow:auto}.file-preview-frame img,.file-preview-frame iframe{width:100%;min-height:180px;border:1px solid var(--nt-line);border-radius:6px;background:var(--nt-bg-2)}.file-preview-frame img{height:auto;object-fit:contain}.file-markdown-panel,.file-editor-shell{display:grid;grid-template-rows:auto minmax(0,1fr) auto;gap:8px;min-width:0;min-height:0}.file-markdown-preview{min-height:180px;overflow:auto;overscroll-behavior:contain;border:1px solid var(--nt-line);border-radius:6px;padding:10px;color:var(--nt-fg);background:var(--nt-bg-2);font-size:12px;line-height:1.45;-webkit-overflow-scrolling:touch}.file-text-preview{min-height:180px;overflow:auto;overscroll-behavior:contain;border:1px solid var(--nt-line);border-radius:6px;padding:10px;color:var(--nt-fg);background:var(--nt-bg-2);font-family:var(--nt-font-mono);font-size:12px;line-height:1.45;white-space:pre-wrap;word-break:break-word;-webkit-overflow-scrolling:touch}.file-markdown-preview :first-child{margin-top:0}.file-markdown-preview :last-child{margin-bottom:0}.file-editor{width:100%;min-height:190px;border:1px solid var(--nt-line);border-radius:6px;padding:10px;color:var(--nt-fg);background:var(--nt-bg-2);font-family:var(--nt-font-mono);font-size:12px;line-height:1.45}.file-editor:focus{border-color:color-mix(in srgb,var(--nt-accent) 55%,transparent);box-shadow:0 0 0 2px var(--nt-accent-soft)}.file-save-row{color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10.5px}.terminal-main{position:relative;display:grid;grid-template-rows:40px minmax(0,1fr);min-width:0;min-height:0;background:var(--nt-bg)}.workspace-error{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:0;border-bottom:1px solid var(--nt-danger-line);padding:6px 12px;color:var(--nt-danger);background:var(--nt-danger-soft);font-size:12px}.workspace-error>span{min-width:0;overflow-wrap:anywhere}.workspace-error-actions{display:flex;flex:0 0 auto;gap:6px}.workspace-error-actions button{height:26px;border:1px solid var(--nt-danger-line);border-radius:5px;padding:0 8px;color:var(--nt-danger);background:var(--nt-danger-soft);font-family:var(--nt-font-mono);font-size:11px;cursor:pointer}.workspace-error-actions button:hover,.workspace-error-actions button:focus-visible{border-color:var(--nt-danger);outline:none}.terminal-tabs{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:stretch;min-width:0;border-bottom:1px solid var(--nt-line);padding:0 8px 0 4px;background:var(--nt-bg)}.mobile-menu-button{display:none;align-self:center;width:32px;height:32px;margin:0 2px;border-radius:5px}.mobile-tab-current-button,.mobile-tab-add-button{display:none}.hamburger-lines{display:grid;gap:3px}.hamburger-lines span{display:block;width:16px;height:1px;background:currentColor}.terminal-tab-list{display:flex;min-width:0;max-width:100%;align-items:stretch;overflow-x:auto;overscroll-behavior:contain;scrollbar-width:none;-webkit-overflow-scrolling:touch}.terminal-tab-list::-webkit-scrollbar{display:none}.terminal-tab-drop-slot{flex:0 0 6px;position:relative}.terminal-tab-drop-slot:before{content:"";position:absolute;top:8px;bottom:8px;left:50%;width:1px;background:var(--nt-line);pointer-events:none}.terminal-tab-drop-slot:first-child:before,.terminal-tab-drop-slot:last-child:before{display:none}.terminal-tab-drop-slot[data-over=true]:after{content:"";position:absolute;inset:4px 2px;background:var(--nt-accent);border-radius:2px;box-shadow:0 0 8px var(--nt-accent-glow);pointer-events:none}.terminal-tab{position:relative;display:flex;align-items:center;min-width:0;touch-action:none;user-select:none;-webkit-user-select:none}.terminal-tab[data-active=true]:after{position:absolute;right:12px;bottom:-1px;left:12px;height:2px;background:var(--nt-accent);box-shadow:0 0 10px var(--nt-accent-glow);content:""}.terminal-tab-status-dot{display:inline-block;flex:0 0 auto;width:7px;height:7px;border-radius:50%;margin:0 6px 0 10px;background:var(--nt-fg-3);vertical-align:middle}.terminal-tab-status-dot[data-activity=idle]{background:var(--nt-accent);box-shadow:0 0 4px var(--nt-accent-glow)}.terminal-tab-status-dot[data-activity=busy]{background:var(--nt-warning);box-shadow:0 0 6px var(--nt-warning-glow);animation:nterminal-tab-status-pulse 1.5s ease-in-out infinite}.terminal-tab-status-dot[data-activity=exited]{background:var(--nt-danger)}@keyframes nterminal-tab-status-pulse{0%,to{opacity:1}50%{opacity:.5}}.terminal-tab[data-unread=true]:before{position:absolute;top:4px;right:6px;width:6px;height:6px;border-radius:50%;background:var(--nt-accent);box-shadow:0 0 6px var(--nt-accent-glow);content:"";pointer-events:none}.terminal-tab-select,.terminal-tab-editor{display:flex;flex:1 1 auto;align-items:center;gap:8px;min-width:0;height:40px;border:0;padding:0 4px 0 14px;color:var(--nt-fg-2);background:transparent;font-size:12px}.terminal-tab-select{max-width:200px;cursor:pointer}.terminal-tab-select:hover:not(:disabled),.terminal-tab[data-active=true] .terminal-tab-select{color:var(--nt-fg)}.terminal-tab-select>span,.terminal-tab-editor input{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.terminal-tab small,.terminal-tab-editor small{flex:0 0 auto;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10px}.terminal-tab[data-active=true] small,.terminal-tab-editor small{color:var(--nt-accent)}.terminal-tab-editor{padding:0 12px}.terminal-tab-editor input{width:min(180px,100%);border:1px solid var(--nt-accent);border-radius:3px;padding:2px 6px;color:var(--nt-fg);background:var(--nt-bg-2);box-shadow:0 0 8px var(--nt-accent-soft);font-size:12px}.icon-button{width:18px;height:18px;margin-right:6px;border-radius:3px;opacity:0;transition:opacity .12s ease,color .12s ease,background .12s ease}.terminal-tab:hover .icon-button,.terminal-tab[data-active=true] .icon-button{opacity:1}.icon-button:hover:not(:disabled){color:var(--nt-fg)}.tab-add-button{flex:0 0 auto;width:30px;height:40px;font-size:18px;font-weight:500}.terminal-detached-pills{display:flex;flex-wrap:wrap;align-items:center;gap:4px;padding:0 6px;flex:0 1 auto;min-width:0}.terminal-detached-pill{display:inline-flex;align-items:stretch;height:24px;font-size:12px;background:var(--nt-bg-2);border:1px solid var(--nt-line);border-radius:999px;overflow:hidden;color:var(--nt-fg-2);transition:border-color .12s ease,color .12s ease}.terminal-detached-pill:hover{border-color:var(--nt-accent);color:var(--nt-fg)}.terminal-detached-pill-open{padding:0 10px;background:transparent;border:0;color:inherit;font:inherit;cursor:pointer;max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.terminal-detached-pill-open:focus-visible{outline:2px solid var(--nt-accent-soft);outline-offset:-1px}.terminal-detached-pill-delete{display:inline-flex;align-items:center;justify-content:center;width:0;padding:0;background:transparent;border:0;color:var(--nt-fg-3);font-size:14px;line-height:1;cursor:pointer;overflow:hidden;transition:width .14s ease,color .12s ease}.terminal-detached-pill:hover .terminal-detached-pill-delete,.terminal-detached-pill-delete:focus-visible{width:22px;color:var(--nt-danger)}.mobile-tab-sheet-backdrop{display:none}.mobile-tab-sheet{display:grid;grid-template-rows:auto minmax(0,1fr);width:min(520px,100%);height:min(70vh,560px);max-height:min(70vh,560px);min-height:0;overflow:hidden;border:1px solid var(--nt-line-2);border-radius:8px 8px 6px 6px;background:var(--nt-floating-bg-strong);box-shadow:0 -18px 44px var(--nt-shadow-strong)}.mobile-tab-sheet header{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;border-bottom:1px solid var(--nt-line);padding:10px 10px 9px 12px}.mobile-tab-sheet header>div:first-child{display:grid;min-width:0;gap:2px}.mobile-tab-sheet header strong{color:var(--nt-fg);font-size:12px}.mobile-tab-sheet header small{color:var(--nt-fg-3);font-size:10.5px}.mobile-tab-sheet-header-actions{display:flex;gap:6px}.mobile-tab-sheet-header-actions button,.mobile-tab-sheet-actions button{display:grid;min-width:28px;height:28px;place-items:center;border:1px solid var(--nt-line);border-radius:5px;padding:0 8px;color:var(--nt-fg-2);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:11px}.mobile-tab-sheet-header-actions button:hover,.mobile-tab-sheet-actions button:hover,.mobile-tab-sheet-header-actions button:focus-visible,.mobile-tab-sheet-actions button:focus-visible{color:var(--nt-accent);border-color:color-mix(in srgb,var(--nt-accent) 55%,var(--nt-line));outline:none}.mobile-tab-sheet-list{display:grid;min-height:0;gap:6px;overflow:auto;padding:8px;-webkit-overflow-scrolling:touch}.mobile-tab-sheet-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:stretch;gap:6px}.mobile-tab-sheet-row[data-active=true] .mobile-tab-sheet-select,.mobile-tab-sheet-row[data-active=true] .mobile-tab-sheet-editor{border-color:color-mix(in srgb,var(--nt-accent) 62%,var(--nt-line));background:color-mix(in srgb,var(--nt-accent) 11%,var(--nt-bg))}.mobile-tab-sheet-row[data-unread=true] .mobile-tab-sheet-select:after{position:absolute;top:7px;right:7px;width:6px;height:6px;border-radius:50%;background:var(--nt-accent);box-shadow:0 0 6px var(--nt-accent-glow);content:""}.mobile-tab-sheet-select,.mobile-tab-sheet-editor{position:relative;display:grid;grid-template-columns:26px minmax(0,1fr) auto;align-items:center;gap:9px;min-height:52px;min-width:0;border:1px solid var(--nt-line);border-radius:6px;padding:8px;color:var(--nt-fg-2);background:var(--nt-bg);text-align:left}.mobile-tab-sheet-select:hover,.mobile-tab-sheet-select:focus-visible{border-color:color-mix(in srgb,var(--nt-accent) 45%,var(--nt-line));outline:none}.mobile-tab-sheet-editor{grid-template-columns:minmax(0,1fr)}.mobile-tab-sheet-editor input{min-width:0;width:100%;height:34px;border:1px solid var(--nt-accent);border-radius:4px;padding:0 9px;color:var(--nt-fg);background:var(--nt-bg-2);font-family:var(--nt-font-mono);font-size:16px;outline:none}.mobile-tab-sheet-index{display:grid;width:24px;height:24px;place-items:center;border-radius:50%;color:var(--nt-bg);background:var(--nt-fg-3);font-size:11px;font-weight:700}.mobile-tab-sheet-row[data-active=true] .mobile-tab-sheet-index{background:var(--nt-accent)}.mobile-tab-sheet-copy{display:grid;min-width:0;gap:3px}.mobile-tab-sheet-copy strong,.mobile-tab-sheet-copy small{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mobile-tab-sheet-copy strong{color:var(--nt-fg);font-size:12px}.mobile-tab-sheet-copy small,.mobile-tab-sheet-type{color:var(--nt-fg-3);font-size:10.5px}.mobile-tab-sheet-meta{display:inline-flex;align-items:center;gap:5px;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10.5px}.mobile-tab-sheet-meta .terminal-tab-status-dot{margin:0}.mobile-tab-sheet-actions{display:flex;align-items:stretch;gap:5px}.mobile-tab-sheet-close{color:var(--nt-danger)!important}.mobile-tab-sheet-detached{display:grid;gap:6px;margin-top:4px;border-top:1px solid var(--nt-line);padding-top:8px}.mobile-tab-sheet-detached>span{color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10.5px;text-transform:uppercase}.terminal-delete-dialog{max-width:420px;gap:16px}.terminal-delete-dialog-body{display:grid;gap:8px}.terminal-delete-dialog-body p{margin:0;color:var(--nt-fg);font-size:13px}.terminal-delete-dialog-body span{min-width:0;overflow:hidden;padding:9px 10px;border:1px solid var(--nt-line);border-radius:6px;color:var(--nt-fg);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:12px;text-overflow:ellipsis;white-space:nowrap}.terminal-delete-dialog-body small{color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px}.terminal-delete-warning{border:1px solid var(--nt-warning-line);border-radius:6px;padding:8px 10px;color:var(--nt-warning);background:var(--nt-warning-soft);font-size:12px;line-height:1.35}.terminal-delete-dialog-actions{display:flex;justify-content:flex-end;gap:8px}.terminal-delete-dialog-actions button{height:32px;min-width:82px;border-radius:5px;padding:0 14px;font-family:var(--nt-font-mono);font-size:12px;cursor:pointer}.terminal-delete-confirm{border:1px solid color-mix(in srgb,var(--nt-danger) 55%,transparent);color:var(--nt-danger);background:var(--nt-danger-soft)}.terminal-delete-confirm:hover:not(:disabled){color:var(--nt-on-danger);background:var(--nt-danger)}.transcript-overlay{position:absolute;inset:0;padding:0}.transcript-dialog{width:min(90%,calc(100% - 24px));max-width:none;height:min(90%,calc(100% - 24px));max-height:none;min-height:0;gap:8px;overflow:hidden}.transcript-dialog .security-panel-header,.transcript-dialog-controls{flex:0 0 auto}.transcript-dialog-title{display:grid;min-width:0;gap:2px}.transcript-dialog-title h2{margin:0}.transcript-dialog-title span{min-width:0;overflow:hidden;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10.5px;text-overflow:ellipsis;white-space:nowrap}.transcript-dialog-controls{display:flex;align-items:center;gap:12px;justify-content:flex-end;min-width:0}.transcript-tool-toggle{width:auto;margin-right:auto;color:var(--nt-fg-2);font-family:var(--nt-font-mono);font-size:11px}.transcript-result-count{margin-left:0;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px;white-space:nowrap}.transcript-search{display:flex;flex:1 1 220px;align-items:center;gap:6px;min-width:min(220px,100%);color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px}.transcript-search input{width:100%;min-width:0;border:1px solid var(--nt-line);border-radius:4px;padding:5px 7px;color:var(--nt-fg);background:color-mix(in srgb,var(--nt-bg-2) 72%,transparent);font-family:var(--nt-font-mono);font-size:11px}.transcript-search-actions{display:flex;flex:0 0 auto;gap:4px}.transcript-prompts-toggle,.transcript-search-actions button{height:28px;min-width:44px;border:1px solid var(--nt-line);border-radius:4px;padding:0 8px;color:var(--nt-fg-2);background:color-mix(in srgb,var(--nt-bg-2) 72%,transparent);font-family:var(--nt-font-mono);font-size:10.5px;cursor:pointer}.transcript-prompts-toggle{flex:0 0 auto}.transcript-prompts-toggle[aria-pressed=true]{color:var(--nt-transcript-user);border-color:color-mix(in srgb,var(--nt-transcript-user) 55%,var(--nt-line));background:color-mix(in srgb,var(--nt-transcript-user) 12%,transparent)}.transcript-prompts-toggle:hover:not(:disabled),.transcript-search-actions button:hover:not(:disabled){color:var(--nt-fg);border-color:color-mix(in srgb,var(--nt-accent) 55%,var(--nt-line))}.transcript-prompt-index{display:grid;flex:0 0 auto;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:6px;max-height:min(180px,28vh);overflow:auto;border:1px solid var(--nt-line);border-radius:6px;padding:8px;background:color-mix(in srgb,var(--nt-bg-2) 78%,transparent);-webkit-overflow-scrolling:touch}.transcript-prompt-index-item{display:grid;gap:3px;min-width:0;border:1px solid transparent;border-radius:5px;padding:7px 8px;color:var(--nt-fg-2);background:transparent;font-family:var(--nt-font-mono);text-align:left;cursor:pointer}.transcript-prompt-index-item:hover,.transcript-prompt-index-item-active{border-color:color-mix(in srgb,var(--nt-transcript-user) 45%,var(--nt-line));background:color-mix(in srgb,var(--nt-transcript-user) 10%,transparent)}.transcript-prompt-index-item span,.transcript-prompt-index-item strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.transcript-prompt-index-item span{color:var(--nt-transcript-user);font-size:10px;font-weight:650}.transcript-prompt-index-item strong{color:var(--nt-fg);font-size:11px;font-weight:500}.transcript-prompt-index-empty{color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px}.transcript-dialog-scroll{min-height:0;flex:1 1 auto;overflow:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;border:1px solid var(--nt-line);border-radius:6px;background:var(--nt-bg)}.transcript-output{margin:0;min-height:100%;padding:14px 16px 18px;color:var(--nt-fg);font-family:var(--nt-font-mono);font-size:12px;line-height:1.42;overflow-wrap:anywhere}.transcript-formatted-output{background:linear-gradient(90deg,color-mix(in srgb,var(--nt-accent) 5%,transparent),transparent 38%),var(--nt-bg)}.transcript-entry{scroll-margin:72px;padding:2px 4px 10px 8px;border-left:2px solid transparent}.transcript-entry+.transcript-entry{margin-top:10px}.transcript-entry-search-active{border-left-color:var(--nt-transcript-search);background:color-mix(in srgb,var(--nt-transcript-search) 8%,transparent)}.transcript-entry-prompt-active{border-left-color:var(--nt-transcript-user);background:color-mix(in srgb,var(--nt-transcript-user) 11%,transparent)}.transcript-entry-header{margin-bottom:5px;color:var(--nt-fg-3);font-size:11px;font-weight:700}.transcript-entry-user .transcript-entry-header{display:inline-flex;align-items:center;min-height:22px;border:1px solid color-mix(in srgb,var(--nt-transcript-user) 44%,transparent);border-radius:999px;padding:2px 8px;color:var(--nt-transcript-user);background:color-mix(in srgb,var(--nt-transcript-user) 11%,transparent)}.transcript-entry-user{border-left-color:color-mix(in srgb,var(--nt-transcript-user) 70%,transparent);border-radius:7px;padding:9px 11px 12px 12px;background:linear-gradient(90deg,color-mix(in srgb,var(--nt-transcript-user) 11%,transparent),transparent 68%),color-mix(in srgb,var(--nt-transcript-user) 5%,transparent)}.transcript-entry-user+.transcript-entry{margin-top:12px}.transcript-entry-assistant .transcript-entry-header{color:var(--nt-transcript-assistant)}.transcript-entry-system .transcript-entry-header{color:var(--nt-fg-3)}.transcript-entry-tool .transcript-entry-header{color:var(--nt-transcript-tool)}.transcript-entry-body{color:var(--nt-fg)}.transcript-entry-body>:first-child{margin-top:0}.transcript-entry-body>:last-child{margin-bottom:0}.transcript-entry-body p,.transcript-entry-body ul,.transcript-entry-body ol,.transcript-entry-body blockquote,.transcript-entry-body table,.transcript-entry-body pre{margin:0 0 8px}.transcript-entry-body ul,.transcript-entry-body ol{padding-left:22px}.transcript-entry-body li+li{margin-top:2px}.transcript-entry-body a{color:var(--nt-transcript-command);text-decoration:none}.transcript-entry-body a:hover{text-decoration:underline}.transcript-entry-body blockquote{padding:2px 0 2px 12px;border-left:2px solid var(--nt-line-2);color:var(--nt-fg-2)}.transcript-entry-body h1,.transcript-entry-body h2,.transcript-entry-body h3,.transcript-entry-body h4,.transcript-entry-body h5,.transcript-entry-body h6{margin:10px 0 6px;color:var(--nt-fg);font-size:12.5px;line-height:1.35}.transcript-entry-body code{border:1px solid color-mix(in srgb,var(--nt-line) 72%,transparent);border-radius:4px;padding:1px 4px;background:color-mix(in srgb,var(--nt-bg-2) 78%,transparent);color:var(--nt-transcript-code);font-family:var(--nt-font-mono);font-size:.95em}.transcript-markdown-code,.transcript-entry-pre{margin:0 0 8px;border:1px solid var(--nt-line);border-radius:5px;padding:9px 10px;overflow-x:auto;background:color-mix(in srgb,var(--nt-bg-2) 62%,transparent);color:var(--nt-fg);font-family:var(--nt-font-mono);font-size:11.5px;line-height:1.48;white-space:pre-wrap}.transcript-markdown-code code{border:0;border-radius:0;padding:0;background:transparent;color:inherit;font-size:inherit}.transcript-entry-body table{width:100%;border-collapse:collapse;font-size:11.5px}.transcript-entry-body th,.transcript-entry-body td{border:1px solid var(--nt-line);padding:5px 7px;text-align:left;vertical-align:top}.transcript-entry-body th{color:var(--nt-accent);background:color-mix(in srgb,var(--nt-bg-2) 72%,transparent)}.transcript-line{display:block;min-height:1.42em;padding:0 2px}.transcript-line-user{color:var(--nt-transcript-user);font-weight:700}.transcript-line-assistant{color:var(--nt-transcript-assistant);font-weight:700}.transcript-line-system,.transcript-line-dim{color:var(--nt-fg-4)}.transcript-line-tool,.transcript-line-inline-tool{color:var(--nt-transcript-tool)}.transcript-line-command{color:var(--nt-transcript-command)}.transcript-line-success{color:var(--nt-ok)}.transcript-line-error{color:var(--nt-danger)}.transcript-search-hit{border-radius:2px;padding:0 1px;color:var(--nt-transcript-on-search);background:var(--nt-transcript-search)}.transcript-dialog-status,.transcript-dialog-hint,.transcript-dialog-error{padding:10px 12px;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px}.transcript-dialog-hint{border-bottom:1px solid var(--nt-line);color:var(--nt-fg-4);text-align:center}.transcript-dialog-error{color:var(--nt-danger)}.terminal-pane-actions{display:flex;align-items:center;gap:2px;padding:0 4px}.pane-action-button{width:28px;height:28px;align-self:center;border-radius:5px}.pane-action-button:hover:not(:disabled){border-color:var(--nt-line)}.split-icon{position:relative;display:block;width:14px;height:14px;border:1px solid currentColor;color:currentColor}.split-icon:before{position:absolute;background:currentColor;content:""}.split-icon-right:before{top:0;bottom:0;left:6px;width:1px}.split-icon-down:before{top:6px;right:0;left:0;height:1px}.workspace-body{position:relative;min-width:0;min-height:0;overflow:hidden;background:var(--nt-bg)}.mobile-pane-switcher{display:none}.mobile-focused-split,.mobile-focused-pane{width:100%;height:100%;min-width:0;min-height:0}.mobile-focused-pane[data-active=false]{display:none}.workspace-server-surface,.workspace-tab-surface{position:absolute;inset:0;min-width:0;min-height:0}.workspace-server-surface[data-active=false],.workspace-tab-surface[data-active=false]{display:none}.workspace-placeholder,.empty-workspace,.missing-pane{display:grid;height:100%;min-height:220px;place-content:center;gap:10px;color:var(--nt-fg-3);font-family:var(--nt-font-mono)}.workspace-placeholder{display:flex;align-items:center;justify-content:center}.workspace-placeholder:before{display:inline-block;color:var(--nt-accent);animation:nt-blink 1.05s steps(2,end) infinite;content:"●"}@keyframes nt-blink{50%{opacity:0}}.empty-workspace{color:var(--nt-fg-2);text-align:center}.empty-workspace button{width:max-content;height:30px;justify-self:center;border-radius:5px;padding:0 12px;color:var(--nt-fg-2)}.split-pane{display:grid;width:100%;height:100%;min-width:0;min-height:0}.split-cell{min-width:0;min-height:0;overflow:hidden}.pane-drop-host{position:relative;width:100%;height:100%;min-width:0;min-height:0}.pane-drop-zone{position:absolute;z-index:5;pointer-events:auto;background:transparent;transition:background 80ms ease}.pane-drop-zone--left{top:0;bottom:0;left:0;width:42%}.pane-drop-zone--right{top:0;bottom:0;right:0;width:42%}.pane-drop-zone--top{top:0;left:42%;right:42%;height:42%}.pane-drop-zone--bottom{bottom:0;left:42%;right:42%;height:42%}.pane-drop-zone[data-over=true]{background:var(--nt-accent-soft);box-shadow:inset 0 0 0 2px var(--nt-accent),0 0 18px var(--nt-accent-glow)}.split-divider{position:relative;background:var(--nt-line);touch-action:none;transition:background .15s ease,box-shadow .15s ease}.split-divider[data-direction=vertical]{cursor:col-resize}.split-divider[data-direction=horizontal]{cursor:row-resize}.split-divider:before{position:absolute;inset:0;content:""}.split-divider[data-direction=vertical]:before{right:-4px;left:-4px}.split-divider[data-direction=horizontal]:before{top:-4px;bottom:-4px}.split-divider:hover,.split-divider.is-dragging{z-index:2;background:var(--nt-accent);box-shadow:0 0 10px var(--nt-accent-glow)}.split-divider-handle{position:absolute;top:50%;left:50%;width:28px;height:4px;border-radius:2px;background:transparent;transform:translate(-50%,-50%)}.split-divider[data-direction=horizontal] .split-divider-handle{width:4px;height:28px}.split-divider:hover .split-divider-handle,.split-divider.is-dragging .split-divider-handle{background:var(--nt-accent)}.terminal-pane{position:relative;display:grid;grid-template-rows:26px minmax(0,1fr) 22px;--compose-drawer-bottom-offset: 0px;--compose-drawer-closed-height: 22px;--compose-drawer-panel-height: 0px;--terminal-compose-slide-distance: 0px;--terminal-keyboard-slide-distance: 0px;--terminal-output-slide-distance: max(var(--terminal-compose-slide-distance), var(--terminal-keyboard-slide-distance));--terminal-output-slide-y: 0px;width:100%;height:100%;min-width:0;min-height:0;overflow:hidden;background:var(--nt-bg);cursor:text}.terminal-pane[data-compose-open=true]{--terminal-compose-slide-distance: max( 0px, calc(var(--compose-drawer-panel-height) + var(--compose-drawer-bottom-offset) - var(--compose-drawer-closed-height)) );--terminal-output-slide-y: calc(-1 * var(--terminal-output-slide-distance))}.compose-drawer{position:relative;grid-row:3;grid-column:1 / -1;z-index:8;font-family:var(--nt-font-mono);pointer-events:none;min-width:0;max-width:100%;overflow:visible}.compose-drawer[data-open=true]{position:absolute;right:0;bottom:0;left:0;z-index:12;height:0}.compose-drawer-handle{position:relative;display:flex;align-items:center;gap:6px;width:100%;height:22px;border:0;border-radius:0;padding:0 10px;font-size:10.5px;letter-spacing:.06em;text-transform:lowercase;color:var(--nt-fg-3);background:var(--nt-bg-2);box-shadow:none;cursor:pointer;pointer-events:auto;transition:color .12s ease,background .12s ease,border-color .12s ease,opacity .14s ease,transform .18s ease}.compose-drawer-handle:hover{color:var(--nt-accent);background:var(--nt-bg)}.compose-drawer[data-open=true] .compose-drawer-handle{display:none}.compose-drawer-handle-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--nt-accent);margin-left:2px}.compose-drawer-panel{position:absolute;right:0;bottom:0;left:0;display:flex;flex-direction:column;max-height:0;padding:0 6px;gap:4px;border-top:0 solid var(--nt-line);background:var(--nt-bg-2);box-shadow:0 -14px 34px var(--nt-shadow);min-width:0;max-width:100%;overflow:auto;overscroll-behavior:contain;opacity:0;pointer-events:none;transition:max-height .18s ease,opacity .14s ease,padding .18s ease,border-width .18s ease}.compose-drawer[data-open=true] .compose-drawer-panel{max-height:min(220px,32vh);padding:4px 6px 6px;border-top-width:1px;opacity:1;pointer-events:auto}.compose-drawer-header{display:flex;flex:0 0 auto;align-items:center;gap:8px;width:100%;height:20px;border:0;padding:0 2px;font-size:10.5px;color:var(--nt-fg-3);background:transparent;cursor:pointer}.compose-drawer-header:hover{color:var(--nt-accent)}.compose-drawer-title{letter-spacing:.06em;text-transform:lowercase;color:var(--nt-fg-2)}.compose-drawer-hint{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--nt-fg-3);font-size:10px}.compose-drawer-close{width:16px;text-align:center;font-size:14px;color:var(--nt-fg-3)}.compose-drawer-input{width:100%;min-width:0;max-width:100%;flex:1 1 38px;min-height:0;max-height:180px;resize:vertical;padding:4px 8px;border:1px solid var(--nt-line);border-radius:4px;background:var(--nt-bg);color:var(--nt-fg);font-family:var(--nt-font-mono);font-size:12.5px;line-height:1.35;outline:none;transition:border-color .12s ease,box-shadow .12s ease}.compose-drawer-input:focus{border-color:var(--nt-accent);box-shadow:0 0 0 2px var(--nt-accent-soft)}.compose-drawer-actions{display:flex;flex:0 0 auto;justify-content:flex-end;gap:4px}.compose-drawer-clear,.compose-drawer-queue,.compose-drawer-send{height:22px;padding:0 10px;border-radius:4px;font-family:var(--nt-font-mono);font-size:10.5px;letter-spacing:.04em;cursor:pointer;transition:color .12s ease,background .12s ease,border-color .12s ease}.compose-drawer-clear{border:1px solid var(--nt-line);color:var(--nt-fg-3);background:transparent}.compose-drawer-clear:hover:not(:disabled){color:var(--nt-fg);background:var(--nt-bg)}.compose-drawer-queue{border:1px solid var(--nt-line);color:var(--nt-fg-2);background:var(--nt-bg-2)}.compose-drawer-queue:hover:not(:disabled){color:var(--nt-fg);border-color:var(--nt-accent);background:var(--nt-accent-soft)}.compose-drawer-send{border:1px solid var(--nt-accent);color:var(--nt-accent);background:var(--nt-accent-soft)}.compose-drawer-send:hover:not(:disabled){color:var(--nt-on-accent);background:var(--nt-accent);box-shadow:0 0 12px var(--nt-accent-glow)}.compose-drawer-clear:disabled,.compose-drawer-queue:disabled,.compose-drawer-send:disabled{cursor:not-allowed;opacity:.4}.terminal-pane[data-active=true]{background:linear-gradient(180deg,var(--nt-accent-soft),transparent 22%)}.terminal-pane[data-active=true]:before{position:absolute;top:0;bottom:0;left:0;z-index:1;width:2px;background:var(--nt-accent);box-shadow:0 0 14px var(--nt-accent-glow);content:"";pointer-events:none}.terminal-pane-header{position:relative;z-index:3;display:flex;align-items:center;gap:6px;min-width:0;border-bottom:1px solid var(--nt-line);padding:0 12px;color:var(--nt-fg-3);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:10.5px;touch-action:none;user-select:none;-webkit-user-select:none}.terminal-pane-dot{flex:0 0 auto;width:5px;height:5px;border-radius:50%;background:var(--nt-fg-3)}.terminal-pane[data-active=true] .terminal-pane-dot{background:var(--nt-accent);box-shadow:0 0 8px var(--nt-accent)}.terminal-pane-cwd{min-width:0;overflow:hidden;color:var(--nt-fg-2);text-overflow:ellipsis;white-space:nowrap}.terminal-pane-spacer{flex:1 1 auto}.terminal-pane-state{flex:0 0 auto;font-weight:500}.terminal-pane-transcript{appearance:none;flex:0 0 auto;display:inline-flex;align-items:center;gap:5px;padding:1px 5px;border:1px solid color-mix(in srgb,var(--nt-accent) 45%,transparent);border-radius:3px;color:var(--nt-accent);background:color-mix(in srgb,var(--nt-accent) 10%,transparent);font-family:var(--nt-font-mono);font-size:9px;font-weight:700;line-height:1.35;cursor:pointer}.terminal-pane-transcript kbd{padding:0 3px;border-radius:3px;color:var(--nt-fg-2);background:color-mix(in srgb,var(--nt-bg) 72%,transparent);font:inherit;font-size:8px;font-weight:700}.terminal-pane-transcript:hover{border-color:var(--nt-accent);background:color-mix(in srgb,var(--nt-accent) 18%,transparent)}.terminal-pane-transcript:focus-visible{outline:2px solid var(--nt-accent-soft);outline-offset:1px}.terminal-pane-state-exited{color:var(--nt-fg-3)}.terminal-pane-cache{appearance:none;flex:0 0 auto;display:inline-flex;align-items:center;gap:4px;min-width:38px;height:18px;border:1px solid var(--nt-line);border-radius:3px;padding:0 5px;color:var(--nt-fg-3);background:transparent;font-family:var(--nt-font-mono);font-size:9px;font-weight:700;line-height:1;cursor:pointer}.terminal-pane-cache svg{flex:0 0 auto}.terminal-pane-cache[data-state=warning]{border-color:color-mix(in srgb,var(--nt-warn) 60%,transparent);color:var(--nt-warn)}.terminal-pane-cache[data-state=critical],.terminal-pane-cache[data-state=expired]{border-color:color-mix(in srgb,var(--nt-danger) 68%,transparent);color:var(--nt-danger)}.terminal-pane-cache[data-enabled=true]{background:color-mix(in srgb,var(--nt-accent) 14%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--nt-accent) 35%,transparent)}.terminal-pane-cache:hover{color:var(--nt-fg);background:var(--nt-hover-fill)}.terminal-pane-scrollback,.terminal-pane-code,.terminal-pane-interrupt,.terminal-pane-reload{box-sizing:border-box;flex:0 0 auto;width:18px;height:18px;padding:0;border:1px solid var(--nt-line);border-radius:3px;color:var(--nt-fg-3);background:transparent;font-size:12px;line-height:1;cursor:pointer}.terminal-pane-code{display:inline-grid;place-items:center}.terminal-pane-code img{display:block;width:13px;height:13px;object-fit:contain;pointer-events:none}.terminal-pane-code[data-state=missing]{opacity:.52;border-style:dashed}.terminal-pane-code[data-state=unknown]{opacity:.72}.terminal-pane-code[data-busy=true] img{animation:terminal-history-spin .7s linear infinite}.terminal-pane-code:disabled{cursor:not-allowed;opacity:.4}.terminal-pane-scrollback{display:inline-flex;align-items:center;justify-content:center;gap:4px;width:auto;min-width:18px;padding:0 4px}.terminal-pane-interrupt{font-family:var(--nt-font-mono);font-size:9px;font-weight:700}.terminal-pane-scrollback[data-active=true]{border-color:var(--nt-accent);color:var(--nt-on-accent);background:var(--nt-accent)}.terminal-pane-scrollback svg{display:block;flex:0 0 auto}.terminal-pane-scrollback kbd{color:inherit;font:inherit;font-size:8px;font-weight:700;line-height:1}.terminal-pane-scrollback:hover,.terminal-pane-code:hover:not(:disabled),.terminal-pane-interrupt:hover,.terminal-pane-reload:hover{border-color:var(--nt-accent);color:var(--nt-accent);background:color-mix(in srgb,var(--nt-accent) 10%,transparent)}.terminal-pane-scrollback[data-active=true]:hover{border-color:var(--nt-accent);color:var(--nt-on-accent);background:var(--nt-accent)}.terminal-pane-scrollback:focus-visible,.terminal-pane-code:focus-visible,.terminal-pane-interrupt:focus-visible,.terminal-pane-reload:focus-visible{outline:2px solid var(--nt-accent-soft);outline-offset:1px}.code-server-dialog-backdrop{z-index:80}.code-server-dialog{display:flex;flex-direction:column;width:min(620px,calc(100vw - 32px));max-width:620px;max-height:min(680px,calc(var(--nterminal-viewport-height) - 32px));min-height:0;padding:0;gap:0;overflow:hidden;border-radius:8px;box-shadow:0 24px 70px var(--nt-shadow-strong),0 0 0 1px var(--nt-subtle-fill)}.code-server-dialog .security-panel-header{flex:0 0 auto;padding:16px 18px;border-bottom:1px solid var(--nt-line)}.code-server-dialog .security-panel-header>div{display:grid;min-width:0;gap:3px}.code-server-dialog .security-panel-header p{margin:0;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px}.code-server-dialog-scroll{flex:1 1 auto;min-height:0;overflow:auto;overscroll-behavior:contain;padding:16px 18px;-webkit-overflow-scrolling:touch}.code-server-dialog-body{display:grid;gap:8px;padding:0}.code-server-dialog-body p,.code-server-dialog-muted{margin:0;color:var(--nt-fg-2);font-size:12px;line-height:1.45}.code-server-dialog code{color:var(--nt-fg);border:1px solid var(--nt-line);border-radius:4px;padding:1px 4px;background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:.92em}.code-server-dialog-error{margin:14px 0 0;border:1px solid var(--nt-danger-line);border-radius:6px;padding:8px 10px;color:var(--nt-danger);background:var(--nt-danger-soft);font-size:12px;line-height:1.35}.code-server-progress{overflow:hidden;margin:14px 0 0;border:1px solid var(--nt-line);border-radius:6px;background:var(--nt-bg-2)}.code-server-progress-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:9px 12px;border-bottom:1px solid var(--nt-line);color:var(--nt-fg-2);font-size:12px;text-transform:capitalize}.code-server-progress[data-status=failed] .code-server-progress-heading strong{color:var(--nt-danger)}.code-server-progress[data-status=succeeded] .code-server-progress-heading strong{color:var(--nt-ok)}.code-server-progress pre{max-height:min(220px,34vh);margin:0;overflow:auto;padding:12px;color:var(--nt-fg-2);font-family:var(--nt-font-mono);font-size:11px;line-height:1.45;white-space:pre-wrap}.code-server-dialog-actions{display:flex;flex:0 0 auto;align-items:center;justify-content:flex-end;gap:8px;border-top:1px solid var(--nt-line);padding:16px 18px 18px}.code-server-dialog-actions button{min-width:92px;height:32px;border-radius:5px;padding:0 13px;border:1px solid var(--nt-accent);color:var(--nt-on-accent);background:var(--nt-accent);font-family:var(--nt-font-mono);font-size:12px;cursor:pointer}.code-server-dialog-actions .secondary-button{color:var(--nt-fg-2);border-color:var(--nt-line-2);background:transparent}.code-server-dialog-actions button:hover:not(:disabled){box-shadow:0 0 14px var(--nt-accent-glow)}.code-server-dialog-actions .secondary-button:hover:not(:disabled){color:var(--nt-accent);border-color:color-mix(in srgb,var(--nt-accent) 50%,var(--nt-line-2));background:var(--nt-accent-soft);box-shadow:none}@media(max-width:640px){.code-server-dialog{width:calc(100vw - 20px);max-height:calc(var(--nterminal-viewport-height) - 20px)}.code-server-dialog .security-panel-header,.code-server-dialog-scroll,.code-server-dialog-actions{padding-left:12px;padding-right:12px}.code-server-dialog-actions{flex-wrap:wrap}.code-server-dialog-actions button{flex:1 1 120px}}.code-server-notice{position:absolute;top:34px;right:10px;z-index:16;max-width:min(360px,calc(100% - 20px));border:1px solid color-mix(in srgb,var(--nt-accent) 45%,var(--nt-line));border-radius:6px;padding:8px 10px;color:var(--nt-fg);background:var(--nt-floating-bg-strong);box-shadow:0 12px 34px var(--nt-shadow-strong);font-family:var(--nt-font-mono);font-size:11px;line-height:1.35;pointer-events:none}.code-server-notice[data-tone=warning]{border-color:color-mix(in srgb,var(--nt-warning) 58%,var(--nt-line));color:var(--nt-warning)}.terminal-pane-close{width:18px;height:18px;margin-left:4px;border-radius:3px;opacity:0;transition:opacity .12s ease,color .12s ease,background .12s ease}.terminal-pane:hover .terminal-pane-close,.terminal-pane[data-active=true] .terminal-pane-close,.editor-pane:hover .terminal-pane-close{opacity:1}.editor-pane{display:grid;grid-template-rows:28px auto auto minmax(0,1fr);width:100%;height:100%;min-width:0;min-height:0;overflow:hidden;background:var(--nt-bg)}.editor-pane-header{display:flex;align-items:center;gap:8px;min-width:0;border-bottom:1px solid var(--nt-line);padding:0 10px;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10.5px}.editor-pane-header strong{min-width:0;overflow:hidden;color:var(--nt-fg);font-size:11px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.editor-pane-header button:not(.terminal-pane-close){min-height:20px;border:1px solid var(--nt-line-2);border-radius:4px;padding:0 8px;color:var(--nt-fg-2);background:transparent;font-size:10.5px}.editor-pane-header button:not(.terminal-pane-close):hover:not(:disabled){border-color:color-mix(in srgb,var(--nt-accent) 55%,transparent);color:var(--nt-fg);background:var(--nt-accent-soft)}.editor-pane-alert{border-bottom:1px solid var(--nt-danger-line);padding:7px 10px;color:var(--nt-danger);background:var(--nt-danger-soft);font-size:11px}.editor-pane-textarea{grid-row:4;width:100%;height:100%;min-width:0;min-height:0;border:0;padding:12px;resize:none;color:var(--nt-fg);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:12px;line-height:1.5;outline:none}.editor-markdown-preview{grid-row:4;width:100%;height:100%;min-width:0;min-height:0;overflow:auto;overscroll-behavior:contain;border:0;padding:14px 16px;color:var(--nt-fg);background:var(--nt-bg);font-size:13px;line-height:1.5;-webkit-overflow-scrolling:touch}.editor-markdown-preview :first-child{margin-top:0}.editor-markdown-preview :last-child{margin-bottom:0}.xterm-container{position:relative;z-index:0;width:100%;height:100%;min-width:0;min-height:0;overflow:hidden;overscroll-behavior:contain;padding:3px;touch-action:none;transform:translateY(var(--terminal-output-slide-y));transition:transform .18s ease}.xterm{width:100%;height:100%}.xterm .xterm-viewport{scrollbar-color:var(--nt-scrollbar-thumb) transparent;scrollbar-width:thin}.xterm .xterm-viewport::-webkit-scrollbar{width:7px;height:7px;background:transparent}.xterm .xterm-viewport::-webkit-scrollbar-track,.xterm .xterm-viewport::-webkit-scrollbar-track-piece{background:transparent}.xterm .xterm-viewport::-webkit-scrollbar-thumb{min-height:28px;border:2px solid transparent;border-radius:999px;background:var(--nt-scrollbar-thumb);background-clip:content-box}.xterm .xterm-viewport::-webkit-scrollbar-thumb:hover{background:var(--nt-scrollbar-thumb-hover);background-clip:content-box}.xterm .xterm-viewport::-webkit-scrollbar-button{display:none!important;width:0!important;min-width:0!important;max-width:0!important;height:0!important;min-height:0!important;max-height:0!important;margin:0!important;border:0!important;padding:0!important;background:transparent!important;-webkit-appearance:none!important;appearance:none!important}.xterm .xterm-viewport::-webkit-scrollbar-button:single-button,.xterm .xterm-viewport::-webkit-scrollbar-button:start:decrement,.xterm .xterm-viewport::-webkit-scrollbar-button:end:increment,.xterm .xterm-viewport::-webkit-scrollbar-button:vertical:start:decrement,.xterm .xterm-viewport::-webkit-scrollbar-button:vertical:end:increment,.xterm .xterm-viewport::-webkit-scrollbar-button:horizontal:start:decrement,.xterm .xterm-viewport::-webkit-scrollbar-button:horizontal:end:increment{display:none!important;width:0!important;min-width:0!important;max-width:0!important;height:0!important;min-height:0!important;max-height:0!important;margin:0!important;border:0!important;padding:0!important;background:transparent!important;-webkit-appearance:none!important;appearance:none!important}.xterm .xterm-viewport::-webkit-scrollbar-corner,.xterm .xterm-viewport::-webkit-resizer{width:0!important;height:0!important;background:transparent!important}.terminal-pane[data-tmux-scrollback=true] .xterm .xterm-viewport{overflow-y:hidden!important;scrollbar-color:transparent transparent;scrollbar-width:none!important;-ms-overflow-style:none}.terminal-pane[data-tmux-scrollback=true] .xterm .xterm-viewport::-webkit-scrollbar{display:none!important;width:0!important;height:0!important;background:transparent!important}.terminal-pane[data-tmux-scrollback=true] .xterm .xterm-viewport::-webkit-scrollbar-track,.terminal-pane[data-tmux-scrollback=true] .xterm .xterm-viewport::-webkit-scrollbar-thumb,.terminal-pane[data-tmux-scrollback=true] .xterm .xterm-viewport::-webkit-scrollbar-button{display:none!important;background:transparent!important}.terminal-history-loader{position:absolute;top:34px;left:50%;z-index:3;display:grid;width:24px;height:24px;place-items:center;border:1px solid var(--nt-line);border-radius:999px;background:var(--nt-floating-bg);box-shadow:0 0 12px var(--nt-shadow);transform:translate(-50%,var(--terminal-output-slide-y));transition:transform .18s ease;pointer-events:none}.terminal-history-loader span{width:12px;height:12px;border:2px solid color-mix(in srgb,var(--nt-fg) 28%,transparent);border-top-color:var(--nt-accent);border-radius:50%;animation:terminal-history-spin .7s linear infinite}.cache-keepalive-toast{position:absolute;right:14px;bottom:48px;z-index:12;display:flex;flex-direction:column;gap:7px;width:min(310px,calc(100% - 28px));border:1px solid color-mix(in srgb,var(--nt-accent) 28%,transparent);border-radius:8px;padding:9px;color:var(--nt-fg);background:var(--nt-floating-bg-strong);box-shadow:0 18px 48px var(--nt-shadow-strong),0 0 22px color-mix(in srgb,var(--nt-accent) 8%,transparent);animation:completion-toast-in .22s ease-out}.cache-keepalive-toast[data-tone=warning]{border-color:color-mix(in srgb,var(--nt-warning) 42%,transparent)}.cache-keepalive-toast[data-tone=success]{border-color:color-mix(in srgb,var(--nt-ok) 42%,transparent)}.cache-keepalive-toast[data-tone=skipped]{border-color:color-mix(in srgb,var(--nt-line) 86%,transparent)}.cache-keepalive-toast header{display:flex;align-items:center;gap:8px}.cache-keepalive-toast strong{flex:1 1 auto;min-width:0;overflow:hidden;font-size:11px;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.cache-keepalive-toast p{margin:0;color:var(--nt-fg-2);font-size:10px;line-height:1.35}.cache-keepalive-toast header button,.cache-keepalive-toast-actions button{border:1px solid color-mix(in srgb,var(--nt-line) 72%,transparent);border-radius:6px;color:var(--nt-fg-2);background:var(--nt-subtle-fill);cursor:pointer;touch-action:manipulation}.cache-keepalive-toast header button{flex:0 0 auto;width:28px;height:28px;padding:0;font-size:13px;line-height:1}.cache-keepalive-toast-actions{display:flex;flex-wrap:wrap;gap:6px}.cache-keepalive-toast-actions button{flex:1 1 auto;min-width:74px;padding:5px 7px;font-size:10px;font-weight:700}.cache-keepalive-toast button:hover{color:var(--nt-fg);background:var(--nt-hover-fill)}.terminal-scroll-progress{position:absolute;top:34px;right:10px;z-index:3;padding:2px 7px;border:1px solid color-mix(in srgb,var(--nt-scrollbar-thumb) 64%,transparent);border-radius:6px;background:var(--nt-floating-bg);color:var(--nt-fg);font-size:11px;line-height:16px;font-variant-numeric:tabular-nums;opacity:.34;pointer-events:none;transform:translateY(var(--terminal-output-slide-y));transition:opacity .12s ease,border-color .12s ease,color .12s ease,transform .18s ease}.terminal-scroll-progress[data-active=true]{border-color:var(--nt-line-2);color:var(--nt-fg);opacity:1}.terminal-scroll-progress[data-pending=true]{border-color:var(--nt-line);color:var(--nt-fg-2);opacity:.42}.terminal-scroll-progress[data-buffer=alternate]{border-color:color-mix(in srgb,var(--nt-warning) 34%,transparent);color:var(--nt-warning);background:var(--nt-warning-soft)}.terminal-scroll-bottom-button{position:absolute;top:auto;right:10px;bottom:34px;z-index:4;display:grid;width:28px;height:28px;place-items:center;border:1px solid color-mix(in srgb,var(--nt-accent) 28%,transparent);border-radius:999px;color:var(--nt-accent);background:var(--nt-floating-bg);box-shadow:0 10px 24px var(--nt-shadow);font-family:var(--nt-font-mono);font-size:15px;line-height:1;cursor:pointer;transform:translateY(var(--terminal-output-slide-y));transition:transform .18s ease}.terminal-scroll-bottom-button:hover{border-color:color-mix(in srgb,var(--nt-accent) 55%,transparent);background:var(--nt-floating-bg-hover)}.terminal-scroll-handle{position:absolute;top:64px;right:0;bottom:60px;z-index:4;display:none;width:34px;border:0;padding:0;background:transparent;cursor:ns-resize;touch-action:none;transform:translateY(var(--terminal-output-slide-y));transition:transform .18s ease}.terminal-scroll-handle span{position:absolute;top:50%;right:8px;width:5px;height:54px;border-radius:999px;background:var(--nt-scrollbar-thumb);transform:translateY(-50%)}.terminal-scroll-handle:hover span,.terminal-scroll-handle:active span{background:color-mix(in srgb,var(--nt-accent) 68%,transparent)}@keyframes terminal-history-spin{to{transform:rotate(360deg)}}.mobile-terminal-key-bar,.mobile-terminal-key-toggle{display:none}.mobile-terminal-key{display:grid;min-width:34px;height:30px;place-items:center;border:1px solid var(--nt-line-2);border-radius:5px;padding:0 8px;color:var(--nt-fg-2);background:var(--nt-floating-bg-strong);font-family:var(--nt-font-mono);font-size:11px;cursor:pointer}.mobile-terminal-key{-webkit-tap-highlight-color:transparent;touch-action:manipulation;border-color:var(--nt-line-2);color:var(--nt-fg-3);background:transparent;box-shadow:none;transition:none}.mobile-terminal-key:hover,.mobile-terminal-key:focus,.mobile-terminal-key:focus-visible,.mobile-terminal-key:active{outline:none;border-color:var(--nt-line-2);color:var(--nt-fg-3);background:transparent;box-shadow:none}.mobile-terminal-key.mobile-terminal-key[data-active=true]{border-color:var(--nt-accent);color:var(--nt-accent);background:var(--nt-accent-soft);box-shadow:0 0 8px var(--nt-accent-glow)}.completion-toast{position:absolute;right:16px;bottom:12px;z-index:13;display:flex;flex-direction:column;gap:6px;width:min(238px,calc(100% - 32px));border:1px solid color-mix(in srgb,var(--nt-accent) 28%,transparent);border-radius:8px;padding:8px;color:var(--nt-fg);background:var(--nt-floating-bg-strong);box-shadow:0 18px 48px var(--nt-shadow-strong),0 0 22px color-mix(in srgb,var(--nt-accent) 8%,transparent);cursor:pointer;animation:completion-toast-in .22s ease-out}.completion-toast:focus-visible{outline:2px solid color-mix(in srgb,var(--nt-accent) 60%,transparent);outline-offset:2px}.completion-toast-header{display:flex;align-items:center;gap:8px;min-width:0}.completion-toast-character{width:100%;height:152px;object-fit:contain;pointer-events:none}.completion-toast-copy{display:flex;flex:1 1 auto;flex-direction:column;align-items:flex-start;gap:1px;min-width:0;min-height:34px}.completion-toast-copy strong,.completion-toast-copy span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.completion-toast-copy strong{font-size:10px;font-weight:600}.completion-toast-copy span{color:var(--nt-fg-2);font-family:var(--nt-font-mono);font-size:10px}.completion-toast button{flex:0 0 auto;display:grid;width:36px;height:36px;place-items:center;align-self:start;border:1px solid color-mix(in srgb,var(--nt-line) 70%,transparent);border-radius:7px;padding:0;color:var(--nt-fg-2);background:var(--nt-subtle-fill);cursor:pointer;font-size:14px;line-height:1;touch-action:manipulation}.completion-toast button:hover{color:var(--nt-fg);background:var(--nt-hover-fill)}@media(max-width:640px){.completion-toast{right:10px;bottom:10px;width:min(260px,calc(100% - 20px))}.completion-toast button{width:44px;height:44px}}@keyframes completion-toast-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@media(prefers-reduced-motion:reduce){.completion-toast{animation:none}}.upload-toast{position:absolute;right:16px;bottom:12px;z-index:12;display:grid;width:min(360px,calc(100% - 32px));max-height:min(360px,calc(100% - 64px));overflow:hidden;border:1px solid var(--nt-line-2);border-radius:8px;color:var(--nt-fg);background:var(--nt-floating-bg-strong);box-shadow:0 18px 48px var(--nt-shadow-strong),0 0 0 1px var(--nt-subtle-fill)}.upload-toast-partial,.upload-toast-failed{border-color:var(--nt-danger-line)}.upload-toast-header{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;border-bottom:1px solid var(--nt-line);padding:10px 10px 9px 12px}.upload-toast-header strong{min-width:0;overflow:hidden;color:var(--nt-fg);font-size:12px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.upload-toast-header button{display:grid;width:22px;height:22px;place-items:center;border:1px solid transparent;border-radius:4px;padding:0;color:var(--nt-fg-3);background:transparent;cursor:pointer}.upload-toast-header button:hover{color:var(--nt-fg);background:var(--nt-bg-2)}.upload-toast-body{display:grid;gap:9px;min-width:0;overflow:auto;overscroll-behavior:contain;padding:10px 12px 12px;font-family:var(--nt-font-mono);font-size:11px;-webkit-overflow-scrolling:touch}.upload-queue-body{gap:8px}.upload-queue-item{display:grid;min-width:0;gap:8px;border:1px solid var(--nt-line);border-radius:6px;padding:9px;background:var(--nt-subtle-fill)}.upload-queue-item[data-status=failed],.upload-queue-item[data-status=partial]{border-color:var(--nt-danger-line)}.upload-queue-item-header{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px}.upload-queue-item-header strong{min-width:0;overflow:hidden;color:var(--nt-fg);font-size:11.5px;text-overflow:ellipsis;white-space:nowrap}.upload-queue-actions{display:flex;align-items:center;gap:4px}.upload-queue-actions button{min-width:24px;height:24px;border:1px solid var(--nt-line);border-radius:4px;padding:0 7px;color:var(--nt-fg-2);background:var(--nt-bg);font-size:10.5px;cursor:pointer}.upload-queue-actions button:hover,.upload-queue-actions button:focus-visible{color:var(--nt-accent);border-color:color-mix(in srgb,var(--nt-accent) 55%,var(--nt-line));outline:none}.upload-toast-body p{margin:0}.upload-progress-row{display:flex;min-width:0;justify-content:space-between;gap:12px;color:var(--nt-fg-2)}.upload-progress-track{height:4px;overflow:hidden;border-radius:2px;background:var(--nt-line)}.upload-progress-track span{display:block;height:100%;max-width:100%;background:var(--nt-accent);transition:width .12s ease}.upload-toast-destination,.upload-toast-muted{min-width:0;overflow:hidden;color:var(--nt-fg-3);text-overflow:ellipsis;white-space:nowrap}.upload-result-list{display:grid;gap:6px;min-width:0;margin:0;padding:0;list-style:none}.upload-result-list li{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;min-width:0;color:var(--nt-fg-2)}.upload-result-list li:before{width:5px;height:5px;border-radius:50%;background:var(--nt-ok);content:""}.upload-result-list li[data-status=failed]:before{background:var(--nt-danger)}.upload-result-path{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.upload-result-error{max-width:140px;overflow:hidden;color:var(--nt-danger);text-overflow:ellipsis;white-space:nowrap}.upload-result-renamed{max-width:72px;overflow:hidden;color:var(--nt-warn);text-overflow:ellipsis;white-space:nowrap}.auth-screen{position:relative;display:grid;width:100%;min-height:var(--nterminal-viewport-height);place-items:center;overflow:hidden;padding:24px 24px calc(24px + var(--nterminal-safe-area-bottom));color:var(--nt-fg);background:var(--nt-bg)}.auth-background{position:absolute;inset:0;overflow:hidden;pointer-events:none}.auth-grid{position:absolute;inset:0;background-image:linear-gradient(var(--nt-line) 1px,transparent 1px),linear-gradient(90deg,var(--nt-line) 1px,transparent 1px);background-size:32px 32px;opacity:.22;-webkit-mask-image:radial-gradient(ellipse at 50% 38%,#000 0,transparent 70%);mask-image:radial-gradient(ellipse at 50% 38%,#000 0,transparent 70%)}.auth-glow{position:absolute;top:30%;left:50%;width:720px;height:720px;background:radial-gradient(circle,var(--nt-accent-soft),transparent 60%);filter:blur(20px);transform:translate(-50%,-50%)}.auth-panel{position:relative;display:grid;width:min(440px,100%);gap:18px;border:1px solid var(--nt-line);border-radius:8px;padding:28px;background:linear-gradient(180deg,var(--nt-subtle-fill),transparent);box-shadow:0 30px 80px var(--nt-shadow-strong),0 0 0 1px var(--nt-subtle-fill);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.auth-header{display:grid;gap:18px;border-bottom:1px dashed var(--nt-line);padding-bottom:18px}.auth-brand{display:flex;align-items:center;gap:10px}.eyebrow{margin:0;color:var(--nt-accent);font-family:var(--nt-font-mono);font-size:11px;font-weight:700;letter-spacing:.18em;text-transform:uppercase}.auth-host{margin:2px 0 0;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10.5px}h1{margin:0;color:var(--nt-fg);font-size:22px;line-height:1.2}.auth-form{display:grid;gap:14px}.auth-form label{display:grid;gap:6px;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px}.auth-form input:not([type=checkbox]){width:100%;height:38px;border:1px solid var(--nt-line-2);border-radius:6px;padding:0 12px;color:var(--nt-fg);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:14px;letter-spacing:.16em;transition:border-color .12s ease,box-shadow .12s ease,background .12s ease}.auth-form input:not([type=checkbox]):focus{border-color:var(--nt-accent);background:var(--nt-bg-2);box-shadow:0 0 0 3px var(--nt-accent-soft)}.button-row,.workspace-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.auth-form button,.button-row button{display:inline-flex;align-items:center;justify-content:center;height:38px;border-radius:6px;padding:0 18px;font-family:var(--nt-font-mono);font-size:12px;letter-spacing:.04em;cursor:pointer;transition:color .12s ease,background .12s ease,border-color .12s ease,box-shadow .12s ease}.auth-form button[type=submit]{border:1px solid var(--nt-accent);color:var(--nt-accent);background:var(--nt-accent-soft)}.auth-form button[type=submit]:hover:not(:disabled){color:var(--nt-on-accent);background:var(--nt-accent);box-shadow:0 0 16px var(--nt-accent-glow)}.secondary-button,.button-row .secondary-button{border:1px solid var(--nt-line-2);color:var(--nt-fg-2);background:transparent}.muted,.form-error{margin:0;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px}.form-error{border:1px solid var(--nt-danger-line);border-radius:5px;padding:6px 10px;color:var(--nt-danger);background:var(--nt-danger-soft)}@media(max-width:760px){input,textarea,select{font-size:16px}.terminal-pane{--compose-drawer-bottom-offset: max(var(--nterminal-keyboard-inset-bottom), var(--nterminal-safe-area-bottom))}:root[data-nterminal-keyboard-visible=true] .terminal-pane[data-active=true]:not([data-compose-open=true]){--terminal-keyboard-slide-distance: max(0px, calc(var(--nterminal-keyboard-inset-bottom) - var(--compose-drawer-closed-height)));--terminal-output-slide-y: calc(-1 * var(--terminal-output-slide-distance))}.compose-drawer-input{min-height:32px;max-height:70px;resize:none}.compose-drawer[data-open=true]{bottom:max(var(--nterminal-keyboard-inset-bottom),var(--nterminal-safe-area-bottom))}.compose-drawer-panel{gap:3px}.compose-drawer[data-open=true] .compose-drawer-panel{max-height:min(128px,30vh,calc(var(--nterminal-viewport-height) - 72px));padding:3px 6px 4px}.xterm .xterm-helper-textarea{font-size:16px}.terminal-shell,.terminal-shell[data-collapsed=true]{display:block;height:var(--nterminal-viewport-height);min-height:var(--nterminal-viewport-height)}.workspace-backdrop{position:fixed;inset:0;z-index:20;min-height:0;border:0;background:var(--nt-scrim);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.terminal-shell[data-sidebar-open=true] .workspace-backdrop{display:block}.workspace-sidebar{position:fixed;inset:0 auto 0 0;z-index:30;width:min(280px,86vw);padding-bottom:var(--nterminal-safe-area-bottom);transform:translate(-100%);transition:transform .18s ease;box-shadow:12px 0 32px var(--nt-shadow-strong)}.terminal-shell[data-sidebar-open=true] .workspace-sidebar{transform:translate(0)}.terminal-shell[data-collapsed=true] .workspace-brand{grid-template-columns:minmax(0,1fr) auto;justify-items:stretch;padding:16px 16px 14px}.terminal-shell[data-collapsed=true] .workspace-list{align-items:stretch}.terminal-shell[data-collapsed=true] .workspace-select-button{justify-items:start;padding:7px 16px 7px 14px}.terminal-shell[data-collapsed=true] .workspace-initial,.sidebar-collapse-button{display:none}.sidebar-drawer-close-button{display:grid}.settings-panel{width:calc(100vw - 16px);max-width:none;height:calc(var(--nterminal-viewport-height) - 18px);max-height:none}.settings-layout{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr)}.settings-nav{position:sticky;top:0;z-index:1;flex-direction:row;gap:6px;overflow-x:auto;border-right:0;border-bottom:1px solid var(--nt-line);scrollbar-width:none}.settings-nav::-webkit-scrollbar{display:none}.settings-nav button{flex:0 0 auto;border-left:0;border-bottom:2px solid transparent;text-align:center}.settings-nav button:hover,.settings-nav button[data-active=true]{border-left-color:transparent;border-bottom-color:var(--nt-accent)}.settings-content{max-height:none;min-height:0;padding:14px 14px calc(14px + var(--nterminal-safe-area-bottom));-webkit-overflow-scrolling:touch}.settings-theme-picker{grid-template-columns:minmax(0,1fr)}.transcript-dialog{width:calc(100% - 16px);max-width:none;height:calc(100% - 16px);max-height:none;padding:10px;gap:8px}.transcript-dialog-controls{flex-wrap:wrap;justify-content:flex-start}.transcript-tool-toggle{margin-right:0}.transcript-search{flex:1 1 100%;min-width:0}.transcript-prompts-toggle,.transcript-search-actions{flex:1 1 auto}.transcript-search-actions button{flex:1 1 0}.transcript-prompt-index{grid-template-columns:minmax(0,1fr);max-height:min(170px,26vh)}.transcript-result-count{margin-left:0}.transcript-overlay{padding:4px}.settings-shortcut-list li{grid-template-columns:minmax(0,1fr)}.settings-shortcut-actions{justify-content:stretch}.settings-shortcut-recorder{min-width:0;flex:1}.workspace-brand-name,.terminal-shell[data-collapsed=true] .workspace-brand-name{display:block}.terminal-shell[data-collapsed=true] .workspace-sidebar-header,.terminal-shell[data-collapsed=true] .workspace-sidebar-footer{display:flex}.terminal-shell[data-collapsed=true][data-sidebar-open=true] .workspace-sidebar-footer{justify-content:space-between;padding:12px 16px}.terminal-shell[data-collapsed=true][data-sidebar-open=true] .workspace-sidebar-footer>span{display:block}.terminal-main{height:100%;grid-template-rows:48px minmax(0,1fr)}.terminal-main[data-mobile-pane-switcher=true]{grid-template-rows:48px 34px minmax(0,1fr)}.workspace-error{align-items:stretch;flex-direction:column;gap:6px}.workspace-error-actions{justify-content:flex-end}.terminal-tabs{grid-template-columns:auto minmax(0,1fr) auto auto;gap:4px;min-height:48px;padding:0 4px}.terminal-tab-list{display:none}.mobile-tab-current-button{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-self:center;align-items:center;gap:7px;min-width:0;height:40px;border:1px solid var(--nt-line);border-radius:6px;padding:0 9px;color:var(--nt-fg);background:var(--nt-bg-2);font-family:var(--nt-font-mono);text-align:left}.mobile-tab-current-button:disabled{opacity:.55}.mobile-tab-current-button .terminal-tab-status-dot{margin:0}.mobile-tab-current-button>span:not(.terminal-tab-status-dot){min-width:0;overflow:hidden;font-size:12px;text-overflow:ellipsis;white-space:nowrap}.mobile-tab-current-button small{color:var(--nt-fg-3);font-size:10px;white-space:nowrap}.mobile-tab-add-button{display:grid;align-self:center;width:38px;height:40px;place-items:center;border:1px solid var(--nt-line);border-radius:6px;color:var(--nt-fg-2);background:var(--nt-bg);font-size:18px}.mobile-tab-sheet-backdrop{position:fixed;inset:0;z-index:42;display:flex;align-items:flex-end;justify-content:center;padding:0 10px calc(10px + var(--nterminal-safe-area-bottom));background:var(--nt-scrim-soft)}.mobile-tab-sheet{display:grid}.terminal-tab{flex:0 0 auto;min-width:96px;max-width:min(46vw,150px)}.terminal-tab[data-active=true]{min-width:min(58vw,178px);max-width:min(58vw,178px)}.terminal-tab:not([data-active=true]) .icon-button{display:none}.terminal-tab-select,.terminal-tab-editor{width:100%;min-width:0;max-width:none}.mobile-pane-switcher{display:flex;min-width:0;min-height:34px;align-items:center;gap:6px;border-bottom:1px solid var(--nt-line);padding:0 8px;background:color-mix(in srgb,var(--nt-bg-2) 70%,var(--nt-bg));color:var(--nt-fg-2);font-family:var(--nt-font-mono);font-size:11px}.mobile-pane-switcher>button{display:grid;width:28px;height:28px;flex:0 0 auto;place-items:center;border:1px solid var(--nt-line);border-radius:5px;color:var(--nt-fg-2);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:14px;line-height:1;cursor:pointer}.mobile-pane-switcher>button:hover,.mobile-pane-switcher>button:focus-visible{color:var(--nt-accent);border-color:color-mix(in srgb,var(--nt-accent) 55%,var(--nt-line));outline:none}.mobile-pane-switcher>.mobile-pane-current{width:auto;min-width:0;flex:1 1 auto;overflow:hidden;padding:0 8px;text-align:center;text-overflow:ellipsis;white-space:nowrap}.mobile-pane-sheet-backdrop{position:fixed;inset:0;z-index:42;display:flex;align-items:flex-end;justify-content:center;padding:0 10px calc(10px + var(--nterminal-safe-area-bottom));background:var(--nt-scrim-soft)}.mobile-pane-sheet{display:grid;width:min(520px,100%);max-height:min(58vh,420px);min-height:0;overflow:hidden;border:1px solid var(--nt-line-2);border-radius:8px 8px 6px 6px;background:var(--nt-floating-bg-strong);box-shadow:0 -18px 44px var(--nt-shadow-strong)}.mobile-pane-sheet header{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;border-bottom:1px solid var(--nt-line);padding:10px 10px 9px 12px}.mobile-pane-sheet header strong{color:var(--nt-fg);font-size:12px}.mobile-pane-sheet header button{display:grid;width:28px;height:28px;place-items:center;border:1px solid var(--nt-line);border-radius:5px;padding:0;color:var(--nt-fg-2);background:var(--nt-bg)}.mobile-pane-sheet-list{display:grid;min-height:0;gap:6px;overflow:auto;padding:8px;-webkit-overflow-scrolling:touch}.mobile-pane-sheet-list button{display:grid;grid-template-columns:26px minmax(0,1fr) auto;align-items:center;gap:9px;min-height:52px;border:1px solid var(--nt-line);border-radius:6px;padding:8px;color:var(--nt-fg-2);background:var(--nt-bg);text-align:left}.mobile-pane-sheet-list button[data-active=true]{border-color:color-mix(in srgb,var(--nt-accent) 62%,var(--nt-line));background:color-mix(in srgb,var(--nt-accent) 11%,var(--nt-bg))}.mobile-pane-sheet-index{display:grid;width:24px;height:24px;place-items:center;border-radius:50%;color:var(--nt-bg);background:var(--nt-fg-3);font-size:11px;font-weight:700}.mobile-pane-sheet-list button[data-active=true] .mobile-pane-sheet-index{background:var(--nt-accent)}.mobile-pane-sheet-copy{display:grid;min-width:0;gap:3px}.mobile-pane-sheet-copy strong,.mobile-pane-sheet-copy small{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mobile-pane-sheet-copy strong{color:var(--nt-fg);font-size:12px}.mobile-pane-sheet-copy small,.mobile-pane-sheet-type{color:var(--nt-fg-3);font-size:10.5px}.mobile-pane-sheet-type{text-transform:uppercase}.mobile-menu-button{display:grid;width:40px;height:40px}.terminal-tab-select,.terminal-tab-editor{gap:4px;height:48px;min-width:0;max-width:none;padding:0 6px 0 12px}.terminal-tab-select small,.terminal-tab-editor small{display:none}.icon-button{width:26px;height:26px;opacity:1}.tab-add-button{width:40px;height:48px}.pane-action-button{width:38px;height:38px}.terminal-pane-scrollback,.terminal-pane-code,.terminal-pane-interrupt,.terminal-pane-reload{width:26px;min-width:26px;height:26px;padding:0}.terminal-pane-transcript kbd,.terminal-pane-scrollback kbd{display:none}.terminal-pane-close{width:26px;height:26px;opacity:1}.terminal-scroll-bottom-button{top:auto;right:12px;bottom:max(52px,var(--nterminal-safe-area-bottom) + 52px);width:38px;height:38px;font-size:18px}.terminal-scroll-handle{top:76px;right:0;bottom:104px;display:block;width:42px}.terminal-scroll-handle span{right:12px;width:7px;height:76px}.terminal-pane[data-active=true] .xterm-container{padding-bottom:var(--nterminal-safe-area-bottom)}.mobile-terminal-key-bar{position:absolute;right:8px;bottom:max(8px,var(--nterminal-safe-area-bottom));left:8px;z-index:10;display:flex;max-width:calc(100% - 16px);align-items:center;justify-content:center;gap:4px;overflow-x:auto;overscroll-behavior:contain;border:1px solid var(--nt-line-2);border-radius:8px;padding:4px;background:var(--nt-floating-bg);box-shadow:0 10px 26px var(--nt-shadow);scrollbar-width:none;-webkit-overflow-scrolling:touch}.mobile-terminal-key-toggle{position:absolute;right:10px;bottom:max(10px,var(--nterminal-safe-area-bottom));z-index:10;display:grid;width:32px;height:32px;place-items:center;border:1px solid var(--nt-line-2);border-radius:50%;color:var(--nt-fg-3);background:var(--nt-floating-bg);font-size:16px;cursor:pointer;box-shadow:0 4px 14px var(--nt-shadow)}.mobile-terminal-key-toggle:hover{color:var(--nt-accent);border-color:var(--nt-accent)}:root[data-nterminal-keyboard-visible=true] .mobile-terminal-key-toggle{position:fixed;bottom:calc(var(--nterminal-keyboard-inset-bottom) + 8px)}.mobile-terminal-key-bar::-webkit-scrollbar{display:none}:root[data-nterminal-keyboard-visible=true] .terminal-pane[data-active=true] .xterm-container{padding-bottom:3px}:root[data-nterminal-keyboard-visible=true] .mobile-terminal-key-bar{position:fixed;bottom:calc(var(--nterminal-keyboard-inset-bottom) + 4px)}}