@schlenkr/ragents 0.1.8 → 0.1.9
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/server/src/config-definition.ts +24 -2
- package/apps/server/src/config.ts +0 -6
- package/apps/server/src/host-api.json +3 -10
- package/apps/server/src/host-api.ts +6 -7
- package/apps/server/src/plugin-build/build.ts +28 -5
- package/apps/server/src/plugin-build/plugin-description.ts +1 -1
- package/apps/server/src/plugin-build/typecheck.ts +2 -2
- package/apps/server/src/plugin-support/language-server/plugin.ts +8 -7
- package/apps/server/src/plugin-support/language-server/tools.ts +7 -6
- package/apps/server/src/plugin-support/model-aliases.ts +55 -25
- package/apps/server/src/plugin-support/product-relay.ts +10 -2
- package/apps/server/src/plugin-support/workspace-sandbox-host.ts +18 -9
- package/apps/server/src/profile/bundle-manifest.ts +7 -3
- package/apps/server/src/profile/compose.ts +6 -0
- package/apps/server/src/profile/plugin-discovery.ts +6 -1
- package/apps/server/src/profile/provisioning.ts +6 -5
- package/apps/server/src/ragents/engine.ts +0 -1
- package/apps/server/src/ragents/host-services.ts +4 -0
- package/apps/server/src/ragents/session.ts +1 -1
- package/apps/server/src/server.ts +1 -0
- package/apps/server/tsconfig.json +2 -0
- package/apps/web/dist/help/guide-clients.html +14 -6
- package/apps/web/dist/help/guide-clients.md +14 -6
- package/apps/web/dist/help/guide-distributed.html +12 -4
- package/apps/web/dist/help/guide-distributed.md +12 -4
- package/apps/web/dist/help/guide-getting-started.html +12 -8
- package/apps/web/dist/help/guide-getting-started.md +12 -8
- package/apps/web/dist/help/guide-plugins.html +6 -2
- package/apps/web/dist/help/guide-plugins.md +6 -2
- package/apps/web/dist/help/guide-runtime.html +2 -1
- package/apps/web/dist/help/guide-runtime.md +2 -1
- package/apps/web/dist/help/index.html +3328 -1135
- package/apps/web/dist/host-web.json +3 -3
- package/bundles/ragents.activity/ragents-bundle.json +3 -3
- package/bundles/ragents.actor-programs/ragents-bundle.json +3 -3
- package/bundles/ragents.ask/ragents-bundle.json +4 -4
- package/bundles/ragents.ask/server/index.js +42 -11
- package/bundles/ragents.ask/server/index.js.map +3 -3
- package/bundles/ragents.ask/web/chunks/chunk-WFN4374U.js +2 -0
- package/bundles/ragents.ask/web/chunks/chunk-WFN4374U.js.map +7 -0
- package/bundles/ragents.ask/web/classes.json +1 -1
- package/bundles/ragents.ask/web/exports/ask-payload.js +1 -1
- package/bundles/ragents.ask/web/index.js +1 -1
- package/bundles/ragents.ask/web/index.js.map +3 -3
- package/bundles/ragents.browser/executor/index.mjs +357 -0
- package/bundles/ragents.browser/executor/index.mjs.map +7 -0
- package/bundles/ragents.browser/ragents-bundle.json +5 -8
- package/bundles/ragents.browser/server/chunks/{chunk-2GKLLCBE.js → chunk-CWLX4VA5.js} +1 -1
- package/bundles/ragents.browser/server/chunks/chunk-CWLX4VA5.js.map +7 -0
- package/bundles/ragents.browser/server/exports/server/contract.js +1 -1
- package/bundles/ragents.browser/server/index.js +20 -9
- package/bundles/ragents.browser/server/index.js.map +4 -4
- package/bundles/ragents.documents/ragents-bundle.json +3 -3
- package/bundles/ragents.lsp-fsharp/executor/index.mjs +68 -0
- package/bundles/ragents.lsp-fsharp/executor/index.mjs.map +7 -0
- package/bundles/ragents.lsp-fsharp/ragents-bundle.json +5 -9
- package/bundles/ragents.lsp-fsharp/server/index.js +21 -6
- package/bundles/ragents.lsp-fsharp/server/index.js.map +4 -4
- package/bundles/ragents.lsp-roslyn/executor/index.mjs +68 -0
- package/bundles/ragents.lsp-roslyn/executor/index.mjs.map +7 -0
- package/bundles/ragents.lsp-roslyn/ragents-bundle.json +6 -8
- package/bundles/ragents.lsp-roslyn/server/index.js +54 -15
- package/bundles/ragents.lsp-roslyn/server/index.js.map +4 -4
- package/bundles/ragents.lsp-typescript/executor/index.mjs +49 -0
- package/bundles/ragents.lsp-typescript/executor/index.mjs.map +7 -0
- package/bundles/ragents.lsp-typescript/ragents-bundle.json +5 -7
- package/bundles/ragents.lsp-typescript/server/index.js +22 -2
- package/bundles/ragents.lsp-typescript/server/index.js.map +3 -3
- package/bundles/ragents.model-relay/ragents-bundle.json +4 -4
- package/bundles/ragents.model-relay/server/index.js +3 -2
- package/bundles/ragents.model-relay/server/index.js.map +2 -2
- package/bundles/ragents.orchestration/ragents-bundle.json +3 -3
- package/bundles/ragents.overseer/ragents-bundle.json +3 -3
- package/bundles/ragents.processes/ragents-bundle.json +3 -3
- package/bundles/ragents.product/ragents-bundle.json +3 -3
- package/bundles/ragents.profile-distribution/ragents-bundle.json +4 -4
- package/bundles/ragents.profile-distribution/server/index.js +1 -1
- package/bundles/ragents.profile-distribution/server/index.js.map +2 -2
- package/bundles/ragents.reference/ragents-bundle.json +3 -3
- package/bundles/ragents.todo/ragents-bundle.json +3 -3
- package/bundles/ragents.transcript/ragents-bundle.json +3 -3
- package/bundles/ragents.watch/ragents-bundle.json +3 -3
- package/bundles/ragents.workspace/ragents-bundle.json +11 -5
- package/bundles/ragents.workspace/server/index.js +101 -28
- package/bundles/ragents.workspace/server/index.js.map +3 -3
- package/bundles/ragents.workspace/web/classes.json +1 -1
- package/bundles/ragents.workspace/web/index.js +1 -1
- package/bundles/ragents.workspace/web/index.js.map +3 -3
- package/package.json +2 -2
- package/packages/agent/dist/core/agent-settings.d.ts +1 -7
- package/packages/agent/dist/core/compaction/compaction.d.ts +17 -13
- package/packages/agent/dist/core/model-runtime.d.ts +5 -4
- package/packages/agent/dist/core/provider-composer.d.ts +2 -1
- package/packages/agent/dist/core/tools/bash.d.ts +9 -3
- package/packages/agent/dist/index.d.ts +1 -1
- package/packages/agent/src/core/agent-settings.ts +1 -4
- package/packages/agent/src/core/compaction/compaction.ts +68 -30
- package/packages/agent/src/core/model-runtime.ts +12 -5
- package/packages/agent/src/core/provider-composer.ts +5 -0
- package/packages/agent/src/core/tools/bash.ts +36 -30
- package/packages/agent/src/index.ts +3 -0
- package/packages/ai/dist/types.d.ts +11 -0
- package/packages/ai/src/types.ts +12 -0
- package/packages/ragents/src/domain/event-semantics.ts +3 -0
- package/packages/ragents/src/domain/event-validation.ts +15 -2
- package/packages/ragents/src/domain/events.ts +3 -0
- package/packages/ragents/src/domain/model.ts +2 -0
- package/packages/ragents/src/domain/projection.ts +1 -0
- package/packages/ragents/src/drivers/agent-runtime.ts +1 -1
- package/packages/ragents/src/drivers/agent-turn.ts +8 -6
- package/packages/ragents/src/runtime/decisions/inputs.ts +6 -2
- package/packages/ragents/src/runtime/journal-storage.ts +5 -4
- package/packages/workspace-executor/package.json +0 -1
- package/packages/workspace-executor/src/bash-launch.ts +56 -10
- package/packages/workspace-executor/src/context.ts +4 -0
- package/packages/workspace-executor/src/contributions.ts +150 -0
- package/packages/workspace-executor/src/executor.ts +1 -1
- package/packages/workspace-executor/src/index.ts +16 -19
- package/packages/workspace-executor/src/language-server/host.ts +3 -0
- package/packages/workspace-executor/src/language-server/module.ts +12 -2
- package/packages/workspace-executor/src/language-server/roots.ts +0 -5
- package/packages/workspace-executor/src/modules.ts +7 -6
- package/packages/workspace-executor/src/sandbox-tools.ts +3 -9
- package/packages/workspace-executor/src/shell-platform.ts +14 -3
- package/packages/workspace-executor/src/tools.ts +0 -3
- package/plugins/ragents.ask/ask-payload.ts +9 -0
- package/plugins/ragents.ask/server/ask-service.ts +53 -13
- package/plugins/ragents.ask/web/AskActionView.tsx +3 -2
- package/plugins/ragents.browser/executor/index.ts +5 -0
- package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/module.ts +25 -31
- package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/playwright.ts +9 -23
- package/plugins/ragents.browser/provision.ts +1 -1
- package/plugins/ragents.browser/server/browser.ts +3 -3
- package/plugins/ragents.browser/server/contract.ts +2 -2
- package/plugins/ragents.browser/server/index.ts +1 -1
- package/plugins/ragents.lsp-fsharp/executor.ts +80 -0
- package/plugins/ragents.lsp-fsharp/provision.ts +1 -1
- package/plugins/ragents.lsp-fsharp/server/index.ts +2 -2
- package/plugins/ragents.lsp-roslyn/executor.ts +64 -0
- package/plugins/ragents.lsp-roslyn/provision.ts +1 -1
- package/plugins/ragents.lsp-roslyn/server/index.ts +28 -5
- package/plugins/ragents.lsp-roslyn/server/solution-on-start.ts +18 -6
- package/plugins/ragents.lsp-typescript/executor.ts +50 -0
- package/plugins/ragents.lsp-typescript/server/index.ts +2 -2
- package/plugins/ragents.model-relay/server/config.ts +1 -1
- package/plugins/ragents.model-relay/server/relay.ts +4 -2
- package/plugins/ragents.profile-distribution/server/archive.ts +2 -1
- package/plugins/ragents.workspace/client/workspace-client.ts +111 -28
- package/plugins/ragents.workspace/contract.ts +33 -2
- package/plugins/ragents.workspace/server/binding.ts +10 -4
- package/plugins/ragents.workspace/server/clients.ts +56 -9
- package/plugins/ragents.workspace/server/config.ts +9 -0
- package/plugins/ragents.workspace/server/index.ts +13 -4
- package/plugins/ragents.workspace/server/runtime.ts +10 -0
- package/plugins/ragents.workspace/server/shell-platform.ts +6 -5
- package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +1 -1
- package/ragents.config.core.ts +4 -1
- package/ragents.config.showcase.ts +4 -1
- package/scripts/agent/journal.ts +3 -1
- package/scripts/package/build-package.ts +3 -1
- package/scripts/provision/run-provision.ts +2 -2
- package/scripts/workspace-client/run-workspace-client.ts +7 -4
- package/apps/web/dist/help/screenshots/release-checklist-vscode.png +0 -0
- package/apps/web/dist/help/screenshots/release-checklist-web.png +0 -0
- package/bundles/ragents.ask/web/chunks/chunk-HGFDGTNC.js +0 -2
- package/bundles/ragents.ask/web/chunks/chunk-HGFDGTNC.js.map +0 -7
- package/bundles/ragents.browser/server/chunks/chunk-2GKLLCBE.js.map +0 -7
- package/packages/workspace-executor/src/language-server/adapters/fsharp.ts +0 -60
- package/packages/workspace-executor/src/language-server/adapters/index.ts +0 -7
- package/packages/workspace-executor/src/language-server/adapters/roslyn.ts +0 -56
- package/packages/workspace-executor/src/language-server/adapters/typescript.ts +0 -74
- package/packages/workspace-executor/src/language-server/solution.ts +0 -13
- /package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/contract.ts +0 -0
- /package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/pages.ts +0 -0
|
@@ -2,13 +2,28 @@ import { createRequire as __ragentsCreateRequire } from "node:module";
|
|
|
2
2
|
const require = __ragentsCreateRequire(import.meta.url);
|
|
3
3
|
|
|
4
4
|
// server/index.ts
|
|
5
|
-
import
|
|
5
|
+
import path2 from "node:path";
|
|
6
6
|
import { declaredEnvironment } from "@ragents/host/plugin-support/plugin-config.js";
|
|
7
7
|
import { createLanguageServerPlugin } from "@ragents/host/plugin-support/language-server/plugin.js";
|
|
8
8
|
import { sandboxServicesToken } from "@ragents/host/plugin-support/workspace-sandbox-host.js";
|
|
9
9
|
import { runtimeProviderToken } from "@ragents/host/ragents/host-services.js";
|
|
10
10
|
import { askServiceToken } from "@ragents/plugins/ragents.ask/server/contract";
|
|
11
11
|
|
|
12
|
+
// executor.ts
|
|
13
|
+
import { existsSync } from "node:fs";
|
|
14
|
+
import path from "node:path";
|
|
15
|
+
import { pathToFileURL } from "node:url";
|
|
16
|
+
var ROSLYN_SERVER_VARIABLE = "ROSLYN_LANGUAGE_SERVER";
|
|
17
|
+
var ROSLYN_SERVER_FILE = "roslyn/Microsoft.CodeAnalysis.LanguageServer.dll";
|
|
18
|
+
var languages = { ".cs": "csharp" };
|
|
19
|
+
var roslynLanguageServer = {
|
|
20
|
+
id: "roslyn",
|
|
21
|
+
label: "Roslyn",
|
|
22
|
+
languages,
|
|
23
|
+
rootDescription: "the .sln file (or a single .csproj)",
|
|
24
|
+
solutionExtensions: [".sln", ".slnx"]
|
|
25
|
+
};
|
|
26
|
+
|
|
12
27
|
// server/solution-on-start.ts
|
|
13
28
|
import {
|
|
14
29
|
languageServerOpenOperation,
|
|
@@ -16,12 +31,21 @@ import {
|
|
|
16
31
|
} from "@ragents/workspace-executor";
|
|
17
32
|
import { DISMISSED_ANSWER } from "@ragents/plugins/ragents.ask/server/contract";
|
|
18
33
|
var SOLUTION_ON_START_VARIABLE = "ROSLYN_SOLUTION_ON_START";
|
|
34
|
+
var SOLUTION_PREFERRED_VARIABLE = "ROSLYN_SOLUTION_PREFERRED";
|
|
19
35
|
var NO_SOLUTION = "Keine laden";
|
|
20
36
|
var SOLUTION_QUESTION = "Welche Solution soll Roslyn f\xFCr die Diagnostik laden?";
|
|
21
|
-
var
|
|
37
|
+
var matchesPreferred = (solution, preferred) => {
|
|
38
|
+
const path4 = solution.toLowerCase();
|
|
39
|
+
const expected = preferred.toLowerCase();
|
|
40
|
+
return path4 === expected || path4.endsWith(`/${expected}`);
|
|
41
|
+
};
|
|
42
|
+
var solutionStartStep = (listing, preferred) => {
|
|
22
43
|
if (listing.opened || listing.solutions.length === 0) return { kind: "none" };
|
|
23
|
-
|
|
24
|
-
|
|
44
|
+
const paths = listing.solutions.map((solution) => solution.path);
|
|
45
|
+
const matching = preferred === void 0 ? [] : paths.filter((path4) => matchesPreferred(path4, preferred));
|
|
46
|
+
const candidates = matching.length > 0 ? matching : paths;
|
|
47
|
+
if (candidates.length === 1) return { kind: "open", path: candidates[0] };
|
|
48
|
+
return { kind: "ask", options: [...candidates, NO_SOLUTION] };
|
|
25
49
|
};
|
|
26
50
|
var solutionAnswer = (options, answer) => {
|
|
27
51
|
const chosen = answer.trim().replaceAll("\\", "/");
|
|
@@ -34,8 +58,8 @@ var createSolutionOnStart = (options) => {
|
|
|
34
58
|
const openTool = languageServerOpenOperation(options.adapterId);
|
|
35
59
|
const questionCommand = (runId) => `${options.pluginId}.solution-question:${runId}`;
|
|
36
60
|
const marked = (runId) => options.runtime().view(runId).pluginStates.some((entry) => entry.pluginId === options.pluginId && entry.scope.kind === "run");
|
|
37
|
-
const load = async (runId,
|
|
38
|
-
await options.sandbox().execute(runId, openTool, { root:
|
|
61
|
+
const load = async (runId, path4, ifNoneOpen, signal) => {
|
|
62
|
+
await options.sandbox().execute(runId, openTool, { root: path4, ifNoneOpen }, { signal });
|
|
39
63
|
};
|
|
40
64
|
const answered = async (runId, coordinatorId, choices, answer, signal) => {
|
|
41
65
|
const outcome = solutionAnswer(choices, answer);
|
|
@@ -52,7 +76,7 @@ ${openTool} l\xE4dt eine Solution.` }
|
|
|
52
76
|
};
|
|
53
77
|
const begin = async (runId, ownerId, coordinatorId, signal) => {
|
|
54
78
|
const listing = await options.sandbox().execute(runId, languageServerSolutionsOperation(options.adapterId), null, { signal });
|
|
55
|
-
const step = solutionStartStep(listing);
|
|
79
|
+
const step = solutionStartStep(listing, options.preferred);
|
|
56
80
|
if (step.kind === "none") return { rest: Promise.resolve() };
|
|
57
81
|
if (step.kind === "open") return { rest: load(runId, step.path, true, signal) };
|
|
58
82
|
const answer = options.ask().ask(
|
|
@@ -116,7 +140,8 @@ ${openTool} l\xE4dt eine Solution.` }
|
|
|
116
140
|
// server/index.ts
|
|
117
141
|
var roslynConfigDescriptors = [
|
|
118
142
|
{ key: ROSLYN_SERVER_VARIABLE, source: "environment" },
|
|
119
|
-
{ key: SOLUTION_ON_START_VARIABLE, source: "environment" }
|
|
143
|
+
{ key: SOLUTION_ON_START_VARIABLE, source: "environment" },
|
|
144
|
+
{ key: SOLUTION_PREFERRED_VARIABLE, source: "environment" }
|
|
120
145
|
];
|
|
121
146
|
var PLUGIN_ID = "ragents.lsp-roslyn";
|
|
122
147
|
var env = declaredEnvironment(roslynConfigDescriptors);
|
|
@@ -127,13 +152,24 @@ var solutionOnStart = () => {
|
|
|
127
152
|
}
|
|
128
153
|
return mode === "on";
|
|
129
154
|
};
|
|
155
|
+
var preferredSolution = (loadOnStart) => {
|
|
156
|
+
const preferred = env.optional(SOLUTION_PREFERRED_VARIABLE);
|
|
157
|
+
if (preferred === void 0) return void 0;
|
|
158
|
+
if (!loadOnStart) {
|
|
159
|
+
throw new Error(`${SOLUTION_PREFERRED_VARIABLE} in der Sektion ragents.lsp-roslyn verlangt ${SOLUTION_ON_START_VARIABLE}: "on"`);
|
|
160
|
+
}
|
|
161
|
+
if (preferred === "" || preferred.includes("\\") || path2.win32.isAbsolute(preferred)) {
|
|
162
|
+
throw new Error(`${SOLUTION_PREFERRED_VARIABLE} in der Sektion ragents.lsp-roslyn ist ein Pfad relativ zum Arbeitsbereich mit Schr\xE4gstrichen, nicht "${preferred}"`);
|
|
163
|
+
}
|
|
164
|
+
return preferred;
|
|
165
|
+
};
|
|
130
166
|
var plugin = {
|
|
131
167
|
requires: ["ragents.ask"],
|
|
132
168
|
create: () => {
|
|
133
169
|
let startup;
|
|
134
170
|
const languageServer = createLanguageServerPlugin({
|
|
135
171
|
id: PLUGIN_ID,
|
|
136
|
-
|
|
172
|
+
languageServer: roslynLanguageServer,
|
|
137
173
|
configDescriptors: roslynConfigDescriptors,
|
|
138
174
|
onOpened: (runId) => startup?.opened(runId)
|
|
139
175
|
});
|
|
@@ -141,10 +177,13 @@ var plugin = {
|
|
|
141
177
|
manifest: languageServer.manifest,
|
|
142
178
|
register: (host) => {
|
|
143
179
|
languageServer.register(host);
|
|
144
|
-
|
|
180
|
+
const loadOnStart = solutionOnStart();
|
|
181
|
+
const preferred = preferredSolution(loadOnStart);
|
|
182
|
+
if (!loadOnStart) return;
|
|
145
183
|
startup = createSolutionOnStart({
|
|
146
184
|
pluginId: PLUGIN_ID,
|
|
147
|
-
adapterId:
|
|
185
|
+
adapterId: roslynLanguageServer.id,
|
|
186
|
+
preferred,
|
|
148
187
|
sandbox: () => host.service(sandboxServicesToken),
|
|
149
188
|
runtime: () => host.service(runtimeProviderToken)(),
|
|
150
189
|
ask: () => host.service(askServiceToken)
|
|
@@ -157,8 +196,7 @@ var plugin = {
|
|
|
157
196
|
|
|
158
197
|
// provision.ts
|
|
159
198
|
import { stat } from "node:fs/promises";
|
|
160
|
-
import
|
|
161
|
-
import { ROSLYN_SERVER_FILE } from "@ragents/workspace-executor";
|
|
199
|
+
import path3 from "node:path";
|
|
162
200
|
import {
|
|
163
201
|
DOTNET_INSTRUCTION,
|
|
164
202
|
downloadArchive,
|
|
@@ -175,7 +213,7 @@ var PACKAGE = "microsoft.codeanalysis.languageserver.neutral";
|
|
|
175
213
|
var PREFIX = "content/LanguageServer/neutral/";
|
|
176
214
|
var roslynArchiveUrl = `${FEED}/${PACKAGE}/${ROSLYN_VERSION}/${PACKAGE}.${ROSLYN_VERSION}.nupkg`;
|
|
177
215
|
var createRoslynProvision = (download = downloadArchive, runtimes = dotnetRuntimeMajors) => {
|
|
178
|
-
const serverFile = (target) =>
|
|
216
|
+
const serverFile = (target) => path3.join(target, ...ROSLYN_SERVER_FILE.split("/"));
|
|
179
217
|
const check = async (target) => {
|
|
180
218
|
if (await runtimes() === void 0) return provisionGap("dotnet", DOTNET_INSTRUCTION, false);
|
|
181
219
|
const installed = await stat(serverFile(target)).catch(() => void 0);
|
|
@@ -194,13 +232,14 @@ var createRoslynProvision = (download = downloadArchive, runtimes = dotnetRuntim
|
|
|
194
232
|
throw new Error(`Das Paket ${PACKAGE} ${ROSLYN_VERSION} enth\xE4lt ${ROSLYN_SERVER_FILE} nicht`);
|
|
195
233
|
}
|
|
196
234
|
await writeProvisionStamp(target, ROSLYN_VERSION);
|
|
197
|
-
log(`${files} Dateien nach ${
|
|
235
|
+
log(`${files} Dateien nach ${path3.join(target, "roslyn")}`);
|
|
198
236
|
}
|
|
199
237
|
};
|
|
200
238
|
};
|
|
201
239
|
var provision = createRoslynProvision();
|
|
202
240
|
export {
|
|
203
241
|
plugin,
|
|
242
|
+
preferredSolution,
|
|
204
243
|
provision,
|
|
205
244
|
roslynConfigDescriptors,
|
|
206
245
|
solutionOnStart
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../plugins/ragents.lsp-roslyn/server/index.ts", "../../../plugins/ragents.lsp-roslyn/server/solution-on-start.ts", "../../../plugins/ragents.lsp-roslyn/provision.ts"],
|
|
4
|
-
"sourcesContent": ["import { roslynAdapter, ROSLYN_SERVER_VARIABLE } from \"@ragents/workspace-executor\";\nimport { declaredEnvironment } from \"@ragents/host/plugin-support/plugin-config.js\";\nimport { createLanguageServerPlugin } from \"@ragents/host/plugin-support/language-server/plugin.js\";\nimport type { PluginModule } from \"@ragents/host/plugin-support/plugin-module.js\";\nimport { sandboxServicesToken } from \"@ragents/host/plugin-support/workspace-sandbox-host.js\";\nimport { runtimeProviderToken } from \"@ragents/host/ragents/host-services.js\";\nimport { askServiceToken } from \"@ragents/plugins/ragents.ask/server/contract.js\";\nimport { createSolutionOnStart, SOLUTION_ON_START_VARIABLE, type SolutionOnStart } from \"./solution-on-start.js\";\n\nexport const roslynConfigDescriptors = [\n { key: ROSLYN_SERVER_VARIABLE, source: \"environment\" },\n { key: SOLUTION_ON_START_VARIABLE, source: \"environment\" },\n] as const;\n\nconst PLUGIN_ID = \"ragents.lsp-roslyn\";\n\nconst env = declaredEnvironment(roslynConfigDescriptors);\n\n/** Ohne Angabe l\u00E4dt ein neuer Run nichts von selbst; einschalten geht nur ausdr\u00FCcklich mit \"on\". */\nexport const solutionOnStart = (): boolean => {\n const mode = env.optional(SOLUTION_ON_START_VARIABLE) ?? \"off\";\n if (mode !== \"on\" && mode !== \"off\") {\n throw new Error(`${SOLUTION_ON_START_VARIABLE} in der Sektion ragents.lsp-roslyn ist \"on\" oder \"off\", nicht \"${mode}\"`);\n }\n return mode === \"on\";\n};\n\nexport const plugin: PluginModule = {\n requires: [\"ragents.ask\"],\n create: () => {\n let startup: SolutionOnStart | undefined;\n const languageServer = createLanguageServerPlugin({\n id: PLUGIN_ID,\n adapter: roslynAdapter,\n configDescriptors: roslynConfigDescriptors,\n onOpened: (runId) => startup?.opened(runId),\n });\n return {\n manifest: languageServer.manifest,\n register: (host) => {\n languageServer.register(host);\n if (!solutionOnStart()) return;\n startup = createSolutionOnStart({\n pluginId: PLUGIN_ID,\n adapterId: roslynAdapter.id,\n sandbox: () => host.service(sandboxServicesToken),\n runtime: () => host.service(runtimeProviderToken)(),\n ask: () => host.service(askServiceToken),\n });\n host.lifecycle(startup.lifecycle);\n },\n };\n },\n};\n", "import type { Orchestration, SessionLifecycleContribution } from \"@ragents/engine\";\nimport {\n languageServerOpenOperation,\n languageServerSolutionsOperation,\n type LanguageServerSolutions,\n} from \"@ragents/workspace-executor\";\nimport type { SandboxServices } from \"@ragents/host/plugin-support/workspace-sandbox-host.js\";\nimport { DISMISSED_ANSWER, type AskService } from \"@ragents/plugins/ragents.ask/server/contract.js\";\n\nexport const SOLUTION_ON_START_VARIABLE = \"ROSLYN_SOLUTION_ON_START\";\nexport const NO_SOLUTION = \"Keine laden\";\nexport const SOLUTION_QUESTION = \"Welche Solution soll Roslyn f\u00FCr die Diagnostik laden?\";\n\nexport type SolutionStartStep =\n | { kind: \"none\" }\n | { kind: \"open\"; path: string }\n | { kind: \"ask\"; options: readonly string[] };\n\nexport type SolutionAnswer =\n | { kind: \"none\" }\n | { kind: \"open\"; path: string }\n | { kind: \"forward\" };\n\n/** Was jemand schon ge\u00F6ffnet hat oder gerade \u00F6ffnet, bleibt ohne Frage und ohne zweites Laden. */\nexport const solutionStartStep = (listing: LanguageServerSolutions): SolutionStartStep => {\n if (listing.opened || listing.solutions.length === 0) return { kind: \"none\" };\n if (listing.solutions.length === 1) return { kind: \"open\", path: listing.solutions[0].path };\n return { kind: \"ask\", options: [...listing.solutions.map((solution) => solution.path), NO_SOLUTION] };\n};\n\n/** Eine frei formulierte Antwort bekommt der Koordinator, damit sie nicht verloren geht. */\nexport const solutionAnswer = (options: readonly string[], answer: string): SolutionAnswer => {\n const chosen = answer.trim().replaceAll(\"\\\\\", \"/\");\n if (chosen === NO_SOLUTION || answer === DISMISSED_ANSWER) return { kind: \"none\" };\n return options.includes(chosen) ? { kind: \"open\", path: chosen } : { kind: \"forward\" };\n};\n\nexport interface SolutionOnStartOptions {\n pluginId: string;\n adapterId: string;\n sandbox: () => SandboxServices;\n runtime: () => Orchestration;\n ask: () => AskService;\n}\n\nconst messageOf = (error: unknown): string => error instanceof Error ? error.message : String(error);\n\n/** L\u00E4dt beim Start ohne Run-Script die einzige Solution oder fragt bei mehreren; der Merker im Journal l\u00E4sst das je Run h\u00F6chstens einmal zu. */\nexport interface SolutionOnStart {\n lifecycle: SessionLifecycleContribution;\n /** Jemand hat eine Instanz ge\u00F6ffnet; eine noch offene Startfrage erledigt sich damit ohne Laden und ohne Input. */\n opened: (runId: string) => void;\n}\n\nexport const createSolutionOnStart = (options: SolutionOnStartOptions): SolutionOnStart => {\n const running = new Map<string, AbortController>();\n const openTool = languageServerOpenOperation(options.adapterId);\n const questionCommand = (runId: string): string => `${options.pluginId}.solution-question:${runId}`;\n\n const marked = (runId: string): boolean => options.runtime().view(runId).pluginStates\n .some((entry) => entry.pluginId === options.pluginId && entry.scope.kind === \"run\");\n\n const load = async (runId: string, path: string, ifNoneOpen: boolean, signal: AbortSignal): Promise<void> => {\n await options.sandbox().execute(runId, openTool, { root: path, ifNoneOpen }, { signal });\n };\n\n const answered = async (runId: string, coordinatorId: string, choices: readonly string[], answer: string, signal: AbortSignal) => {\n const outcome = solutionAnswer(choices, answer);\n if (outcome.kind === \"open\") return load(runId, outcome.path, false, signal);\n if (outcome.kind === \"none\") return;\n const runtime = options.runtime();\n runtime.enqueueInput(\n { actorId: runtime.state(runId).ownerId, commandId: `${options.pluginId}.solution-answer:${runId}` },\n runId,\n { actorId: coordinatorId, content: `Antwort auf die Frage: ${SOLUTION_QUESTION}\\nAntwort: ${answer}\\n${openTool} l\u00E4dt eine Solution.` },\n );\n };\n\n const begin = async (runId: string, ownerId: string, coordinatorId: string, signal: AbortSignal): Promise<{ rest: Promise<void> }> => {\n const listing = await options.sandbox().execute(runId, languageServerSolutionsOperation(options.adapterId), null, { signal }) as LanguageServerSolutions;\n const step = solutionStartStep(listing);\n if (step.kind === \"none\") return { rest: Promise.resolve() };\n if (step.kind === \"open\") return { rest: load(runId, step.path, true, signal) };\n const answer = options.ask().ask(\n { runId, agentId: ownerId, turnId: null, commandId: questionCommand(runId) },\n {\n question: SOLUTION_QUESTION,\n description: \"Im Arbeitsbereich liegen mehrere Solutions; die gew\u00E4hlte l\u00E4dt Roslyn f\u00FCr die Diagnostik ohne Build.\",\n options: [...step.options],\n recipient: coordinatorId,\n },\n signal,\n );\n return { rest: answer.then((text) => answered(runId, coordinatorId, step.options, text, signal)) };\n };\n\n const finish = (runId: string, controller: AbortController, error?: unknown): void => {\n if (error !== undefined && !controller.signal.aborted) {\n console.error(`${options.pluginId}: Solution beim Start von ${runId} nicht geladen: ${messageOf(error)}`);\n }\n if (running.get(runId) === controller) running.delete(runId);\n };\n\n const stop = ({ runId }: { runId: string }): void => {\n running.get(runId)?.abort(new Error(\"Der Run wurde gestoppt\"));\n running.delete(runId);\n };\n\n const opened = (runId: string): void => {\n try {\n const proposed = options.runtime().events(runId).find((event) =>\n event.type === \"action.proposed\" && event.commandId === questionCommand(runId));\n if (proposed?.type === \"action.proposed\") options.ask().withdraw(runId, proposed.payload.actionId);\n } catch (error) {\n console.error(`${options.pluginId}: Startfrage von ${runId} nicht verworfen: ${messageOf(error)}`);\n }\n };\n\n const lifecycle: SessionLifecycleContribution = {\n id: `${options.pluginId}.solution-on-start`,\n sessionStarted: async ({ runId, startEntry }) => {\n if (marked(runId)) return;\n const runtime = options.runtime();\n const { ownerId, primaryActorId } = runtime.state(runId);\n runtime.replacePluginState(\n { actorId: ownerId, commandId: `${options.pluginId}.solution-on-start:${runId}` },\n runId,\n { pluginId: options.pluginId, scope: { kind: \"run\" }, state: { version: 1, startEntry: startEntry?.id ?? null } },\n );\n if (startEntry?.action === \"script\") return;\n if (!primaryActorId) throw new Error(`Der Run ${runId} hat beim Start keinen Koordinator, dem eine Antwort zugehen k\u00F6nnte`);\n const controller = new AbortController();\n running.set(runId, controller);\n try {\n const { rest } = await begin(runId, ownerId, primaryActorId, controller.signal);\n void rest.then(() => finish(runId, controller), (error: unknown) => finish(runId, controller, error));\n } catch (error) {\n finish(runId, controller, error);\n }\n },\n stopSession: stop,\n deleteSession: stop,\n };\n return { lifecycle, opened };\n};\n", "import { stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { ROSLYN_SERVER_FILE } from \"@ragents/workspace-executor\";\nimport {\n DOTNET_INSTRUCTION,\n downloadArchive,\n dotnetRuntimeMajors,\n provisionGap,\n provisionReady,\n readProvisionStamp,\n unpackArchive,\n writeProvisionStamp,\n type ArchiveDownload,\n type PluginProvision,\n type ProvisionState,\n} from \"@ragents/host/plugin-support/provision.js\";\n\nexport const ROSLYN_VERSION = \"5.4.0-2.26179.14\";\n\nconst FEED = \"https://pkgs.dev.azure.com/azure-public/vside/_packaging/vs-impl/nuget/v3/flat2\";\nconst PACKAGE = \"microsoft.codeanalysis.languageserver.neutral\";\nconst PREFIX = \"content/LanguageServer/neutral/\";\n\nexport const roslynArchiveUrl = `${FEED}/${PACKAGE}/${ROSLYN_VERSION}/${PACKAGE}.${ROSLYN_VERSION}.nupkg`;\n\nexport const createRoslynProvision = (\n download: ArchiveDownload = downloadArchive,\n runtimes: () => Promise<readonly number[] | undefined> = dotnetRuntimeMajors,\n): PluginProvision => {\n const serverFile = (target: string): string => path.join(target, ...ROSLYN_SERVER_FILE.split(\"/\"));\n const check = async (target: string): Promise<ProvisionState> => {\n if (await runtimes() === undefined) return provisionGap(\"dotnet\", DOTNET_INSTRUCTION, false);\n const installed = await stat(serverFile(target)).catch(() => undefined);\n if (installed?.isFile() && await readProvisionStamp(target) === ROSLYN_VERSION) return provisionReady;\n return provisionGap(\"roslyn\", `Microsoft.CodeAnalysis.LanguageServer ${ROSLYN_VERSION} fehlt unter ${serverFile(target)}`, true);\n };\n return {\n check,\n apply: async (target, log) => {\n const state = await check(target);\n if (state.kind === \"ready\") return;\n if (!state.installable) throw new Error(state.instruction);\n log(`Roslyn ${ROSLYN_VERSION} laden`);\n const files = await unpackArchive(await download(roslynArchiveUrl), PREFIX, target, \"roslyn\");\n if (!(await stat(serverFile(target)).catch(() => undefined))?.isFile()) {\n throw new Error(`Das Paket ${PACKAGE} ${ROSLYN_VERSION} enth\u00E4lt ${ROSLYN_SERVER_FILE} nicht`);\n }\n await writeProvisionStamp(target, ROSLYN_VERSION);\n log(`${files} Dateien nach ${path.join(target, \"roslyn\")}`);\n },\n };\n};\n\nexport const provision = createRoslynProvision();\n"],
|
|
5
|
-
"mappings": ";;;;AAAA,
|
|
6
|
-
"names": ["path"]
|
|
3
|
+
"sources": ["../../../plugins/ragents.lsp-roslyn/server/index.ts", "../../../plugins/ragents.lsp-roslyn/executor.ts", "../../../plugins/ragents.lsp-roslyn/server/solution-on-start.ts", "../../../plugins/ragents.lsp-roslyn/provision.ts"],
|
|
4
|
+
"sourcesContent": ["import path from \"node:path\";\nimport { declaredEnvironment } from \"@ragents/host/plugin-support/plugin-config.js\";\nimport { createLanguageServerPlugin } from \"@ragents/host/plugin-support/language-server/plugin.js\";\nimport type { PluginModule } from \"@ragents/host/plugin-support/plugin-module.js\";\nimport { sandboxServicesToken } from \"@ragents/host/plugin-support/workspace-sandbox-host.js\";\nimport { runtimeProviderToken } from \"@ragents/host/ragents/host-services.js\";\nimport { askServiceToken } from \"@ragents/plugins/ragents.ask/server/contract.js\";\nimport { roslynLanguageServer, ROSLYN_SERVER_VARIABLE } from \"../executor.js\";\nimport {\n createSolutionOnStart,\n SOLUTION_ON_START_VARIABLE,\n SOLUTION_PREFERRED_VARIABLE,\n type SolutionOnStart,\n} from \"./solution-on-start.js\";\n\nexport const roslynConfigDescriptors = [\n { key: ROSLYN_SERVER_VARIABLE, source: \"environment\" },\n { key: SOLUTION_ON_START_VARIABLE, source: \"environment\" },\n { key: SOLUTION_PREFERRED_VARIABLE, source: \"environment\" },\n] as const;\n\nconst PLUGIN_ID = \"ragents.lsp-roslyn\";\n\nconst env = declaredEnvironment(roslynConfigDescriptors);\n\n/** Ohne Angabe l\u00E4dt ein neuer Run nichts von selbst; einschalten geht nur ausdr\u00FCcklich mit \"on\". */\nexport const solutionOnStart = (): boolean => {\n const mode = env.optional(SOLUTION_ON_START_VARIABLE) ?? \"off\";\n if (mode !== \"on\" && mode !== \"off\") {\n throw new Error(`${SOLUTION_ON_START_VARIABLE} in der Sektion ragents.lsp-roslyn ist \"on\" oder \"off\", nicht \"${mode}\"`);\n }\n return mode === \"on\";\n};\n\n/** Ein Pfad relativ zur Wurzel des Arbeitsbereichs, wie ihn `roslyn_solutions` nennt; ohne Laden beim Start h\u00E4tte er keine Wirkung. */\nexport const preferredSolution = (loadOnStart: boolean): string | undefined => {\n const preferred = env.optional(SOLUTION_PREFERRED_VARIABLE);\n if (preferred === undefined) return undefined;\n if (!loadOnStart) {\n throw new Error(`${SOLUTION_PREFERRED_VARIABLE} in der Sektion ragents.lsp-roslyn verlangt ${SOLUTION_ON_START_VARIABLE}: \"on\"`);\n }\n if (preferred === \"\" || preferred.includes(\"\\\\\") || path.win32.isAbsolute(preferred)) {\n throw new Error(`${SOLUTION_PREFERRED_VARIABLE} in der Sektion ragents.lsp-roslyn ist ein Pfad relativ zum Arbeitsbereich mit Schr\u00E4gstrichen, nicht \"${preferred}\"`);\n }\n return preferred;\n};\n\nexport const plugin: PluginModule = {\n requires: [\"ragents.ask\"],\n create: () => {\n let startup: SolutionOnStart | undefined;\n const languageServer = createLanguageServerPlugin({\n id: PLUGIN_ID,\n languageServer: roslynLanguageServer,\n configDescriptors: roslynConfigDescriptors,\n onOpened: (runId) => startup?.opened(runId),\n });\n return {\n manifest: languageServer.manifest,\n register: (host) => {\n languageServer.register(host);\n const loadOnStart = solutionOnStart();\n const preferred = preferredSolution(loadOnStart);\n if (!loadOnStart) return;\n startup = createSolutionOnStart({\n pluginId: PLUGIN_ID,\n adapterId: roslynLanguageServer.id,\n preferred,\n sandbox: () => host.service(sandboxServicesToken),\n runtime: () => host.service(runtimeProviderToken)(),\n ask: () => host.service(askServiceToken),\n });\n host.lifecycle(startup.lifecycle);\n },\n };\n },\n};\n", "import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { LanguageServerDescription, WorkspaceExecutorContribution } from \"@ragents/workspace-executor\";\n\nexport const ROSLYN_SERVER_VARIABLE = \"ROSLYN_LANGUAGE_SERVER\";\nexport const ROSLYN_SERVER_FILE = \"roslyn/Microsoft.CodeAnalysis.LanguageServer.dll\";\n\nconst languages = { \".cs\": \"csharp\" } as const;\n\nexport const roslynLanguageServer: LanguageServerDescription = {\n id: \"roslyn\",\n label: \"Roslyn\",\n languages,\n rootDescription: \"the .sln file (or a single .csproj)\",\n solutionExtensions: [\".sln\", \".slnx\"],\n};\n\nconst dotnetCommand = (server: string, args: readonly string[]): { command: string; args: string[] } =>\n server.toLowerCase().endsWith(\".dll\")\n ? { command: \"dotnet\", args: [server, ...args] }\n : { command: server, args: [...args] };\n\nconst serverPath = (toolsDirectory: string): string => {\n const configured = process.env[ROSLYN_SERVER_VARIABLE];\n if (configured) return configured;\n const provisioned = path.join(toolsDirectory, ...ROSLYN_SERVER_FILE.split(\"/\"));\n if (existsSync(provisioned)) return provisioned;\n throw new Error(\"Microsoft.CodeAnalysis.LanguageServer gibt es auf diesem Rechner nicht: weder \"\n + `${ROSLYN_SERVER_VARIABLE} gesetzt noch ${provisioned} vorhanden. Ein Arbeitsplatz holt ihn mit `\n + `pnpm provision --workspace, ein Server \u00FCber pnpm provision <profil>; ${ROSLYN_SERVER_VARIABLE} \u00FCbersteuert beides`);\n};\n\nexport const executor: WorkspaceExecutorContribution = (machine) => ({\n languageServers: [{\n ...roslynLanguageServer,\n resolveRoot: (workspaceRoot, root) => machine.resolveRootFile(workspaceRoot, root, [\".sln\", \".slnx\", \".csproj\"]),\n rootDirectory: (root) => path.dirname(root),\n launch: async (context, root) => ({\n label: \"Roslyn\",\n ...dotnetCommand(serverPath(machine.toolsDirectory), [\n \"--stdio\",\n \"--logLevel\", \"Warning\",\n \"--extensionLogDirectory\", path.join(context.logDirectory, \"roslyn-logs\"),\n ]),\n cwd: path.dirname(root),\n env: context.env,\n uid: context.uid,\n gid: context.gid,\n rootUri: pathToFileURL(path.dirname(root)).href,\n languages,\n newFileSettleMs: 2_000,\n }),\n open: async (session, root, timeoutMs) => {\n const uri = pathToFileURL(root).href;\n const loaded = session.waitForNotification(timeoutMs, \"Projekte geladen\",\n (method) => method === \"workspace/projectInitializationComplete\");\n if (root.toLowerCase().endsWith(\".csproj\")) session.notify(\"project/open\", { projects: [uri] });\n else session.notify(\"solution/open\", { solution: uri });\n await loaded;\n return `${path.basename(root)} geladen`;\n },\n }],\n});\n", "import type { Orchestration, SessionLifecycleContribution } from \"@ragents/engine\";\nimport {\n languageServerOpenOperation,\n languageServerSolutionsOperation,\n type LanguageServerSolutions,\n} from \"@ragents/workspace-executor\";\nimport type { SandboxServices } from \"@ragents/host/plugin-support/workspace-sandbox-host.js\";\nimport { DISMISSED_ANSWER, type AskService } from \"@ragents/plugins/ragents.ask/server/contract.js\";\n\nexport const SOLUTION_ON_START_VARIABLE = \"ROSLYN_SOLUTION_ON_START\";\nexport const SOLUTION_PREFERRED_VARIABLE = \"ROSLYN_SOLUTION_PREFERRED\";\nexport const NO_SOLUTION = \"Keine laden\";\nexport const SOLUTION_QUESTION = \"Welche Solution soll Roslyn f\u00FCr die Diagnostik laden?\";\n\nexport type SolutionStartStep =\n | { kind: \"none\" }\n | { kind: \"open\"; path: string }\n | { kind: \"ask\"; options: readonly string[] };\n\nexport type SolutionAnswer =\n | { kind: \"none\" }\n | { kind: \"open\"; path: string }\n | { kind: \"forward\" };\n\n/** Die Vorgabe passt auch in einem Unterordner, etwa wenn der Arbeitsbereich der Ordner \u00FCber dem Checkout ist. */\nconst matchesPreferred = (solution: string, preferred: string): boolean => {\n const path = solution.toLowerCase();\n const expected = preferred.toLowerCase();\n return path === expected || path.endsWith(`/${expected}`);\n};\n\n/** Was jemand schon ge\u00F6ffnet hat oder gerade \u00F6ffnet, bleibt ohne Frage und ohne zweites Laden; passt die Vorgabe, z\u00E4hlen nur die passenden Solutions. */\nexport const solutionStartStep = (listing: LanguageServerSolutions, preferred?: string): SolutionStartStep => {\n if (listing.opened || listing.solutions.length === 0) return { kind: \"none\" };\n const paths = listing.solutions.map((solution) => solution.path);\n const matching = preferred === undefined ? [] : paths.filter((path) => matchesPreferred(path, preferred));\n const candidates = matching.length > 0 ? matching : paths;\n if (candidates.length === 1) return { kind: \"open\", path: candidates[0] };\n return { kind: \"ask\", options: [...candidates, NO_SOLUTION] };\n};\n\n/** Eine frei formulierte Antwort bekommt der Koordinator, damit sie nicht verloren geht. */\nexport const solutionAnswer = (options: readonly string[], answer: string): SolutionAnswer => {\n const chosen = answer.trim().replaceAll(\"\\\\\", \"/\");\n if (chosen === NO_SOLUTION || answer === DISMISSED_ANSWER) return { kind: \"none\" };\n return options.includes(chosen) ? { kind: \"open\", path: chosen } : { kind: \"forward\" };\n};\n\nexport interface SolutionOnStartOptions {\n pluginId: string;\n adapterId: string;\n preferred?: string;\n sandbox: () => SandboxServices;\n runtime: () => Orchestration;\n ask: () => AskService;\n}\n\nconst messageOf = (error: unknown): string => error instanceof Error ? error.message : String(error);\n\n/** L\u00E4dt beim Start ohne Run-Script die Vorgabe oder die einzige Solution oder fragt bei mehreren; der Merker im Journal l\u00E4sst das je Run h\u00F6chstens einmal zu. */\nexport interface SolutionOnStart {\n lifecycle: SessionLifecycleContribution;\n /** Jemand hat eine Instanz ge\u00F6ffnet; eine noch offene Startfrage erledigt sich damit ohne Laden und ohne Input. */\n opened: (runId: string) => void;\n}\n\nexport const createSolutionOnStart = (options: SolutionOnStartOptions): SolutionOnStart => {\n const running = new Map<string, AbortController>();\n const openTool = languageServerOpenOperation(options.adapterId);\n const questionCommand = (runId: string): string => `${options.pluginId}.solution-question:${runId}`;\n\n const marked = (runId: string): boolean => options.runtime().view(runId).pluginStates\n .some((entry) => entry.pluginId === options.pluginId && entry.scope.kind === \"run\");\n\n const load = async (runId: string, path: string, ifNoneOpen: boolean, signal: AbortSignal): Promise<void> => {\n await options.sandbox().execute(runId, openTool, { root: path, ifNoneOpen }, { signal });\n };\n\n const answered = async (runId: string, coordinatorId: string, choices: readonly string[], answer: string, signal: AbortSignal) => {\n const outcome = solutionAnswer(choices, answer);\n if (outcome.kind === \"open\") return load(runId, outcome.path, false, signal);\n if (outcome.kind === \"none\") return;\n const runtime = options.runtime();\n runtime.enqueueInput(\n { actorId: runtime.state(runId).ownerId, commandId: `${options.pluginId}.solution-answer:${runId}` },\n runId,\n { actorId: coordinatorId, content: `Antwort auf die Frage: ${SOLUTION_QUESTION}\\nAntwort: ${answer}\\n${openTool} l\u00E4dt eine Solution.` },\n );\n };\n\n const begin = async (runId: string, ownerId: string, coordinatorId: string, signal: AbortSignal): Promise<{ rest: Promise<void> }> => {\n const listing = await options.sandbox().execute(runId, languageServerSolutionsOperation(options.adapterId), null, { signal }) as LanguageServerSolutions;\n const step = solutionStartStep(listing, options.preferred);\n if (step.kind === \"none\") return { rest: Promise.resolve() };\n if (step.kind === \"open\") return { rest: load(runId, step.path, true, signal) };\n const answer = options.ask().ask(\n { runId, agentId: ownerId, turnId: null, commandId: questionCommand(runId) },\n {\n question: SOLUTION_QUESTION,\n description: \"Im Arbeitsbereich liegen mehrere Solutions; die gew\u00E4hlte l\u00E4dt Roslyn f\u00FCr die Diagnostik ohne Build.\",\n options: [...step.options],\n recipient: coordinatorId,\n },\n signal,\n );\n return { rest: answer.then((text) => answered(runId, coordinatorId, step.options, text, signal)) };\n };\n\n const finish = (runId: string, controller: AbortController, error?: unknown): void => {\n if (error !== undefined && !controller.signal.aborted) {\n console.error(`${options.pluginId}: Solution beim Start von ${runId} nicht geladen: ${messageOf(error)}`);\n }\n if (running.get(runId) === controller) running.delete(runId);\n };\n\n const stop = ({ runId }: { runId: string }): void => {\n running.get(runId)?.abort(new Error(\"Der Run wurde gestoppt\"));\n running.delete(runId);\n };\n\n const opened = (runId: string): void => {\n try {\n const proposed = options.runtime().events(runId).find((event) =>\n event.type === \"action.proposed\" && event.commandId === questionCommand(runId));\n if (proposed?.type === \"action.proposed\") options.ask().withdraw(runId, proposed.payload.actionId);\n } catch (error) {\n console.error(`${options.pluginId}: Startfrage von ${runId} nicht verworfen: ${messageOf(error)}`);\n }\n };\n\n const lifecycle: SessionLifecycleContribution = {\n id: `${options.pluginId}.solution-on-start`,\n sessionStarted: async ({ runId, startEntry }) => {\n if (marked(runId)) return;\n const runtime = options.runtime();\n const { ownerId, primaryActorId } = runtime.state(runId);\n runtime.replacePluginState(\n { actorId: ownerId, commandId: `${options.pluginId}.solution-on-start:${runId}` },\n runId,\n { pluginId: options.pluginId, scope: { kind: \"run\" }, state: { version: 1, startEntry: startEntry?.id ?? null } },\n );\n if (startEntry?.action === \"script\") return;\n if (!primaryActorId) throw new Error(`Der Run ${runId} hat beim Start keinen Koordinator, dem eine Antwort zugehen k\u00F6nnte`);\n const controller = new AbortController();\n running.set(runId, controller);\n try {\n const { rest } = await begin(runId, ownerId, primaryActorId, controller.signal);\n void rest.then(() => finish(runId, controller), (error: unknown) => finish(runId, controller, error));\n } catch (error) {\n finish(runId, controller, error);\n }\n },\n stopSession: stop,\n deleteSession: stop,\n };\n return { lifecycle, opened };\n};\n", "import { stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n DOTNET_INSTRUCTION,\n downloadArchive,\n dotnetRuntimeMajors,\n provisionGap,\n provisionReady,\n readProvisionStamp,\n unpackArchive,\n writeProvisionStamp,\n type ArchiveDownload,\n type PluginProvision,\n type ProvisionState,\n} from \"@ragents/host/plugin-support/provision.js\";\nimport { ROSLYN_SERVER_FILE } from \"./executor.js\";\n\nexport const ROSLYN_VERSION = \"5.4.0-2.26179.14\";\n\nconst FEED = \"https://pkgs.dev.azure.com/azure-public/vside/_packaging/vs-impl/nuget/v3/flat2\";\nconst PACKAGE = \"microsoft.codeanalysis.languageserver.neutral\";\nconst PREFIX = \"content/LanguageServer/neutral/\";\n\nexport const roslynArchiveUrl = `${FEED}/${PACKAGE}/${ROSLYN_VERSION}/${PACKAGE}.${ROSLYN_VERSION}.nupkg`;\n\nexport const createRoslynProvision = (\n download: ArchiveDownload = downloadArchive,\n runtimes: () => Promise<readonly number[] | undefined> = dotnetRuntimeMajors,\n): PluginProvision => {\n const serverFile = (target: string): string => path.join(target, ...ROSLYN_SERVER_FILE.split(\"/\"));\n const check = async (target: string): Promise<ProvisionState> => {\n if (await runtimes() === undefined) return provisionGap(\"dotnet\", DOTNET_INSTRUCTION, false);\n const installed = await stat(serverFile(target)).catch(() => undefined);\n if (installed?.isFile() && await readProvisionStamp(target) === ROSLYN_VERSION) return provisionReady;\n return provisionGap(\"roslyn\", `Microsoft.CodeAnalysis.LanguageServer ${ROSLYN_VERSION} fehlt unter ${serverFile(target)}`, true);\n };\n return {\n check,\n apply: async (target, log) => {\n const state = await check(target);\n if (state.kind === \"ready\") return;\n if (!state.installable) throw new Error(state.instruction);\n log(`Roslyn ${ROSLYN_VERSION} laden`);\n const files = await unpackArchive(await download(roslynArchiveUrl), PREFIX, target, \"roslyn\");\n if (!(await stat(serverFile(target)).catch(() => undefined))?.isFile()) {\n throw new Error(`Das Paket ${PACKAGE} ${ROSLYN_VERSION} enth\u00E4lt ${ROSLYN_SERVER_FILE} nicht`);\n }\n await writeProvisionStamp(target, ROSLYN_VERSION);\n log(`${files} Dateien nach ${path.join(target, \"roslyn\")}`);\n },\n };\n};\n\nexport const provision = createRoslynProvision();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["path", "path", "path", "path", "path"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createRequire as __ragentsCreateRequire } from "node:module";
|
|
2
|
+
const require = __ragentsCreateRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
// executor.ts
|
|
5
|
+
import { stat } from "node:fs/promises";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { pathToFileURL } from "node:url";
|
|
8
|
+
var languages = {
|
|
9
|
+
".ts": "typescript",
|
|
10
|
+
".tsx": "typescriptreact",
|
|
11
|
+
".mts": "typescript",
|
|
12
|
+
".cts": "typescript",
|
|
13
|
+
".js": "javascript",
|
|
14
|
+
".jsx": "javascriptreact"
|
|
15
|
+
};
|
|
16
|
+
var typescriptLanguageServer = {
|
|
17
|
+
id: "typescript",
|
|
18
|
+
label: "TypeScript",
|
|
19
|
+
languages,
|
|
20
|
+
rootDescription: "the directory whose tsconfig.json projects should be served (e.g. src)"
|
|
21
|
+
};
|
|
22
|
+
var hasWorkspaceTypeScript = (root) => stat(path.join(root, "node_modules", "typescript", "lib", "tsserver.js")).then((info) => info.isFile(), () => false);
|
|
23
|
+
var executor = (machine) => ({
|
|
24
|
+
languageServers: [{
|
|
25
|
+
...typescriptLanguageServer,
|
|
26
|
+
resolveRoot: machine.resolveRootDirectory,
|
|
27
|
+
rootDirectory: (root) => root,
|
|
28
|
+
launch: async (context, root) => ({
|
|
29
|
+
label: "TypeScript",
|
|
30
|
+
command: process.execPath,
|
|
31
|
+
args: [machine.hostPackageFile(context.hostRoot, "typescript-language-server/lib/cli.mjs"), "--stdio"],
|
|
32
|
+
cwd: root,
|
|
33
|
+
// Im Extension-Host ist process.execPath Electron; ohne diese Variable startet es die Anwendung statt des Skripts.
|
|
34
|
+
env: { ...context.env, ELECTRON_RUN_AS_NODE: "1" },
|
|
35
|
+
uid: context.uid,
|
|
36
|
+
gid: context.gid,
|
|
37
|
+
rootUri: pathToFileURL(root).href,
|
|
38
|
+
initializationOptions: await hasWorkspaceTypeScript(root) ? {} : { tsserver: { path: path.dirname(machine.hostPackageFile(context.hostRoot, "typescript")) } },
|
|
39
|
+
languages,
|
|
40
|
+
publishesOnlyChangedDiagnostics: true
|
|
41
|
+
}),
|
|
42
|
+
open: async (_session, root) => `TypeScript-Server auf ${path.basename(root)} bereit; Projekte werden je Datei aus der n\xE4chsten tsconfig.json geladen`
|
|
43
|
+
}]
|
|
44
|
+
});
|
|
45
|
+
export {
|
|
46
|
+
executor,
|
|
47
|
+
typescriptLanguageServer
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../plugins/ragents.lsp-typescript/executor.ts"],
|
|
4
|
+
"sourcesContent": ["import { stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { LanguageServerDescription, WorkspaceExecutorContribution } from \"@ragents/workspace-executor\";\n\nconst languages = {\n \".ts\": \"typescript\",\n \".tsx\": \"typescriptreact\",\n \".mts\": \"typescript\",\n \".cts\": \"typescript\",\n \".js\": \"javascript\",\n \".jsx\": \"javascriptreact\",\n} as const;\n\nexport const typescriptLanguageServer: LanguageServerDescription = {\n id: \"typescript\",\n label: \"TypeScript\",\n languages,\n rootDescription: \"the directory whose tsconfig.json projects should be served (e.g. src)\",\n};\n\nconst hasWorkspaceTypeScript = (root: string): Promise<boolean> =>\n stat(path.join(root, \"node_modules\", \"typescript\", \"lib\", \"tsserver.js\")).then((info) => info.isFile(), () => false);\n\n/** Sprachserver und Compiler liegen in den node_modules des Hosts dieser Maschine; ohne Host gibt es sie hier nicht. */\nexport const executor: WorkspaceExecutorContribution = (machine) => ({\n languageServers: [{\n ...typescriptLanguageServer,\n resolveRoot: machine.resolveRootDirectory,\n rootDirectory: (root) => root,\n launch: async (context, root) => ({\n label: \"TypeScript\",\n command: process.execPath,\n args: [machine.hostPackageFile(context.hostRoot, \"typescript-language-server/lib/cli.mjs\"), \"--stdio\"],\n cwd: root,\n // Im Extension-Host ist process.execPath Electron; ohne diese Variable startet es die Anwendung statt des Skripts.\n env: { ...context.env, ELECTRON_RUN_AS_NODE: \"1\" },\n uid: context.uid,\n gid: context.gid,\n rootUri: pathToFileURL(root).href,\n initializationOptions: await hasWorkspaceTypeScript(root)\n ? {}\n : { tsserver: { path: path.dirname(machine.hostPackageFile(context.hostRoot, \"typescript\")) } },\n languages,\n publishesOnlyChangedDiagnostics: true,\n }),\n open: async (_session, root) =>\n `TypeScript-Server auf ${path.basename(root)} bereit; Projekte werden je Datei aus der n\u00E4chsten tsconfig.json geladen`,\n }],\n});\n"],
|
|
5
|
+
"mappings": ";;;;AAAA,SAAS,YAAY;AACrB,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAG9B,IAAM,YAAY;AAAA,EAChB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AACV;AAEO,IAAM,2BAAsD;AAAA,EACjE,IAAI;AAAA,EACJ,OAAO;AAAA,EACP;AAAA,EACA,iBAAiB;AACnB;AAEA,IAAM,yBAAyB,CAAC,SAC9B,KAAK,KAAK,KAAK,MAAM,gBAAgB,cAAc,OAAO,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,OAAO,GAAG,MAAM,KAAK;AAG9G,IAAM,WAA0C,CAAC,aAAa;AAAA,EACnE,iBAAiB,CAAC;AAAA,IAChB,GAAG;AAAA,IACH,aAAa,QAAQ;AAAA,IACrB,eAAe,CAAC,SAAS;AAAA,IACzB,QAAQ,OAAO,SAAS,UAAU;AAAA,MAChC,OAAO;AAAA,MACP,SAAS,QAAQ;AAAA,MACjB,MAAM,CAAC,QAAQ,gBAAgB,QAAQ,UAAU,wCAAwC,GAAG,SAAS;AAAA,MACrG,KAAK;AAAA;AAAA,MAEL,KAAK,EAAE,GAAG,QAAQ,KAAK,sBAAsB,IAAI;AAAA,MACjD,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA,MACb,SAAS,cAAc,IAAI,EAAE;AAAA,MAC7B,uBAAuB,MAAM,uBAAuB,IAAI,IACpD,CAAC,IACD,EAAE,UAAU,EAAE,MAAM,KAAK,QAAQ,QAAQ,gBAAgB,QAAQ,UAAU,YAAY,CAAC,EAAE,EAAE;AAAA,MAChG;AAAA,MACA,iCAAiC;AAAA,IACnC;AAAA,IACA,MAAM,OAAO,UAAU,SACrB,yBAAyB,KAAK,SAAS,IAAI,CAAC;AAAA,EAChD,CAAC;AACH;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
"format":
|
|
2
|
+
"format": 4,
|
|
3
3
|
"id": "ragents.lsp-typescript",
|
|
4
|
-
"api":
|
|
4
|
+
"api": 7,
|
|
5
5
|
"hostNames": {
|
|
6
6
|
"server": {
|
|
7
7
|
"@ragents/host/plugin-support/language-server/plugin": [
|
|
8
8
|
"createLanguageServerPlugin"
|
|
9
|
-
],
|
|
10
|
-
"@ragents/workspace-executor": [
|
|
11
|
-
"typescriptAdapter"
|
|
12
9
|
]
|
|
13
10
|
},
|
|
14
11
|
"web": {
|
|
@@ -20,13 +17,14 @@
|
|
|
20
17
|
]
|
|
21
18
|
}
|
|
22
19
|
},
|
|
23
|
-
"stand": "
|
|
24
|
-
"sourceStand": "
|
|
20
|
+
"stand": "dd53ba53f6e472fce212ed551f10909efd9350762ad6a319a0a1e1fdf1366633",
|
|
21
|
+
"sourceStand": "2be508860c9ec7d3ba61c558a25ab753c854ebc4bb95c27b7c35539d5a844bbf",
|
|
25
22
|
"server": "server/index.js",
|
|
26
23
|
"web": {
|
|
27
24
|
"entry": "web/index.js",
|
|
28
25
|
"classes": "web/classes.json"
|
|
29
26
|
},
|
|
27
|
+
"executor": "executor/index.mjs",
|
|
30
28
|
"exports": {
|
|
31
29
|
"server": {},
|
|
32
30
|
"web": {}
|
|
@@ -2,10 +2,30 @@ import { createRequire as __ragentsCreateRequire } from "node:module";
|
|
|
2
2
|
const require = __ragentsCreateRequire(import.meta.url);
|
|
3
3
|
|
|
4
4
|
// server/index.ts
|
|
5
|
-
import { typescriptAdapter } from "@ragents/workspace-executor";
|
|
6
5
|
import { createLanguageServerPlugin } from "@ragents/host/plugin-support/language-server/plugin.js";
|
|
6
|
+
|
|
7
|
+
// executor.ts
|
|
8
|
+
import { stat } from "node:fs/promises";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import { pathToFileURL } from "node:url";
|
|
11
|
+
var languages = {
|
|
12
|
+
".ts": "typescript",
|
|
13
|
+
".tsx": "typescriptreact",
|
|
14
|
+
".mts": "typescript",
|
|
15
|
+
".cts": "typescript",
|
|
16
|
+
".js": "javascript",
|
|
17
|
+
".jsx": "javascriptreact"
|
|
18
|
+
};
|
|
19
|
+
var typescriptLanguageServer = {
|
|
20
|
+
id: "typescript",
|
|
21
|
+
label: "TypeScript",
|
|
22
|
+
languages,
|
|
23
|
+
rootDescription: "the directory whose tsconfig.json projects should be served (e.g. src)"
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// server/index.ts
|
|
7
27
|
var plugin = {
|
|
8
|
-
create: () => createLanguageServerPlugin({ id: "ragents.lsp-typescript",
|
|
28
|
+
create: () => createLanguageServerPlugin({ id: "ragents.lsp-typescript", languageServer: typescriptLanguageServer })
|
|
9
29
|
};
|
|
10
30
|
export {
|
|
11
31
|
plugin
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../plugins/ragents.lsp-typescript/server/index.ts"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": ";;;;AAAA,SAAS,
|
|
3
|
+
"sources": ["../../../plugins/ragents.lsp-typescript/server/index.ts", "../../../plugins/ragents.lsp-typescript/executor.ts"],
|
|
4
|
+
"sourcesContent": ["import { createLanguageServerPlugin } from \"@ragents/host/plugin-support/language-server/plugin.js\";\nimport type { PluginModule } from \"@ragents/host/plugin-support/plugin-module.js\";\nimport { typescriptLanguageServer } from \"../executor.js\";\n\nexport const plugin: PluginModule = {\n create: () => createLanguageServerPlugin({ id: \"ragents.lsp-typescript\", languageServer: typescriptLanguageServer }),\n};\n", "import { stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { LanguageServerDescription, WorkspaceExecutorContribution } from \"@ragents/workspace-executor\";\n\nconst languages = {\n \".ts\": \"typescript\",\n \".tsx\": \"typescriptreact\",\n \".mts\": \"typescript\",\n \".cts\": \"typescript\",\n \".js\": \"javascript\",\n \".jsx\": \"javascriptreact\",\n} as const;\n\nexport const typescriptLanguageServer: LanguageServerDescription = {\n id: \"typescript\",\n label: \"TypeScript\",\n languages,\n rootDescription: \"the directory whose tsconfig.json projects should be served (e.g. src)\",\n};\n\nconst hasWorkspaceTypeScript = (root: string): Promise<boolean> =>\n stat(path.join(root, \"node_modules\", \"typescript\", \"lib\", \"tsserver.js\")).then((info) => info.isFile(), () => false);\n\n/** Sprachserver und Compiler liegen in den node_modules des Hosts dieser Maschine; ohne Host gibt es sie hier nicht. */\nexport const executor: WorkspaceExecutorContribution = (machine) => ({\n languageServers: [{\n ...typescriptLanguageServer,\n resolveRoot: machine.resolveRootDirectory,\n rootDirectory: (root) => root,\n launch: async (context, root) => ({\n label: \"TypeScript\",\n command: process.execPath,\n args: [machine.hostPackageFile(context.hostRoot, \"typescript-language-server/lib/cli.mjs\"), \"--stdio\"],\n cwd: root,\n // Im Extension-Host ist process.execPath Electron; ohne diese Variable startet es die Anwendung statt des Skripts.\n env: { ...context.env, ELECTRON_RUN_AS_NODE: \"1\" },\n uid: context.uid,\n gid: context.gid,\n rootUri: pathToFileURL(root).href,\n initializationOptions: await hasWorkspaceTypeScript(root)\n ? {}\n : { tsserver: { path: path.dirname(machine.hostPackageFile(context.hostRoot, \"typescript\")) } },\n languages,\n publishesOnlyChangedDiagnostics: true,\n }),\n open: async (_session, root) =>\n `TypeScript-Server auf ${path.basename(root)} bereit; Projekte werden je Datei aus der n\u00E4chsten tsconfig.json geladen`,\n }],\n});\n"],
|
|
5
|
+
"mappings": ";;;;AAAA,SAAS,kCAAkC;;;ACA3C,SAAS,YAAY;AACrB,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAG9B,IAAM,YAAY;AAAA,EAChB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AACV;AAEO,IAAM,2BAAsD;AAAA,EACjE,IAAI;AAAA,EACJ,OAAO;AAAA,EACP;AAAA,EACA,iBAAiB;AACnB;;;ADfO,IAAM,SAAuB;AAAA,EAClC,QAAQ,MAAM,2BAA2B,EAAE,IAAI,0BAA0B,gBAAgB,yBAAyB,CAAC;AACrH;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"format":
|
|
2
|
+
"format": 4,
|
|
3
3
|
"id": "ragents.model-relay",
|
|
4
|
-
"api":
|
|
4
|
+
"api": 7,
|
|
5
5
|
"hostNames": {
|
|
6
6
|
"server": {
|
|
7
7
|
"@ragents/host/plugin-support/http": [
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
},
|
|
22
22
|
"web": {}
|
|
23
23
|
},
|
|
24
|
-
"stand": "
|
|
25
|
-
"sourceStand": "
|
|
24
|
+
"stand": "d9b2bb73d0a0ce28e3dc6ba8ebb3e4468c622acbfd36252cd0107e78001aa155",
|
|
25
|
+
"sourceStand": "c369f726eed75198cb6d9d4f97377969818766043a4ffa01fff99a3988919947",
|
|
26
26
|
"server": "server/index.js",
|
|
27
27
|
"exports": {
|
|
28
28
|
"server": {},
|
|
@@ -8,7 +8,7 @@ import { Protocol } from "@ragents/host/protocol.js";
|
|
|
8
8
|
// server/config.ts
|
|
9
9
|
import { configuredModelAliases } from "@ragents/host/plugin-support/model-aliases.js";
|
|
10
10
|
var relayAliases = (aliases) => {
|
|
11
|
-
if (aliases.length === 0) throw new Error(
|
|
11
|
+
if (aliases.length === 0) throw new Error("ragents.model-relay needs MODEL_ALIASES in the host section, a list of { alias, model, thinking?, compaction }");
|
|
12
12
|
return aliases;
|
|
13
13
|
};
|
|
14
14
|
var modelRelayConfig = Object.freeze({
|
|
@@ -32,7 +32,7 @@ var resolveAliases = (aliases, upstreams) => aliases.map((entry) => {
|
|
|
32
32
|
}
|
|
33
33
|
const model = upstream.models.find((candidate) => candidate.id === entry.model);
|
|
34
34
|
if (!model) throw new Error(`MODEL_ALIASES: das Modell ${entry.model} hinter ${entry.alias} fehlt im Katalog von ${entry.upstream}`);
|
|
35
|
-
return { alias: entry.alias, upstream, model };
|
|
35
|
+
return { alias: entry.alias, upstream, model, compaction: entry.compaction };
|
|
36
36
|
});
|
|
37
37
|
var catalogEntryOf = (resolved) => ({
|
|
38
38
|
id: resolved.alias,
|
|
@@ -44,6 +44,7 @@ var catalogEntryOf = (resolved) => ({
|
|
|
44
44
|
input: [...resolved.model.input],
|
|
45
45
|
contextWindow: resolved.model.contextWindow,
|
|
46
46
|
maxTokens: resolved.model.maxTokens,
|
|
47
|
+
compaction: resolved.compaction,
|
|
47
48
|
...resolved.model.compat ? { compat: resolved.model.compat } : {}
|
|
48
49
|
}
|
|
49
50
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../plugins/ragents.model-relay/server/index.ts", "../../../plugins/ragents.model-relay/server/config.ts", "../../../plugins/ragents.model-relay/server/relay.ts"],
|
|
4
|
-
"sourcesContent": ["import type { RAgentsPlugin } from \"@ragents/engine\";\nimport { modelUpstreamsToken } from \"@ragents/host/plugin-support/model-upstreams.js\";\nimport type { PluginModule } from \"@ragents/host/plugin-support/plugin-module.js\";\nimport { Protocol } from \"@ragents/host/protocol.js\";\nimport { modelRelayConfig } from \"./config.js\";\nimport { createRelayRoutes, resolveAliases, type ResolvedAlias } from \"./relay.js\";\n\nconst modelRelayPlugin: RAgentsPlugin = {\n manifest: { id: \"ragents.model-relay\" },\n register: (host) => {\n const upstreams = host.service(modelUpstreamsToken);\n let resolved: readonly ResolvedAlias[] | undefined;\n const aliases = (): readonly ResolvedAlias[] => resolved ??= resolveAliases(modelRelayConfig.aliases(), upstreams());\n const log = new Protocol(host.storage.root(\"relay.log\"));\n host.lifecycle({\n id: \"ragents.model-relay\",\n initialize: () => {\n const list = aliases();\n log.write(`=== Start: ${list.map((entry) => `${entry.alias}=${entry.upstream.id}/${entry.model.id}`).join(\", \")} ===`);\n console.log(`Modell-Relay: ${list.length} Aliasse unter /relay/v1 (${list.map((entry) => entry.alias).join(\", \")})`);\n },\n shutdown: () => log.close(),\n });\n host.http(...createRelayRoutes({ aliases, log: (line) => log.write(line) }));\n },\n};\n\nexport const plugin: PluginModule = {\n create: () => modelRelayPlugin,\n};\n", "import { configuredModelAliases, type ModelAlias } from \"@ragents/host/plugin-support/model-aliases.js\";\n\n/** Das Relay bietet die Aliasse des Profils an (MODEL_ALIASES im Abschnitt host), dieselben wie f\u00FCr die eigenen Runs. */\nexport const relayAliases = (aliases: readonly ModelAlias[]): readonly ModelAlias[] => {\n if (aliases.length === 0) throw new Error(\"ragents.model-relay braucht MODEL_ALIASES im Abschnitt host; erwartet wird eine Liste \\\"alias=anbieter/modell\\\"\");\n return aliases;\n};\n\nexport const modelRelayConfig = Object.freeze({\n aliases: () => relayAliases(configuredModelAliases()),\n});\n", "import type { IncomingMessage } from \"node:http\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport type { ReadableStream } from \"node:stream/web\";\nimport type { HttpRouteContribution } from \"@ragents/engine\";\nimport { PayloadTooLargeError, readBody, writeJson } from \"@ragents/host/plugin-support/http.js\";\nimport type { ModelAlias } from \"@ragents/host/plugin-support/model-aliases.js\";\nimport type { ModelUpstream } from \"@ragents/host/plugin-support/model-upstreams.js\";\n\nexport const RELAY_PATH_PREFIX = \"/relay/v1\";\nexport const RELAY_RIGHT = \"models.use\";\n\nconst MAX_REQUEST_BYTES = 64 * 1024 * 1024;\nconst MAX_SCAN_BYTES = 8 * 1024 * 1024;\nconst DROPPED_HEADERS = new Set([\"host\", \"authorization\", \"cookie\", \"content-length\", \"connection\", \"transfer-encoding\", \"accept-encoding\", \"expect\"]);\n\nexport interface ResolvedAlias {\n readonly alias: string;\n readonly upstream: ModelUpstream;\n readonly model: ModelUpstream[\"models\"][number];\n}\n\n/** Jeder Alias muss auf einen konfigurierten Anbieter und ein Modell aus dessen Katalog zeigen. */\nexport const resolveAliases = (aliases: readonly ModelAlias[], upstreams: readonly ModelUpstream[]): readonly ResolvedAlias[] =>\n aliases.map((entry) => {\n const upstream = upstreams.find((candidate) => candidate.id === entry.upstream);\n if (!upstream) {\n const available = upstreams.map((candidate) => candidate.id).join(\", \") || \"keiner\";\n throw new Error(`MODEL_ALIASES: der Anbieter ${entry.upstream} hinter ${entry.alias} ist auf diesem Server nicht konfiguriert (verf\u00FCgbar: ${available})`);\n }\n const model = upstream.models.find((candidate) => candidate.id === entry.model);\n if (!model) throw new Error(`MODEL_ALIASES: das Modell ${entry.model} hinter ${entry.alias} fehlt im Katalog von ${entry.upstream}`);\n return { alias: entry.alias, upstream, model };\n });\n\n/** Der Katalogeintrag nennt nur, was der Verbraucher f\u00FCr den Draht braucht; Name, Anbieter und Kosten bleiben beim Server. */\nexport const catalogEntryOf = (resolved: ResolvedAlias) => ({\n id: resolved.alias,\n object: \"model\" as const,\n owned_by: \"relay\",\n catalog: {\n reasoning: resolved.model.reasoning,\n ...(resolved.model.thinkingLevelMap ? { thinkingLevelMap: resolved.model.thinkingLevelMap } : {}),\n input: [...resolved.model.input],\n contextWindow: resolved.model.contextWindow,\n maxTokens: resolved.model.maxTokens,\n ...(resolved.model.compat ? { compat: resolved.model.compat } : {}),\n },\n});\n\ninterface Usage {\n readonly prompt: number | undefined;\n readonly completion: number | undefined;\n}\n\n/** Ersetzt im durchgereichten Strom den echten Modellnamen durch den Alias, entfernt den Anbieter und merkt sich den letzten usage-Block. */\nconst responseRewriter = (alias: string) => {\n const decoder = new TextDecoder();\n let pending = \"\";\n let usage: Usage | undefined;\n let overflow = false;\n const rewrite = (text: string): string => {\n let parsed: unknown;\n try { parsed = JSON.parse(text); }\n catch { return text; }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return text;\n const body = parsed as { model?: unknown; provider?: unknown; usage?: { prompt_tokens?: unknown; completion_tokens?: unknown } };\n if (body.usage && typeof body.usage === \"object\") {\n const number = (value: unknown) => typeof value === \"number\" ? value : undefined;\n usage = { prompt: number(body.usage.prompt_tokens), completion: number(body.usage.completion_tokens) };\n }\n if (typeof body.model !== \"string\" && body.provider === undefined) return text;\n const rest = Object.fromEntries(Object.entries(body).filter(([key]) => key !== \"provider\"));\n return JSON.stringify(typeof body.model === \"string\" ? { ...rest, model: alias } : rest);\n };\n const line = (text: string): string => text.startsWith(\"data: \") ? `data: ${rewrite(text.slice(6))}` : text;\n return {\n feed: (chunk: Buffer): string => {\n const text = decoder.decode(chunk, { stream: true });\n if (overflow) return text;\n pending += text;\n const lines = pending.split(\"\\n\");\n pending = lines.pop() ?? \"\";\n const forwarded = lines.map((entry) => `${line(entry)}\\n`).join(\"\");\n if (pending.length <= MAX_SCAN_BYTES) return forwarded;\n overflow = true;\n const remainder = pending;\n pending = \"\";\n return `${forwarded}${remainder}`;\n },\n finish: (): string => {\n const rest = overflow || !pending.trim() ? pending : pending.startsWith(\"data: \") ? line(pending) : rewrite(pending);\n pending = \"\";\n return rest;\n },\n usage: (): Usage | undefined => usage,\n };\n};\n\nconst openAiError = (message: string, type: string) => ({ error: { message, type } });\n\nconst forwardedHeaders = (request: IncomingMessage, apiKey: string): Record<string, string> => {\n const headers: Record<string, string> = {};\n for (const [name, value] of Object.entries(request.headers)) {\n if (DROPPED_HEADERS.has(name) || value === undefined) continue;\n headers[name] = Array.isArray(value) ? value.join(\", \") : value;\n }\n headers[\"content-type\"] = \"application/json\";\n headers.authorization = `Bearer ${apiKey}`;\n return headers;\n};\n\nexport interface RelayRouteOptions {\n aliases: () => readonly ResolvedAlias[];\n log: (line: string) => void;\n fetch?: typeof fetch;\n}\n\nconst modelsPath = `${RELAY_PATH_PREFIX}/models`;\nconst completionsPath = `${RELAY_PATH_PREFIX}/chat/completions`;\n\nexport const createRelayRoutes = (options: RelayRouteOptions): HttpRouteContribution[] => {\n const fetchImpl = options.fetch ?? fetch;\n return [\n {\n id: \"ragents.model-relay.models\",\n isApiPath: (pathname) => pathname.startsWith(`${RELAY_PATH_PREFIX}/`),\n matches: (request, url) => request.method === \"GET\" && url.pathname === modelsPath,\n requiredRights: [RELAY_RIGHT],\n handle: ({ response }) => {\n writeJson(response, 200, { object: \"list\", data: options.aliases().map(catalogEntryOf) });\n },\n },\n {\n id: \"ragents.model-relay.completions\",\n isApiPath: (pathname) => pathname.startsWith(`${RELAY_PATH_PREFIX}/`),\n matches: (request, url) => request.method === \"POST\" && url.pathname === completionsPath,\n requiredRights: [RELAY_RIGHT],\n handle: async ({ request, response, access }) => {\n const user = access.user?.id ?? \"anonym\";\n let text: string;\n try {\n text = await readBody(request, MAX_REQUEST_BYTES);\n } catch (error) {\n if (!(error instanceof PayloadTooLargeError)) throw error;\n writeJson(response, 413, openAiError(error.message, \"invalid_request_error\"));\n return;\n }\n let parsed: unknown;\n try { parsed = JSON.parse(text); }\n catch { parsed = undefined; }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n writeJson(response, 400, openAiError(\"Der Anfragek\u00F6rper ist kein JSON-Objekt\", \"invalid_request_error\"));\n return;\n }\n const alias = (parsed as { model?: unknown }).model;\n if (typeof alias !== \"string\" || !alias) {\n writeJson(response, 400, openAiError(\"Die Anfrage nennt kein Modell\", \"invalid_request_error\"));\n return;\n }\n const resolved = options.aliases().find((candidate) => candidate.alias === alias);\n if (!resolved) {\n writeJson(response, 404, openAiError(`Das Modell ${alias} ist auf diesem Relay unbekannt`, \"invalid_request_error\"));\n return;\n }\n const controller = new AbortController();\n response.once(\"close\", () => controller.abort());\n const target = `${resolved.upstream.baseUrl}/chat/completions`;\n let upstream: Response;\n try {\n upstream = await fetchImpl(target, {\n method: \"POST\",\n headers: forwardedHeaders(request, resolved.upstream.apiKey),\n body: JSON.stringify({ ...parsed, model: resolved.model.id }),\n signal: controller.signal,\n });\n } catch (error) {\n if (controller.signal.aborted) return;\n const reason = error instanceof Error ? error.message : String(error);\n options.log(`${user} ${alias} -> ${resolved.upstream.id}/${resolved.model.id}: nicht erreichbar (${reason})`);\n writeJson(response, 502, openAiError(`Der Anbieter hinter ${alias} ist nicht erreichbar`, \"server_error\"));\n return;\n }\n response.writeHead(upstream.status, {\n \"Content-Type\": upstream.headers.get(\"content-type\") ?? \"application/octet-stream\",\n \"Cache-Control\": \"no-store\",\n });\n const rewriter = responseRewriter(alias);\n if (upstream.body) {\n const source = Readable.fromWeb(upstream.body as ReadableStream<Uint8Array>);\n try {\n await pipeline(source, async function* (chunks: AsyncIterable<Buffer>) {\n for await (const chunk of chunks) {\n const forwarded = rewriter.feed(chunk);\n if (forwarded) yield forwarded;\n }\n const rest = rewriter.finish();\n if (rest) yield rest;\n }, response);\n } catch (error) {\n if (!controller.signal.aborted) throw error;\n }\n } else {\n response.end();\n }\n const usage = rewriter.usage();\n const tokens = usage ? ` tokens in=${usage.prompt ?? \"?\"} out=${usage.completion ?? \"?\"}` : \"\";\n options.log(`${user} ${alias} -> ${resolved.upstream.id}/${resolved.model.id}: ${upstream.status}${tokens}`);\n },\n },\n ];\n};\n"],
|
|
5
|
-
"mappings": ";;;;AACA,SAAS,2BAA2B;AAEpC,SAAS,gBAAgB;;;ACHzB,SAAS,8BAA+C;AAGjD,IAAM,eAAe,CAAC,YAA0D;AACrF,MAAI,QAAQ,WAAW,EAAG,OAAM,IAAI,MAAM
|
|
4
|
+
"sourcesContent": ["import type { RAgentsPlugin } from \"@ragents/engine\";\nimport { modelUpstreamsToken } from \"@ragents/host/plugin-support/model-upstreams.js\";\nimport type { PluginModule } from \"@ragents/host/plugin-support/plugin-module.js\";\nimport { Protocol } from \"@ragents/host/protocol.js\";\nimport { modelRelayConfig } from \"./config.js\";\nimport { createRelayRoutes, resolveAliases, type ResolvedAlias } from \"./relay.js\";\n\nconst modelRelayPlugin: RAgentsPlugin = {\n manifest: { id: \"ragents.model-relay\" },\n register: (host) => {\n const upstreams = host.service(modelUpstreamsToken);\n let resolved: readonly ResolvedAlias[] | undefined;\n const aliases = (): readonly ResolvedAlias[] => resolved ??= resolveAliases(modelRelayConfig.aliases(), upstreams());\n const log = new Protocol(host.storage.root(\"relay.log\"));\n host.lifecycle({\n id: \"ragents.model-relay\",\n initialize: () => {\n const list = aliases();\n log.write(`=== Start: ${list.map((entry) => `${entry.alias}=${entry.upstream.id}/${entry.model.id}`).join(\", \")} ===`);\n console.log(`Modell-Relay: ${list.length} Aliasse unter /relay/v1 (${list.map((entry) => entry.alias).join(\", \")})`);\n },\n shutdown: () => log.close(),\n });\n host.http(...createRelayRoutes({ aliases, log: (line) => log.write(line) }));\n },\n};\n\nexport const plugin: PluginModule = {\n create: () => modelRelayPlugin,\n};\n", "import { configuredModelAliases, type ModelAlias } from \"@ragents/host/plugin-support/model-aliases.js\";\n\n/** Das Relay bietet die Aliasse des Profils an (MODEL_ALIASES im Abschnitt host), dieselben wie f\u00FCr die eigenen Runs. */\nexport const relayAliases = (aliases: readonly ModelAlias[]): readonly ModelAlias[] => {\n if (aliases.length === 0) throw new Error(\"ragents.model-relay needs MODEL_ALIASES in the host section, a list of { alias, model, thinking?, compaction }\");\n return aliases;\n};\n\nexport const modelRelayConfig = Object.freeze({\n aliases: () => relayAliases(configuredModelAliases()),\n});\n", "import type { IncomingMessage } from \"node:http\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport type { ReadableStream } from \"node:stream/web\";\nimport type { HttpRouteContribution } from \"@ragents/engine\";\nimport { PayloadTooLargeError, readBody, writeJson } from \"@ragents/host/plugin-support/http.js\";\nimport type { ModelAlias } from \"@ragents/host/plugin-support/model-aliases.js\";\nimport type { ModelUpstream } from \"@ragents/host/plugin-support/model-upstreams.js\";\n\nexport const RELAY_PATH_PREFIX = \"/relay/v1\";\nexport const RELAY_RIGHT = \"models.use\";\n\nconst MAX_REQUEST_BYTES = 64 * 1024 * 1024;\nconst MAX_SCAN_BYTES = 8 * 1024 * 1024;\nconst DROPPED_HEADERS = new Set([\"host\", \"authorization\", \"cookie\", \"content-length\", \"connection\", \"transfer-encoding\", \"accept-encoding\", \"expect\"]);\n\nexport interface ResolvedAlias {\n readonly alias: string;\n readonly upstream: ModelUpstream;\n readonly model: ModelUpstream[\"models\"][number];\n readonly compaction: ModelAlias[\"compaction\"];\n}\n\n/** Jeder Alias muss auf einen konfigurierten Anbieter und ein Modell aus dessen Katalog zeigen. */\nexport const resolveAliases = (aliases: readonly ModelAlias[], upstreams: readonly ModelUpstream[]): readonly ResolvedAlias[] =>\n aliases.map((entry) => {\n const upstream = upstreams.find((candidate) => candidate.id === entry.upstream);\n if (!upstream) {\n const available = upstreams.map((candidate) => candidate.id).join(\", \") || \"keiner\";\n throw new Error(`MODEL_ALIASES: der Anbieter ${entry.upstream} hinter ${entry.alias} ist auf diesem Server nicht konfiguriert (verf\u00FCgbar: ${available})`);\n }\n const model = upstream.models.find((candidate) => candidate.id === entry.model);\n if (!model) throw new Error(`MODEL_ALIASES: das Modell ${entry.model} hinter ${entry.alias} fehlt im Katalog von ${entry.upstream}`);\n return { alias: entry.alias, upstream, model, compaction: entry.compaction };\n });\n\n/** Der Katalogeintrag nennt nur, was der Verbraucher f\u00FCr Draht und Kompaktierung braucht; Name, Anbieter und Kosten bleiben beim Server. */\nexport const catalogEntryOf = (resolved: ResolvedAlias) => ({\n id: resolved.alias,\n object: \"model\" as const,\n owned_by: \"relay\",\n catalog: {\n reasoning: resolved.model.reasoning,\n ...(resolved.model.thinkingLevelMap ? { thinkingLevelMap: resolved.model.thinkingLevelMap } : {}),\n input: [...resolved.model.input],\n contextWindow: resolved.model.contextWindow,\n maxTokens: resolved.model.maxTokens,\n compaction: resolved.compaction,\n ...(resolved.model.compat ? { compat: resolved.model.compat } : {}),\n },\n});\n\ninterface Usage {\n readonly prompt: number | undefined;\n readonly completion: number | undefined;\n}\n\n/** Ersetzt im durchgereichten Strom den echten Modellnamen durch den Alias, entfernt den Anbieter und merkt sich den letzten usage-Block. */\nconst responseRewriter = (alias: string) => {\n const decoder = new TextDecoder();\n let pending = \"\";\n let usage: Usage | undefined;\n let overflow = false;\n const rewrite = (text: string): string => {\n let parsed: unknown;\n try { parsed = JSON.parse(text); }\n catch { return text; }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return text;\n const body = parsed as { model?: unknown; provider?: unknown; usage?: { prompt_tokens?: unknown; completion_tokens?: unknown } };\n if (body.usage && typeof body.usage === \"object\") {\n const number = (value: unknown) => typeof value === \"number\" ? value : undefined;\n usage = { prompt: number(body.usage.prompt_tokens), completion: number(body.usage.completion_tokens) };\n }\n if (typeof body.model !== \"string\" && body.provider === undefined) return text;\n const rest = Object.fromEntries(Object.entries(body).filter(([key]) => key !== \"provider\"));\n return JSON.stringify(typeof body.model === \"string\" ? { ...rest, model: alias } : rest);\n };\n const line = (text: string): string => text.startsWith(\"data: \") ? `data: ${rewrite(text.slice(6))}` : text;\n return {\n feed: (chunk: Buffer): string => {\n const text = decoder.decode(chunk, { stream: true });\n if (overflow) return text;\n pending += text;\n const lines = pending.split(\"\\n\");\n pending = lines.pop() ?? \"\";\n const forwarded = lines.map((entry) => `${line(entry)}\\n`).join(\"\");\n if (pending.length <= MAX_SCAN_BYTES) return forwarded;\n overflow = true;\n const remainder = pending;\n pending = \"\";\n return `${forwarded}${remainder}`;\n },\n finish: (): string => {\n const rest = overflow || !pending.trim() ? pending : pending.startsWith(\"data: \") ? line(pending) : rewrite(pending);\n pending = \"\";\n return rest;\n },\n usage: (): Usage | undefined => usage,\n };\n};\n\nconst openAiError = (message: string, type: string) => ({ error: { message, type } });\n\nconst forwardedHeaders = (request: IncomingMessage, apiKey: string): Record<string, string> => {\n const headers: Record<string, string> = {};\n for (const [name, value] of Object.entries(request.headers)) {\n if (DROPPED_HEADERS.has(name) || value === undefined) continue;\n headers[name] = Array.isArray(value) ? value.join(\", \") : value;\n }\n headers[\"content-type\"] = \"application/json\";\n headers.authorization = `Bearer ${apiKey}`;\n return headers;\n};\n\nexport interface RelayRouteOptions {\n aliases: () => readonly ResolvedAlias[];\n log: (line: string) => void;\n fetch?: typeof fetch;\n}\n\nconst modelsPath = `${RELAY_PATH_PREFIX}/models`;\nconst completionsPath = `${RELAY_PATH_PREFIX}/chat/completions`;\n\nexport const createRelayRoutes = (options: RelayRouteOptions): HttpRouteContribution[] => {\n const fetchImpl = options.fetch ?? fetch;\n return [\n {\n id: \"ragents.model-relay.models\",\n isApiPath: (pathname) => pathname.startsWith(`${RELAY_PATH_PREFIX}/`),\n matches: (request, url) => request.method === \"GET\" && url.pathname === modelsPath,\n requiredRights: [RELAY_RIGHT],\n handle: ({ response }) => {\n writeJson(response, 200, { object: \"list\", data: options.aliases().map(catalogEntryOf) });\n },\n },\n {\n id: \"ragents.model-relay.completions\",\n isApiPath: (pathname) => pathname.startsWith(`${RELAY_PATH_PREFIX}/`),\n matches: (request, url) => request.method === \"POST\" && url.pathname === completionsPath,\n requiredRights: [RELAY_RIGHT],\n handle: async ({ request, response, access }) => {\n const user = access.user?.id ?? \"anonym\";\n let text: string;\n try {\n text = await readBody(request, MAX_REQUEST_BYTES);\n } catch (error) {\n if (!(error instanceof PayloadTooLargeError)) throw error;\n writeJson(response, 413, openAiError(error.message, \"invalid_request_error\"));\n return;\n }\n let parsed: unknown;\n try { parsed = JSON.parse(text); }\n catch { parsed = undefined; }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n writeJson(response, 400, openAiError(\"Der Anfragek\u00F6rper ist kein JSON-Objekt\", \"invalid_request_error\"));\n return;\n }\n const alias = (parsed as { model?: unknown }).model;\n if (typeof alias !== \"string\" || !alias) {\n writeJson(response, 400, openAiError(\"Die Anfrage nennt kein Modell\", \"invalid_request_error\"));\n return;\n }\n const resolved = options.aliases().find((candidate) => candidate.alias === alias);\n if (!resolved) {\n writeJson(response, 404, openAiError(`Das Modell ${alias} ist auf diesem Relay unbekannt`, \"invalid_request_error\"));\n return;\n }\n const controller = new AbortController();\n response.once(\"close\", () => controller.abort());\n const target = `${resolved.upstream.baseUrl}/chat/completions`;\n let upstream: Response;\n try {\n upstream = await fetchImpl(target, {\n method: \"POST\",\n headers: forwardedHeaders(request, resolved.upstream.apiKey),\n body: JSON.stringify({ ...parsed, model: resolved.model.id }),\n signal: controller.signal,\n });\n } catch (error) {\n if (controller.signal.aborted) return;\n const reason = error instanceof Error ? error.message : String(error);\n options.log(`${user} ${alias} -> ${resolved.upstream.id}/${resolved.model.id}: nicht erreichbar (${reason})`);\n writeJson(response, 502, openAiError(`Der Anbieter hinter ${alias} ist nicht erreichbar`, \"server_error\"));\n return;\n }\n response.writeHead(upstream.status, {\n \"Content-Type\": upstream.headers.get(\"content-type\") ?? \"application/octet-stream\",\n \"Cache-Control\": \"no-store\",\n });\n const rewriter = responseRewriter(alias);\n if (upstream.body) {\n const source = Readable.fromWeb(upstream.body as ReadableStream<Uint8Array>);\n try {\n await pipeline(source, async function* (chunks: AsyncIterable<Buffer>) {\n for await (const chunk of chunks) {\n const forwarded = rewriter.feed(chunk);\n if (forwarded) yield forwarded;\n }\n const rest = rewriter.finish();\n if (rest) yield rest;\n }, response);\n } catch (error) {\n if (!controller.signal.aborted) throw error;\n }\n } else {\n response.end();\n }\n const usage = rewriter.usage();\n const tokens = usage ? ` tokens in=${usage.prompt ?? \"?\"} out=${usage.completion ?? \"?\"}` : \"\";\n options.log(`${user} ${alias} -> ${resolved.upstream.id}/${resolved.model.id}: ${upstream.status}${tokens}`);\n },\n },\n ];\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"format":
|
|
2
|
+
"format": 4,
|
|
3
3
|
"id": "ragents.orchestration",
|
|
4
|
-
"api":
|
|
4
|
+
"api": 7,
|
|
5
5
|
"hostNames": {
|
|
6
6
|
"server": {
|
|
7
7
|
"@ragents/engine": [
|
|
@@ -172,7 +172,7 @@
|
|
|
172
172
|
}
|
|
173
173
|
},
|
|
174
174
|
"stand": "04d3cd3b2394dc698c36386e4e24a5f551d75207db44ceb6295e6b0aa688656d",
|
|
175
|
-
"sourceStand": "
|
|
175
|
+
"sourceStand": "7f9a2b6ec051509e1369004227985fbc3fc619376368badb393ba19ae9b73484",
|
|
176
176
|
"server": "server/index.js",
|
|
177
177
|
"web": {
|
|
178
178
|
"entry": "web/index.js",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"format":
|
|
2
|
+
"format": 4,
|
|
3
3
|
"id": "ragents.overseer",
|
|
4
|
-
"api":
|
|
4
|
+
"api": 7,
|
|
5
5
|
"hostNames": {
|
|
6
6
|
"server": {
|
|
7
7
|
"@ragents/engine": [
|
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
}
|
|
130
130
|
},
|
|
131
131
|
"stand": "09df34aa3b7215537058517cd34d9b0065706507daa918b9122eb50dadbfa897",
|
|
132
|
-
"sourceStand": "
|
|
132
|
+
"sourceStand": "04d406afbc672561a4019ce39b1696e21a44428de9f69d41fdfc4a344d3e2f3a",
|
|
133
133
|
"server": "server/index.js",
|
|
134
134
|
"web": {
|
|
135
135
|
"entry": "web/index.js",
|