@schlenkr/ragents 0.1.8 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/apps/server/package.json +1 -1
  2. package/apps/server/src/access-projection.ts +6 -36
  3. package/apps/server/src/api/contracts.ts +5 -2
  4. package/apps/server/src/api/core-methods.ts +5 -3
  5. package/apps/server/src/config-definition.ts +24 -2
  6. package/apps/server/src/config-file.ts +1 -1
  7. package/apps/server/src/config.ts +0 -6
  8. package/apps/server/src/host-api.json +5 -10
  9. package/apps/server/src/host-api.ts +6 -7
  10. package/apps/server/src/plugin-build/build.ts +28 -5
  11. package/apps/server/src/plugin-build/plugin-description.ts +1 -1
  12. package/apps/server/src/plugin-build/typecheck.ts +2 -2
  13. package/apps/server/src/plugin-support/language-server/plugin.ts +8 -7
  14. package/apps/server/src/plugin-support/language-server/tools.ts +7 -6
  15. package/apps/server/src/plugin-support/model-aliases.ts +55 -25
  16. package/apps/server/src/plugin-support/process-sandbox.ts +16 -15
  17. package/apps/server/src/plugin-support/product-relay.ts +10 -2
  18. package/apps/server/src/plugin-support/workspace-sandbox-host.ts +18 -9
  19. package/apps/server/src/profile/bundle-manifest.ts +7 -3
  20. package/apps/server/src/profile/compose.ts +6 -0
  21. package/apps/server/src/profile/plugin-discovery.ts +6 -1
  22. package/apps/server/src/profile/provisioning.ts +6 -5
  23. package/apps/server/src/provider.ts +2 -2
  24. package/apps/server/src/ragents/engine.ts +2 -2
  25. package/apps/server/src/ragents/global-chat.ts +7 -1
  26. package/apps/server/src/ragents/host-services.ts +4 -0
  27. package/apps/server/src/ragents/session.ts +1 -1
  28. package/apps/server/src/server.ts +4 -1
  29. package/apps/server/tsconfig.json +2 -0
  30. package/apps/web/dist/assets/{highlighted-body-KPVGNVTW-xXXhTDbh.js → highlighted-body-KPVGNVTW-BO4wLQtE.js} +1 -1
  31. package/apps/web/dist/assets/main-DnnqWHkH.js +11 -0
  32. package/apps/web/dist/assets/mermaid-HWGCJPDP-BLLeth5_.js +568 -0
  33. package/apps/web/dist/assets/{runPanel-ZT6TPDLM.js → runPanel-DPm7s3KM.js} +2 -2
  34. package/apps/web/dist/help/guide-clients.html +26 -8
  35. package/apps/web/dist/help/guide-clients.md +27 -8
  36. package/apps/web/dist/help/guide-distributed.html +12 -4
  37. package/apps/web/dist/help/guide-distributed.md +12 -4
  38. package/apps/web/dist/help/guide-getting-started.html +12 -8
  39. package/apps/web/dist/help/guide-getting-started.md +12 -8
  40. package/apps/web/dist/help/guide-plugins.html +6 -2
  41. package/apps/web/dist/help/guide-plugins.md +6 -2
  42. package/apps/web/dist/help/guide-runtime.html +2 -1
  43. package/apps/web/dist/help/guide-runtime.md +2 -1
  44. package/apps/web/dist/help/index.html +4328 -1132
  45. package/apps/web/dist/help/mini-app.css +24 -0
  46. package/apps/web/dist/host-web.json +4 -4
  47. package/apps/web/dist/index.html +2 -2
  48. package/apps/web/dist/run-panel.html +2 -2
  49. package/apps/web/package.json +1 -1
  50. package/apps/web/src/panel/ConnectionsPage.tsx +3 -0
  51. package/apps/web/src/panel/StartPage.tsx +3 -0
  52. package/apps/web/src/panel/contract.ts +7 -0
  53. package/bundles/ragents.activity/ragents-bundle.json +3 -3
  54. package/bundles/ragents.actor-programs/ragents-bundle.json +4 -4
  55. package/bundles/ragents.actor-programs/server/index.js +31 -3
  56. package/bundles/ragents.actor-programs/server/index.js.map +4 -4
  57. package/bundles/ragents.actor-programs/web/index.js.map +1 -1
  58. package/bundles/ragents.ask/ragents-bundle.json +4 -6
  59. package/bundles/ragents.ask/server/index.js +42 -11
  60. package/bundles/ragents.ask/server/index.js.map +3 -3
  61. package/bundles/ragents.ask/web/chunks/{chunk-V7W3QDVS.js → chunk-MBRPS477.js} +2 -2
  62. package/bundles/ragents.ask/web/chunks/{chunk-V7W3QDVS.js.map → chunk-MBRPS477.js.map} +4 -4
  63. package/bundles/ragents.ask/web/chunks/chunk-WFN4374U.js +2 -0
  64. package/bundles/ragents.ask/web/chunks/chunk-WFN4374U.js.map +7 -0
  65. package/bundles/ragents.ask/web/classes.json +1 -1
  66. package/bundles/ragents.ask/web/exports/ask-payload.js +1 -1
  67. package/bundles/ragents.ask/web/exports/web/QuestionCard.js +1 -1
  68. package/bundles/ragents.ask/web/index.js +1 -1
  69. package/bundles/ragents.ask/web/index.js.map +4 -4
  70. package/bundles/ragents.browser/executor/index.mjs +357 -0
  71. package/bundles/ragents.browser/executor/index.mjs.map +7 -0
  72. package/bundles/ragents.browser/ragents-bundle.json +5 -8
  73. package/bundles/ragents.browser/server/chunks/{chunk-2GKLLCBE.js → chunk-CWLX4VA5.js} +1 -1
  74. package/bundles/ragents.browser/server/chunks/chunk-CWLX4VA5.js.map +7 -0
  75. package/bundles/ragents.browser/server/exports/server/contract.js +1 -1
  76. package/bundles/ragents.browser/server/index.js +20 -9
  77. package/bundles/ragents.browser/server/index.js.map +4 -4
  78. package/bundles/ragents.documents/ragents-bundle.json +3 -3
  79. package/bundles/ragents.lsp-fsharp/executor/index.mjs +68 -0
  80. package/bundles/ragents.lsp-fsharp/executor/index.mjs.map +7 -0
  81. package/bundles/ragents.lsp-fsharp/ragents-bundle.json +5 -9
  82. package/bundles/ragents.lsp-fsharp/server/index.js +21 -6
  83. package/bundles/ragents.lsp-fsharp/server/index.js.map +4 -4
  84. package/bundles/ragents.lsp-roslyn/executor/index.mjs +68 -0
  85. package/bundles/ragents.lsp-roslyn/executor/index.mjs.map +7 -0
  86. package/bundles/ragents.lsp-roslyn/ragents-bundle.json +6 -8
  87. package/bundles/ragents.lsp-roslyn/server/index.js +54 -15
  88. package/bundles/ragents.lsp-roslyn/server/index.js.map +4 -4
  89. package/bundles/ragents.lsp-typescript/executor/index.mjs +49 -0
  90. package/bundles/ragents.lsp-typescript/executor/index.mjs.map +7 -0
  91. package/bundles/ragents.lsp-typescript/ragents-bundle.json +5 -7
  92. package/bundles/ragents.lsp-typescript/server/index.js +22 -2
  93. package/bundles/ragents.lsp-typescript/server/index.js.map +3 -3
  94. package/bundles/ragents.model-relay/ragents-bundle.json +4 -4
  95. package/bundles/ragents.model-relay/server/index.js +3 -2
  96. package/bundles/ragents.model-relay/server/index.js.map +2 -2
  97. package/bundles/ragents.orchestration/ragents-bundle.json +4 -4
  98. package/bundles/ragents.orchestration/web/classes.json +1 -1
  99. package/bundles/ragents.orchestration/web/index.js +6 -6
  100. package/bundles/ragents.orchestration/web/index.js.map +3 -3
  101. package/bundles/ragents.overseer/ragents-bundle.json +4 -4
  102. package/bundles/ragents.overseer/server/index.js +1 -1
  103. package/bundles/ragents.overseer/server/index.js.map +2 -2
  104. package/bundles/ragents.processes/ragents-bundle.json +3 -3
  105. package/bundles/ragents.product/ragents-bundle.json +3 -3
  106. package/bundles/ragents.profile-distribution/ragents-bundle.json +4 -4
  107. package/bundles/ragents.profile-distribution/server/index.js +1 -1
  108. package/bundles/ragents.profile-distribution/server/index.js.map +2 -2
  109. package/bundles/ragents.reference/ragents-bundle.json +3 -3
  110. package/bundles/ragents.todo/ragents-bundle.json +3 -3
  111. package/bundles/ragents.transcript/ragents-bundle.json +3 -3
  112. package/bundles/ragents.watch/ragents-bundle.json +3 -3
  113. package/bundles/ragents.workspace/ragents-bundle.json +11 -5
  114. package/bundles/ragents.workspace/server/index.js +105 -30
  115. package/bundles/ragents.workspace/server/index.js.map +3 -3
  116. package/bundles/ragents.workspace/web/classes.json +1 -1
  117. package/bundles/ragents.workspace/web/index.js +1 -1
  118. package/bundles/ragents.workspace/web/index.js.map +3 -3
  119. package/package.json +3 -3
  120. package/packages/agent/dist/core/agent-settings.d.ts +1 -7
  121. package/packages/agent/dist/core/compaction/compaction.d.ts +17 -13
  122. package/packages/agent/dist/core/model-runtime.d.ts +5 -4
  123. package/packages/agent/dist/core/provider-composer.d.ts +2 -1
  124. package/packages/agent/dist/core/tools/bash.d.ts +9 -3
  125. package/packages/agent/dist/index.d.ts +1 -1
  126. package/packages/agent/src/core/agent-settings.ts +1 -4
  127. package/packages/agent/src/core/compaction/compaction.ts +68 -30
  128. package/packages/agent/src/core/model-runtime.ts +12 -5
  129. package/packages/agent/src/core/provider-composer.ts +5 -0
  130. package/packages/agent/src/core/tools/bash.ts +36 -30
  131. package/packages/agent/src/index.ts +3 -0
  132. package/packages/ai/dist/types.d.ts +11 -0
  133. package/packages/ai/src/types.ts +12 -0
  134. package/packages/ragents/src/domain/event-semantics.ts +3 -0
  135. package/packages/ragents/src/domain/event-validation.ts +15 -2
  136. package/packages/ragents/src/domain/events.ts +3 -0
  137. package/packages/ragents/src/domain/model.ts +2 -0
  138. package/packages/ragents/src/domain/projection.ts +1 -0
  139. package/packages/ragents/src/drivers/agent-runtime.ts +1 -1
  140. package/packages/ragents/src/drivers/agent-turn.ts +8 -6
  141. package/packages/ragents/src/index.ts +1 -0
  142. package/packages/ragents/src/plugin-host.ts +46 -0
  143. package/packages/ragents/src/plugin-types.ts +19 -0
  144. package/packages/ragents/src/runtime/decisions/inputs.ts +6 -2
  145. package/packages/ragents/src/runtime/journal-storage.ts +5 -4
  146. package/packages/workspace-executor/package.json +0 -1
  147. package/packages/workspace-executor/src/bash-launch.ts +56 -10
  148. package/packages/workspace-executor/src/context.ts +4 -0
  149. package/packages/workspace-executor/src/contributions.ts +150 -0
  150. package/packages/workspace-executor/src/executor.ts +1 -1
  151. package/packages/workspace-executor/src/index.ts +16 -19
  152. package/packages/workspace-executor/src/language-server/host.ts +3 -0
  153. package/packages/workspace-executor/src/language-server/module.ts +12 -2
  154. package/packages/workspace-executor/src/language-server/roots.ts +0 -5
  155. package/packages/workspace-executor/src/managed-process.ts +28 -0
  156. package/packages/workspace-executor/src/modules.ts +7 -6
  157. package/packages/workspace-executor/src/sandbox-tools.ts +12 -12
  158. package/packages/workspace-executor/src/shell-platform.ts +14 -3
  159. package/packages/workspace-executor/src/tools.ts +0 -3
  160. package/plugins/ragents.actor-programs/server/access-projections.ts +31 -0
  161. package/plugins/ragents.actor-programs/server/index.ts +2 -0
  162. package/plugins/ragents.ask/ask-payload.ts +9 -0
  163. package/plugins/ragents.ask/server/ask-service.ts +53 -13
  164. package/plugins/ragents.ask/web/AskActionView.tsx +3 -2
  165. package/plugins/ragents.ask/web/index.tsx +0 -6
  166. package/plugins/ragents.browser/executor/index.ts +5 -0
  167. package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/module.ts +25 -31
  168. package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/playwright.ts +9 -23
  169. package/plugins/ragents.browser/provision.ts +1 -1
  170. package/plugins/ragents.browser/server/browser.ts +3 -3
  171. package/plugins/ragents.browser/server/contract.ts +2 -2
  172. package/plugins/ragents.browser/server/index.ts +1 -1
  173. package/plugins/ragents.lsp-fsharp/executor.ts +80 -0
  174. package/plugins/ragents.lsp-fsharp/provision.ts +1 -1
  175. package/plugins/ragents.lsp-fsharp/server/index.ts +2 -2
  176. package/plugins/ragents.lsp-roslyn/executor.ts +64 -0
  177. package/plugins/ragents.lsp-roslyn/provision.ts +1 -1
  178. package/plugins/ragents.lsp-roslyn/server/index.ts +28 -5
  179. package/plugins/ragents.lsp-roslyn/server/solution-on-start.ts +18 -6
  180. package/plugins/ragents.lsp-typescript/executor.ts +50 -0
  181. package/plugins/ragents.lsp-typescript/server/index.ts +2 -2
  182. package/plugins/ragents.model-relay/server/config.ts +1 -1
  183. package/plugins/ragents.model-relay/server/relay.ts +4 -2
  184. package/plugins/ragents.orchestration/web/ActorTile.tsx +1 -1
  185. package/plugins/ragents.orchestration/web/run-panel/RunPanel.tsx +8 -7
  186. package/plugins/ragents.orchestration/web/run-panel/sheet-status.ts +3 -3
  187. package/plugins/ragents.overseer/server/api.ts +2 -2
  188. package/plugins/ragents.profile-distribution/server/archive.ts +2 -1
  189. package/plugins/ragents.workspace/client/workspace-client.ts +128 -32
  190. package/plugins/ragents.workspace/contract.ts +33 -2
  191. package/plugins/ragents.workspace/server/binding.ts +10 -4
  192. package/plugins/ragents.workspace/server/clients.ts +56 -9
  193. package/plugins/ragents.workspace/server/config.ts +12 -0
  194. package/plugins/ragents.workspace/server/index.ts +15 -5
  195. package/plugins/ragents.workspace/server/runtime.ts +10 -0
  196. package/plugins/ragents.workspace/server/shell-platform.ts +6 -5
  197. package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +1 -1
  198. package/ragents.config.core.ts +4 -1
  199. package/ragents.config.showcase.ts +4 -1
  200. package/scripts/agent/journal.ts +3 -1
  201. package/scripts/package/build-package.ts +3 -1
  202. package/scripts/provision/run-provision.ts +2 -2
  203. package/scripts/workspace-client/run-workspace-client.ts +7 -4
  204. package/apps/web/dist/assets/main-C7JeZFjs.js +0 -6
  205. package/apps/web/dist/assets/mermaid-HWGCJPDP-DfsU5ofC.js +0 -478
  206. package/apps/web/dist/help/screenshots/release-checklist-vscode.png +0 -0
  207. package/apps/web/dist/help/screenshots/release-checklist-web.png +0 -0
  208. package/bundles/ragents.ask/web/chunks/chunk-HGFDGTNC.js +0 -2
  209. package/bundles/ragents.ask/web/chunks/chunk-HGFDGTNC.js.map +0 -7
  210. package/bundles/ragents.browser/server/chunks/chunk-2GKLLCBE.js.map +0 -7
  211. package/packages/workspace-executor/src/language-server/adapters/fsharp.ts +0 -60
  212. package/packages/workspace-executor/src/language-server/adapters/index.ts +0 -7
  213. package/packages/workspace-executor/src/language-server/adapters/roslyn.ts +0 -56
  214. package/packages/workspace-executor/src/language-server/adapters/typescript.ts +0 -74
  215. package/packages/workspace-executor/src/language-server/solution.ts +0 -13
  216. package/plugins/ragents.ask/web/QuestionSection.tsx +0 -48
  217. /package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/contract.ts +0 -0
  218. /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 { roslynAdapter, ROSLYN_SERVER_VARIABLE } from "@ragents/workspace-executor";
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 solutionStartStep = (listing) => {
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
- if (listing.solutions.length === 1) return { kind: "open", path: listing.solutions[0].path };
24
- return { kind: "ask", options: [...listing.solutions.map((solution) => solution.path), NO_SOLUTION] };
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, path2, ifNoneOpen, signal) => {
38
- await options.sandbox().execute(runId, openTool, { root: path2, ifNoneOpen }, { signal });
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
- adapter: roslynAdapter,
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
- if (!solutionOnStart()) return;
180
+ const loadOnStart = solutionOnStart();
181
+ const preferred = preferredSolution(loadOnStart);
182
+ if (!loadOnStart) return;
145
183
  startup = createSolutionOnStart({
146
184
  pluginId: PLUGIN_ID,
147
- adapterId: roslynAdapter.id,
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 path from "node:path";
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) => path.join(target, ...ROSLYN_SERVER_FILE.split("/"));
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 ${path.join(target, "roslyn")}`);
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": "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",
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": 3,
2
+ "format": 4,
3
3
  "id": "ragents.lsp-typescript",
4
- "api": 6,
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": "b808c9dcfbf9f8a766b8704e6ff5284057a5f36d44726eb2a365fc0a9fff0448",
24
- "sourceStand": "2563d53fb388d1fdb8e33889dc3ddccaf878afaa960bb5c3ca9bc095533c8b19",
20
+ "stand": "dd53ba53f6e472fce212ed551f10909efd9350762ad6a319a0a1e1fdf1366633",
21
+ "sourceStand": "28ea0cecdb9caa4fb173831798ae34e6a8d08b73b1f4b8b0b909da0225314d84",
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", adapter: typescriptAdapter })
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 { typescriptAdapter } from \"@ragents/workspace-executor\";\nimport { createLanguageServerPlugin } from \"@ragents/host/plugin-support/language-server/plugin.js\";\nimport type { PluginModule } from \"@ragents/host/plugin-support/plugin-module.js\";\n\nexport const plugin: PluginModule = {\n create: () => createLanguageServerPlugin({ id: \"ragents.lsp-typescript\", adapter: typescriptAdapter }),\n};\n"],
5
- "mappings": ";;;;AAAA,SAAS,yBAAyB;AAClC,SAAS,kCAAkC;AAGpC,IAAM,SAAuB;AAAA,EAClC,QAAQ,MAAM,2BAA2B,EAAE,IAAI,0BAA0B,SAAS,kBAAkB,CAAC;AACvG;",
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": 3,
2
+ "format": 4,
3
3
  "id": "ragents.model-relay",
4
- "api": 6,
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": "b490de948673e6cf227a3ec4fbff5d4abe86b44c4eb26effa552dfbad803ae9a",
25
- "sourceStand": "a05d84e6bba175ae94059fd6734e2fc00af2cae9391a8a1b0fded6690f76046a",
24
+ "stand": "d9b2bb73d0a0ce28e3dc6ba8ebb3e4468c622acbfd36252cd0107e78001aa155",
25
+ "sourceStand": "b41d54a650ea23a1fbf999adabd997fc1f9091c7b7643a826f0a652891fb7364",
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('ragents.model-relay braucht MODEL_ALIASES im Abschnitt host; erwartet wird eine Liste "alias=anbieter/modell"');
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": "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",
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": 3,
2
+ "format": 4,
3
3
  "id": "ragents.orchestration",
4
- "api": 6,
4
+ "api": 7,
5
5
  "hostNames": {
6
6
  "server": {
7
7
  "@ragents/engine": [
@@ -171,8 +171,8 @@
171
171
  ]
172
172
  }
173
173
  },
174
- "stand": "04d3cd3b2394dc698c36386e4e24a5f551d75207db44ceb6295e6b0aa688656d",
175
- "sourceStand": "00d1dfef1200d3b1c4f51a12dbf126c9f0ae06da62a6ed691638c92a22d0c12d",
174
+ "stand": "48bc275b47b4228a8f135c017d0c139819f6abe10dc37cfe077de6874314642b",
175
+ "sourceStand": "310b306e3eb56d1c97a357a44831b5907c722df27448c29f017f32eb9804ab6e",
176
176
  "server": "server/index.js",
177
177
  "web": {
178
178
  "entry": "web/index.js",