@promptbook/cli 0.112.0-96 → 0.112.0-98

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 (79) hide show
  1. package/apps/agents-server/playwright.config.ts +2 -1
  2. package/apps/agents-server/src/app/admin/cli-access/CliAccessClient.tsx +99 -0
  3. package/apps/agents-server/src/app/admin/cli-access/page.tsx +14 -0
  4. package/apps/agents-server/src/app/admin/code-runners/CodeRunnersClient.tsx +124 -34
  5. package/apps/agents-server/src/app/admin/servers/CreateServerDialog.tsx +46 -505
  6. package/apps/agents-server/src/app/admin/servers/ServersClient.tsx +23 -11
  7. package/apps/agents-server/src/app/admin/servers/ServersRegistryApi.ts +5 -0
  8. package/apps/agents-server/src/app/admin/servers/ServersRegistryDnsTypes.ts +87 -0
  9. package/apps/agents-server/src/app/admin/servers/ServersRegistryTable.tsx +258 -128
  10. package/apps/agents-server/src/app/admin/servers/useCreateServerWizard.ts +46 -334
  11. package/apps/agents-server/src/app/admin/servers/useServersRegistryState.ts +26 -2
  12. package/apps/agents-server/src/app/admin/update/UpdateClient.tsx +435 -0
  13. package/apps/agents-server/src/app/admin/update/page.tsx +14 -0
  14. package/apps/agents-server/src/app/agents/[agentName]/chat/CanonicalAgentChatSurface.tsx +24 -0
  15. package/apps/agents-server/src/app/api/admin/cli-access/route.ts +137 -0
  16. package/apps/agents-server/src/app/api/admin/code-runners/authentication/route.ts +140 -0
  17. package/apps/agents-server/src/app/api/admin/code-runners/route.ts +4 -35
  18. package/apps/agents-server/src/app/api/admin/servers/[serverId]/route.ts +7 -2
  19. package/apps/agents-server/src/app/api/admin/servers/route.ts +95 -4
  20. package/apps/agents-server/src/app/api/admin/update/route.ts +52 -0
  21. package/apps/agents-server/src/app/api/auth/login/route.ts +8 -0
  22. package/apps/agents-server/src/app/api/auth/logout/route.ts +10 -2
  23. package/apps/agents-server/src/app/api/chat/export/pdf/route.ts +63 -0
  24. package/apps/agents-server/src/app/page.tsx +10 -0
  25. package/apps/agents-server/src/components/AdminTerminal/AdminTerminalCard.tsx +279 -0
  26. package/apps/agents-server/src/components/AdminTerminal/useAdminTerminalSession.ts +336 -0
  27. package/apps/agents-server/src/components/Header/buildHeaderSystemMenuItems.ts +10 -0
  28. package/apps/agents-server/src/languages/ServerTranslationKeys.ts +2 -0
  29. package/apps/agents-server/src/languages/translations/czech.yaml +2 -0
  30. package/apps/agents-server/src/languages/translations/english.yaml +2 -0
  31. package/apps/agents-server/src/middleware.ts +32 -0
  32. package/apps/agents-server/src/tools/BrowserConnectionProvider.ts +1 -1
  33. package/apps/agents-server/src/utils/chatExport/downloadChatPdfFromServer.ts +59 -0
  34. package/apps/agents-server/src/utils/chatExport/renderHtmlToPdfOnServer.ts +37 -0
  35. package/apps/agents-server/src/utils/codeRunnerAuthentication.ts +234 -0
  36. package/apps/agents-server/src/utils/codeRunnerConfiguration.ts +67 -0
  37. package/apps/agents-server/src/utils/createInteractiveTerminalEventStream.ts +84 -0
  38. package/apps/agents-server/src/utils/interactiveTerminalSession.ts +442 -0
  39. package/apps/agents-server/src/utils/serverCliAccess.ts +221 -0
  40. package/apps/agents-server/src/utils/serverManagement/standaloneVpsServerMetadata.ts +145 -0
  41. package/apps/agents-server/src/utils/serverRegistry.ts +3 -2
  42. package/apps/agents-server/src/utils/session.ts +37 -9
  43. package/apps/agents-server/src/utils/shibboleth/createShibbolethAuthenticationLogPayload.ts +173 -0
  44. package/apps/agents-server/src/utils/shibboleth/writeShibbolethAuthenticationLog.ts +27 -0
  45. package/apps/agents-server/src/utils/standaloneVpsDnsDiagnostics.ts +258 -0
  46. package/apps/agents-server/src/utils/standaloneVpsRawIpBootstrap.ts +87 -0
  47. package/apps/agents-server/src/utils/vpsConfiguration.ts +87 -13
  48. package/apps/agents-server/src/utils/vpsSelfUpdate.ts +664 -0
  49. package/esm/apps/agents-server/src/utils/serverRegistry.d.ts +1 -1
  50. package/esm/index.es.js +7 -5
  51. package/esm/index.es.js.map +1 -1
  52. package/esm/src/book-components/Chat/Chat/ChatActionsBar.d.ts +2 -0
  53. package/esm/src/book-components/Chat/Chat/ChatProps.d.ts +6 -0
  54. package/esm/src/book-components/Chat/save/_common/ChatSaveFormatHandler.d.ts +35 -0
  55. package/esm/src/book-components/Chat/save/_common/createChatExportFilename.d.ts +11 -0
  56. package/esm/src/version.d.ts +1 -1
  57. package/package.json +1 -1
  58. package/src/book-components/Chat/Chat/Chat.tsx +2 -0
  59. package/src/book-components/Chat/Chat/ChatActionsBar.tsx +17 -9
  60. package/src/book-components/Chat/Chat/ChatProps.tsx +7 -0
  61. package/src/book-components/Chat/save/_common/ChatSaveFormatHandler.ts +40 -0
  62. package/src/book-components/Chat/save/_common/createChatExportFilename.ts +20 -0
  63. package/src/book-components/Chat/utils/renderMarkdown.ts +1 -3
  64. package/src/other/templates/getTemplatesPipelineCollection.ts +718 -790
  65. package/src/scrapers/document/DocumentScraper.ts +1 -1
  66. package/src/scrapers/document-legacy/LegacyDocumentScraper.ts +1 -1
  67. package/src/version.ts +2 -2
  68. package/src/versions.txt +2 -0
  69. package/umd/apps/agents-server/src/utils/serverRegistry.d.ts +1 -1
  70. package/umd/index.umd.js +7 -5
  71. package/umd/index.umd.js.map +1 -1
  72. package/umd/src/book-components/Chat/Chat/ChatActionsBar.d.ts +2 -0
  73. package/umd/src/book-components/Chat/Chat/ChatProps.d.ts +6 -0
  74. package/umd/src/book-components/Chat/save/_common/ChatSaveFormatHandler.d.ts +35 -0
  75. package/umd/src/book-components/Chat/save/_common/createChatExportFilename.d.ts +11 -0
  76. package/umd/src/version.d.ts +1 -1
  77. package/src/conversion/validation/_importPipeline.ts +0 -88
  78. /package/esm/src/conversion/validation/{_importPipeline.d.ts → _importPipeline.test.d.ts} +0 -0
  79. /package/umd/src/conversion/validation/{_importPipeline.d.ts → _importPipeline.test.d.ts} +0 -0
