@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.
- package/apps/agents-server/playwright.config.ts +2 -1
- package/apps/agents-server/src/app/admin/cli-access/CliAccessClient.tsx +99 -0
- package/apps/agents-server/src/app/admin/cli-access/page.tsx +14 -0
- package/apps/agents-server/src/app/admin/code-runners/CodeRunnersClient.tsx +124 -34
- package/apps/agents-server/src/app/admin/servers/CreateServerDialog.tsx +46 -505
- package/apps/agents-server/src/app/admin/servers/ServersClient.tsx +23 -11
- package/apps/agents-server/src/app/admin/servers/ServersRegistryApi.ts +5 -0
- package/apps/agents-server/src/app/admin/servers/ServersRegistryDnsTypes.ts +87 -0
- package/apps/agents-server/src/app/admin/servers/ServersRegistryTable.tsx +258 -128
- package/apps/agents-server/src/app/admin/servers/useCreateServerWizard.ts +46 -334
- package/apps/agents-server/src/app/admin/servers/useServersRegistryState.ts +26 -2
- package/apps/agents-server/src/app/admin/update/UpdateClient.tsx +435 -0
- package/apps/agents-server/src/app/admin/update/page.tsx +14 -0
- package/apps/agents-server/src/app/agents/[agentName]/chat/CanonicalAgentChatSurface.tsx +24 -0
- package/apps/agents-server/src/app/api/admin/cli-access/route.ts +137 -0
- package/apps/agents-server/src/app/api/admin/code-runners/authentication/route.ts +140 -0
- package/apps/agents-server/src/app/api/admin/code-runners/route.ts +4 -35
- package/apps/agents-server/src/app/api/admin/servers/[serverId]/route.ts +7 -2
- package/apps/agents-server/src/app/api/admin/servers/route.ts +95 -4
- package/apps/agents-server/src/app/api/admin/update/route.ts +52 -0
- package/apps/agents-server/src/app/api/auth/login/route.ts +8 -0
- package/apps/agents-server/src/app/api/auth/logout/route.ts +10 -2
- package/apps/agents-server/src/app/api/chat/export/pdf/route.ts +63 -0
- package/apps/agents-server/src/app/page.tsx +10 -0
- package/apps/agents-server/src/components/AdminTerminal/AdminTerminalCard.tsx +279 -0
- package/apps/agents-server/src/components/AdminTerminal/useAdminTerminalSession.ts +336 -0
- package/apps/agents-server/src/components/Header/buildHeaderSystemMenuItems.ts +10 -0
- package/apps/agents-server/src/languages/ServerTranslationKeys.ts +2 -0
- package/apps/agents-server/src/languages/translations/czech.yaml +2 -0
- package/apps/agents-server/src/languages/translations/english.yaml +2 -0
- package/apps/agents-server/src/middleware.ts +32 -0
- package/apps/agents-server/src/tools/BrowserConnectionProvider.ts +1 -1
- package/apps/agents-server/src/utils/chatExport/downloadChatPdfFromServer.ts +59 -0
- package/apps/agents-server/src/utils/chatExport/renderHtmlToPdfOnServer.ts +37 -0
- package/apps/agents-server/src/utils/codeRunnerAuthentication.ts +234 -0
- package/apps/agents-server/src/utils/codeRunnerConfiguration.ts +67 -0
- package/apps/agents-server/src/utils/createInteractiveTerminalEventStream.ts +84 -0
- package/apps/agents-server/src/utils/interactiveTerminalSession.ts +442 -0
- package/apps/agents-server/src/utils/serverCliAccess.ts +221 -0
- package/apps/agents-server/src/utils/serverManagement/standaloneVpsServerMetadata.ts +145 -0
- package/apps/agents-server/src/utils/serverRegistry.ts +3 -2
- package/apps/agents-server/src/utils/session.ts +37 -9
- package/apps/agents-server/src/utils/shibboleth/createShibbolethAuthenticationLogPayload.ts +173 -0
- package/apps/agents-server/src/utils/shibboleth/writeShibbolethAuthenticationLog.ts +27 -0
- package/apps/agents-server/src/utils/standaloneVpsDnsDiagnostics.ts +258 -0
- package/apps/agents-server/src/utils/standaloneVpsRawIpBootstrap.ts +87 -0
- package/apps/agents-server/src/utils/vpsConfiguration.ts +87 -13
- package/apps/agents-server/src/utils/vpsSelfUpdate.ts +664 -0
- package/esm/apps/agents-server/src/utils/serverRegistry.d.ts +1 -1
- package/esm/index.es.js +7 -5
- package/esm/index.es.js.map +1 -1
- package/esm/src/book-components/Chat/Chat/ChatActionsBar.d.ts +2 -0
- package/esm/src/book-components/Chat/Chat/ChatProps.d.ts +6 -0
- package/esm/src/book-components/Chat/save/_common/ChatSaveFormatHandler.d.ts +35 -0
- package/esm/src/book-components/Chat/save/_common/createChatExportFilename.d.ts +11 -0
- package/esm/src/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/book-components/Chat/Chat/Chat.tsx +2 -0
- package/src/book-components/Chat/Chat/ChatActionsBar.tsx +17 -9
- package/src/book-components/Chat/Chat/ChatProps.tsx +7 -0
- package/src/book-components/Chat/save/_common/ChatSaveFormatHandler.ts +40 -0
- package/src/book-components/Chat/save/_common/createChatExportFilename.ts +20 -0
- package/src/book-components/Chat/utils/renderMarkdown.ts +1 -3
- package/src/other/templates/getTemplatesPipelineCollection.ts +718 -790
- package/src/scrapers/document/DocumentScraper.ts +1 -1
- package/src/scrapers/document-legacy/LegacyDocumentScraper.ts +1 -1
- package/src/version.ts +2 -2
- package/src/versions.txt +2 -0
- package/umd/apps/agents-server/src/utils/serverRegistry.d.ts +1 -1
- package/umd/index.umd.js +7 -5
- package/umd/index.umd.js.map +1 -1
- package/umd/src/book-components/Chat/Chat/ChatActionsBar.d.ts +2 -0
- package/umd/src/book-components/Chat/Chat/ChatProps.d.ts +6 -0
- package/umd/src/book-components/Chat/save/_common/ChatSaveFormatHandler.d.ts +35 -0
- package/umd/src/book-components/Chat/save/_common/createChatExportFilename.d.ts +11 -0
- package/umd/src/version.d.ts +1 -1
- package/src/conversion/validation/_importPipeline.ts +0 -88
- /package/esm/src/conversion/validation/{_importPipeline.d.ts → _importPipeline.test.d.ts} +0 -0
- /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:
|
|
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 [
|
|
50
|
-
const [
|
|
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
|
-
|
|
54
|
-
|
|
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
|
-
|
|
118
|
+
const loadConfiguration = useCallback(async (): Promise<void> => {
|
|
61
119
|
try {
|
|
62
120
|
setIsLoading(true);
|
|
63
|
-
|
|
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
|
-
|
|
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
|
-
|
|
89
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
<
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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
|
}
|