@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
@@ -19,7 +19,7 @@
19
19
  "@ragents/engine": "workspace:*",
20
20
  "@ragents/workspace-executor": "workspace:*",
21
21
  "handlebars": "^4.7.9",
22
- "quassel": "^0.2.2",
22
+ "quassel": "^0.3.0",
23
23
  "tsx": "^4.20.0",
24
24
  "typebox": "^1.3.13",
25
25
  "vscode-jsonrpc": "^9.0.2"
@@ -1,37 +1,9 @@
1
- import { emptyUsage, type AccessContext, type JsonValue, type PluginState, type RunView } from "@ragents/engine";
1
+ import { emptyUsage, type AccessContext, type AccessProjectionRegistry, type RunView } from "@ragents/engine";
2
2
  import type { ChatEvent, Message } from "quassel/events";
3
3
  import type { ActorConversations } from "./ragents/actor-chat-history.js";
4
4
 
5
- const record = (value: JsonValue | undefined): Record<string, JsonValue | undefined> | undefined =>
6
- value !== null && typeof value === "object" && !Array.isArray(value) ? value : undefined;
7
-
8
- const hiddenStates = new Set(["ragents.system-prompt", "ragents.model", "ragents.start-options"]);
9
-
10
- const visibleState = (entry: PluginState): PluginState | undefined => {
11
- if (hiddenStates.has(entry.pluginId)) return undefined;
12
- if (entry.pluginId === "ragents.actor-programs.invocations") return { ...entry, state: { version: 1, revision: entry.updatedAt } };
13
- if (entry.pluginId !== "ragents.actor-programs") return entry;
14
- const state = record(entry.state);
15
- const program = state?.program ? record(state.program) : undefined;
16
- if (!program) return entry;
17
- const views = Array.isArray(program.views) ? program.views.map((value) => {
18
- const view = record(value);
19
- return view ? { id: view.id, key: view.key, title: view.title, visible: view.visible, placements: view.placements } : value;
20
- }) : [];
21
- return { ...entry, state: {
22
- version: 1,
23
- program: {
24
- name: program.name,
25
- title: program.title,
26
- actorId: program.actorId,
27
- actorHandle: program.actorHandle,
28
- revision: program.revision,
29
- views,
30
- },
31
- } };
32
- };
33
-
34
- export const accessibleRunView = (view: RunView, access: AccessContext): RunView => access.can("runs.inspect") ? view : {
5
+ /** Plugin-Zustände und Plugin-Ereignisse zeigt jedes Plugin selbst über seine Zugriffsprojektion (docs/spec/plugins.md, Registrierungen des PluginHost). */
6
+ export const accessibleRunView = (view: RunView, access: AccessContext, projections: AccessProjectionRegistry): RunView => access.can("runs.inspect") ? view : {
35
7
  ...view,
36
8
  actors: view.actors.map((actor) => actor.kind === "human" ? { ...actor, grants: [] } : {
37
9
  ...actor,
@@ -53,12 +25,12 @@ export const accessibleRunView = (view: RunView, access: AccessContext): RunView
53
25
  turns: view.turns.map((turn) => ({ ...turn, usage: emptyUsage(), toolCalls: [], reason: turn.reason ? "Die Verarbeitung wurde beendet." : null })),
54
26
  subscriptions: [],
55
27
  pluginStates: view.pluginStates.flatMap((entry) => {
56
- const state = visibleState(entry);
28
+ const state = projections.state(entry, access);
57
29
  return state ? [state] : [];
58
30
  }),
59
31
  };
60
32
 
61
- export const accessibleChatEvent = (event: ChatEvent, access: AccessContext): ChatEvent | undefined => {
33
+ export const accessibleChatEvent = (event: ChatEvent, access: AccessContext, projections: AccessProjectionRegistry): ChatEvent | undefined => {
62
34
  if (access.can("runs.inspect")) return event;
63
35
  if (event.kind === "status" && event.startup?.status === "failed") return {
64
36
  ...event,
@@ -70,9 +42,7 @@ export const accessibleChatEvent = (event: ChatEvent, access: AccessContext): Ch
70
42
  if (event.kind === "tool-result") return trace ? event : { kind: "tool-result", id: event.id, result: "", isError: event.isError };
71
43
  if (event.kind === "system") return { ...event, text: "Hinweis zur Verarbeitung. Bei Fragen wende Dich an den zuständigen Agenten." };
72
44
  if (event.kind !== "plugin") return event;
73
- if (hiddenStates.has(event.pluginId)) return undefined;
74
- if (event.pluginId === "ragents.actor-programs" || event.pluginId === "ragents.actor-programs.invocations") return undefined;
75
- return event;
45
+ return projections.chatEvent(event.pluginId, event, access);
76
46
  };
77
47
 
78
48
  const visibleMessage = (message: Message, actorId: string, trace: boolean): Message[] => {
@@ -25,6 +25,9 @@ const attachment = Type.Object({
25
25
  const sessionInfo = openJson<SessionInfo>("SessionInfo");
26
26
 
27
27
  /** Rechte je Run prüft der Host dynamisch; Verträge ohne `rights` nennen ihre Regel in der Beschreibung. */
28
+ /** Was eine Oberfläche beim Start vom Server bekommt: das Profil der Plugins und die RAgents-Fassung des Servers, gegen die sie ihre eigene prüft. */
29
+ export type HostBootstrap = PublicPluginProfile & { readonly version: string };
30
+
28
31
  export const coreContracts = {
29
32
  runs: {
30
33
  list: defineOperation({
@@ -161,9 +164,9 @@ export const coreContracts = {
161
164
  plugins: {
162
165
  bootstrap: defineOperation({
163
166
  id: "ragents.plugins.bootstrap",
164
- description: "Produkt, aktive Plugins mit Web-Konfiguration und freigegebene Vorlagen für die Oberfläche.",
167
+ description: "Produkt, aktive Plugins mit Web-Konfiguration, freigegebene Vorlagen und die RAgents-Fassung des Servers für die Oberfläche.",
165
168
  input: Type.Object({}, { additionalProperties: false }),
166
- result: openJson<PublicPluginProfile>("PublicPluginProfile"),
169
+ result: openJson<HostBootstrap>("HostBootstrap"),
167
170
  }),
168
171
  },
169
172
  external: {
@@ -25,6 +25,8 @@ export interface CoreMethodSources {
25
25
  saveTitleModelSettings: (value: unknown) => Promise<TitleModelSettings>;
26
26
  };
27
27
  plugins: PluginHost;
28
+ /** Die RAgents-Fassung dieses Servers; eine Oberfläche mit anderer Fassung zeigt den Unterschied. */
29
+ version: string;
28
30
  global: GlobalRunPolicy | undefined;
29
31
  /** Der Benutzer eines Runs: null ohne Eigentümer, undefined für eine Kennung ohne Run. */
30
32
  runOwner: (runId: string) => string | null | undefined;
@@ -146,7 +148,7 @@ export const coreMethods = (sources: CoreMethodSources): MethodContribution[] =>
146
148
  implement(coreContracts.settings.skill, ({ id }, { local }) => { assertSettingsReachable(local); return sessions.skill(id); }),
147
149
  implement(coreContracts.settings.titlesRead, (_input, { local }) => { assertSettingsReachable(local); return sessions.titleModelSettings(); }),
148
150
  implement(coreContracts.settings.titlesSave, ({ value }, { local }) => { assertSettingsReachable(local); return sessions.saveTitleModelSettings(value); }),
149
- implement(coreContracts.plugins.bootstrap, (_input, { access }) => sources.plugins.publicProfile(access)),
151
+ implement(coreContracts.plugins.bootstrap, (_input, { access }) => ({ ...sources.plugins.publicProfile(access), version: sources.version })),
150
152
  implement(coreContracts.external.set, async ({ state }, { local }) => {
151
153
  if (!local) throw new DomainError("local-only", "Nur lokal schaltbar", 403);
152
154
  await sources.external.set(state === "on");
@@ -155,7 +157,7 @@ export const coreMethods = (sources: CoreMethodSources): MethodContribution[] =>
155
157
  ];
156
158
  };
157
159
 
158
- export const coreChannels = (sources: Pick<CoreMethodSources, "sessions" | "global" | "runOwner" | "runOwnerOnly">): ChannelContribution[] => {
160
+ export const coreChannels = (sources: Pick<CoreMethodSources, "sessions" | "plugins" | "global" | "runOwner" | "runOwnerOnly">): ChannelContribution[] => {
159
161
  const { sessions, global } = sources;
160
162
  const policy: RunAccessPolicy = { global, ownerOf: sources.runOwner, ownerOnly: sources.runOwnerOnly };
161
163
  return [
@@ -174,7 +176,7 @@ export const coreChannels = (sources: Pick<CoreMethodSources, "sessions" | "glob
174
176
  assertRunRights(access, runId, "read", policy);
175
177
  const current = await sessions.get(runId);
176
178
  return current.subscribe((event) => {
177
- const visible = accessibleChatEvent(event, access);
179
+ const visible = accessibleChatEvent(event, access, sources.plugins.accessProjections);
178
180
  if (visible) emit(visible);
179
181
  });
180
182
  }),
@@ -1,3 +1,5 @@
1
+ import type { ModelCompaction } from "@ragents/ai";
2
+ import type { ThinkingLevel } from "@ragents/engine";
1
3
  import type { hostConfigDescriptors } from "./config.js";
2
4
 
3
5
  export interface EnvironmentReference {
@@ -52,7 +54,23 @@ export interface ProfileUser extends ProfileAnonymousUser {
52
54
  readonly token?: EnvironmentReference;
53
55
  }
54
56
 
55
- export type ConfigValue = string | number | boolean | readonly string[] | EnvironmentReference | ProvisionedReference;
57
+ /** Ein Eintrag von MODEL_ALIASES: ein Modell unter eigenem Namen mit den Kompaktierungswerten, die für dieses Modell gelten. */
58
+ export interface ProfileModelAlias {
59
+ readonly alias: string;
60
+ /** Das Ziel als anbieter/modell aus dem eingebauten Katalog des Anbieters. */
61
+ readonly model: string;
62
+ readonly thinking?: ThinkingLevel;
63
+ readonly compaction: Readonly<ModelCompaction>;
64
+ }
65
+
66
+ export type ConfigValue =
67
+ | string
68
+ | number
69
+ | boolean
70
+ | readonly string[]
71
+ | readonly ProfileModelAlias[]
72
+ | EnvironmentReference
73
+ | ProvisionedReference;
56
74
 
57
75
  type Descriptors = readonly { readonly key: string }[];
58
76
 
@@ -64,6 +82,10 @@ type Section<T extends Descriptors> = {
64
82
  readonly [Key in T[number]["key"]]?: Key extends SecretKeyOf<T> ? EnvironmentReference : ConfigValue;
65
83
  };
66
84
 
85
+ type HostSection = Omit<Section<typeof hostConfigDescriptors>, "MODEL_ALIASES"> & {
86
+ readonly MODEL_ALIASES?: readonly ProfileModelAlias[];
87
+ };
88
+
67
89
  // Der Kern kennt keine Plugin-IDs: welche Sektion und welcher Schlüssel gültig ist, entscheidet die
68
90
  // Laufzeitprüfung gegen die Deklarationen der geladenen Plugins.
69
91
  export type PluginSection = {
@@ -76,5 +98,5 @@ export type PluginSection = {
76
98
  };
77
99
 
78
100
  export type RAgentsConfig =
79
- & { readonly host?: Section<typeof hostConfigDescriptors> }
101
+ & { readonly host?: HostSection }
80
102
  & { readonly [pluginId: string]: PluginSection | undefined };
@@ -106,7 +106,7 @@ export const resolveAnonymousUser = (source: string, raw: unknown): AccessUser |
106
106
  export const resolveDefaultStartEntry = (source: string, raw: unknown): string | undefined => {
107
107
  if (raw === undefined) return undefined;
108
108
  if (typeof raw !== "string" || !START_ENTRY_ID.test(raw)) {
109
- throw new Error(`${source}: defaultStartEntry braucht eine Vorlagenkennung als String, etwa "ragents.reference.word-game"`);
109
+ throw new Error(`${source}: defaultStartEntry braucht eine Vorlagenkennung als String, etwa "acme.tasks.setup"`);
110
110
  }
111
111
  return raw;
112
112
  };
@@ -11,8 +11,6 @@ export const hostConfigDescriptors = [
11
11
  { key: "PORT", source: "environment" },
12
12
  { key: "DATA_DIR", source: "environment" },
13
13
  { key: "AGENT_THINKING", source: "environment" },
14
- { key: "AGENT_COMPACTION_RESERVE_TOKENS", source: "environment" },
15
- { key: "AGENT_COMPACTION_KEEP_RECENT_TOKENS", source: "environment" },
16
14
  { key: "COMPACTION_PROVIDER", source: "environment" },
17
15
  { key: "COMPACTION_MODEL", source: "environment" },
18
16
  ...modelAliasEnvDescriptors,
@@ -37,10 +35,6 @@ export const config = Object.freeze({
37
35
  dataDir: path.resolve(env.value("DATA_DIR", defaultDataDirectory(env.required("PRODUCT_PROFILE")))),
38
36
  webDistDir: hostWebDirectory(rootDir),
39
37
  agentThinking: env.value("AGENT_THINKING", "high"),
40
- agentCompaction: {
41
- ...(env.optional("AGENT_COMPACTION_RESERVE_TOKENS") ? { reserveTokens: env.positiveNumber("AGENT_COMPACTION_RESERVE_TOKENS", "") } : {}),
42
- ...(env.optional("AGENT_COMPACTION_KEEP_RECENT_TOKENS") ? { keepRecentTokens: env.positiveNumber("AGENT_COMPACTION_KEEP_RECENT_TOKENS", "") } : {}),
43
- },
44
38
  compactionProvider: env.value("COMPACTION_PROVIDER", "openrouter"),
45
39
  compactionModel: env.value("COMPACTION_MODEL", ""),
46
40
  productProfile: env.required("PRODUCT_PROFILE"),
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": 6,
2
+ "version": 7,
3
3
  "server": {
4
4
  "@ragents/engine": [
5
5
  "DomainError",
@@ -239,6 +239,7 @@
239
239
  "runManagementToken"
240
240
  ],
241
241
  "@ragents/host/ragents/host-services": [
242
+ "executorContributionsToken",
242
243
  "hostAddressToken",
243
244
  "runGuardToken",
244
245
  "runWorkspaceProviderToken",
@@ -266,31 +267,23 @@
266
267
  "workflowInstructions"
267
268
  ],
268
269
  "@ragents/workspace-executor": [
269
- "BROWSER_EXECUTABLE_VARIABLE",
270
- "BROWSER_OPERATIONS",
271
270
  "COMMAND_OPERATIONS",
272
271
  "FILE_OPERATIONS",
273
- "FSHARP_SERVER_FILE",
274
- "FSHARP_SERVER_VARIABLE",
275
272
  "PROCESS_OPERATIONS",
276
- "ROSLYN_SERVER_FILE",
277
- "ROSLYN_SERVER_VARIABLE",
278
273
  "RUN_FOLDER_OPERATIONS",
279
274
  "RUN_MARKER_ENV",
280
275
  "WORKSPACE_EXECUTOR_VERSION",
281
- "fsharpAdapter",
282
276
  "languageServerOpenOperation",
283
277
  "languageServerSolutionsOperation",
284
278
  "listDirectory",
285
279
  "readTextFile",
286
- "roslynAdapter",
280
+ "ripgrepAvailable",
287
281
  "runManagedProcess",
288
282
  "safeProcessEnvironment",
289
283
  "sandboxRunEnvironment",
290
284
  "sandboxedLaunch",
291
285
  "shellPlatformText",
292
286
  "startManagedService",
293
- "typescriptAdapter",
294
287
  "watchDirectory"
295
288
  ],
296
289
  "@ragents/workspace-executor/src/git-config-environment": [
@@ -891,6 +884,7 @@
891
884
  "encodeAttachment",
892
885
  "fillText",
893
886
  "formatAttachmentSize",
887
+ "formatElapsed",
894
888
  "markdownPlainText",
895
889
  "messageDate",
896
890
  "prettyJson",
@@ -898,6 +892,7 @@
898
892
  "timestampDay",
899
893
  "timestampLabel",
900
894
  "useChatAction",
895
+ "useElapsed",
901
896
  "useQuasselComponents",
902
897
  "useQuasselPortalContainer",
903
898
  "validateAttachmentSelection"
@@ -1,5 +1,5 @@
1
1
  /** The number of the host API a plugin is built against; it changes with every incompatible change of a list, a listed name or a library. */
2
- export const HOST_API_VERSION = 6;
2
+ export const HOST_API_VERSION = 7;
3
3
 
4
4
  /** A library the host shares whole, as its installed version exports it; host code instead names each value it offers. */
5
5
  export const LIBRARY = "library";
@@ -90,7 +90,8 @@ export const hostApi: { readonly server: HostApiModules; readonly web: HostApiMo
90
90
  "@ragents/host/ragents/document-store": ["documentStoreToken"],
91
91
  "@ragents/host/ragents/global-chat": ["globalChatToken", "runManagementToken"],
92
92
  "@ragents/host/ragents/host-services": [
93
- "hostAddressToken", "runtimeProviderToken", "secretEnvNamesToken", "runGuardToken", "runWorkspaceProviderToken", "workspaceGuardToken",
93
+ "executorContributionsToken", "hostAddressToken", "runtimeProviderToken", "secretEnvNamesToken", "runGuardToken", "runWorkspaceProviderToken",
94
+ "workspaceGuardToken",
94
95
  ],
95
96
  "@ragents/host/ragents/product-runtime": ["productRuntimeToken"],
96
97
  "@ragents/host/ragents/runtime-bridge": ["runtimeBridgeToken"],
@@ -100,11 +101,9 @@ export const hostApi: { readonly server: HostApiModules; readonly web: HostApiMo
100
101
  ],
101
102
  "@ragents/workflow": ["defineWorkflow", "workflowInstructions"],
102
103
  "@ragents/workspace-executor": [
103
- "BROWSER_EXECUTABLE_VARIABLE", "BROWSER_OPERATIONS", "COMMAND_OPERATIONS", "FILE_OPERATIONS",
104
- "FSHARP_SERVER_FILE", "FSHARP_SERVER_VARIABLE", "PROCESS_OPERATIONS", "ROSLYN_SERVER_FILE",
105
- "ROSLYN_SERVER_VARIABLE", "RUN_FOLDER_OPERATIONS", "RUN_MARKER_ENV", "WORKSPACE_EXECUTOR_VERSION", "fsharpAdapter",
106
- "languageServerOpenOperation", "languageServerSolutionsOperation", "listDirectory", "readTextFile", "roslynAdapter", "runManagedProcess", "safeProcessEnvironment", "sandboxRunEnvironment", "sandboxedLaunch",
107
- "shellPlatformText", "startManagedService", "typescriptAdapter", "watchDirectory",
104
+ "COMMAND_OPERATIONS", "FILE_OPERATIONS", "PROCESS_OPERATIONS", "RUN_FOLDER_OPERATIONS", "RUN_MARKER_ENV", "WORKSPACE_EXECUTOR_VERSION",
105
+ "languageServerOpenOperation", "languageServerSolutionsOperation", "listDirectory", "readTextFile", "ripgrepAvailable", "runManagedProcess", "safeProcessEnvironment", "sandboxRunEnvironment", "sandboxedLaunch",
106
+ "shellPlatformText", "startManagedService", "watchDirectory",
108
107
  ],
109
108
  "@ragents/workspace-executor/src/git-config-environment": ["withGitConfigPairs"],
110
109
  "@ragents/workspace-executor/src/managed-process": ["ProcessGroupJoinError"],
@@ -5,6 +5,7 @@ import path from "node:path";
5
5
  import { Scanner } from "@tailwindcss/oxide";
6
6
  import { build as esbuild, type Message, type Metafile, type OutputFile, type PartialMessage, type Plugin } from "esbuild";
7
7
  import ts from "typescript";
8
+ import { EXECUTOR_CONTRIBUTION_FILE } from "@ragents/workspace-executor";
8
9
  import { installFolder, withLock } from "../folder-install.js";
9
10
  import { HOST_API_VERSION, HOST_MODULES_GLOBAL, LIBRARY, hostApi, hostOnly, providedByHost, type HostApiHalf } from "../host-api.js";
10
11
  import { checkedHostApiRecord, hostRoot, type HostApiRecord } from "../host-version.js";
@@ -172,13 +173,27 @@ interface HalfState {
172
173
  }
173
174
 
174
175
  /** Keeps a half to the host API, its own folder and declared exports of other plugins; everything else is a build error with its cause. */
175
- const boundaryPlugin = (source: PluginSource, half: HostApiHalf, environment: BuildEnvironment, state: HalfState, assets: readonly string[]): Plugin => ({
176
+ const boundaryPlugin = (
177
+ source: PluginSource,
178
+ half: HostApiHalf,
179
+ environment: BuildEnvironment,
180
+ state: HalfState,
181
+ assets: readonly string[],
182
+ selfContained: boolean,
183
+ ): Plugin => ({
176
184
  name: "ragents-plugin-boundary",
177
185
  setup(build) {
178
186
  const id = source.description.id;
179
187
  const packageProblems = new Map<string, string | undefined>();
180
188
 
189
+ /** The executor contribution loads in every process without the host's loader, the VS Code extension included. */
190
+ const outsideContribution = (specifier: string) => ({ errors: [{
191
+ text: `${specifier}: der Executor-Beitrag lädt in jedem Node-Prozess ohne die Auflösung des Hosts; er importiert nur node:*, eigene Dateien, `
192
+ + "gebündelte Bibliotheken und vom Host Typen (import type), alles andere bekommt er über die Maschine",
193
+ }] });
194
+
181
195
  const crossImport = (owner: string, name: string) => {
196
+ if (selfContained) return outsideContribution(`@ragents/plugins/${owner}/${name}`);
182
197
  state.uses.add(owner);
183
198
  return half === "server"
184
199
  ? { path: `@ragents/plugins/${owner}/${name}`, external: true }
@@ -221,6 +236,7 @@ const boundaryPlugin = (source: PluginSource, half: HostApiHalf, environment: Bu
221
236
  }
222
237
  return crossImport(owner, name);
223
238
  }
239
+ if (selfContained && (providedByHost(half, specifier) || hostOnly(specifier))) return outsideContribution(specifier);
224
240
  if (providedByHost(half, specifier)) {
225
241
  if (args.kind === "dynamic-import" && (half === "web" || !isLibrary(half, specifier))) {
226
242
  return { errors: [{ text: `import() von ${specifier}: ein Modul des Hosts wird statisch importiert, damit der Bau jeden Namen gegen die Host-API prüft` }] };
@@ -381,23 +397,27 @@ const nodePathsOf = (root: string, half: HostApiHalf): string[] =>
381
397
  [path.join(root, "node_modules"), path.join(root, half === "server" ? "apps/server/node_modules" : "apps/web/node_modules")]
382
398
  .filter((folder) => existsSync(folder));
383
399
 
400
+ /** Builds a half; `selfContained` builds the executor contribution as one file under executor/ that imports nothing but node:*. */
384
401
  const buildHalf = async (
385
402
  source: PluginSource,
386
403
  half: HostApiHalf,
387
404
  entries: readonly { readonly in: string; readonly out: string }[],
388
405
  environment: BuildEnvironment,
389
406
  assets: readonly string[],
407
+ selfContained = false,
390
408
  ): Promise<HalfResult | { readonly problems: readonly string[] }> => {
391
409
  const state: HalfState = { uses: new Set() };
392
410
  const id = source.description.id;
393
- const problemsOf = (messages: readonly Message[]): readonly string[] => messages.map((message) => `${half}: ${messageText(message, source.folder)}`);
411
+ const part = selfContained ? path.posix.dirname(EXECUTOR_CONTRIBUTION_FILE) : half;
412
+ const problemsOf = (messages: readonly Message[]): readonly string[] => messages.map((message) => `${part}: ${messageText(message, source.folder)}`);
394
413
  try {
395
414
  const result = await esbuild({
396
415
  absWorkingDir: source.folder,
397
416
  entryPoints: [...entries],
398
- outdir: path.join(environment.out, id, half),
417
+ outdir: path.join(environment.out, id, part),
399
418
  bundle: true,
400
- splitting: true,
419
+ splitting: !selfContained,
420
+ ...(selfContained ? { outExtension: { ".js": path.posix.extname(EXECUTOR_CONTRIBUTION_FILE) } } : {}),
401
421
  format: "esm",
402
422
  write: false,
403
423
  metafile: true,
@@ -416,7 +436,7 @@ const buildHalf = async (
416
436
  define: { "process.env.NODE_ENV": JSON.stringify("production") },
417
437
  } : { banner: { js: SERVER_BANNER } }),
418
438
  logLevel: "silent",
419
- plugins: [boundaryPlugin(source, half, environment, state, assets)],
439
+ plugins: [boundaryPlugin(source, half, environment, state, assets, selfContained)],
420
440
  });
421
441
  const fatal = result.warnings.filter((warning) => FATAL_WARNINGS.has(warning.id));
422
442
  if (fatal.length > 0) return { problems: problemsOf(fatal) };
@@ -472,6 +492,7 @@ const buildPlugin = async (folder: string, environment: BuildEnvironment, typeEr
472
492
  const serverEntry = sourceFileOf(path.join(source.folder, "server/index"));
473
493
  const webEntry = sourceFileOf(path.join(source.folder, "web/index"));
474
494
  const provision = sourceFileOf(path.join(source.folder, "provision"));
495
+ const executorEntry = sourceFileOf(path.join(source.folder, "executor"));
475
496
  const exportEntries = (half: HostApiHalf) => source.description.exports[half].map((name) => ({
476
497
  in: sourceFileOf(path.join(source.folder, name))!,
477
498
  out: `exports/${name}`,
@@ -481,6 +502,7 @@ const buildPlugin = async (folder: string, environment: BuildEnvironment, typeEr
481
502
  const results = await Promise.all([
482
503
  buildHalf(source, "server", [{ in: provision ? "ragents-entry:server" : serverEntry, out: "index" }, ...exportEntries("server")], environment, assets),
483
504
  ...(hasWeb ? [buildHalf(source, "web", [...(webEntry ? [{ in: webEntry, out: "index" }] : []), ...exportEntries("web")], environment, assets)] : []),
505
+ ...(executorEntry ? [buildHalf(source, "server", [{ in: executorEntry, out: path.posix.parse(EXECUTOR_CONTRIBUTION_FILE).name }], environment, assets, true)] : []),
484
506
  ]);
485
507
  const problems = results.flatMap((result) => "problems" in result ? result.problems : []);
486
508
  if (problems.length > 0) return failed(problems);
@@ -525,6 +547,7 @@ const buildPlugin = async (folder: string, environment: BuildEnvironment, typeEr
525
547
  classes: "web/classes.json",
526
548
  },
527
549
  } : {}),
550
+ ...(executorEntry ? { executor: EXECUTOR_CONTRIBUTION_FILE } : {}),
528
551
  exports: {
529
552
  server: Object.fromEntries(source.description.exports.server.map((name) => [name, exportOutput("server", name)])),
530
553
  web: Object.fromEntries(source.description.exports.web.map((name) => [name, exportOutput("web", name)])),
@@ -19,7 +19,7 @@ export interface PluginSource {
19
19
 
20
20
  const ID_PATTERN = /^[a-z0-9]+(?:[.-][a-z0-9]+)*$/;
21
21
  /** Places of the bundle the build tool writes itself; an asset there would overwrite its output or publish sources under /plugins/<id>/web/. */
22
- const RESERVED_ASSET_ROOTS = new Set(["server", "web", "ragents-bundle.json"]);
22
+ const RESERVED_ASSET_ROOTS = new Set(["server", "web", "executor", "ragents-bundle.json"]);
23
23
  const DESCRIPTION_KEYS = new Set(["id", "exports", "assets"]);
24
24
  const HALVES = new Set(["server", "web"]);
25
25
 
@@ -11,9 +11,9 @@ export const PLUGIN_TSCONFIG: Readonly<Record<HostApiHalf, string>> = {
11
11
  web: "apps/web/tsconfig.plugin.json",
12
12
  };
13
13
 
14
- /** The files a half starts from: its entry, the provisioning for the server, and the declared exports. */
14
+ /** The files a half starts from: its entry, the provisioning and the executor contribution for the server, and the declared exports. */
15
15
  export const halfEntries = (source: PluginSource, half: HostApiHalf): readonly string[] => {
16
- const own = half === "server" ? ["server/index", "provision"] : ["web/index"];
16
+ const own = half === "server" ? ["server/index", "provision", "executor"] : ["web/index"];
17
17
  return [...own, ...source.description.exports[half]]
18
18
  .map((name) => sourceFileOf(path.join(source.folder, name)))
19
19
  .filter((file): file is string => file !== undefined);
@@ -1,5 +1,5 @@
1
1
  import type { PluginConfigDescriptor, RAgentsPlugin } from "@ragents/engine";
2
- import type { LanguageServerAdapter } from "@ragents/workspace-executor";
2
+ import type { LanguageServerDescription } from "@ragents/workspace-executor";
3
3
  import { workspaceGuardToken } from "../../ragents/host-services.js";
4
4
  import { sandboxServicesToken } from "../workspace-sandbox-host.js";
5
5
  import { createLanguageServerSnapshotMethod, createLanguageServerSolutionMethods } from "./snapshot-method.js";
@@ -7,7 +7,8 @@ import { createLanguageServerToolContributor } from "./tools.js";
7
7
 
8
8
  export interface LanguageServerPluginOptions {
9
9
  id: string;
10
- adapter: LanguageServerAdapter;
10
+ /** Beschreibt den Sprachserver für Werkzeuge und Reiter; gestartet wird er im Executor aus dem Beitrag des Plugins. */
11
+ languageServer: LanguageServerDescription;
11
12
  tabLabel?: string;
12
13
  configDescriptors?: readonly PluginConfigDescriptor[];
13
14
  /** Nach jedem erfolgreichen Öffnen über Werkzeug oder Umschalten, mit dem Run. */
@@ -20,16 +21,16 @@ export const createLanguageServerPlugin = (options: LanguageServerPluginOptions)
20
21
  const sandbox = host.service(sandboxServicesToken);
21
22
  if (options.configDescriptors) host.config(...options.configDescriptors);
22
23
  const opened = options.onOpened ?? (() => undefined);
23
- host.functions(createLanguageServerToolContributor(options.adapter, sandbox, opened));
24
- const solutions = options.adapter.solutionExtensions !== undefined;
24
+ host.functions(createLanguageServerToolContributor(options.id, options.languageServer, sandbox, opened));
25
+ const solutions = options.languageServer.solutionExtensions !== undefined;
25
26
  host.clientConfig({
26
- label: options.tabLabel ?? options.adapter.label,
27
- openTool: `${options.adapter.id}_open`,
27
+ label: options.tabLabel ?? options.languageServer.label,
28
+ openTool: `${options.languageServer.id}_open`,
28
29
  solutions,
29
30
  });
30
31
  const methodOptions = {
31
32
  pluginId: options.id,
32
- adapterId: options.adapter.id,
33
+ adapterId: options.languageServer.id,
33
34
  sandbox,
34
35
  ensureWorkspaceAccess: host.service(workspaceGuardToken),
35
36
  opened,
@@ -5,7 +5,7 @@ import {
5
5
  languageServerDiagnosticsOperation,
6
6
  languageServerOpenOperation,
7
7
  languageServerSolutionsOperation,
8
- type LanguageServerAdapter,
8
+ type LanguageServerDescription,
9
9
  type LanguageServerSolutions,
10
10
  type LanguageServerState,
11
11
  } from "@ragents/workspace-executor";
@@ -30,11 +30,12 @@ export const formatSolutions = (label: string, listing: LanguageServerSolutions)
30
30
 
31
31
  /** Beschreibung und Weiterreichung: der Sprachserver läuft im Executor des Runs, nicht in diesem Plugin. */
32
32
  export const createLanguageServerToolContributor = (
33
- adapter: LanguageServerAdapter,
33
+ pluginId: string,
34
+ languageServer: LanguageServerDescription,
34
35
  sandbox: SandboxServices,
35
36
  opened: (runId: string) => void,
36
37
  ): ToolContributor => {
37
- const { id, label, rootDescription, languages } = adapter;
38
+ const { id, label, rootDescription, languages } = languageServer;
38
39
  const extensions = Object.keys(languages).join(", ");
39
40
  const openMetadata = {
40
41
  name: languageServerOpenOperation(id),
@@ -96,7 +97,7 @@ export const createLanguageServerToolContributor = (
96
97
  const solutionsMetadata = {
97
98
  name: languageServerSolutionsOperation(id),
98
99
  nativeTool: true,
99
- description: `List the solution files (${(adapter.solutionExtensions ?? []).join(", ")}) of this run's workspace and mark `
100
+ description: `List the solution files (${(languageServer.solutionExtensions ?? []).join(", ")}) of this run's workspace and mark `
100
101
  + `which ones the ${label} language server has open. ${openMetadata.name} loads another one in addition; `
101
102
  + "the open ones stay open.",
102
103
  } as const;
@@ -128,9 +129,9 @@ export const createLanguageServerToolContributor = (
128
129
  ...(scope.signal ? { signal: scope.signal } : {}),
129
130
  }) as string,
130
131
  });
131
- const withSolutions = adapter.solutionExtensions !== undefined;
132
+ const withSolutions = languageServer.solutionExtensions !== undefined;
132
133
  return {
133
- name: `ragents.lsp-${id}`,
134
+ name: pluginId,
134
135
  descriptors: [
135
136
  toolDescriptorFrom(openMetadata, alwaysAvailable),
136
137
  toolDescriptorFrom(diagnosticsMetadata, alwaysAvailable),