@@ -89,7 +89,8 @@ const config = defineConfig({
89
89
  },
90
90
  },
91
91
  {
92
- command: 'npm run prebuild && next build && npm run start',
92
+ command:
93
+ 'npm run prebuild && node -r ./scripts/ignore-kill-eperm.js ../../node_modules/next/dist/bin/next build && npm run start',
93
94
  cwd: __dirname,
94
95
  url: APP_URL,
95
96
  reuseExistingServer: false,
@@ -0,0 +1,99 @@
1
+ 'use client';
2
+
3
+ import { AlertTriangle } from 'lucide-react';
4
+ import { AdminTerminalCard } from '../../../components/AdminTerminal/AdminTerminalCard';
5
+ import { useAdminTerminalSession } from '../../../components/AdminTerminal/useAdminTerminalSession';
6
+
7
+ /**
8
+ * Browser-safe snapshot of one raw CLI access session.
9
+ */
10
+ type CliAccessSession = {
11
+ readonly id: string;
12
+ readonly title: string;
13
+ readonly shell: string;
14
+ readonly workingDirectory: string;
15
+ readonly isRunning: boolean;
16
+ readonly output: string;
17
+ readonly startedAt: string;
18
+ readonly finishedAt: string | null;
19
+ readonly exitCode: number | null;
20
+ readonly signal: string | null;
21
+ };
22
+
23
+ /**
24
+ * Super-admin UI for the unrestricted standalone VPS shell.
25
+ */
26
+ export function CliAccessClient() {
27
+ const terminal = useAdminTerminalSession<CliAccessSession>({
28
+ basePath: '/api/admin/cli-access',
29
+ loadErrorMessage: 'Failed to load the CLI access session.',
30
+ startErrorMessage: 'Failed to start the CLI access session.',
31
+ sendErrorMessage: 'Failed to send CLI access input.',
32
+ stopErrorMessage: 'Failed to stop the CLI access session.',
33
+ startSuccessMessage: 'CLI access terminal started.',
34
+ finishSuccessMessage: 'CLI access session finished.',
35
+ finishErrorMessage: 'CLI access session ended with an error.',
36
+ });
37
+
38
+ return (
39
+ <div className="container mx-auto space-y-6 px-4 py-8">
40
+ <div className="mt-20">
41
+ <h1 className="text-3xl font-light text-gray-900">CLI Access</h1>
42
+ <p className="mt-1 max-w-4xl text-sm text-gray-500">
43
+ Open the live server shell directly in the Agents Server UI and run raw commands with the same
44
+ permissions as the running Agents Server process.
45
+ </p>
46
+ </div>
47
+
48
+ {terminal.errorMessage ? (
49
+ <div className="rounded-xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-700">
50
+ {terminal.errorMessage}
51
+ </div>
52
+ ) : null}
53
+ {terminal.successMessage ? (
54
+ <div className="rounded-xl border border-emerald-200 bg-emerald-50 px-4 py-3 text-sm text-emerald-700">
55
+ {terminal.successMessage}
56
+ </div>
57
+ ) : null}
58
+
59
+ <div className="rounded-2xl border border-amber-200 bg-amber-50 px-4 py-4 text-sm text-amber-900">
60
+ <div className="flex items-start gap-3">
61
+ <AlertTriangle className="mt-0.5 h-5 w-5 flex-none" />
62
+ <div className="space-y-1">
63
+ <p className="font-semibold">Super-admin only</p>
64
+ <p>
65
+ This terminal is intentionally unrestricted. Every command runs directly on the server as the
66
+ same operating-system user that runs the Agents Server.
67
+ </p>
68
+ </div>
69
+ </div>
70
+ </div>
71
+
72
+ <AdminTerminalCard
73
+ title="Raw server shell"
74
+ description="Start one shared shell session in the managed installation directory, run any command you need, and stop the session when you are done."
75
+ hint={`Shell: ${terminal.session?.shell || 'bash'}${terminal.session?.workingDirectory ? ` • Working directory: ${terminal.session.workingDirectory}` : ''}`}
76
+ session={terminal.session}
77
+ input={terminal.input}
78
+ onInputChange={terminal.setInput}
79
+ onStart={() => void terminal.startSession()}
80
+ onStop={() => void terminal.stopSession()}
81
+ onSend={(input) => void terminal.sendInput(input)}
82
+ isLoading={terminal.isLoadingSession}
83
+ isStarting={terminal.isStarting}
84
+ isSending={terminal.isSending}
85
+ isStopping={terminal.isStopping}
86
+ startLabel="Start CLI session"
87
+ runningLabel="CLI session running"
88
+ stopLabel="Stop session"
89
+ outputLabel="Live shell output"
90
+ outputEmptyState="No shell output yet. Start the CLI session to see the live server console here."
91
+ inputPlaceholder="Type any shell command, for example pm2 status, git pull, npm run build, or bash scripts"
92
+ quickActions={[
93
+ { label: 'Send Enter', input: '\n' },
94
+ { label: 'Send Ctrl+C', input: '\u0003' },
95
+ ]}
96
+ />
97
+ </div>
98
+ );
99
+ }
@@ -0,0 +1,14 @@
1
+ import { ForbiddenPage } from '../../../components/ForbiddenPage/ForbiddenPage';
2
+ import { isUserGlobalAdmin } from '../../../utils/isUserGlobalAdmin';
3
+ import { CliAccessClient } from './CliAccessClient';
4
+
5
+ /**
6
+ * Super-admin page for raw browser-based access to the VPS shell.
7
+ */
8
+ export default async function CliAccessPage() {
9
+ if (!(await isUserGlobalAdmin())) {
10
+ return <ForbiddenPage />;
11
+ }
12
+
13
+ return <CliAccessClient />;
14
+ }
@@ -1,7 +1,9 @@
1
1
  'use client';
2
2
 
3
3
  import { Loader2, Save, ServerCog } from 'lucide-react';
4
- import { useEffect, useState } from 'react';
4
+ import { useCallback, useEffect, useState } from 'react';
5
+ import { AdminTerminalCard } from '../../../components/AdminTerminal/AdminTerminalCard';
6
+ import { useAdminTerminalSession } from '../../../components/AdminTerminal/useAdminTerminalSession';
5
7
  import { Card } from '../../../components/Homepage/Card';
6
8
 
7
9
  /**
@@ -19,6 +21,20 @@ type CodeRunnersResponse = {
19
21
  readonly error?: string;
20
22
  };
21
23
 
24
+ /**
25
+ * Browser-safe snapshot of one authentication terminal session.
26
+ */
27
+ type CodeRunnerAuthenticationSession = {
28
+ readonly id: string;
29
+ readonly agent: string;
30
+ readonly isRunning: boolean;
31
+ readonly output: string;
32
+ readonly startedAt: string;
33
+ readonly finishedAt: string | null;
34
+ readonly exitCode: number | null;
35
+ readonly signal: string | null;
36
+ };
37
+
22
38
  /**
23
39
  * Supported runner options shown by the standalone UI.
24
40
  */
@@ -30,6 +46,22 @@ const RUNNER_OPTIONS = [
30
46
  { value: 'gemini', label: 'Gemini' },
31
47
  ] as const;
32
48
 
49
+ /**
50
+ * Contextual UI copy for the runner authentication terminal.
51
+ */
52
+ const AUTHENTICATION_HINTS: Record<string, string> = {
53
+ 'github-copilot':
54
+ 'Start the terminal, run `/login` if Copilot asks for it, trust the installation directory, and exit the CLI once the signed-in status is shown.',
55
+ 'openai-codex':
56
+ 'Start the terminal and follow the Codex CLI login flow there. Paste any prompted device or browser code in your browser, then exit the CLI when authentication succeeds.',
57
+ 'claude-code':
58
+ 'Start the terminal and complete the Claude Code login or project-trust prompts directly in the embedded terminal, then exit the CLI once it is ready.',
59
+ opencode:
60
+ 'Start the terminal and complete the Opencode authentication flow directly there, including any browser/device confirmation, then exit the CLI.',
61
+ gemini:
62
+ 'Start the terminal and complete the Gemini CLI authentication prompts there, then exit the CLI after it confirms that the runner is ready.',
63
+ };
64
+
33
65
  /**
34
66
  * Shared input styling for code-runner controls.
35
67
  */
@@ -46,21 +78,48 @@ export function CodeRunnersClient() {
46
78
  const [status, setStatus] = useState('');
47
79
  const [isLoading, setIsLoading] = useState(true);
48
80
  const [isSaving, setIsSaving] = useState(false);
49
- const [errorMessage, setErrorMessage] = useState<string | null>(null);
50
- const [successMessage, setSuccessMessage] = useState<string | null>(null);
81
+ const [configurationErrorMessage, setConfigurationErrorMessage] = useState<string | null>(null);
82
+ const [configurationSuccessMessage, setConfigurationSuccessMessage] = useState<string | null>(null);
51
83
  const [applyOutput, setApplyOutput] = useState<string | null>(null);
52
-
53
- useEffect(() => {
54
- void loadConfiguration();
55
- }, []);
84
+ const authenticationTerminal = useAdminTerminalSession<CodeRunnerAuthenticationSession>({
85
+ basePath: '/api/admin/code-runners/authentication',
86
+ loadErrorMessage: 'Failed to load the authentication session.',
87
+ startErrorMessage: 'Failed to start the authentication session.',
88
+ sendErrorMessage: 'Failed to send authentication input.',
89
+ stopErrorMessage: 'Failed to stop the authentication session.',
90
+ startSuccessMessage: 'Runner authentication terminal started.',
91
+ finishSuccessMessage: 'Runner authentication finished.',
92
+ finishErrorMessage: 'Runner authentication session ended with an error.',
93
+ });
94
+ const {
95
+ session: authenticationSession,
96
+ input: authenticationInput,
97
+ setInput: setAuthenticationInput,
98
+ isStarting: isStartingAuthentication,
99
+ isSending: isSendingAuthenticationInput,
100
+ isStopping: isStoppingAuthentication,
101
+ errorMessage: authenticationErrorMessage,
102
+ successMessage: authenticationSuccessMessage,
103
+ clearMessages: clearAuthenticationMessages,
104
+ loadSession: loadAuthenticationSession,
105
+ startSession: startAuthenticationSession,
106
+ sendInput: sendAuthenticationInput,
107
+ stopSession: stopAuthenticationSession,
108
+ } = authenticationTerminal;
109
+ const authenticationHint =
110
+ AUTHENTICATION_HINTS[agent] ||
111
+ 'Start the terminal, complete the runner authentication flow there, and exit the CLI when the runner is ready.';
112
+ const errorMessage = configurationErrorMessage ?? authenticationErrorMessage;
113
+ const successMessage = configurationSuccessMessage ?? authenticationSuccessMessage;
56
114
 
57
115
  /**
58
116
  * Loads current code-runner settings.
59
117
  */
60
- async function loadConfiguration(): Promise<void> {
118
+ const loadConfiguration = useCallback(async (): Promise<void> => {
61
119
  try {
62
120
  setIsLoading(true);
63
- setErrorMessage(null);
121
+ setConfigurationErrorMessage(null);
122
+
64
123
  const response = await fetch('/api/admin/code-runners', { cache: 'no-store' });
65
124
  const payload = (await response.json()) as CodeRunnersResponse;
66
125
 
@@ -72,12 +131,28 @@ export function CodeRunnersClient() {
72
131
  setModel(payload.model || 'gpt-5.4');
73
132
  setThinkingLevel(payload.thinkingLevel || 'xhigh');
74
133
  setStatus(payload.status || '');
134
+
135
+ await loadAuthenticationSession();
75
136
  } catch (error) {
76
- setErrorMessage(error instanceof Error ? error.message : 'Failed to load code-runner configuration.');
137
+ setConfigurationErrorMessage(
138
+ error instanceof Error ? error.message : 'Failed to load code-runner configuration.',
139
+ );
77
140
  } finally {
78
141
  setIsLoading(false);
79
142
  }
80
- }
143
+ }, [loadAuthenticationSession]);
144
+
145
+ useEffect(() => {
146
+ void loadConfiguration();
147
+ }, [loadConfiguration]);
148
+
149
+ useEffect(() => {
150
+ if (!authenticationSession?.finishedAt) {
151
+ return;
152
+ }
153
+
154
+ void loadConfiguration();
155
+ }, [authenticationSession?.finishedAt, loadConfiguration]);
81
156
 
82
157
  /**
83
158
  * Saves code-runner settings into `.env`.
@@ -85,8 +160,9 @@ export function CodeRunnersClient() {
85
160
  async function saveConfiguration(applyRuntimeConfiguration: boolean): Promise<void> {
86
161
  try {
87
162
  setIsSaving(true);
88
- setErrorMessage(null);
89
- setSuccessMessage(null);
163
+ setConfigurationErrorMessage(null);
164
+ setConfigurationSuccessMessage(null);
165
+ clearAuthenticationMessages();
90
166
  setApplyOutput(null);
91
167
 
92
168
  const response = await fetch('/api/admin/code-runners', {
@@ -107,13 +183,15 @@ export function CodeRunnersClient() {
107
183
  setThinkingLevel(payload.thinkingLevel || thinkingLevel);
108
184
  setStatus(payload.status || '');
109
185
  setApplyOutput(payload.applyResult?.output || null);
110
- setSuccessMessage(
186
+ setConfigurationSuccessMessage(
111
187
  applyRuntimeConfiguration
112
188
  ? 'Code-runner configuration was saved and applied.'
113
189
  : 'Code-runner configuration was saved.',
114
190
  );
115
191
  } catch (error) {
116
- setErrorMessage(error instanceof Error ? error.message : 'Failed to save code-runner configuration.');
192
+ setConfigurationErrorMessage(
193
+ error instanceof Error ? error.message : 'Failed to save code-runner configuration.',
194
+ );
117
195
  } finally {
118
196
  setIsSaving(false);
119
197
  }
@@ -146,7 +224,7 @@ export function CodeRunnersClient() {
146
224
  <select
147
225
  value={agent}
148
226
  onChange={(event) => setAgent(event.target.value)}
149
- disabled={isLoading || isSaving}
227
+ disabled={isLoading || isSaving || isStartingAuthentication}
150
228
  className={INPUT_CLASS_NAME}
151
229
  >
152
230
  {RUNNER_OPTIONS.map((option) => (
@@ -162,7 +240,7 @@ export function CodeRunnersClient() {
162
240
  type="text"
163
241
  value={model}
164
242
  onChange={(event) => setModel(event.target.value)}
165
- disabled={isLoading || isSaving}
243
+ disabled={isLoading || isSaving || isStartingAuthentication}
166
244
  className={INPUT_CLASS_NAME}
167
245
  />
168
246
  </label>
@@ -172,7 +250,7 @@ export function CodeRunnersClient() {
172
250
  type="text"
173
251
  value={thinkingLevel}
174
252
  onChange={(event) => setThinkingLevel(event.target.value)}
175
- disabled={isLoading || isSaving}
253
+ disabled={isLoading || isSaving || isStartingAuthentication}
176
254
  className={INPUT_CLASS_NAME}
177
255
  />
178
256
  </label>
@@ -182,7 +260,7 @@ export function CodeRunnersClient() {
182
260
  <button
183
261
  type="button"
184
262
  onClick={() => void saveConfiguration(false)}
185
- disabled={isLoading || isSaving}
263
+ disabled={isLoading || isSaving || isStartingAuthentication}
186
264
  className="inline-flex items-center gap-2 rounded-md bg-blue-600 px-4 py-2 text-sm font-semibold text-white hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-60"
187
265
  >
188
266
  {isSaving ? <Loader2 className="h-4 w-4 animate-spin" /> : <Save className="h-4 w-4" />}
@@ -191,7 +269,7 @@ export function CodeRunnersClient() {
191
269
  <button
192
270
  type="button"
193
271
  onClick={() => void saveConfiguration(true)}
194
- disabled={isLoading || isSaving}
272
+ disabled={isLoading || isSaving || isStartingAuthentication}
195
273
  className="inline-flex items-center gap-2 rounded-md border border-slate-300 bg-white px-4 py-2 text-sm font-semibold text-slate-700 hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-60"
196
274
  >
197
275
  {isSaving ? <Loader2 className="h-4 w-4 animate-spin" /> : <ServerCog className="h-4 w-4" />}
@@ -206,20 +284,32 @@ export function CodeRunnersClient() {
206
284
  </pre>
207
285
  ) : null}
208
286
 
209
- <Card className="hover:border-gray-200 hover:shadow-md">
210
- <div className="space-y-3">
211
- <h2 className="text-lg font-semibold text-slate-900">Authentication</h2>
212
- <p className="text-sm text-slate-600">
213
- GitHub Copilot still requires an interactive CLI login and project trust setup on the VPS
214
- terminal. Use <span className="font-mono">sudo -u $USER copilot</span>, run{' '}
215
- <span className="font-mono">/login</span> when prompted, trust the install directory, then
216
- restart the pm2 process.
217
- </p>
218
- <pre className="max-h-64 overflow-auto rounded-xl border border-slate-200 bg-slate-950 p-4 text-xs text-slate-100">
219
- {status || 'Runner status was not available.'}
220
- </pre>
221
- </div>
222
- </Card>
287
+ <AdminTerminalCard
288
+ title="Authentication"
289
+ description="Save runner changes first if you want to authenticate a different CLI, then start the saved-runner terminal here instead of SSHing into the VPS."
290
+ hint={authenticationHint}
291
+ session={authenticationSession}
292
+ input={authenticationInput}
293
+ onInputChange={setAuthenticationInput}
294
+ onStart={() => void startAuthenticationSession()}
295
+ onStop={() => void stopAuthenticationSession()}
296
+ onSend={(input) => void sendAuthenticationInput(input)}
297
+ isLoading={isLoading}
298
+ isStarting={isStartingAuthentication}
299
+ isSending={isSendingAuthenticationInput}
300
+ isStopping={isStoppingAuthentication}
301
+ startLabel="Authenticate saved runner"
302
+ runningLabel="Authentication running"
303
+ stopLabel="Stop terminal"
304
+ outputLabel="Live authentication terminal"
305
+ outputEmptyState="No authentication session output yet. Start the saved-runner terminal to see the live authentication log here."
306
+ inputPlaceholder="Type a terminal command such as /login and send it to the running runner CLI"
307
+ quickActions={[{ label: 'Send Enter', input: '\n' }]}
308
+ >
309
+ <pre className="max-h-64 overflow-auto rounded-xl border border-slate-200 bg-slate-950 p-4 text-xs text-slate-100">
310
+ {status || 'Runner status was not available.'}
311
+ </pre>
312
+ </AdminTerminalCard>
223
313
  </div>
224
314
  );
225
315
  }