libre-webui 0.16.0 → 0.17.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 +237 -149
- package/backend/dist/db.d.ts.map +1 -1
- package/backend/dist/db.js +5 -0
- package/backend/dist/db.js.map +1 -1
- package/backend/dist/index.d.ts.map +1 -1
- package/backend/dist/index.js +2 -0
- package/backend/dist/index.js.map +1 -1
- package/backend/dist/routes/agentCli.d.ts +3 -0
- package/backend/dist/routes/agentCli.d.ts.map +1 -0
- package/backend/dist/routes/agentCli.js +33 -0
- package/backend/dist/routes/agentCli.js.map +1 -0
- package/backend/dist/routes/chat.d.ts.map +1 -1
- package/backend/dist/routes/chat.js +27 -0
- package/backend/dist/routes/chat.js.map +1 -1
- package/backend/dist/routes/plugins.d.ts.map +1 -1
- package/backend/dist/routes/plugins.js +10 -3
- package/backend/dist/routes/plugins.js.map +1 -1
- package/backend/dist/routes/work.d.ts.map +1 -1
- package/backend/dist/routes/work.js +25 -3
- package/backend/dist/routes/work.js.map +1 -1
- package/backend/dist/services/agentCliService.d.ts +30 -0
- package/backend/dist/services/agentCliService.d.ts.map +1 -0
- package/backend/dist/services/agentCliService.js +328 -0
- package/backend/dist/services/agentCliService.js.map +1 -0
- package/backend/dist/services/chatGenerationService.d.ts.map +1 -1
- package/backend/dist/services/chatGenerationService.js +19 -1
- package/backend/dist/services/chatGenerationService.js.map +1 -1
- package/backend/dist/services/pluginService.d.ts +42 -1
- package/backend/dist/services/pluginService.d.ts.map +1 -1
- package/backend/dist/services/pluginService.js +143 -12
- package/backend/dist/services/pluginService.js.map +1 -1
- package/backend/dist/services/workAgentGuidance.js +1 -1
- package/backend/dist/services/workAgentGuidance.js.map +1 -1
- package/backend/dist/services/workAgentService.d.ts.map +1 -1
- package/backend/dist/services/workAgentService.js +37 -0
- package/backend/dist/services/workAgentService.js.map +1 -1
- package/backend/dist/services/workHostWorkspaceService.d.ts +22 -0
- package/backend/dist/services/workHostWorkspaceService.d.ts.map +1 -0
- package/backend/dist/services/workHostWorkspaceService.js +136 -0
- package/backend/dist/services/workHostWorkspaceService.js.map +1 -0
- package/backend/dist/services/workRuntimeService.d.ts +61 -3
- package/backend/dist/services/workRuntimeService.d.ts.map +1 -1
- package/backend/dist/services/workRuntimeService.js +311 -17
- package/backend/dist/services/workRuntimeService.js.map +1 -1
- package/backend/dist/services/workTaskService.d.ts +3 -3
- package/backend/dist/services/workTaskService.d.ts.map +1 -1
- package/backend/dist/services/workTaskService.js +10 -6
- package/backend/dist/services/workTaskService.js.map +1 -1
- package/backend/dist/services/workTerminalService.d.ts +46 -0
- package/backend/dist/services/workTerminalService.d.ts.map +1 -0
- package/backend/dist/services/workTerminalService.js +241 -0
- package/backend/dist/services/workTerminalService.js.map +1 -0
- package/backend/dist/types/index.d.ts +1 -1
- package/backend/dist/types/index.d.ts.map +1 -1
- package/backend/dist/types/work.d.ts +22 -0
- package/backend/dist/types/work.d.ts.map +1 -1
- package/backend/dist/utils/chatProviderSelection.d.ts.map +1 -1
- package/backend/dist/utils/chatProviderSelection.js +7 -5
- package/backend/dist/utils/chatProviderSelection.js.map +1 -1
- package/backend/dist/websocketServer.d.ts.map +1 -1
- package/backend/dist/websocketServer.js +51 -14
- package/backend/dist/websocketServer.js.map +1 -1
- package/backend/dist/workTerminalServer.d.ts +17 -0
- package/backend/dist/workTerminalServer.d.ts.map +1 -0
- package/backend/dist/workTerminalServer.js +224 -0
- package/backend/dist/workTerminalServer.js.map +1 -0
- package/backend/package.json +1 -1
- package/frontend/dist/assets/index-BqI0kezz.css +1 -0
- package/frontend/dist/assets/index-CRC6g6bL.js +3 -0
- package/frontend/dist/assets/xterm-CmMoOwwu.css +1 -0
- package/frontend/dist/index.html +8 -6
- package/frontend/dist/js/ArtifactContainer-Cdy-973y.js +1 -0
- package/frontend/dist/js/{ArtifactDemoPage-DBVPHFxk.js → ArtifactDemoPage-B4qsvUnF.js} +1 -1
- package/frontend/dist/js/ArtifactSlideOutPanel-CmKgQ4eD.js +1 -0
- package/frontend/dist/js/{Button-DBk-AREB.js → Button-CRwzOaDZ.js} +1 -1
- package/frontend/dist/js/ChatPage-CYT69oBR.js +16 -0
- package/frontend/dist/js/FirstTimeSetup-C8LdLP5J.js +1 -0
- package/frontend/dist/js/GalleryPage-Bm89pnS8.js +1 -0
- package/frontend/dist/js/HomePage-CeCYnMUG.js +1 -0
- package/frontend/dist/js/{LibreClawPage-qGr1Jy8p.js → LibreClawPage-DGMEV6dm.js} +1 -1
- package/frontend/dist/js/{ModelManagerModals-DltRprHU.js → ModelManagerModals-DMoEav1l.js} +1 -1
- package/frontend/dist/js/ModelSelector-DXPdGdQ_.js +1 -0
- package/frontend/dist/js/ModelsPage-D-FIy2x-.js +2 -0
- package/frontend/dist/js/PersonasPage-CIrEVFo5.js +13 -0
- package/frontend/dist/js/RichMessageContent-BJ49VN9j.js +3 -0
- package/frontend/dist/js/SettingsModal-CxtOXPY7.js +1 -0
- package/frontend/dist/js/UserManagementPage-BfyYGGFQ.js +1 -0
- package/frontend/dist/js/WorkPage-C7bW6Hxx.js +4 -0
- package/frontend/dist/js/addon-fit-Cj0_dfHF.js +1 -0
- package/frontend/dist/js/api-DCD41-l9.js +19 -0
- package/frontend/dist/js/appStore-Bw-8Exsx.js +2 -0
- package/frontend/dist/js/ar-BAHlIvy0.js +2 -0
- package/frontend/dist/js/authStore-mOYH_AXI.js +4 -0
- package/frontend/dist/js/bn-BxquDVbd.js +2 -0
- package/frontend/dist/js/{cs-6UKhKj0A.js → cs-C4DoKzRm.js} +2 -2
- package/frontend/dist/js/da-CFslpGTw.js +2 -0
- package/frontend/dist/js/de-ChudoRh2.js +2 -0
- package/frontend/dist/js/es-B36fefE-.js +2 -0
- package/frontend/dist/js/{estree-PDLT672k.js → estree-0vwU39qX.js} +1 -1
- package/frontend/dist/js/fr-BSVeTM5W.js +2 -0
- package/frontend/dist/js/hi-BGoFbl5V.js +2 -0
- package/frontend/dist/js/{html-CkhF9wDQ.js → html-CApr2Bvi.js} +1 -1
- package/frontend/dist/js/id-BfYs2p_j.js +2 -0
- package/frontend/dist/js/{is-BWSbAIoq.js → is-DZ1MS-5A.js} +2 -2
- package/frontend/dist/js/it-CXtrPCG1.js +2 -0
- package/frontend/dist/js/ja-FPJ_NK_y.js +2 -0
- package/frontend/dist/js/ko-DVwD4ZZF.js +2 -0
- package/frontend/dist/js/{markdown-B1iNUbse.js → markdown-C78Qc6xu.js} +1 -1
- package/frontend/dist/js/ms-PKPP0RX3.js +2 -0
- package/frontend/dist/js/nl-DWM5HJZ8.js +2 -0
- package/frontend/dist/js/pl-B9va8Tuf.js +2 -0
- package/frontend/dist/js/pt-P0IQi-Zr.js +2 -0
- package/frontend/dist/js/ru-Ca2bxYnc.js +2 -0
- package/frontend/dist/js/{standalone-CCd6rkf-.js → standalone-DmLfI4Qj.js} +1 -1
- package/frontend/dist/js/sv-DI4RDwyZ.js +2 -0
- package/frontend/dist/js/th-DN0bDS9d.js +2 -0
- package/frontend/dist/js/tr-ChqMv5Q4.js +2 -0
- package/frontend/dist/js/{typescript-DKJ1uM5L.js → typescript-Bcq62agC.js} +1 -1
- package/frontend/dist/js/{ui-vendor-CAFEDSaO.js → ui-vendor-DohPFHDW.js} +1 -1
- package/frontend/dist/js/uk-Cr51h_XQ.js +2 -0
- package/frontend/dist/js/useBaseQuery-BAOlhjar.js +1 -0
- package/frontend/dist/js/useQuery-CcRqxveh.js +1 -0
- package/frontend/dist/js/utils-DmZD5uA3.js +1 -0
- package/frontend/dist/js/{vi-82JkwFsQ.js → vi-D4OhoVMH.js} +2 -2
- package/frontend/dist/js/work-DVgm81bJ.js +1 -0
- package/frontend/dist/js/xterm-DKl1QLiw.js +7 -0
- package/frontend/dist/js/zh-Bvau7hlR.js +2 -0
- package/package.json +3 -3
- package/frontend/dist/assets/index-CKV9Lnj8.js +0 -5
- package/frontend/dist/assets/index-Dme2Ozol.css +0 -1
- package/frontend/dist/js/ArtifactContainer-B0uVR8Z9.js +0 -1
- package/frontend/dist/js/ArtifactSlideOutPanel-Cg5kAwv9.js +0 -1
- package/frontend/dist/js/ChatPage-CPHlIZqU.js +0 -16
- package/frontend/dist/js/FirstTimeSetup-DksL5arK.js +0 -1
- package/frontend/dist/js/GalleryPage-1mdUGo_N.js +0 -1
- package/frontend/dist/js/ModelSelector-CUnwRmNU.js +0 -1
- package/frontend/dist/js/ModelsPage-DMYVg3LT.js +0 -2
- package/frontend/dist/js/PersonasPage-Ct-KKW-j.js +0 -13
- package/frontend/dist/js/RichMessageContent-CGBAcUES.js +0 -3
- package/frontend/dist/js/SettingsModal-BVj3gFCS.js +0 -1
- package/frontend/dist/js/UserManagementPage-D3tLGtTu.js +0 -1
- package/frontend/dist/js/WorkPage-DhTjy-kf.js +0 -2
- package/frontend/dist/js/api-YWoSobKv.js +0 -19
- package/frontend/dist/js/ar-KceI0PfT.js +0 -2
- package/frontend/dist/js/bn-DsKo2dzS.js +0 -2
- package/frontend/dist/js/da-CJgZ3YuL.js +0 -2
- package/frontend/dist/js/de-BZAmOuCT.js +0 -2
- package/frontend/dist/js/es-CD4u7no9.js +0 -2
- package/frontend/dist/js/fr-Cou2jOS3.js +0 -2
- package/frontend/dist/js/hi-ZxkbNCyB.js +0 -2
- package/frontend/dist/js/id-DT9CqaWQ.js +0 -2
- package/frontend/dist/js/it-CdNoTXm3.js +0 -2
- package/frontend/dist/js/ja-CIuQg0xv.js +0 -2
- package/frontend/dist/js/ko-BWRUjDOH.js +0 -2
- package/frontend/dist/js/ms-gJstIj2a.js +0 -2
- package/frontend/dist/js/nl-CydjVNUw.js +0 -2
- package/frontend/dist/js/pl-DPN9mAa5.js +0 -2
- package/frontend/dist/js/pt-MRXGqIjQ.js +0 -2
- package/frontend/dist/js/ru-CvQ9GkJF.js +0 -2
- package/frontend/dist/js/sv-BxS2fvhU.js +0 -2
- package/frontend/dist/js/th-DMxyn6e4.js +0 -2
- package/frontend/dist/js/tr-BTPldUaA.js +0 -2
- package/frontend/dist/js/uk-BGxZOKgp.js +0 -2
- package/frontend/dist/js/useBaseQuery-MuQj7vA5.js +0 -1
- package/frontend/dist/js/useQuery-CYGPkxWR.js +0 -1
- package/frontend/dist/js/utils-pTFqSV8c.js +0 -1
- package/frontend/dist/js/zh-Bxxfwci3.js +0 -2
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ChatMessage } from '../types/index.js';
|
|
2
|
+
import { PluginStreamChunk } from '../utils/pluginStreaming.js';
|
|
3
|
+
export interface AgentCliDefinition {
|
|
4
|
+
/** Stable id used as providerId and model name, e.g. "claude-code". */
|
|
5
|
+
id: string;
|
|
6
|
+
/** Human-readable name shown in the model selector. */
|
|
7
|
+
name: string;
|
|
8
|
+
/** Binary looked up on PATH. */
|
|
9
|
+
command: string;
|
|
10
|
+
parser: 'claude' | 'codex';
|
|
11
|
+
buildArgs: () => string[];
|
|
12
|
+
}
|
|
13
|
+
export interface AgentCliModel {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
command: string;
|
|
17
|
+
binaryPath: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function buildAgentPrompt(messages: readonly ChatMessage[]): string;
|
|
20
|
+
export declare class AgentCliService {
|
|
21
|
+
listAgentModels(): AgentCliModel[];
|
|
22
|
+
isAdminUser(userId: string): boolean;
|
|
23
|
+
assertAgentAccess(userId: string): AgentCliDefinition[];
|
|
24
|
+
executeAgentStreamRequest(agentId: string, messages: readonly ChatMessage[], userId: string, options?: {
|
|
25
|
+
cwd?: string;
|
|
26
|
+
}): AsyncGenerator<PluginStreamChunk, void, unknown>;
|
|
27
|
+
}
|
|
28
|
+
declare const agentCliService: AgentCliService;
|
|
29
|
+
export default agentCliService;
|
|
30
|
+
//# sourceMappingURL=agentCliService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentCliService.d.ts","sourceRoot":"","sources":["../../src/services/agentCliService.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAMhE,MAAM,WAAW,kBAAkB;IACjC,uEAAuE;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC3B,SAAS,EAAE,MAAM,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AA0DD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CAazE;AA6HD,qBAAa,eAAe;IAC1B,eAAe,IAAI,aAAa,EAAE;IAiBlC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAKpC,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAUvD,yBAAyB,CACvB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,SAAS,WAAW,EAAE,EAChC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAO,GAC7B,cAAc,CAAC,iBAAiB,EAAE,IAAI,EAAE,OAAO,CAAC;CA0HpD;AAED,QAAA,MAAM,eAAe,iBAAwB,CAAC;AAC9C,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,328 @@
|
|
|
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
|
+
import { spawn } from 'child_process';
|
|
18
|
+
import fs from 'fs';
|
|
19
|
+
import os from 'os';
|
|
20
|
+
import path from 'path';
|
|
21
|
+
import { userModel } from '../models/userModel.js';
|
|
22
|
+
import { createLogger } from '../utils/logger.js';
|
|
23
|
+
const logger = createLogger('agent-cli');
|
|
24
|
+
const AGENT_CLI_DEFINITIONS = [
|
|
25
|
+
{
|
|
26
|
+
id: 'claude-code',
|
|
27
|
+
name: 'Claude Code',
|
|
28
|
+
command: 'claude',
|
|
29
|
+
parser: 'claude',
|
|
30
|
+
// -p reads the prompt from stdin; stream-json gives line-delimited events.
|
|
31
|
+
buildArgs: () => [
|
|
32
|
+
'-p',
|
|
33
|
+
'--output-format',
|
|
34
|
+
'stream-json',
|
|
35
|
+
'--verbose',
|
|
36
|
+
'--include-partial-messages',
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: 'codex',
|
|
41
|
+
name: 'Codex',
|
|
42
|
+
command: 'codex',
|
|
43
|
+
parser: 'codex',
|
|
44
|
+
buildArgs: () => ['exec', '--json', '--skip-git-repo-check', '-'],
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
const AGENT_TIMEOUT_MS = Math.max(30000, parseInt(process.env.AGENT_CLI_TIMEOUT_MS || '600000', 10) || 600000);
|
|
48
|
+
const MAX_OUTPUT_CHARS = 2000000;
|
|
49
|
+
const MAX_STDERR_CHARS = 8000;
|
|
50
|
+
const MAX_CONTEXT_MESSAGES = 30;
|
|
51
|
+
const agentsEnabled = () => process.env.AGENT_CLI_MODELS_ENABLED !== 'false';
|
|
52
|
+
function resolveBinary(command) {
|
|
53
|
+
const pathValue = process.env.PATH || '';
|
|
54
|
+
for (const dir of pathValue.split(path.delimiter)) {
|
|
55
|
+
if (!dir)
|
|
56
|
+
continue;
|
|
57
|
+
const candidate = path.join(dir, command);
|
|
58
|
+
try {
|
|
59
|
+
fs.accessSync(candidate, fs.constants.X_OK);
|
|
60
|
+
return candidate;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// keep scanning
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
function roleLabel(role) {
|
|
69
|
+
if (role === 'assistant')
|
|
70
|
+
return 'Assistant';
|
|
71
|
+
if (role === 'system')
|
|
72
|
+
return 'System';
|
|
73
|
+
return 'User';
|
|
74
|
+
}
|
|
75
|
+
export function buildAgentPrompt(messages) {
|
|
76
|
+
const context = messages.slice(-MAX_CONTEXT_MESSAGES);
|
|
77
|
+
const transcript = context
|
|
78
|
+
.map(message => `${roleLabel(message.role)}: ${message.content}`)
|
|
79
|
+
.join('\n\n');
|
|
80
|
+
return [
|
|
81
|
+
'You are the assistant in an ongoing chat conversation. The conversation so far:',
|
|
82
|
+
'',
|
|
83
|
+
transcript,
|
|
84
|
+
'',
|
|
85
|
+
'Reply to the last user message. Respond with the reply text only — no role prefix.',
|
|
86
|
+
].join('\n');
|
|
87
|
+
}
|
|
88
|
+
/** Simple push-based async queue bridging child-process events to a generator. */
|
|
89
|
+
class ChunkQueue {
|
|
90
|
+
constructor() {
|
|
91
|
+
this.chunks = [];
|
|
92
|
+
this.waiters = [];
|
|
93
|
+
this.finished = false;
|
|
94
|
+
this.failure = null;
|
|
95
|
+
}
|
|
96
|
+
push(chunk) {
|
|
97
|
+
if (this.finished)
|
|
98
|
+
return;
|
|
99
|
+
this.chunks.push(chunk);
|
|
100
|
+
this.wake();
|
|
101
|
+
}
|
|
102
|
+
finish(error) {
|
|
103
|
+
if (this.finished)
|
|
104
|
+
return;
|
|
105
|
+
this.finished = true;
|
|
106
|
+
this.failure = error ?? null;
|
|
107
|
+
this.wake();
|
|
108
|
+
}
|
|
109
|
+
wake() {
|
|
110
|
+
const waiters = this.waiters;
|
|
111
|
+
this.waiters = [];
|
|
112
|
+
for (const waiter of waiters)
|
|
113
|
+
waiter();
|
|
114
|
+
}
|
|
115
|
+
async *drain() {
|
|
116
|
+
for (;;) {
|
|
117
|
+
while (this.chunks.length > 0) {
|
|
118
|
+
yield this.chunks.shift();
|
|
119
|
+
}
|
|
120
|
+
if (this.finished) {
|
|
121
|
+
if (this.failure)
|
|
122
|
+
throw this.failure;
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
await new Promise(resolve => this.waiters.push(resolve));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function parseClaudeLine(line, queue, state) {
|
|
130
|
+
const event = JSON.parse(line);
|
|
131
|
+
if (event.type === 'system' && event.subtype === 'init') {
|
|
132
|
+
if (typeof event.session_id === 'string') {
|
|
133
|
+
state.agentSessionId = event.session_id;
|
|
134
|
+
}
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (event.type === 'stream_event') {
|
|
138
|
+
const inner = event.event;
|
|
139
|
+
if (inner?.type === 'content_block_delta') {
|
|
140
|
+
if (inner.delta?.type === 'text_delta' && inner.delta.text) {
|
|
141
|
+
state.emittedContent = true;
|
|
142
|
+
queue.push({ type: 'content', content: inner.delta.text });
|
|
143
|
+
}
|
|
144
|
+
else if (inner.delta?.type === 'thinking_delta' &&
|
|
145
|
+
inner.delta.thinking) {
|
|
146
|
+
queue.push({ type: 'reasoning', content: inner.delta.thinking });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (event.type === 'result') {
|
|
152
|
+
if (event.is_error) {
|
|
153
|
+
const detail = typeof event.result === 'string' ? event.result : 'agent error';
|
|
154
|
+
throw new Error(`Claude Code failed: ${detail}`);
|
|
155
|
+
}
|
|
156
|
+
// Older CLIs without partial events still return the final text here.
|
|
157
|
+
if (!state.emittedContent && typeof event.result === 'string') {
|
|
158
|
+
state.emittedContent = true;
|
|
159
|
+
queue.push({ type: 'content', content: event.result });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function parseCodexLine(line, queue, state) {
|
|
164
|
+
const event = JSON.parse(line);
|
|
165
|
+
if (event.type === 'thread.started' && typeof event.thread_id === 'string') {
|
|
166
|
+
state.agentSessionId = event.thread_id;
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (event.type === 'item.completed') {
|
|
170
|
+
const item = event.item;
|
|
171
|
+
if (item?.type === 'agent_message' && item.text) {
|
|
172
|
+
state.emittedContent = true;
|
|
173
|
+
queue.push({ type: 'content', content: item.text });
|
|
174
|
+
}
|
|
175
|
+
else if (item?.type === 'reasoning' && item.text) {
|
|
176
|
+
queue.push({ type: 'reasoning', content: item.text });
|
|
177
|
+
}
|
|
178
|
+
else if (item?.type === 'error' && (item.message || item.text)) {
|
|
179
|
+
// Codex reports non-fatal warnings as error items; only surface them if
|
|
180
|
+
// the run produces no answer at all.
|
|
181
|
+
state.itemErrors.push(item.message || item.text || 'unknown error');
|
|
182
|
+
}
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (event.type === 'turn.failed') {
|
|
186
|
+
const error = event.error;
|
|
187
|
+
throw new Error(`Codex failed: ${error?.message || 'turn failed'}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
export class AgentCliService {
|
|
191
|
+
listAgentModels() {
|
|
192
|
+
if (!agentsEnabled())
|
|
193
|
+
return [];
|
|
194
|
+
const models = [];
|
|
195
|
+
for (const definition of AGENT_CLI_DEFINITIONS) {
|
|
196
|
+
const binaryPath = resolveBinary(definition.command);
|
|
197
|
+
if (binaryPath) {
|
|
198
|
+
models.push({
|
|
199
|
+
id: definition.id,
|
|
200
|
+
name: definition.name,
|
|
201
|
+
command: definition.command,
|
|
202
|
+
binaryPath,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return models;
|
|
207
|
+
}
|
|
208
|
+
isAdminUser(userId) {
|
|
209
|
+
const user = userModel.getUserById(userId);
|
|
210
|
+
return user?.role === 'admin';
|
|
211
|
+
}
|
|
212
|
+
assertAgentAccess(userId) {
|
|
213
|
+
if (!agentsEnabled()) {
|
|
214
|
+
throw new Error('Agent CLI models are disabled on this server.');
|
|
215
|
+
}
|
|
216
|
+
if (!this.isAdminUser(userId)) {
|
|
217
|
+
throw new Error('Agent CLI models require an admin account.');
|
|
218
|
+
}
|
|
219
|
+
return AGENT_CLI_DEFINITIONS;
|
|
220
|
+
}
|
|
221
|
+
executeAgentStreamRequest(agentId, messages, userId, options = {}) {
|
|
222
|
+
this.assertAgentAccess(userId);
|
|
223
|
+
const definition = AGENT_CLI_DEFINITIONS.find(candidate => candidate.id === agentId);
|
|
224
|
+
if (!definition) {
|
|
225
|
+
throw new Error(`Unknown agent CLI "${agentId}".`);
|
|
226
|
+
}
|
|
227
|
+
const binaryPath = resolveBinary(definition.command);
|
|
228
|
+
if (!binaryPath) {
|
|
229
|
+
throw new Error(`The "${definition.command}" CLI is not installed on this server.`);
|
|
230
|
+
}
|
|
231
|
+
const cwd = options.cwd && fs.existsSync(options.cwd) ? options.cwd : os.homedir();
|
|
232
|
+
const prompt = buildAgentPrompt(messages);
|
|
233
|
+
const queue = new ChunkQueue();
|
|
234
|
+
const state = { emittedContent: false, itemErrors: [] };
|
|
235
|
+
const parseLine = definition.parser === 'claude' ? parseClaudeLine : parseCodexLine;
|
|
236
|
+
logger.info(`Spawning agent CLI ${definition.id} (${binaryPath}) in ${cwd} for user ${userId}`);
|
|
237
|
+
const child = spawn(binaryPath, definition.buildArgs(), {
|
|
238
|
+
cwd,
|
|
239
|
+
env: process.env,
|
|
240
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
241
|
+
});
|
|
242
|
+
let stdoutBuffer = '';
|
|
243
|
+
let stderrBuffer = '';
|
|
244
|
+
let totalChars = 0;
|
|
245
|
+
let settled = false;
|
|
246
|
+
const timeout = setTimeout(() => {
|
|
247
|
+
fail(new Error(`Agent CLI timed out after ${AGENT_TIMEOUT_MS}ms.`));
|
|
248
|
+
child.kill('SIGKILL');
|
|
249
|
+
}, AGENT_TIMEOUT_MS);
|
|
250
|
+
const fail = (error) => {
|
|
251
|
+
if (settled)
|
|
252
|
+
return;
|
|
253
|
+
settled = true;
|
|
254
|
+
clearTimeout(timeout);
|
|
255
|
+
queue.finish(error);
|
|
256
|
+
};
|
|
257
|
+
const succeed = () => {
|
|
258
|
+
if (settled)
|
|
259
|
+
return;
|
|
260
|
+
settled = true;
|
|
261
|
+
clearTimeout(timeout);
|
|
262
|
+
const metadata = { agentCli: definition.id };
|
|
263
|
+
if (state.agentSessionId) {
|
|
264
|
+
metadata.agentSessionId = state.agentSessionId;
|
|
265
|
+
}
|
|
266
|
+
queue.push({ type: 'done', providerMetadata: metadata });
|
|
267
|
+
queue.finish();
|
|
268
|
+
};
|
|
269
|
+
const handleLine = (line) => {
|
|
270
|
+
const trimmed = line.trim();
|
|
271
|
+
if (!trimmed.startsWith('{'))
|
|
272
|
+
return;
|
|
273
|
+
try {
|
|
274
|
+
parseLine(trimmed, queue, state);
|
|
275
|
+
}
|
|
276
|
+
catch (error) {
|
|
277
|
+
if (error instanceof SyntaxError)
|
|
278
|
+
return; // partial/non-JSON line
|
|
279
|
+
fail(error instanceof Error ? error : new Error(String(error)));
|
|
280
|
+
child.kill('SIGKILL');
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
child.stdout.on('data', (data) => {
|
|
284
|
+
totalChars += data.length;
|
|
285
|
+
if (totalChars > MAX_OUTPUT_CHARS) {
|
|
286
|
+
fail(new Error('Agent CLI output exceeded the size limit.'));
|
|
287
|
+
child.kill('SIGKILL');
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
stdoutBuffer += data.toString();
|
|
291
|
+
let newlineIndex = stdoutBuffer.indexOf('\n');
|
|
292
|
+
while (newlineIndex !== -1) {
|
|
293
|
+
handleLine(stdoutBuffer.slice(0, newlineIndex));
|
|
294
|
+
stdoutBuffer = stdoutBuffer.slice(newlineIndex + 1);
|
|
295
|
+
newlineIndex = stdoutBuffer.indexOf('\n');
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
child.stderr.on('data', (data) => {
|
|
299
|
+
if (stderrBuffer.length < MAX_STDERR_CHARS) {
|
|
300
|
+
stderrBuffer += data.toString().slice(0, MAX_STDERR_CHARS);
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
child.on('error', error => {
|
|
304
|
+
fail(new Error(`Failed to start ${definition.command}: ${error.message}`));
|
|
305
|
+
});
|
|
306
|
+
child.on('close', code => {
|
|
307
|
+
if (stdoutBuffer)
|
|
308
|
+
handleLine(stdoutBuffer);
|
|
309
|
+
if (settled)
|
|
310
|
+
return;
|
|
311
|
+
if (state.emittedContent) {
|
|
312
|
+
succeed();
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
const detail = state.itemErrors[0] || stderrBuffer.trim() || `exit code ${code}`;
|
|
316
|
+
fail(new Error(`${definition.name} produced no reply (${detail}).`));
|
|
317
|
+
});
|
|
318
|
+
child.stdin.on('error', () => {
|
|
319
|
+
// The CLI may exit before consuming the prompt; close handles reporting.
|
|
320
|
+
});
|
|
321
|
+
child.stdin.write(prompt);
|
|
322
|
+
child.stdin.end();
|
|
323
|
+
return queue.drain();
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
const agentCliService = new AgentCliService();
|
|
327
|
+
export default agentCliService;
|
|
328
|
+
//# sourceMappingURL=agentCliService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentCliService.js","sourceRoot":"","sources":["../../src/services/agentCliService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatGenerationService.d.ts","sourceRoot":"","sources":["../../src/services/chatGenerationService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chatGenerationService.d.ts","sourceRoot":"","sources":["../../src/services/chatGenerationService.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EACV,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,MAAM,EACN,cAAc,EACf,MAAM,mBAAmB,CAAC;AAM3B,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,iBAAiB,CAAC;IACjC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAC3D,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,UAAU,CAAC;AAExD,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,gBAAgB,CAAC;IACzB,cAAc,EAAE,iBAAiB,EAAE,CAAC;IACpC,cAAc,EAAE,WAAW,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,WAAW,CAAC,EAAE,KAAK,CAAC;CACrB;AAED,cAAM,qBAAqB;IACnB,sBAAsB,CAC1B,YAAY,EAAE,MAAM,EACpB,MAAM,GAAE,MAAkB,GACzB,OAAO,CAAC,MAAM,CAAC;IA2BlB,YAAY,CAAC,OAAO,GAAE,iBAAsB,GAAG,iBAAiB;IAO1D,uBAAuB,CAC3B,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,EAC/B,iBAAiB,CAAC,EAAE,qBAAqB,GACxC,OAAO,CAAC,gBAAgB,CAAC;IA4B5B,6BAA6B,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM;IAI/D,wBAAwB,CACtB,KAAK,EAAE,MAAM,EACb,gBAAgB,EAAE,MAAM,EACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACzC,kBAAkB;IAaf,mBAAmB,CAAC,EACxB,MAAM,EACN,cAAc,EACd,cAAc,EACd,MAAM,EACN,oBAAiC,GAClC,EAAE,4BAA4B,GAAG,OAAO,CAAC,2BAA2B,CAAC;CA2FvE;;AAED,wBAA2C"}
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
import { mergeGenerationOptions } from '../utils/generationUtils.js';
|
|
18
18
|
import { OPENAI_RESPONSES_INCOMPLETE_REASON_METADATA_KEY } from '../utils/openAIResponsesAdapter.js';
|
|
19
19
|
import { extractPluginAssistantContent } from '../utils/pluginResponse.js';
|
|
20
|
+
import agentCliService from './agentCliService.js';
|
|
20
21
|
import ollamaService from './ollamaService.js';
|
|
21
22
|
import { personaService } from './personaService.js';
|
|
22
23
|
import pluginService from './pluginService.js';
|
|
@@ -53,7 +54,7 @@ class ChatGenerationService {
|
|
|
53
54
|
const actualModelName = await this.resolveActualModelName(sessionModel, userId);
|
|
54
55
|
const mergedOptions = this.mergeOptions(options);
|
|
55
56
|
const provider = normalizeChatProviderSelection(providerSelection);
|
|
56
|
-
const activePlugin = provider?.providerType === 'ollama'
|
|
57
|
+
const activePlugin = provider?.providerType === 'ollama' || provider?.providerType === 'agent'
|
|
57
58
|
? null
|
|
58
59
|
: pluginService.getActivePluginForModel(actualModelName, userId, provider?.providerId);
|
|
59
60
|
const pluginVariables = activePlugin
|
|
@@ -89,6 +90,23 @@ class ChatGenerationService {
|
|
|
89
90
|
stream: false,
|
|
90
91
|
options: target.mergedOptions,
|
|
91
92
|
};
|
|
93
|
+
if (target.providerType === 'agent' && target.providerId) {
|
|
94
|
+
let assistantContent = '';
|
|
95
|
+
let providerMetadata;
|
|
96
|
+
for await (const chunk of agentCliService.executeAgentStreamRequest(target.providerId, pluginMessages, userId)) {
|
|
97
|
+
if (chunk.type === 'content' && chunk.content) {
|
|
98
|
+
assistantContent += chunk.content;
|
|
99
|
+
}
|
|
100
|
+
else if (chunk.type === 'done' && chunk.providerMetadata) {
|
|
101
|
+
providerMetadata = chunk.providerMetadata;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
response: this.createPluginChatResponse(target.actualModelName, assistantContent, providerMetadata),
|
|
106
|
+
assistantContent,
|
|
107
|
+
source: 'plugin',
|
|
108
|
+
};
|
|
109
|
+
}
|
|
92
110
|
if (target.activePlugin) {
|
|
93
111
|
try {
|
|
94
112
|
const pluginResponse = await pluginService.executePluginRequest(target.actualModelName, pluginMessages, target.mergedOptions, userId, target.activePlugin.id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatGenerationService.js","sourceRoot":"","sources":["../../src/services/chatGenerationService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,+CAA+C,EAAE,MAAM,oCAAoC,CAAC;AACrG,OAAO,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAWzD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AAEnF,MAAM,MAAM,GAAG,YAAY,CAAC,kCAAkC,CAAC,CAAC;AA4BhE,MAAM,qBAAqB;IACzB,KAAK,CAAC,sBAAsB,CAC1B,YAAoB,EACpB,SAAiB,SAAS;QAE1B,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACzC,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAEvD,IAAI,OAAO,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACrE,IAAI,CAAC,OAAO,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACrC,OAAO,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACtE,CAAC;YAED,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;gBACnB,OAAO,OAAO,CAAC,KAAK,CAAC;YACvB,CAAC;YAED,MAAM,CAAC,IAAI,CACT,WAAW,SAAS,2CAA2C,CAChE,CAAC;YACF,OAAO,YAAY,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YACtD,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAED,YAAY,CAAC,UAA6B,EAAE;QAC1C,OAAO,sBAAsB,CAC3B,kBAAkB,CAAC,oBAAoB,EAAE,EACzC,OAAO,CACR,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,uBAAuB,CAC3B,YAAoB,EACpB,MAAc,EACd,UAA6B,EAAE,EAC/B,iBAAyC;QAEzC,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,sBAAsB,CACvD,YAAY,EACZ,MAAM,CACP,CAAC;QACF,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,8BAA8B,CAAC,iBAAiB,CAAC,CAAC;QACnE,MAAM,YAAY,GAChB,QAAQ,EAAE,YAAY,KAAK,QAAQ;
|
|
1
|
+
{"version":3,"file":"chatGenerationService.js","sourceRoot":"","sources":["../../src/services/chatGenerationService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,24 @@
|
|
|
1
1
|
import { EmbeddingModel, OllamaEmbeddingsResponse, Plugin, PluginStatus, PluginResponse, ChatMessage, GenerationOptions, TTSConfig, ImageGenConfig, ImageGenResponse, PluginType } from '../types/index.js';
|
|
2
2
|
import { type PluginStreamChunk } from '../utils/pluginStreamAdapter.js';
|
|
3
|
+
/**
|
|
4
|
+
* Why a refresh did or did not change the catalog. Reported to the caller so a
|
|
5
|
+
* silent fallback to the bundled catalog is never presented as a live update.
|
|
6
|
+
*/
|
|
7
|
+
export type PluginModelDiscoveryOutcome = 'updated' | 'unchanged' | 'missing_credentials' | 'unavailable';
|
|
8
|
+
export interface PluginModelDiscoveryResult {
|
|
9
|
+
models: string[];
|
|
10
|
+
outcome: PluginModelDiscoveryOutcome;
|
|
11
|
+
reason?: string;
|
|
12
|
+
}
|
|
3
13
|
export declare class PluginService {
|
|
4
14
|
private pluginsDir;
|
|
5
15
|
private bundledPluginsDir;
|
|
6
16
|
private legacyPluginsDir;
|
|
7
17
|
private pluginReadDirs;
|
|
8
18
|
private discoveredModelsCache;
|
|
19
|
+
private discoveredModelsUpdatedAt;
|
|
20
|
+
private discoveryAttemptedAt;
|
|
21
|
+
private inflightDiscovery;
|
|
9
22
|
private embeddingService;
|
|
10
23
|
private ttsService;
|
|
11
24
|
private imageGenerationService;
|
|
@@ -61,9 +74,37 @@ export declare class PluginService {
|
|
|
61
74
|
/**
|
|
62
75
|
* Attempt to auto-discover available models from a plugin's full API endpoint.
|
|
63
76
|
* Resolves the provider's model-list endpoint and updates the plugin's model_map.
|
|
64
|
-
* Falls back
|
|
77
|
+
* Falls back to the existing model_map if the endpoint is unavailable; callers
|
|
78
|
+
* that need to tell a real update from a fallback use discoverModelsResult.
|
|
65
79
|
*/
|
|
66
80
|
discoverModels(pluginId: string, userId?: string): Promise<string[]>;
|
|
81
|
+
/**
|
|
82
|
+
* Model discovery with the outcome attached, so a caller can report whether
|
|
83
|
+
* the provider was actually reached instead of assuming the returned catalog
|
|
84
|
+
* is fresh.
|
|
85
|
+
*/
|
|
86
|
+
discoverModelsResult(pluginId: string, userId?: string): Promise<PluginModelDiscoveryResult>;
|
|
87
|
+
/**
|
|
88
|
+
* Whether a plugin's catalog should be re-fetched. Missing catalogs are due
|
|
89
|
+
* immediately; stored ones age out after the TTL. Both cases are gated by a
|
|
90
|
+
* per-plugin backoff so a failing provider is not probed on every request.
|
|
91
|
+
*/
|
|
92
|
+
private isModelDiscoveryDue;
|
|
93
|
+
/**
|
|
94
|
+
* Re-discover models for every active completion plugin whose catalog is
|
|
95
|
+
* missing or stale. Bounded by a deadline so a slow provider cannot stall the
|
|
96
|
+
* plugin-list response; refreshes that outrun it still persist and surface on
|
|
97
|
+
* the next request.
|
|
98
|
+
*/
|
|
99
|
+
refreshStaleModels(userId?: string): Promise<void>;
|
|
100
|
+
/**
|
|
101
|
+
* Say why no key was usable. An environment key is deliberately ignored for a
|
|
102
|
+
* provider whose definition was installed into the writable plugins directory,
|
|
103
|
+
* because that file can be edited to point the credential somewhere else — a
|
|
104
|
+
* silent "no API key" hides that distinction from whoever set the variable.
|
|
105
|
+
*/
|
|
106
|
+
private describeMissingCredential;
|
|
107
|
+
private runModelDiscovery;
|
|
67
108
|
getAllPlugins(userId?: string): Plugin[];
|
|
68
109
|
getPlugin(id: string, userId?: string): Plugin | null;
|
|
69
110
|
installPlugin(pluginData: Plugin, approvedByUserId: string): Plugin;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pluginService.d.ts","sourceRoot":"","sources":["../../src/services/pluginService.ts"],"names":[],"mappings":"AAsBA,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,MAAM,EACN,YAAY,EACZ,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,UAAU,EACX,MAAM,mBAAmB,CAAC;AAgB3B,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"pluginService.d.ts","sourceRoot":"","sources":["../../src/services/pluginService.ts"],"names":[],"mappings":"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"}
|