libre-webui 0.19.6 → 0.21.0
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/README.md +32 -22
- package/backend/dist/db.d.ts.map +1 -1
- package/backend/dist/db.js +31 -0
- package/backend/dist/db.js.map +1 -1
- package/backend/dist/index.d.ts.map +1 -1
- package/backend/dist/index.js +14 -10
- package/backend/dist/index.js.map +1 -1
- package/backend/dist/routes/chat.d.ts.map +1 -1
- package/backend/dist/routes/chat.js +97 -10
- package/backend/dist/routes/chat.js.map +1 -1
- package/backend/dist/routes/libreClaw.d.ts.map +1 -1
- package/backend/dist/routes/libreClaw.js +41 -0
- package/backend/dist/routes/libreClaw.js.map +1 -1
- package/backend/dist/routes/ollama.d.ts.map +1 -1
- package/backend/dist/routes/ollama.js +52 -2
- package/backend/dist/routes/ollama.js.map +1 -1
- package/backend/dist/routes/search.d.ts +3 -0
- package/backend/dist/routes/search.d.ts.map +1 -0
- package/backend/dist/routes/search.js +143 -0
- package/backend/dist/routes/search.js.map +1 -0
- package/backend/dist/routes/work.d.ts.map +1 -1
- package/backend/dist/routes/work.js +138 -4
- package/backend/dist/routes/work.js.map +1 -1
- package/backend/dist/services/agentAccessService.d.ts +6 -0
- package/backend/dist/services/agentAccessService.d.ts.map +1 -0
- package/backend/dist/services/agentAccessService.js +58 -0
- package/backend/dist/services/agentAccessService.js.map +1 -0
- package/backend/dist/services/agentCliService.d.ts.map +1 -1
- package/backend/dist/services/agentCliService.js +2 -1
- package/backend/dist/services/agentCliService.js.map +1 -1
- package/backend/dist/services/authService.d.ts +1 -0
- package/backend/dist/services/authService.d.ts.map +1 -1
- package/backend/dist/services/authService.js +2 -0
- package/backend/dist/services/authService.js.map +1 -1
- package/backend/dist/services/documentService.d.ts +2 -0
- package/backend/dist/services/documentService.d.ts.map +1 -1
- package/backend/dist/services/documentService.js +51 -23
- package/backend/dist/services/documentService.js.map +1 -1
- package/backend/dist/services/modelAccessService.d.ts +12 -0
- package/backend/dist/services/modelAccessService.d.ts.map +1 -0
- package/backend/dist/services/modelAccessService.js +66 -0
- package/backend/dist/services/modelAccessService.js.map +1 -0
- package/backend/dist/services/systemDiagnosticsService.d.ts +4 -3
- package/backend/dist/services/systemDiagnosticsService.d.ts.map +1 -1
- package/backend/dist/services/systemDiagnosticsService.js +35 -34
- package/backend/dist/services/systemDiagnosticsService.js.map +1 -1
- package/backend/dist/services/webSearchService.d.ts +64 -0
- package/backend/dist/services/webSearchService.d.ts.map +1 -0
- package/backend/dist/services/webSearchService.js +230 -0
- package/backend/dist/services/webSearchService.js.map +1 -0
- package/backend/dist/services/workAccessService.d.ts +15 -0
- package/backend/dist/services/workAccessService.d.ts.map +1 -0
- package/backend/dist/services/workAccessService.js +67 -0
- package/backend/dist/services/workAccessService.js.map +1 -0
- package/backend/dist/services/workAdminService.d.ts +67 -0
- package/backend/dist/services/workAdminService.d.ts.map +1 -0
- package/backend/dist/services/workAdminService.js +92 -0
- package/backend/dist/services/workAdminService.js.map +1 -0
- package/backend/dist/services/workAgentGuidance.d.ts +1 -0
- package/backend/dist/services/workAgentGuidance.d.ts.map +1 -1
- package/backend/dist/services/workAgentGuidance.js +3 -0
- package/backend/dist/services/workAgentGuidance.js.map +1 -1
- package/backend/dist/services/workAgentService.d.ts +6 -0
- package/backend/dist/services/workAgentService.d.ts.map +1 -1
- package/backend/dist/services/workAgentService.js +199 -11
- package/backend/dist/services/workAgentService.js.map +1 -1
- package/backend/dist/services/workKubernetesDriver.d.ts +74 -0
- package/backend/dist/services/workKubernetesDriver.d.ts.map +1 -0
- package/backend/dist/services/workKubernetesDriver.js +659 -0
- package/backend/dist/services/workKubernetesDriver.js.map +1 -0
- package/backend/dist/services/workPolicyService.d.ts +58 -0
- package/backend/dist/services/workPolicyService.d.ts.map +1 -0
- package/backend/dist/services/workPolicyService.js +299 -0
- package/backend/dist/services/workPolicyService.js.map +1 -0
- package/backend/dist/services/workPreviewProxyService.d.ts +7 -1
- package/backend/dist/services/workPreviewProxyService.d.ts.map +1 -1
- package/backend/dist/services/workPreviewProxyService.js +36 -8
- package/backend/dist/services/workPreviewProxyService.js.map +1 -1
- package/backend/dist/services/workRuntimeDriver.d.ts +166 -0
- package/backend/dist/services/workRuntimeDriver.d.ts.map +1 -0
- package/backend/dist/services/workRuntimeDriver.js +737 -0
- package/backend/dist/services/workRuntimeDriver.js.map +1 -0
- package/backend/dist/services/workRuntimeService.d.ts +60 -51
- package/backend/dist/services/workRuntimeService.d.ts.map +1 -1
- package/backend/dist/services/workRuntimeService.js +310 -658
- package/backend/dist/services/workRuntimeService.js.map +1 -1
- package/backend/dist/services/workRuntimeShared.d.ts +83 -0
- package/backend/dist/services/workRuntimeShared.d.ts.map +1 -0
- package/backend/dist/services/workRuntimeShared.js +136 -0
- package/backend/dist/services/workRuntimeShared.js.map +1 -0
- package/backend/dist/services/workTaskService.d.ts +6 -1
- package/backend/dist/services/workTaskService.d.ts.map +1 -1
- package/backend/dist/services/workTaskService.js +18 -3
- package/backend/dist/services/workTaskService.js.map +1 -1
- package/backend/dist/services/workTerminalService.d.ts +2 -22
- package/backend/dist/services/workTerminalService.d.ts.map +1 -1
- package/backend/dist/services/workTerminalService.js +10 -127
- package/backend/dist/services/workTerminalService.js.map +1 -1
- package/backend/dist/storage.d.ts.map +1 -1
- package/backend/dist/storage.js +3 -3
- package/backend/dist/storage.js.map +1 -1
- package/backend/dist/storageMappers.d.ts +1 -0
- package/backend/dist/storageMappers.d.ts.map +1 -1
- package/backend/dist/storageMappers.js +1 -0
- package/backend/dist/storageMappers.js.map +1 -1
- package/backend/dist/types/index.d.ts +1 -0
- package/backend/dist/types/index.d.ts.map +1 -1
- package/backend/dist/types/index.js.map +1 -1
- package/backend/dist/types/work.d.ts +4 -0
- package/backend/dist/types/work.d.ts.map +1 -1
- package/backend/dist/utils/chatDocumentContext.d.ts +7 -0
- package/backend/dist/utils/chatDocumentContext.d.ts.map +1 -1
- package/backend/dist/utils/chatDocumentContext.js +38 -30
- package/backend/dist/utils/chatDocumentContext.js.map +1 -1
- package/backend/dist/utils/dockerEndpoint.d.ts +37 -0
- package/backend/dist/utils/dockerEndpoint.d.ts.map +1 -0
- package/backend/dist/utils/dockerEndpoint.js +72 -0
- package/backend/dist/utils/dockerEndpoint.js.map +1 -0
- package/backend/dist/websocketServer.d.ts.map +1 -1
- package/backend/dist/websocketServer.js +79 -15
- package/backend/dist/websocketServer.js.map +1 -1
- package/backend/dist/workTerminalServer.d.ts.map +1 -1
- package/backend/dist/workTerminalServer.js +6 -5
- package/backend/dist/workTerminalServer.js.map +1 -1
- package/backend/package.json +2 -1
- package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
- package/frontend/dist/assets/index-0wfi-EpC.js +40 -0
- package/frontend/dist/assets/index-D7m1zWWg.css +1 -0
- package/frontend/dist/index.html +12 -11
- package/frontend/dist/js/ArtifactContainer-DPRPcuES.js +1 -0
- package/frontend/dist/js/{ArtifactDemoPage-Big00RwH.js → ArtifactDemoPage-DzwPlz9J.js} +1 -1
- package/frontend/dist/js/{ArtifactSandboxFrame-C_S4j076.js → ArtifactSandboxFrame-CKi4mSTH.js} +2 -2
- package/frontend/dist/js/{ArtifactSlideOutPanel-B4-D3HkB.js → ArtifactSlideOutPanel-BskRCzP0.js} +1 -1
- package/frontend/dist/js/ChatPage-DRutCyJ5.js +16 -0
- package/frontend/dist/js/FirstTimeSetup-DU50YWrE.js +1 -0
- package/frontend/dist/js/GalleryPage-DxXIUesf.js +1 -0
- package/frontend/dist/js/HomePage-Bew9kMKx.js +1 -0
- package/frontend/dist/js/{LibreClawPage-B14Go5Mn.js → LibreClawPage-Cy9y3YlF.js} +1 -1
- package/frontend/dist/js/{ModelManagerModals-D9j9RECi.js → ModelManagerModals-D-NxeVvV.js} +1 -1
- package/frontend/dist/js/ModelSelector-DXDcDmDR.js +1 -0
- package/frontend/dist/js/ModelsPage-Bj2reiF9.js +2 -0
- package/frontend/dist/js/{NotesPage-BwEMW-Z3.js → NotesPage-CJKEbj3J.js} +1 -1
- package/frontend/dist/js/{PersonasPage-e-CbTxP3.js → PersonasPage-bgWF9S7b.js} +2 -2
- package/frontend/dist/js/{PluginUsagePage-CvZMJJwv.js → PluginUsagePage-CRkD1Tz6.js} +1 -1
- package/frontend/dist/js/{RichMessageContent-DNl3_CIw.js → RichMessageContent-DeNjCiyN.js} +1 -1
- package/frontend/dist/js/SettingsModal-BUUlkZcv.js +1 -0
- package/frontend/dist/js/SettingsToggle-bZ5W4CCf.js +1 -0
- package/frontend/dist/js/SystemPage-DcO51urv.js +1 -0
- package/frontend/dist/js/UserManagementPage-DLiYw6xG.js +1 -0
- package/frontend/dist/js/WorkPage-MMQ0Y0U5.js +5 -0
- package/frontend/dist/js/api-CZURQtuc.js +14 -0
- package/frontend/dist/js/{appStore-BpoXhleX.js → appStore-sGaWMSDr.js} +2 -2
- package/frontend/dist/js/ar-Bm27TCMQ.js +2 -0
- package/frontend/dist/js/authStore-uaj0hswV.js +4 -0
- package/frontend/dist/js/bn-C7CHC42H.js +2 -0
- package/frontend/dist/js/{chatStore-CWqfsOjc.js → chatStore-tRx0Ulq0.js} +2 -2
- package/frontend/dist/js/{config-CuXlcWP1.js → config-D-jxRG52.js} +1 -1
- package/frontend/dist/js/cs-zGEtwQn_.js +2 -0
- package/frontend/dist/js/da-B-0sHNTu.js +2 -0
- package/frontend/dist/js/de-UZNE6t2h.js +2 -0
- package/frontend/dist/js/es-CPLnFYIw.js +2 -0
- package/frontend/dist/js/{estree-BuWOCMW0.js → estree-CRuerC6a.js} +1 -1
- package/frontend/dist/js/fr-Br1o0WVz.js +2 -0
- package/frontend/dist/js/hi-BcEvNEpb.js +2 -0
- package/frontend/dist/js/{html-D7tW7UvW.js → html-BYKlz3Jp.js} +1 -1
- package/frontend/dist/js/i18n-DJTg6xWw.js +2 -0
- package/frontend/dist/js/id-C30L2DoT.js +2 -0
- package/frontend/dist/js/is-BAEhfi5Z.js +2 -0
- package/frontend/dist/js/it-HWnfQXZY.js +2 -0
- package/frontend/dist/js/ja-Dvux1mon.js +2 -0
- package/frontend/dist/js/ko-agDQ__KP.js +2 -0
- package/frontend/dist/js/{markdown-CBSxWEtK.js → markdown-DFy8bILU.js} +1 -1
- package/frontend/dist/js/{messageCodeStyles-BlTi46wI.js → messageCodeStyles-_gGirbe-.js} +2 -2
- package/frontend/dist/js/ms-aNRa2QX7.js +2 -0
- package/frontend/dist/js/nl-BtkiDUn-.js +2 -0
- package/frontend/dist/js/pl-SEO0lBnX.js +2 -0
- package/frontend/dist/js/pt-BYtjmvq1.js +2 -0
- package/frontend/dist/js/ru-B-ynj2hU.js +2 -0
- package/frontend/dist/js/{standalone-CaXys7q3.js → standalone-jOqWoOmp.js} +1 -1
- package/frontend/dist/js/sv-CliKR15U.js +2 -0
- package/frontend/dist/js/th-DJQyDr9J.js +2 -0
- package/frontend/dist/js/tr-BBGKZ1la.js +2 -0
- package/frontend/dist/js/{typescript-DQ5zi5zo.js → typescript-TwGXpgeF.js} +1 -1
- package/frontend/dist/js/{ui-DFQiHo_k.js → ui-DSFUl2vT.js} +2 -2
- package/frontend/dist/js/{ui-vendor-D_pYT79f.js → ui-vendor-xUzKqAXI.js} +1 -1
- package/frontend/dist/js/uk-C1GcFWxE.js +2 -0
- package/frontend/dist/js/vi-CIxgICOQ.js +2 -0
- package/frontend/dist/js/workApi-kClHFVkJ.js +6 -0
- package/frontend/dist/js/zh-Cm7vsQ9s.js +2 -0
- package/package.json +4 -3
- package/frontend/dist/assets/index-Cd0_AoYV.js +0 -23
- package/frontend/dist/assets/index-DtkGuqvC.css +0 -1
- package/frontend/dist/js/ArtifactContainer-Dy_1KKWg.js +0 -1
- package/frontend/dist/js/ChatPage-BkFd1iac.js +0 -16
- package/frontend/dist/js/FirstTimeSetup-C6YxrwR7.js +0 -1
- package/frontend/dist/js/GalleryPage-BtcPs7SO.js +0 -1
- package/frontend/dist/js/HomePage-5PhpAt14.js +0 -1
- package/frontend/dist/js/ModelSelector-C1wN91tl.js +0 -1
- package/frontend/dist/js/ModelsPage-Cc3L0ur8.js +0 -2
- package/frontend/dist/js/SettingsModal-C8KJJEud.js +0 -1
- package/frontend/dist/js/SystemPage-8kEAS71H.js +0 -1
- package/frontend/dist/js/UserManagementPage-BSrZ0ucu.js +0 -1
- package/frontend/dist/js/WorkPage-spf92PVN.js +0 -5
- package/frontend/dist/js/api-MySpmAK8.js +0 -19
- package/frontend/dist/js/ar-ClMsdoTH.js +0 -2
- package/frontend/dist/js/authStore-DmrydYuS.js +0 -3
- package/frontend/dist/js/bn-LyPol_AY.js +0 -2
- package/frontend/dist/js/cs-D98fZaKF.js +0 -2
- package/frontend/dist/js/da-M7ND0GQR.js +0 -2
- package/frontend/dist/js/de-BV0q1kzb.js +0 -2
- package/frontend/dist/js/es-C7FvsVoN.js +0 -2
- package/frontend/dist/js/fr-5SloN0ok.js +0 -2
- package/frontend/dist/js/hi-C6VeRgeR.js +0 -2
- package/frontend/dist/js/i18n-CLd1FZPx.js +0 -2
- package/frontend/dist/js/id-CkVp7Z1Z.js +0 -2
- package/frontend/dist/js/is-DqxnBX4W.js +0 -2
- package/frontend/dist/js/it-CiW4_O5V.js +0 -2
- package/frontend/dist/js/ja-BZ3Sdund.js +0 -2
- package/frontend/dist/js/ko-CS7LAhfJ.js +0 -2
- package/frontend/dist/js/ms-URvcYqgz.js +0 -2
- package/frontend/dist/js/nl-CQJpW7wK.js +0 -2
- package/frontend/dist/js/pl-DDMgPMAz.js +0 -2
- package/frontend/dist/js/pt-JCqqmGn_.js +0 -2
- package/frontend/dist/js/ru-C_dwMbiK.js +0 -2
- package/frontend/dist/js/sv-CW3c9NGx.js +0 -2
- package/frontend/dist/js/th-9ARgClBr.js +0 -2
- package/frontend/dist/js/tr-DNY5_DAg.js +0 -2
- package/frontend/dist/js/uk-XDh4_7IL.js +0 -2
- package/frontend/dist/js/vi-BaoJBXnt.js +0 -2
- package/frontend/dist/js/zh-B202vYJt.js +0 -2
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Libre WebUI
|
|
3
|
+
* Copyright (C) 2025 Kroonen AI, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at:
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Web search through a SearXNG instance. The connection is an
|
|
19
|
+
* administrator-managed persisted setting (the SEARXNG_URL environment
|
|
20
|
+
* variable seeds the default, so the bundled deploy stack works out of the
|
|
21
|
+
* box once an admin flips the toggle). Search stays off until enabled.
|
|
22
|
+
*
|
|
23
|
+
* The backend queries SearXNG's JSON API server-side; result text is
|
|
24
|
+
* bounded before it reaches any model context. The URL is admin-supplied
|
|
25
|
+
* configuration — treated like the Ollama endpoint, not user input.
|
|
26
|
+
*/
|
|
27
|
+
import { getDatabase } from '../db.js';
|
|
28
|
+
import { createLogger } from '../utils/logger.js';
|
|
29
|
+
const logger = createLogger('services:web-search');
|
|
30
|
+
export const WEB_SEARCH_ENABLED_KEY = 'web_search_enabled';
|
|
31
|
+
export const WEB_SEARCH_URL_KEY = 'web_search_url';
|
|
32
|
+
export const WEB_SEARCH_ACCESS_KEY = 'web_search_access';
|
|
33
|
+
export const WEB_SEARCH_MAX_RESULTS_KEY = 'web_search_max_results';
|
|
34
|
+
export const WEB_SEARCH_SAFE_SEARCH_KEY = 'web_search_safe_search';
|
|
35
|
+
export const WEB_SEARCH_DEFAULT_MAX_RESULTS = 6;
|
|
36
|
+
export const WEB_SEARCH_RESULTS_CEILING = 10;
|
|
37
|
+
export function isWebSearchAccessMode(value) {
|
|
38
|
+
return value === 'admins' || value === 'all-users';
|
|
39
|
+
}
|
|
40
|
+
const SEARCH_TIMEOUT_MS = 12000;
|
|
41
|
+
const RESULT_TEXT_MAX_CHARS = 500;
|
|
42
|
+
const QUERY_MAX_CHARS = 400;
|
|
43
|
+
export function normalizeWebSearchMaxResults(value) {
|
|
44
|
+
const parsed = Number(value);
|
|
45
|
+
if (!Number.isInteger(parsed))
|
|
46
|
+
return WEB_SEARCH_DEFAULT_MAX_RESULTS;
|
|
47
|
+
return Math.min(Math.max(parsed, 1), WEB_SEARCH_RESULTS_CEILING);
|
|
48
|
+
}
|
|
49
|
+
function readSetting(key) {
|
|
50
|
+
try {
|
|
51
|
+
const row = getDatabase()
|
|
52
|
+
.prepare('SELECT value FROM system_settings WHERE key = ?')
|
|
53
|
+
.get(key);
|
|
54
|
+
return row?.value;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function writeSetting(key, value) {
|
|
61
|
+
getDatabase()
|
|
62
|
+
.prepare(`INSERT INTO system_settings (key, value, updated_at)
|
|
63
|
+
VALUES (?, ?, ?)
|
|
64
|
+
ON CONFLICT(key) DO UPDATE SET
|
|
65
|
+
value = excluded.value,
|
|
66
|
+
updated_at = excluded.updated_at`)
|
|
67
|
+
.run(key, value, Date.now());
|
|
68
|
+
}
|
|
69
|
+
export function normalizeWebSearchUrl(value) {
|
|
70
|
+
if (typeof value !== 'string')
|
|
71
|
+
return '';
|
|
72
|
+
const trimmed = value.trim().replace(/\/+$/, '');
|
|
73
|
+
if (!trimmed)
|
|
74
|
+
return '';
|
|
75
|
+
let parsed;
|
|
76
|
+
try {
|
|
77
|
+
parsed = new URL(trimmed);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
throw new Error('Search URL must be a valid http(s) URL.');
|
|
81
|
+
}
|
|
82
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
83
|
+
throw new Error('Search URL must use http or https.');
|
|
84
|
+
}
|
|
85
|
+
return trimmed;
|
|
86
|
+
}
|
|
87
|
+
export function getWebSearchConfig() {
|
|
88
|
+
const enabled = readSetting(WEB_SEARCH_ENABLED_KEY) === 'true';
|
|
89
|
+
const storedUrl = readSetting(WEB_SEARCH_URL_KEY);
|
|
90
|
+
const url = storedUrl !== undefined ? storedUrl : (process.env.SEARXNG_URL ?? '');
|
|
91
|
+
const storedMax = readSetting(WEB_SEARCH_MAX_RESULTS_KEY);
|
|
92
|
+
return {
|
|
93
|
+
enabled,
|
|
94
|
+
url,
|
|
95
|
+
available: enabled && url.length > 0,
|
|
96
|
+
maxResults: storedMax !== undefined
|
|
97
|
+
? normalizeWebSearchMaxResults(storedMax)
|
|
98
|
+
: WEB_SEARCH_DEFAULT_MAX_RESULTS,
|
|
99
|
+
// Safe search is on unless an administrator turned it off.
|
|
100
|
+
safeSearch: readSetting(WEB_SEARCH_SAFE_SEARCH_KEY) !== 'false',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
export function setWebSearchConfig(input) {
|
|
104
|
+
const url = normalizeWebSearchUrl(input.url);
|
|
105
|
+
if (input.enabled && !url) {
|
|
106
|
+
throw new Error('Enable web search only with a SearXNG URL configured.');
|
|
107
|
+
}
|
|
108
|
+
writeSetting(WEB_SEARCH_ENABLED_KEY, input.enabled ? 'true' : 'false');
|
|
109
|
+
writeSetting(WEB_SEARCH_URL_KEY, url);
|
|
110
|
+
if (input.maxResults !== undefined) {
|
|
111
|
+
writeSetting(WEB_SEARCH_MAX_RESULTS_KEY, String(normalizeWebSearchMaxResults(input.maxResults)));
|
|
112
|
+
}
|
|
113
|
+
if (input.safeSearch !== undefined) {
|
|
114
|
+
writeSetting(WEB_SEARCH_SAFE_SEARCH_KEY, input.safeSearch ? 'true' : 'false');
|
|
115
|
+
}
|
|
116
|
+
return getWebSearchConfig();
|
|
117
|
+
}
|
|
118
|
+
export function isWebSearchAvailable() {
|
|
119
|
+
return getWebSearchConfig().available;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Who may use web search, mirroring the Work access mode: administrators
|
|
123
|
+
* always may; other active users only when an administrator opens it up in
|
|
124
|
+
* User Management. Defaults to admins-only and fails closed.
|
|
125
|
+
*/
|
|
126
|
+
export function getWebSearchAccessMode() {
|
|
127
|
+
const value = readSetting(WEB_SEARCH_ACCESS_KEY);
|
|
128
|
+
return isWebSearchAccessMode(value) ? value : 'admins';
|
|
129
|
+
}
|
|
130
|
+
export function setWebSearchAccessMode(mode) {
|
|
131
|
+
if (!isWebSearchAccessMode(mode)) {
|
|
132
|
+
throw new Error(`Invalid web search access mode "${String(mode)}".`);
|
|
133
|
+
}
|
|
134
|
+
writeSetting(WEB_SEARCH_ACCESS_KEY, mode);
|
|
135
|
+
}
|
|
136
|
+
/** Whether this user may run web searches right now (search must also be available). */
|
|
137
|
+
export function userCanUseWebSearch(user) {
|
|
138
|
+
if (!user)
|
|
139
|
+
return false;
|
|
140
|
+
if (user.status !== undefined && user.status !== 'active')
|
|
141
|
+
return false;
|
|
142
|
+
if (user.role === 'admin')
|
|
143
|
+
return true;
|
|
144
|
+
return getWebSearchAccessMode() === 'all-users';
|
|
145
|
+
}
|
|
146
|
+
const bounded = (value, max) => typeof value === 'string'
|
|
147
|
+
? value.replace(/\s+/g, ' ').trim().slice(0, max)
|
|
148
|
+
: '';
|
|
149
|
+
export async function webSearch(query, maxResults) {
|
|
150
|
+
const config = getWebSearchConfig();
|
|
151
|
+
if (!config.available) {
|
|
152
|
+
throw new Error('Web search is not enabled on this server.');
|
|
153
|
+
}
|
|
154
|
+
const trimmedQuery = query.trim().slice(0, QUERY_MAX_CHARS);
|
|
155
|
+
if (!trimmedQuery) {
|
|
156
|
+
throw new Error('A search query is required.');
|
|
157
|
+
}
|
|
158
|
+
// Callers (including model tool calls) can request fewer results, never
|
|
159
|
+
// more than the administrator's ceiling.
|
|
160
|
+
const requested = maxResults === undefined
|
|
161
|
+
? config.maxResults
|
|
162
|
+
: Math.max(1, Math.trunc(maxResults));
|
|
163
|
+
const limit = Math.min(requested, config.maxResults);
|
|
164
|
+
const target = new URL(`${config.url}/search`);
|
|
165
|
+
target.searchParams.set('q', trimmedQuery);
|
|
166
|
+
target.searchParams.set('format', 'json');
|
|
167
|
+
target.searchParams.set('safesearch', config.safeSearch ? '1' : '0');
|
|
168
|
+
const controller = new AbortController();
|
|
169
|
+
const timer = setTimeout(() => controller.abort(), SEARCH_TIMEOUT_MS);
|
|
170
|
+
let response;
|
|
171
|
+
try {
|
|
172
|
+
response = await fetch(target, {
|
|
173
|
+
signal: controller.signal,
|
|
174
|
+
headers: { Accept: 'application/json' },
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
logger.warn('Web search request failed:', error);
|
|
179
|
+
throw new Error('The search service could not be reached. Check the SearXNG URL.');
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
clearTimeout(timer);
|
|
183
|
+
}
|
|
184
|
+
if (!response.ok) {
|
|
185
|
+
throw new Error(`The search service answered with HTTP ${response.status}. Confirm the instance allows the JSON format.`);
|
|
186
|
+
}
|
|
187
|
+
let payload;
|
|
188
|
+
try {
|
|
189
|
+
payload = (await response.json());
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
throw new Error('The search service did not return JSON. Enable the json format in the SearXNG settings.');
|
|
193
|
+
}
|
|
194
|
+
const results = [];
|
|
195
|
+
for (const raw of payload.results ?? []) {
|
|
196
|
+
const url = typeof raw.url === 'string' ? raw.url.trim() : '';
|
|
197
|
+
if (!/^https?:\/\//i.test(url))
|
|
198
|
+
continue;
|
|
199
|
+
results.push({
|
|
200
|
+
title: bounded(raw.title, 200) || url,
|
|
201
|
+
url: url.slice(0, 1000),
|
|
202
|
+
content: bounded(raw.content, RESULT_TEXT_MAX_CHARS),
|
|
203
|
+
...(typeof raw.engine === 'string' ? { engine: raw.engine } : {}),
|
|
204
|
+
});
|
|
205
|
+
if (results.length >= limit)
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
return results;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* The latest user message enhanced with search context, mirroring the
|
|
212
|
+
* document-RAG enhancement shape so every provider path benefits.
|
|
213
|
+
*/
|
|
214
|
+
export function buildWebSearchEnhancedContent(content, results, query) {
|
|
215
|
+
if (results.length === 0)
|
|
216
|
+
return content;
|
|
217
|
+
const blocks = results.map((result, index) => `[${index + 1}] ${result.title}\n${result.url}${result.content ? `\n${result.content}` : ''}`);
|
|
218
|
+
return `Web search results for "${query}":\n\n${blocks.join('\n\n')}\n\n---\n\nUsing the search results above when they are relevant, answer the user's message. Cite sources inline with bracketed numbers like [1] where you rely on them.\n\nUser message: ${content}`;
|
|
219
|
+
}
|
|
220
|
+
export default {
|
|
221
|
+
getWebSearchConfig,
|
|
222
|
+
setWebSearchConfig,
|
|
223
|
+
isWebSearchAvailable,
|
|
224
|
+
getWebSearchAccessMode,
|
|
225
|
+
setWebSearchAccessMode,
|
|
226
|
+
userCanUseWebSearch,
|
|
227
|
+
webSearch,
|
|
228
|
+
buildWebSearchEnhancedContent,
|
|
229
|
+
};
|
|
230
|
+
//# sourceMappingURL=webSearchService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webSearchService.js","sourceRoot":"","sources":["../../src/services/webSearchService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type WorkAccessMode = 'admins' | 'all-users';
|
|
2
|
+
export declare const WORK_ACCESS_MODES: readonly WorkAccessMode[];
|
|
3
|
+
export declare const WORK_ACCESS_MODE_KEY = "work_access_mode";
|
|
4
|
+
export declare function isWorkAccessMode(value: unknown): value is WorkAccessMode;
|
|
5
|
+
export declare function getWorkAccessMode(): WorkAccessMode;
|
|
6
|
+
export declare function setWorkAccessMode(mode: WorkAccessMode): void;
|
|
7
|
+
/**
|
|
8
|
+
* Whether a user may use Work right now. Administrators always may; other
|
|
9
|
+
* active accounts may when the mode is opened to all users.
|
|
10
|
+
*/
|
|
11
|
+
export declare function userHasWorkAccess(user: {
|
|
12
|
+
role?: string;
|
|
13
|
+
status?: string;
|
|
14
|
+
}): boolean;
|
|
15
|
+
//# sourceMappingURL=workAccessService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workAccessService.d.ts","sourceRoot":"","sources":["../../src/services/workAccessService.ts"],"names":[],"mappings":"AA+BA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEpD,eAAO,MAAM,iBAAiB,EAAE,SAAS,cAAc,EAGtD,CAAC;AAEF,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAKxE;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAa5D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAIV"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Libre WebUI
|
|
3
|
+
* Copyright (C) 2025 Kroonen AI, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at:
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Who may use Work. The mode is a persisted system setting so an
|
|
19
|
+
* administrator's decision survives restarts and takes effect immediately —
|
|
20
|
+
* every access check reads the current value, mirroring how role demotions
|
|
21
|
+
* are honored mid-session. The default is admins-only: opening Work to all
|
|
22
|
+
* users hands every account a command-executing sandbox, which is safe by
|
|
23
|
+
* construction but is still a decision the administrator must make.
|
|
24
|
+
*
|
|
25
|
+
* Host-folder workspaces are NOT governed by this mode: they bind-mount
|
|
26
|
+
* server paths and therefore stay admin-only regardless of the setting.
|
|
27
|
+
*/
|
|
28
|
+
import { getDatabase } from '../db.js';
|
|
29
|
+
export const WORK_ACCESS_MODES = [
|
|
30
|
+
'admins',
|
|
31
|
+
'all-users',
|
|
32
|
+
];
|
|
33
|
+
export const WORK_ACCESS_MODE_KEY = 'work_access_mode';
|
|
34
|
+
export function isWorkAccessMode(value) {
|
|
35
|
+
return (typeof value === 'string' &&
|
|
36
|
+
WORK_ACCESS_MODES.includes(value));
|
|
37
|
+
}
|
|
38
|
+
export function getWorkAccessMode() {
|
|
39
|
+
const row = getDatabase()
|
|
40
|
+
.prepare('SELECT value FROM system_settings WHERE key = ?')
|
|
41
|
+
.get(WORK_ACCESS_MODE_KEY);
|
|
42
|
+
return isWorkAccessMode(row?.value) ? row.value : 'admins';
|
|
43
|
+
}
|
|
44
|
+
export function setWorkAccessMode(mode) {
|
|
45
|
+
if (!isWorkAccessMode(mode)) {
|
|
46
|
+
throw new Error(`Invalid Work access mode "${String(mode)}".`);
|
|
47
|
+
}
|
|
48
|
+
getDatabase()
|
|
49
|
+
.prepare(`INSERT INTO system_settings (key, value, updated_at)
|
|
50
|
+
VALUES (?, ?, ?)
|
|
51
|
+
ON CONFLICT(key) DO UPDATE SET
|
|
52
|
+
value = excluded.value,
|
|
53
|
+
updated_at = excluded.updated_at`)
|
|
54
|
+
.run(WORK_ACCESS_MODE_KEY, mode, Date.now());
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Whether a user may use Work right now. Administrators always may; other
|
|
58
|
+
* active accounts may when the mode is opened to all users.
|
|
59
|
+
*/
|
|
60
|
+
export function userHasWorkAccess(user) {
|
|
61
|
+
if (user.status !== undefined && user.status !== 'active')
|
|
62
|
+
return false;
|
|
63
|
+
if (user.role === 'admin')
|
|
64
|
+
return true;
|
|
65
|
+
return getWorkAccessMode() === 'all-users';
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=workAccessService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workAccessService.js","sourceRoot":"","sources":["../../src/services/workAccessService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAIvC,MAAM,CAAC,MAAM,iBAAiB,GAA8B;IAC1D,QAAQ;IACR,WAAW;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEvD,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACxB,iBAAuC,CAAC,QAAQ,CAAC,KAAK,CAAC,CACzD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,WAAW,EAAE;SACtB,OAAO,CAAC,iDAAiD,CAAC;SAC1D,GAAG,CAAC,oBAAoB,CAAmC,CAAC;IAC/D,OAAO,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAoB;IACpD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IACD,WAAW,EAAE;SACV,OAAO,CACN;;;;0CAIoC,CACrC;SACA,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAGjC;IACC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACxE,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,iBAAiB,EAAE,KAAK,WAAW,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One aggregated snapshot of everything Work is doing across every user,
|
|
3
|
+
* for the admin System page: task inventory with owners, live runtime
|
|
4
|
+
* state (from the single labeled listing the drivers already provide),
|
|
5
|
+
* terminal sessions, admission headroom, reconciliation state, and the
|
|
6
|
+
* access mode. Read-only: this module never mutates runtime state.
|
|
7
|
+
*/
|
|
8
|
+
import { type WorkAccessMode } from './workAccessService.js';
|
|
9
|
+
import type { WorkTaskRecord } from '../types/work.js';
|
|
10
|
+
export interface WorkAdminTask {
|
|
11
|
+
id: string;
|
|
12
|
+
title: string;
|
|
13
|
+
ownerId: string;
|
|
14
|
+
ownerUsername: string;
|
|
15
|
+
model: string;
|
|
16
|
+
status: string;
|
|
17
|
+
previewStatus: string;
|
|
18
|
+
networkEnabled: boolean;
|
|
19
|
+
hostWorkspace: boolean;
|
|
20
|
+
/** null when the runtime could not be asked (backend unavailable). */
|
|
21
|
+
running: boolean | null;
|
|
22
|
+
terminalSessions: number;
|
|
23
|
+
updatedAt: number;
|
|
24
|
+
}
|
|
25
|
+
export interface WorkAdminOverview {
|
|
26
|
+
generatedAt: number;
|
|
27
|
+
accessMode: WorkAccessMode;
|
|
28
|
+
runtimeAvailable: boolean;
|
|
29
|
+
runtimeReason?: string;
|
|
30
|
+
recoveryPending: number;
|
|
31
|
+
admission: {
|
|
32
|
+
activeGlobal: number;
|
|
33
|
+
maxGlobal: number;
|
|
34
|
+
maxPerUser: number;
|
|
35
|
+
};
|
|
36
|
+
tasks: WorkAdminTask[];
|
|
37
|
+
/** Managed containers whose task record no longer exists. */
|
|
38
|
+
orphanContainers: Array<{
|
|
39
|
+
name: string;
|
|
40
|
+
taskId: string;
|
|
41
|
+
running: boolean;
|
|
42
|
+
}>;
|
|
43
|
+
}
|
|
44
|
+
interface WorkAdminDeps {
|
|
45
|
+
listTasksWithOwner: () => Array<{
|
|
46
|
+
record: WorkTaskRecord;
|
|
47
|
+
ownerUsername: string;
|
|
48
|
+
}>;
|
|
49
|
+
listManaged: () => Promise<Array<{
|
|
50
|
+
name: string;
|
|
51
|
+
taskId: string;
|
|
52
|
+
running: boolean;
|
|
53
|
+
}>>;
|
|
54
|
+
isRuntimeAvailable: () => Promise<boolean>;
|
|
55
|
+
runtimeUnavailableReason: () => string | null;
|
|
56
|
+
sessionCount: (taskId: string) => number;
|
|
57
|
+
activeGlobal: () => number;
|
|
58
|
+
limits: () => {
|
|
59
|
+
maxGlobal: number;
|
|
60
|
+
maxPerUser: number;
|
|
61
|
+
};
|
|
62
|
+
recoveryPending: () => number;
|
|
63
|
+
accessMode: () => WorkAccessMode;
|
|
64
|
+
}
|
|
65
|
+
export declare function buildWorkAdminOverview(deps?: WorkAdminDeps): Promise<WorkAdminOverview>;
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=workAdminService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workAdminService.d.ts","sourceRoot":"","sources":["../../src/services/workAdminService.ts"],"names":[],"mappings":"AAiBA;;;;;;GAMG;AAEH,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAIhF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,sEAAsE;IACtE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,cAAc,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE;QACT,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,6DAA6D;IAC7D,gBAAgB,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC7E;AAED,UAAU,aAAa;IACrB,kBAAkB,EAAE,MAAM,KAAK,CAAC;QAC9B,MAAM,EAAE,cAAc,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;IACH,WAAW,EAAE,MAAM,OAAO,CACxB,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAC1D,CAAC;IACF,kBAAkB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,wBAAwB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC9C,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,eAAe,EAAE,MAAM,MAAM,CAAC;IAC9B,UAAU,EAAE,MAAM,cAAc,CAAC;CAClC;AAiBD,wBAAsB,sBAAsB,CAC1C,IAAI,GAAE,aAA2B,GAChC,OAAO,CAAC,iBAAiB,CAAC,CAoD5B"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Libre WebUI
|
|
3
|
+
* Copyright (C) 2025 Kroonen AI, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at:
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* One aggregated snapshot of everything Work is doing across every user,
|
|
19
|
+
* for the admin System page: task inventory with owners, live runtime
|
|
20
|
+
* state (from the single labeled listing the drivers already provide),
|
|
21
|
+
* terminal sessions, admission headroom, reconciliation state, and the
|
|
22
|
+
* access mode. Read-only: this module never mutates runtime state.
|
|
23
|
+
*/
|
|
24
|
+
import { getWorkAccessMode } from './workAccessService.js';
|
|
25
|
+
import workRuntimeService from './workRuntimeService.js';
|
|
26
|
+
import workTaskService from './workTaskService.js';
|
|
27
|
+
import workTerminalService from './workTerminalService.js';
|
|
28
|
+
const defaultDeps = {
|
|
29
|
+
listTasksWithOwner: () => workTaskService.listAllTasksWithOwner(),
|
|
30
|
+
listManaged: () => workRuntimeService.driver.listManaged(),
|
|
31
|
+
isRuntimeAvailable: () => workRuntimeService.isDockerAvailable(),
|
|
32
|
+
runtimeUnavailableReason: () => workRuntimeService.dockerUnavailableReason,
|
|
33
|
+
sessionCount: taskId => workTerminalService.sessionCount(taskId),
|
|
34
|
+
activeGlobal: () => workRuntimeService.activeRuntimeCounts().global,
|
|
35
|
+
limits: () => ({
|
|
36
|
+
maxGlobal: workRuntimeService.limits.maxActiveRuntimesGlobal,
|
|
37
|
+
maxPerUser: workRuntimeService.limits.maxActiveRuntimesPerUser,
|
|
38
|
+
}),
|
|
39
|
+
recoveryPending: () => workRuntimeService.recoveryPendingCount,
|
|
40
|
+
accessMode: () => getWorkAccessMode(),
|
|
41
|
+
};
|
|
42
|
+
export async function buildWorkAdminOverview(deps = defaultDeps) {
|
|
43
|
+
const tasks = deps.listTasksWithOwner();
|
|
44
|
+
const runtimeAvailable = await deps.isRuntimeAvailable();
|
|
45
|
+
// One labeled listing answers "what is actually running" for every task
|
|
46
|
+
// at once. When the runtime is down the inventory is still useful, so
|
|
47
|
+
// per-task state degrades to unknown instead of failing the overview.
|
|
48
|
+
let managed = [];
|
|
49
|
+
let managedKnown = false;
|
|
50
|
+
if (runtimeAvailable) {
|
|
51
|
+
try {
|
|
52
|
+
managed = await deps.listManaged();
|
|
53
|
+
managedKnown = true;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
managedKnown = false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const runningByTask = new Map(managed.map(entry => [entry.taskId, entry.running]));
|
|
60
|
+
const taskIds = new Set(tasks.map(task => task.record.id));
|
|
61
|
+
const limits = deps.limits();
|
|
62
|
+
return {
|
|
63
|
+
generatedAt: Date.now(),
|
|
64
|
+
accessMode: deps.accessMode(),
|
|
65
|
+
runtimeAvailable,
|
|
66
|
+
runtimeReason: runtimeAvailable
|
|
67
|
+
? undefined
|
|
68
|
+
: (deps.runtimeUnavailableReason() ?? undefined),
|
|
69
|
+
recoveryPending: deps.recoveryPending(),
|
|
70
|
+
admission: {
|
|
71
|
+
activeGlobal: deps.activeGlobal(),
|
|
72
|
+
maxGlobal: limits.maxGlobal,
|
|
73
|
+
maxPerUser: limits.maxPerUser,
|
|
74
|
+
},
|
|
75
|
+
tasks: tasks.map(({ record, ownerUsername }) => ({
|
|
76
|
+
id: record.id,
|
|
77
|
+
title: record.title,
|
|
78
|
+
ownerId: record.userId,
|
|
79
|
+
ownerUsername,
|
|
80
|
+
model: record.model,
|
|
81
|
+
status: record.status,
|
|
82
|
+
previewStatus: record.previewStatus,
|
|
83
|
+
networkEnabled: record.networkEnabled,
|
|
84
|
+
hostWorkspace: Boolean(record.hostPath),
|
|
85
|
+
running: managedKnown ? (runningByTask.get(record.id) ?? false) : null,
|
|
86
|
+
terminalSessions: deps.sessionCount(record.id),
|
|
87
|
+
updatedAt: record.updatedAt,
|
|
88
|
+
})),
|
|
89
|
+
orphanContainers: managed.filter(entry => !taskIds.has(entry.taskId)),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=workAdminService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workAdminService.js","sourceRoot":"","sources":["../../src/services/workAdminService.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,5 +20,6 @@ export declare const WORK_WRITE_FILE_RECOMMENDED_CHARS = 8000;
|
|
|
20
20
|
export declare const WORK_AGENT_SKILLS: readonly WorkAgentSkill[];
|
|
21
21
|
export declare function workToolCallBudget(roundBudget: number): number;
|
|
22
22
|
export declare function buildWorkAgentSystemPrompt(context: WorkAgentGuidanceContext): string;
|
|
23
|
+
export declare function buildWorkEmptyRoundNudgePrompt(): string;
|
|
23
24
|
export declare function buildWorkBudgetExhaustionPrompt(): string;
|
|
24
25
|
//# sourceMappingURL=workAgentGuidance.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workAgentGuidance.d.ts","sourceRoot":"","sources":["../../src/services/workAgentGuidance.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,wBAAwB;IACvC,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAID,eAAO,MAAM,iCAAiC,OAAQ,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,cAAc,EAiD7C,CAAC;AAEX,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,wBAAwB,GAChC,MAAM,CA4BR;AAED,wBAAgB,+BAA+B,IAAI,MAAM,CAQxD"}
|
|
1
|
+
{"version":3,"file":"workAgentGuidance.d.ts","sourceRoot":"","sources":["../../src/services/workAgentGuidance.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,wBAAwB;IACvC,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAID,eAAO,MAAM,iCAAiC,OAAQ,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,cAAc,EAiD7C,CAAC;AAEX,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,wBAAwB,GAChC,MAAM,CA4BR;AAED,wBAAgB,8BAA8B,IAAI,MAAM,CAEvD;AAED,wBAAgB,+BAA+B,IAAI,MAAM,CAQxD"}
|
|
@@ -101,6 +101,9 @@ ${skills}
|
|
|
101
101
|
|
|
102
102
|
Finish with a concise summary of what changed and the checks that actually ran.`;
|
|
103
103
|
}
|
|
104
|
+
export function buildWorkEmptyRoundNudgePrompt() {
|
|
105
|
+
return `Your last turn contained no reply and no tool calls, so nothing happened. Continue the task now: either call the tools you need, or reply with your findings and the next step.`;
|
|
106
|
+
}
|
|
104
107
|
export function buildWorkBudgetExhaustionPrompt() {
|
|
105
108
|
return `The autonomous execution budget is exhausted. Do not call any more tools.
|
|
106
109
|
Return a concise final response that states:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workAgentGuidance.js","sourceRoot":"","sources":["../../src/services/workAgentGuidance.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workAgentGuidance.js","sourceRoot":"","sources":["../../src/services/workAgentGuidance.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { OllamaChatMessage, OllamaChatResponse } from '../types/index.js';
|
|
2
2
|
import { WorkMessage, WorkRun, WorkTaskDetail, WorkToolCall } from '../types/work.js';
|
|
3
3
|
export declare const WORK_PROVIDER_STATE_METADATA_KEY = "workProviderState";
|
|
4
|
+
export declare const WORK_EMPTY_MODEL_RESPONSE_METADATA_KEY = "emptyModelResponse";
|
|
4
5
|
export declare const WORK_TOOL_SCHEMAS: Record<string, unknown>[];
|
|
6
|
+
export declare const WORK_WEB_SEARCH_TOOL_SCHEMA: Record<string, unknown>;
|
|
7
|
+
export declare function workToolSchemasForTask(task: {
|
|
8
|
+
networkEnabled: boolean;
|
|
9
|
+
userId: string;
|
|
10
|
+
}): Record<string, unknown>[];
|
|
5
11
|
export declare class WorkAgentService {
|
|
6
12
|
private controllers;
|
|
7
13
|
private executions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workAgentService.d.ts","sourceRoot":"","sources":["../../src/services/workAgentService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workAgentService.d.ts","sourceRoot":"","sources":["../../src/services/workAgentService.ts"],"names":[],"mappings":"AA0CA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EACL,WAAW,EACX,OAAO,EACP,cAAc,EAEd,YAAY,EACb,MAAM,kBAAkB,CAAC;AAU1B,eAAO,MAAM,gCAAgC,sBAAsB,CAAC;AACpE,eAAO,MAAM,sCAAsC,uBAAuB,CAAC;AAS3E,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EA8EtD,CAAC;AAKF,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAa7D,CAAC;AAEJ,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAM5B;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,UAAU,CAAoC;IAEtD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAazD;IAEK,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAGpE;IAEK,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;YAEa,UAAU;IA2BlB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWtD;IAEK,uBAAuB,CAAC,CAAC,EAC7B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,CAAC,CAAC,CAmEZ;IAED,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE1C;YAEa,kBAAkB;IA2B1B,QAAQ,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAc7D;YAEa,OAAO;YAimBP,yBAAyB;IA6BvC,OAAO,CAAC,2BAA2B;IAsBnC,OAAO,CAAC,eAAe;YA0BT,WAAW;IAiJzB,OAAO,CAAC,gBAAgB;CAYzB;AA+CD,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAY,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAKxD;CACF;AAsJD,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,WAAW,EAAE,EACvB,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY,GAAG,OAAO,CAAC,EAChE,kBAAkB,CAAC,EAAE,MAAM,GAC1B,iBAAiB,EAAE,CAwLrB;AA4ED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,kBAAkB,GAC3B,YAAY,EAAE,CA+GhB;AA4LD,eAAO,MAAM,gBAAgB,kBAAyB,CAAC;eACxC,gBAAgB"}
|