@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.
- package/apps/server/package.json +1 -1
- package/apps/server/src/access-projection.ts +6 -36
- package/apps/server/src/api/contracts.ts +5 -2
- package/apps/server/src/api/core-methods.ts +5 -3
- package/apps/server/src/config-definition.ts +24 -2
- package/apps/server/src/config-file.ts +1 -1
- package/apps/server/src/config.ts +0 -6
- package/apps/server/src/host-api.json +5 -10
- package/apps/server/src/host-api.ts +6 -7
- package/apps/server/src/plugin-build/build.ts +28 -5
- package/apps/server/src/plugin-build/plugin-description.ts +1 -1
- package/apps/server/src/plugin-build/typecheck.ts +2 -2
- package/apps/server/src/plugin-support/language-server/plugin.ts +8 -7
- package/apps/server/src/plugin-support/language-server/tools.ts +7 -6
- package/apps/server/src/plugin-support/model-aliases.ts +55 -25
- package/apps/server/src/plugin-support/process-sandbox.ts +16 -15
- package/apps/server/src/plugin-support/product-relay.ts +10 -2
- package/apps/server/src/plugin-support/workspace-sandbox-host.ts +18 -9
- package/apps/server/src/profile/bundle-manifest.ts +7 -3
- package/apps/server/src/profile/compose.ts +6 -0
- package/apps/server/src/profile/plugin-discovery.ts +6 -1
- package/apps/server/src/profile/provisioning.ts +6 -5
- package/apps/server/src/provider.ts +2 -2
- package/apps/server/src/ragents/engine.ts +2 -2
- package/apps/server/src/ragents/global-chat.ts +7 -1
- package/apps/server/src/ragents/host-services.ts +4 -0
- package/apps/server/src/ragents/session.ts +1 -1
- package/apps/server/src/server.ts +4 -1
- package/apps/server/tsconfig.json +2 -0
- package/apps/web/dist/assets/{highlighted-body-KPVGNVTW-xXXhTDbh.js → highlighted-body-KPVGNVTW-BO4wLQtE.js} +1 -1
- package/apps/web/dist/assets/main-DnnqWHkH.js +11 -0
- package/apps/web/dist/assets/mermaid-HWGCJPDP-BLLeth5_.js +568 -0
- package/apps/web/dist/assets/{runPanel-ZT6TPDLM.js → runPanel-DPm7s3KM.js} +2 -2
- package/apps/web/dist/help/guide-clients.html +26 -8
- package/apps/web/dist/help/guide-clients.md +27 -8
- package/apps/web/dist/help/guide-distributed.html +12 -4
- package/apps/web/dist/help/guide-distributed.md +12 -4
- package/apps/web/dist/help/guide-getting-started.html +12 -8
- package/apps/web/dist/help/guide-getting-started.md +12 -8
- package/apps/web/dist/help/guide-plugins.html +6 -2
- package/apps/web/dist/help/guide-plugins.md +6 -2
- package/apps/web/dist/help/guide-runtime.html +2 -1
- package/apps/web/dist/help/guide-runtime.md +2 -1
- package/apps/web/dist/help/index.html +4328 -1132
- package/apps/web/dist/help/mini-app.css +24 -0
- package/apps/web/dist/host-web.json +4 -4
- package/apps/web/dist/index.html +2 -2
- package/apps/web/dist/run-panel.html +2 -2
- package/apps/web/package.json +1 -1
- package/apps/web/src/panel/ConnectionsPage.tsx +3 -0
- package/apps/web/src/panel/StartPage.tsx +3 -0
- package/apps/web/src/panel/contract.ts +7 -0
- package/bundles/ragents.activity/ragents-bundle.json +3 -3
- package/bundles/ragents.actor-programs/ragents-bundle.json +4 -4
- package/bundles/ragents.actor-programs/server/index.js +31 -3
- package/bundles/ragents.actor-programs/server/index.js.map +4 -4
- package/bundles/ragents.actor-programs/web/index.js.map +1 -1
- package/bundles/ragents.ask/ragents-bundle.json +4 -6
- package/bundles/ragents.ask/server/index.js +42 -11
- package/bundles/ragents.ask/server/index.js.map +3 -3
- package/bundles/ragents.ask/web/chunks/{chunk-V7W3QDVS.js → chunk-MBRPS477.js} +2 -2
- package/bundles/ragents.ask/web/chunks/{chunk-V7W3QDVS.js.map → chunk-MBRPS477.js.map} +4 -4
- package/bundles/ragents.ask/web/chunks/chunk-WFN4374U.js +2 -0
- package/bundles/ragents.ask/web/chunks/chunk-WFN4374U.js.map +7 -0
- package/bundles/ragents.ask/web/classes.json +1 -1
- package/bundles/ragents.ask/web/exports/ask-payload.js +1 -1
- package/bundles/ragents.ask/web/exports/web/QuestionCard.js +1 -1
- package/bundles/ragents.ask/web/index.js +1 -1
- package/bundles/ragents.ask/web/index.js.map +4 -4
- package/bundles/ragents.browser/executor/index.mjs +357 -0
- package/bundles/ragents.browser/executor/index.mjs.map +7 -0
- package/bundles/ragents.browser/ragents-bundle.json +5 -8
- package/bundles/ragents.browser/server/chunks/{chunk-2GKLLCBE.js → chunk-CWLX4VA5.js} +1 -1
- package/bundles/ragents.browser/server/chunks/chunk-CWLX4VA5.js.map +7 -0
- package/bundles/ragents.browser/server/exports/server/contract.js +1 -1
- package/bundles/ragents.browser/server/index.js +20 -9
- package/bundles/ragents.browser/server/index.js.map +4 -4
- package/bundles/ragents.documents/ragents-bundle.json +3 -3
- package/bundles/ragents.lsp-fsharp/executor/index.mjs +68 -0
- package/bundles/ragents.lsp-fsharp/executor/index.mjs.map +7 -0
- package/bundles/ragents.lsp-fsharp/ragents-bundle.json +5 -9
- package/bundles/ragents.lsp-fsharp/server/index.js +21 -6
- package/bundles/ragents.lsp-fsharp/server/index.js.map +4 -4
- package/bundles/ragents.lsp-roslyn/executor/index.mjs +68 -0
- package/bundles/ragents.lsp-roslyn/executor/index.mjs.map +7 -0
- package/bundles/ragents.lsp-roslyn/ragents-bundle.json +6 -8
- package/bundles/ragents.lsp-roslyn/server/index.js +54 -15
- package/bundles/ragents.lsp-roslyn/server/index.js.map +4 -4
- package/bundles/ragents.lsp-typescript/executor/index.mjs +49 -0
- package/bundles/ragents.lsp-typescript/executor/index.mjs.map +7 -0
- package/bundles/ragents.lsp-typescript/ragents-bundle.json +5 -7
- package/bundles/ragents.lsp-typescript/server/index.js +22 -2
- package/bundles/ragents.lsp-typescript/server/index.js.map +3 -3
- package/bundles/ragents.model-relay/ragents-bundle.json +4 -4
- package/bundles/ragents.model-relay/server/index.js +3 -2
- package/bundles/ragents.model-relay/server/index.js.map +2 -2
- package/bundles/ragents.orchestration/ragents-bundle.json +4 -4
- package/bundles/ragents.orchestration/web/classes.json +1 -1
- package/bundles/ragents.orchestration/web/index.js +6 -6
- package/bundles/ragents.orchestration/web/index.js.map +3 -3
- package/bundles/ragents.overseer/ragents-bundle.json +4 -4
- package/bundles/ragents.overseer/server/index.js +1 -1
- package/bundles/ragents.overseer/server/index.js.map +2 -2
- package/bundles/ragents.processes/ragents-bundle.json +3 -3
- package/bundles/ragents.product/ragents-bundle.json +3 -3
- package/bundles/ragents.profile-distribution/ragents-bundle.json +4 -4
- package/bundles/ragents.profile-distribution/server/index.js +1 -1
- package/bundles/ragents.profile-distribution/server/index.js.map +2 -2
- package/bundles/ragents.reference/ragents-bundle.json +3 -3
- package/bundles/ragents.todo/ragents-bundle.json +3 -3
- package/bundles/ragents.transcript/ragents-bundle.json +3 -3
- package/bundles/ragents.watch/ragents-bundle.json +3 -3
- package/bundles/ragents.workspace/ragents-bundle.json +11 -5
- package/bundles/ragents.workspace/server/index.js +105 -30
- package/bundles/ragents.workspace/server/index.js.map +3 -3
- package/bundles/ragents.workspace/web/classes.json +1 -1
- package/bundles/ragents.workspace/web/index.js +1 -1
- package/bundles/ragents.workspace/web/index.js.map +3 -3
- package/package.json +3 -3
- package/packages/agent/dist/core/agent-settings.d.ts +1 -7
- package/packages/agent/dist/core/compaction/compaction.d.ts +17 -13
- package/packages/agent/dist/core/model-runtime.d.ts +5 -4
- package/packages/agent/dist/core/provider-composer.d.ts +2 -1
- package/packages/agent/dist/core/tools/bash.d.ts +9 -3
- package/packages/agent/dist/index.d.ts +1 -1
- package/packages/agent/src/core/agent-settings.ts +1 -4
- package/packages/agent/src/core/compaction/compaction.ts +68 -30
- package/packages/agent/src/core/model-runtime.ts +12 -5
- package/packages/agent/src/core/provider-composer.ts +5 -0
- package/packages/agent/src/core/tools/bash.ts +36 -30
- package/packages/agent/src/index.ts +3 -0
- package/packages/ai/dist/types.d.ts +11 -0
- package/packages/ai/src/types.ts +12 -0
- package/packages/ragents/src/domain/event-semantics.ts +3 -0
- package/packages/ragents/src/domain/event-validation.ts +15 -2
- package/packages/ragents/src/domain/events.ts +3 -0
- package/packages/ragents/src/domain/model.ts +2 -0
- package/packages/ragents/src/domain/projection.ts +1 -0
- package/packages/ragents/src/drivers/agent-runtime.ts +1 -1
- package/packages/ragents/src/drivers/agent-turn.ts +8 -6
- package/packages/ragents/src/index.ts +1 -0
- package/packages/ragents/src/plugin-host.ts +46 -0
- package/packages/ragents/src/plugin-types.ts +19 -0
- package/packages/ragents/src/runtime/decisions/inputs.ts +6 -2
- package/packages/ragents/src/runtime/journal-storage.ts +5 -4
- package/packages/workspace-executor/package.json +0 -1
- package/packages/workspace-executor/src/bash-launch.ts +56 -10
- package/packages/workspace-executor/src/context.ts +4 -0
- package/packages/workspace-executor/src/contributions.ts +150 -0
- package/packages/workspace-executor/src/executor.ts +1 -1
- package/packages/workspace-executor/src/index.ts +16 -19
- package/packages/workspace-executor/src/language-server/host.ts +3 -0
- package/packages/workspace-executor/src/language-server/module.ts +12 -2
- package/packages/workspace-executor/src/language-server/roots.ts +0 -5
- package/packages/workspace-executor/src/managed-process.ts +28 -0
- package/packages/workspace-executor/src/modules.ts +7 -6
- package/packages/workspace-executor/src/sandbox-tools.ts +12 -12
- package/packages/workspace-executor/src/shell-platform.ts +14 -3
- package/packages/workspace-executor/src/tools.ts +0 -3
- package/plugins/ragents.actor-programs/server/access-projections.ts +31 -0
- package/plugins/ragents.actor-programs/server/index.ts +2 -0
- package/plugins/ragents.ask/ask-payload.ts +9 -0
- package/plugins/ragents.ask/server/ask-service.ts +53 -13
- package/plugins/ragents.ask/web/AskActionView.tsx +3 -2
- package/plugins/ragents.ask/web/index.tsx +0 -6
- package/plugins/ragents.browser/executor/index.ts +5 -0
- package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/module.ts +25 -31
- package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/playwright.ts +9 -23
- package/plugins/ragents.browser/provision.ts +1 -1
- package/plugins/ragents.browser/server/browser.ts +3 -3
- package/plugins/ragents.browser/server/contract.ts +2 -2
- package/plugins/ragents.browser/server/index.ts +1 -1
- package/plugins/ragents.lsp-fsharp/executor.ts +80 -0
- package/plugins/ragents.lsp-fsharp/provision.ts +1 -1
- package/plugins/ragents.lsp-fsharp/server/index.ts +2 -2
- package/plugins/ragents.lsp-roslyn/executor.ts +64 -0
- package/plugins/ragents.lsp-roslyn/provision.ts +1 -1
- package/plugins/ragents.lsp-roslyn/server/index.ts +28 -5
- package/plugins/ragents.lsp-roslyn/server/solution-on-start.ts +18 -6
- package/plugins/ragents.lsp-typescript/executor.ts +50 -0
- package/plugins/ragents.lsp-typescript/server/index.ts +2 -2
- package/plugins/ragents.model-relay/server/config.ts +1 -1
- package/plugins/ragents.model-relay/server/relay.ts +4 -2
- package/plugins/ragents.orchestration/web/ActorTile.tsx +1 -1
- package/plugins/ragents.orchestration/web/run-panel/RunPanel.tsx +8 -7
- package/plugins/ragents.orchestration/web/run-panel/sheet-status.ts +3 -3
- package/plugins/ragents.overseer/server/api.ts +2 -2
- package/plugins/ragents.profile-distribution/server/archive.ts +2 -1
- package/plugins/ragents.workspace/client/workspace-client.ts +128 -32
- package/plugins/ragents.workspace/contract.ts +33 -2
- package/plugins/ragents.workspace/server/binding.ts +10 -4
- package/plugins/ragents.workspace/server/clients.ts +56 -9
- package/plugins/ragents.workspace/server/config.ts +12 -0
- package/plugins/ragents.workspace/server/index.ts +15 -5
- package/plugins/ragents.workspace/server/runtime.ts +10 -0
- package/plugins/ragents.workspace/server/shell-platform.ts +6 -5
- package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +1 -1
- package/ragents.config.core.ts +4 -1
- package/ragents.config.showcase.ts +4 -1
- package/scripts/agent/journal.ts +3 -1
- package/scripts/package/build-package.ts +3 -1
- package/scripts/provision/run-provision.ts +2 -2
- package/scripts/workspace-client/run-workspace-client.ts +7 -4
- package/apps/web/dist/assets/main-C7JeZFjs.js +0 -6
- package/apps/web/dist/assets/mermaid-HWGCJPDP-DfsU5ofC.js +0 -478
- package/apps/web/dist/help/screenshots/release-checklist-vscode.png +0 -0
- package/apps/web/dist/help/screenshots/release-checklist-web.png +0 -0
- package/bundles/ragents.ask/web/chunks/chunk-HGFDGTNC.js +0 -2
- package/bundles/ragents.ask/web/chunks/chunk-HGFDGTNC.js.map +0 -7
- package/bundles/ragents.browser/server/chunks/chunk-2GKLLCBE.js.map +0 -7
- package/packages/workspace-executor/src/language-server/adapters/fsharp.ts +0 -60
- package/packages/workspace-executor/src/language-server/adapters/index.ts +0 -7
- package/packages/workspace-executor/src/language-server/adapters/roslyn.ts +0 -56
- package/packages/workspace-executor/src/language-server/adapters/typescript.ts +0 -74
- package/packages/workspace-executor/src/language-server/solution.ts +0 -13
- package/plugins/ragents.ask/web/QuestionSection.tsx +0 -48
- /package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/contract.ts +0 -0
- /package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/pages.ts +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../plugins/ragents.browser/server/index.ts", "../../../plugins/ragents.browser/server/browser.ts", "../../../plugins/ragents.browser/server/tools.ts", "../../../plugins/ragents.browser/provision.ts"],
|
|
4
|
-
"sourcesContent": ["import type { RAgentsPlugin } from \"@ragents/engine\";\nimport { BROWSER_EXECUTABLE_VARIABLE } from \"@ragents/workspace-executor\";\nimport type { PluginModule } from \"@ragents/host/plugin-support/plugin-module.js\";\nimport { sandboxServicesToken } from \"@ragents/host/plugin-support/workspace-sandbox-host.js\";\nimport { documentStoreToken } from \"@ragents/host/ragents/document-store.js\";\nimport { RunBrowser } from \"./browser.js\";\nimport { browserRuntimeToken } from \"./contract.js\";\nimport { createBrowserFunctions, createBrowserImageContribution } from \"./tools.js\";\n\n/** Der Executor des Servers liest den Wert aus seiner Umgebung; ein Arbeitsplatz aus seiner eigenen, nie aus dem Profil. */\nexport const browserConfigDescriptors = [{ key: BROWSER_EXECUTABLE_VARIABLE, source: \"environment\" }] as const;\n\nconst browserPlugin: RAgentsPlugin = {\n manifest: { id: \"ragents.browser\" },\n register: (host) => {\n const documents = host.service(documentStoreToken);\n const browser = new RunBrowser({\n sandbox: host.service(sandboxServicesToken),\n filesFor: (runId) => documents.directoryFor(runId),\n });\n host.config(...browserConfigDescriptors);\n host.provide(browserRuntimeToken, browser);\n host.functions(...createBrowserFunctions(browser));\n host.agentRuntime(createBrowserImageContribution(browser));\n host.lifecycle({\n id: \"ragents.browser.lifecycle\",\n prepareSession: ({ runId }) => browser.restore(runId),\n stopSession: ({ runId }) => browser.close(runId),\n afterStopSession: ({ runId }) => browser.close(runId),\n deleteSession: ({ runId }) => browser.delete(runId),\n shutdown: () => browser.shutdown(),\n });\n },\n};\n\nexport const plugin: PluginModule = { requires: [\"ragents.documents\"], create: () => browserPlugin };\n", "import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n BROWSER_OPERATIONS,\n type BrowserCheck,\n type BrowserCheckResult,\n type BrowserPageState,\n type BrowserSnapshot,\n type BrowserStep,\n type BrowserTarget,\n type BrowserViewport,\n} from \"@ragents/workspace-executor\";\nimport type { SandboxServices } from \"@ragents/host/plugin-support/workspace-sandbox-host.js\";\nimport { documentsApiPrefix } from \"@ragents/plugins/ragents.documents/contract.js\";\nimport type { BrowserCallOptions, BrowserEvidence, BrowserRuntime } from \"./contract.js\";\n\nexport const DEFAULT_VIEWPORT: BrowserViewport = { width: 1920, height: 1080 };\n\ninterface SavedCapture {\n name: string;\n path: string;\n}\n\n/** Was der Server von der Seite eines Runs wei\u00DF: den zuletzt gemeldeten Stand und die Zeit der letzten bestandenen Pr\u00FCfung. */\ninterface ObservedPage {\n url: string;\n checkedAt?: string;\n errors: string[];\n screenshots: string[];\n}\n\nexport interface BrowserOptions {\n sandbox: Pick<SandboxServices, \"execute\">;\n filesFor: (runId: string) => Promise<string>;\n}\n\nconst capturePath = (id: string): string => `browser/${id}.png`;\n\n/** Die Browserpr\u00FCfung eines Runs: die Seite lebt beim Executor des Runs, Evidenz, Aufnahmen und Viewport h\u00E4lt der Server. */\nexport class RunBrowser implements BrowserRuntime {\n readonly #options: BrowserOptions;\n readonly #pages = new Map<string, ObservedPage>();\n readonly #viewports = new Map<string, BrowserViewport>();\n readonly #captures = new Map<string, SavedCapture[]>();\n readonly #captureLoads = new Map<string, Promise<void>>();\n readonly #captureWrites = new Map<string, Promise<void>>();\n readonly #generations = new Map<string, number>();\n #shutdown = false;\n\n constructor(options: BrowserOptions) {\n this.#options = options;\n }\n\n restore(runId: string): Promise<void> {\n const loading = this.#captureLoads.get(runId);\n if (loading) return loading;\n const pending = this.#restore(runId).catch((error) => { this.#captureLoads.delete(runId); throw error; });\n this.#captureLoads.set(runId, pending);\n return pending;\n }\n\n async open(runId: string, url: string, options: BrowserCallOptions = {}): Promise<BrowserSnapshot> {\n options.signal?.throwIfAborted();\n this.#assertRunning();\n const generation = this.#generation(runId);\n await this.restore(runId);\n options.signal?.throwIfAborted();\n this.#assertRunning();\n if (generation !== this.#generation(runId)) throw new Error(\"Der Browser wurde beendet.\");\n return this.#run(runId, BROWSER_OPERATIONS.open, { url, viewport: this.#viewports.get(runId) ?? DEFAULT_VIEWPORT }, options);\n }\n\n snapshot(runId: string, options: BrowserCallOptions = {}): Promise<BrowserSnapshot> {\n return this.#run(runId, BROWSER_OPERATIONS.snapshot, null, options);\n }\n\n /** Der gew\u00E4hlte Viewport gilt f\u00FCr den Run, auch f\u00FCr einen sp\u00E4ter neu gestarteten Browser. */\n async viewport(runId: string, viewport: BrowserViewport, options: BrowserCallOptions = {}): Promise<BrowserSnapshot> {\n const snapshot = await this.#run<BrowserSnapshot>(runId, BROWSER_OPERATIONS.viewport, viewport, options);\n this.#viewports.set(runId, viewport);\n return snapshot;\n }\n\n click(runId: string, target: BrowserTarget, options: BrowserCallOptions = {}): Promise<BrowserSnapshot> {\n return this.#run(runId, BROWSER_OPERATIONS.click, { target }, options);\n }\n\n fill(runId: string, target: BrowserTarget, value: string, options: BrowserCallOptions = {}): Promise<BrowserSnapshot> {\n return this.#run(runId, BROWSER_OPERATIONS.fill, { target, value }, options);\n }\n\n select(runId: string, target: BrowserTarget, label: string, options: BrowserCallOptions = {}): Promise<BrowserSnapshot> {\n return this.#run(runId, BROWSER_OPERATIONS.select, { target, label }, options);\n }\n\n press(runId: string, target: BrowserTarget, key: string, options: BrowserCallOptions = {}): Promise<BrowserSnapshot> {\n return this.#run(runId, BROWSER_OPERATIONS.press, { target, key }, options);\n }\n\n /** Die Zeit einer bestandenen Pr\u00FCfung ist die des Servers, damit sie sich mit seinen \u00FCbrigen Zeiten vergleichen l\u00E4sst. */\n async check(runId: string, input: BrowserCheck, options: BrowserCallOptions = {}): Promise<{ checkedAt: string; url: string; assertions: string[] }> {\n const generation = this.#generation(runId);\n const { result, page } = await this.#execute<BrowserCheckResult>(runId, generation, BROWSER_OPERATIONS.check, input, options);\n const checkedAt = new Date().toISOString();\n this.#observe(runId, generation, page, checkedAt);\n return { checkedAt, url: result.url, assertions: result.assertions };\n }\n\n async screenshot(runId: string, input: { label?: string; fullPage?: boolean }, options: BrowserCallOptions = {}): Promise<{\n name: string;\n path: string;\n url: string;\n markdown: string;\n capturedAt: string;\n }> {\n await this.restore(runId);\n const id = randomUUID();\n const image = await this.#run<string>(runId, BROWSER_OPERATIONS.screenshot, { id, fullPage: input.fullPage ?? false }, options);\n const capture = { name: input.label?.trim() || \"Browseraufnahme\", path: capturePath(id) };\n await this.#store(runId, capture, Buffer.from(image, \"base64\"));\n const url = this.#captureUrl(runId, capture.path);\n return {\n ...capture,\n url,\n markdown: `![${capture.name.replace(/[\\[\\]\\\\]/g, \"\")}](${url})`,\n capturedAt: new Date().toISOString(),\n };\n }\n\n async image(runId: string): Promise<Buffer> {\n const latest = this.#captures.get(runId)?.at(-1);\n if (!latest) throw new Error(\"F\u00FCr diesen Run gibt es noch keinen Browser-Screenshot. Zuerst browser_screenshot aufrufen.\");\n return readFile(path.join(await this.#options.filesFor(runId), latest.path));\n }\n\n evidence(runId: string): BrowserEvidence {\n const captures = this.#captures.get(runId) ?? [];\n const shown = (capture: SavedCapture) => ({ name: capture.name, url: this.#captureUrl(runId, capture.path) });\n const screenshots = captures.map(shown);\n const page = this.#pages.get(runId);\n if (!page) return { screenshots, currentScreenshots: [], errors: [] };\n const current = page.screenshots\n .map((id) => captures.find((capture) => capture.path === capturePath(id)))\n .filter((capture): capture is SavedCapture => capture !== undefined);\n return {\n ...(page.checkedAt ? { checkedAt: page.checkedAt } : {}),\n url: page.url,\n screenshots,\n currentScreenshots: current.map(shown),\n errors: [...page.errors],\n };\n }\n\n /** Schlie\u00DFt den Browser beim Executor des Runs; ein nicht verbundener Arbeitsplatz h\u00E4lt nichts, was sich jetzt schlie\u00DFen lie\u00DFe. */\n async close(runId: string): Promise<void> {\n this.#forget(runId);\n await this.#options.sandbox.execute(runId, BROWSER_OPERATIONS.close, null, { whenReachable: true });\n }\n\n async delete(runId: string): Promise<void> {\n await this.close(runId);\n this.#viewports.delete(runId);\n this.#captures.delete(runId);\n this.#captureLoads.delete(runId);\n this.#captureWrites.delete(runId);\n }\n\n async shutdown(): Promise<void> {\n this.#shutdown = true;\n const results = await Promise.allSettled([...this.#pages.keys()].map((runId) => this.close(runId)));\n this.#viewports.clear();\n this.#captures.clear();\n this.#captureLoads.clear();\n this.#captureWrites.clear();\n const failed = results.find((result): result is PromiseRejectedResult => result.status === \"rejected\");\n if (failed) throw failed.reason;\n }\n\n #assertRunning(): void {\n if (this.#shutdown) throw new Error(\"Der Browserdienst ist beendet.\");\n }\n\n #generation(runId: string): number {\n return this.#generations.get(runId) ?? 0;\n }\n\n /** Ein geschlossener Browser hat keine Seite mehr; Ergebnisse, die vorher begonnen haben, z\u00E4hlen danach nicht. */\n #forget(runId: string): void {\n this.#generations.set(runId, this.#generation(runId) + 1);\n this.#pages.delete(runId);\n }\n\n async #run<T>(runId: string, operation: string, input: unknown, options: BrowserCallOptions): Promise<T> {\n const generation = this.#generation(runId);\n const { result, page } = await this.#execute<T>(runId, generation, operation, input, options);\n this.#observe(runId, generation, page);\n return result;\n }\n\n async #execute<T>(runId: string, generation: number, operation: string, input: unknown, options: BrowserCallOptions): Promise<BrowserStep<T>> {\n try {\n return await this.#options.sandbox.execute(runId, operation, input, options) as BrowserStep<T>;\n } catch (error) {\n await this.#resync(runId, generation);\n throw error;\n }\n }\n\n /** Nach einem gescheiterten Aufruf fragt der Server den Stand der Seite nach; wer ihn nicht nennen kann, hat keine Seite. */\n async #resync(runId: string, generation: number): Promise<void> {\n const page = await this.#options.sandbox.execute(runId, BROWSER_OPERATIONS.state, null, { whenReachable: true })\n .then((value) => value as BrowserPageState | null, () => null);\n this.#observe(runId, generation, page);\n }\n\n /** Nur eine bestandene Pr\u00FCfung setzt die Zeit; jeder andere Stand beh\u00E4lt sie, solange die Seite gepr\u00FCft bleibt. */\n #observe(runId: string, generation: number, page: BrowserPageState | null, checkedAt?: string): void {\n if (generation !== this.#generation(runId)) return;\n if (!page) {\n this.#pages.delete(runId);\n return;\n }\n const stamp = page.checked ? checkedAt ?? this.#pages.get(runId)?.checkedAt : undefined;\n this.#pages.set(runId, {\n url: page.url,\n errors: page.errors,\n screenshots: page.screenshots,\n ...(stamp ? { checkedAt: stamp } : {}),\n });\n }\n\n /** Legt eine Aufnahme in die Dateiablage des Runs und schreibt die Aufnahmeliste atomar; die Aufnahmen eines Runs der Reihe nach. */\n #store(runId: string, capture: SavedCapture, image: Buffer): Promise<void> {\n const previous = this.#captureWrites.get(runId) ?? Promise.resolve();\n const pending = previous.then(async () => {\n const directory = await this.#options.filesFor(runId);\n await mkdir(path.join(directory, \"browser\"), { recursive: true });\n await writeFile(path.join(directory, capture.path), image);\n const captures = [...this.#captures.get(runId) ?? [], capture];\n const manifest = path.join(directory, \"browser\", \".captures.json\");\n const temporary = `${manifest}.${randomUUID()}.tmp`;\n await writeFile(temporary, JSON.stringify(captures), \"utf8\");\n await rename(temporary, manifest);\n this.#captures.set(runId, captures);\n });\n this.#captureWrites.set(runId, pending.then(() => undefined, () => undefined));\n return pending;\n }\n\n #captureUrl(runId: string, filename: string): string {\n return `${documentsApiPrefix}/runs/${encodeURIComponent(runId)}/files/content?path=${encodeURIComponent(filename)}`;\n }\n\n async #restore(runId: string): Promise<void> {\n const directory = await this.#options.filesFor(runId);\n const manifest = path.join(directory, \"browser\", \".captures.json\");\n let content: string;\n try { content = await readFile(manifest, \"utf8\"); }\n catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n this.#captures.set(runId, []);\n return;\n }\n const captures: unknown = JSON.parse(content);\n if (!Array.isArray(captures) || captures.some((entry) => !entry || typeof entry.name !== \"string\"\n || typeof entry.path !== \"string\" || !/^browser\\/[a-f0-9-]{36}\\.png$/.test(entry.path))) {\n throw new Error(\"Die gespeicherte Browser-Aufnahmeliste dieses Runs ist besch\u00E4digt.\");\n }\n this.#captures.set(runId, captures);\n }\n}\n", "import { Type } from \"typebox\";\nimport { defineRunFunction, type AgentContribution, type RunFunction } from \"@ragents/engine\";\nimport { alwaysAvailable } from \"@ragents/host/plugin-support/tool-availability.js\";\nimport { RunBrowser } from \"./browser.js\";\n\nconst targetSchema = Type.Object({\n role: Type.Optional(Type.String({ minLength: 1, description: \"Accessible role, e.g. button, textbox, link, combobox.\" })),\n name: Type.Optional(Type.String({ description: \"Exact accessible name for role.\" })),\n label: Type.Optional(Type.String({ minLength: 1, description: \"Exact form label.\" })),\n text: Type.Optional(Type.String({ minLength: 1, description: \"Exact visible text.\" })),\n testId: Type.Optional(Type.String({ minLength: 1, description: \"data-testid value.\" })),\n css: Type.Optional(Type.String({ minLength: 1, description: \"CSS selector for elements without useful accessible names.\" })),\n frame: Type.Optional(Type.String({ minLength: 1, description: \"CSS selector of an iframe containing the target.\" })),\n nth: Type.Optional(Type.Integer({ minimum: 0, description: \"0-based index among all matches when the target matches several elements; not together with first.\" })),\n first: Type.Optional(Type.Boolean({ description: \"Use the first match when the target matches several elements; not together with nth.\" })),\n}, { additionalProperties: false, description: \"Use exactly one of role (with optional name), label, text, testId, css. Resolve semantic targets server-side; never copy snapshot element IDs. Ambiguous targets are errors naming the candidates unless nth or first selects one.\" });\n\nconst snapshotSchema = Type.Object({\n url: Type.String(),\n title: Type.String(),\n snapshot: Type.String(),\n truncated: Type.Boolean(),\n errors: Type.Array(Type.String()),\n}, { additionalProperties: false });\n\nconst emptySchema = Type.Object({}, { additionalProperties: false });\nconst targetInputSchema = Type.Object({ target: targetSchema }, { additionalProperties: false });\nconst screenshotDescription = \"Capture the real browser page into this run's document library. The returned URL and Markdown display it to the user. Call browser_view_screenshot to inspect the latest capture as an image without copying a path.\";\n\nexport const createBrowserFunctions = (browser: RunBrowser): RunFunction[] => [\n defineRunFunction({\n name: \"browser_open\",\n label: \"Browser \u00F6ffnen\",\n description: \"Open an HTTP(S) page in this run's isolated headless browser. Returns its accessible structure and browser errors. Reuses the current run browser; other runs have separate cookies and processes.\",\n schema: Type.Object({ url: Type.String({ minLength: 1 }) }, { additionalProperties: false }),\n resultSchema: snapshotSchema,\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller, signal }, toolCallId, input) => ({ ...await browser.open(caller.runId, input.url, { signal, toolCallId }) }),\n }),\n defineRunFunction({\n name: \"browser_snapshot\",\n label: \"Browser lesen\",\n description: \"Read the current real page's accessible structure, title, URL and errors. Use role/name or labels for subsequent actions; snapshot reference IDs never need to be copied.\",\n schema: emptySchema,\n resultSchema: snapshotSchema,\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller, signal }, toolCallId) => ({ ...await browser.snapshot(caller.runId, { signal, toolCallId }) }),\n }),\n defineRunFunction({\n name: \"browser_click\",\n label: \"Im Browser klicken\",\n description: \"Click a uniquely identified visible element with Playwright auto-waiting. Returns the actual resulting page. Ambiguous or absent targets are errors.\",\n schema: targetInputSchema,\n resultSchema: snapshotSchema,\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller, signal }, toolCallId, input) => ({ ...await browser.click(caller.runId, input.target, { signal, toolCallId }) }),\n }),\n defineRunFunction({\n name: \"browser_fill\",\n label: \"Browserfeld ausf\u00FCllen\",\n description: \"Fill an input or textarea by accessible label or another semantic target, firing the normal input events. Returns the resulting page.\",\n schema: Type.Object({ target: targetSchema, value: Type.String() }, { additionalProperties: false }),\n resultSchema: snapshotSchema,\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller, signal }, toolCallId, input) => ({ ...await browser.fill(caller.runId, input.target, input.value, { signal, toolCallId }) }),\n }),\n defineRunFunction({\n name: \"browser_select\",\n label: \"Im Browser ausw\u00E4hlen\",\n description: \"Choose an option by its visible label in a native select element. For custom dropdowns use browser_click on the trigger and the visible option.\",\n schema: Type.Object({ target: targetSchema, label: Type.String({ minLength: 1 }) }, { additionalProperties: false }),\n resultSchema: snapshotSchema,\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller, signal }, toolCallId, input) => ({ ...await browser.select(caller.runId, input.target, input.label, { signal, toolCallId }) }),\n }),\n defineRunFunction({\n name: \"browser_press\",\n label: \"Browsertaste dr\u00FCcken\",\n description: \"Focus a target and press a Playwright key or chord such as Enter, Escape, Tab or ControlOrMeta+A. Returns the resulting page.\",\n schema: Type.Object({ target: targetSchema, key: Type.String({ minLength: 1 }) }, { additionalProperties: false }),\n resultSchema: snapshotSchema,\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller, signal }, toolCallId, input) => ({ ...await browser.press(caller.runId, input.target, input.key, { signal, toolCallId }) }),\n }),\n defineRunFunction({\n name: \"browser_check\",\n label: \"Browserergebnis pr\u00FCfen\",\n description: \"Assert visible target/text, resulting URL and absence of browser errors. Fails on mismatch; records successful evidence for this page until the next action/navigation/error. Supply at least one assertion. Browser errors are checked by default. Visibility assertions wait at most 5 seconds, shorter than actions.\",\n schema: Type.Object({\n target: Type.Optional(targetSchema),\n text: Type.Optional(Type.String({ minLength: 1 })),\n url: Type.Optional(Type.String({ minLength: 1 })),\n count: Type.Optional(Type.Integer({ minimum: 0, description: \"Expected number of visible matches of target instead of exactly one; 0 asserts absence. Requires target without nth or first.\" })),\n noErrors: Type.Optional(Type.Boolean({ description: \"true (default): the check also fails on any browser error collected since the last navigation. false: ignore browser errors and judge only the assertions; use this when the page has known noise such as 404s or third-party script errors that are not part of the check.\" })),\n }, { additionalProperties: false }),\n resultSchema: Type.Object({ checkedAt: Type.String(), url: Type.String(), assertions: Type.Array(Type.String()) }, { additionalProperties: false }),\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: ({ caller, signal }, toolCallId, input) => browser.check(caller.runId, input, { signal, toolCallId }),\n }),\n defineRunFunction({\n name: \"browser_viewport\",\n label: \"Browsergr\u00F6\u00DFe setzen\",\n description: \"Resize the page viewport in CSS pixels, for example to check a narrow layout. The default is 1920 x 1080 (16:9) and screenshots use the viewport size at scale 1; the chosen size stays for the run until changed again. Returns the resulting page.\",\n schema: Type.Object({\n width: Type.Integer({ minimum: 320, maximum: 3840 }),\n height: Type.Integer({ minimum: 240, maximum: 2160 }),\n }, { additionalProperties: false }),\n resultSchema: snapshotSchema,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller, signal }, toolCallId, input) => ({ ...await browser.viewport(caller.runId, input, { signal, toolCallId }) }),\n }),\n defineRunFunction({\n name: \"browser_screenshot\",\n label: \"Browser aufnehmen\",\n description: screenshotDescription,\n schema: Type.Object({ label: Type.Optional(Type.String({ maxLength: 200 })), fullPage: Type.Optional(Type.Boolean()) }, { additionalProperties: false }),\n resultSchema: Type.Object({\n name: Type.String(),\n path: Type.String(),\n url: Type.String(),\n markdown: Type.String(),\n capturedAt: Type.String(),\n }, { additionalProperties: false }),\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: ({ caller, signal }, toolCallId, input) => browser.screenshot(caller.runId, input, { signal, toolCallId }),\n }),\n defineRunFunction({\n name: \"browser_view_screenshot\",\n label: \"Browseraufnahme ansehen\",\n description: \"View this run's latest screenshot as native image input without a path. Invoke this native tool directly to receive pixels; calling it through TypeScript only verifies image availability. Requires an image-capable model for native image input.\",\n nativeTool: true,\n schema: emptySchema,\n resultSchema: Type.String(),\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller, signal }) => {\n signal?.throwIfAborted();\n await browser.image(caller.runId);\n return \"Letzte Browseraufnahme dieses Runs ist verf\u00FCgbar.\";\n },\n }),\n defineRunFunction({\n name: \"browser_close\",\n label: \"Browser schlie\u00DFen\",\n description: \"Close this run's browser and discard its cookies. Saved screenshots remain in the document library.\",\n schema: emptySchema,\n resultSchema: Type.Object({ closed: Type.Boolean() }, { additionalProperties: false }),\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller }) => { await browser.close(caller.runId); return { closed: true }; },\n }),\n];\n\nexport const createBrowserImageContribution = (browser: RunBrowser): AgentContribution => ({\n id: \"ragents.browser.image\",\n afterToolCall: async ({ runId }, outcome, call) => {\n if (outcome.toolName !== \"browser_view_screenshot\" || outcome.isError) return undefined;\n try {\n call.signal?.throwIfAborted();\n if (!call.modelReadsImages) throw new Error(\"Das gew\u00E4hlte Modell unterst\u00FCtzt keine Bilder. Screenshot \u00FCber die Dokumente ansehen oder ein bildf\u00E4higes Modell w\u00E4hlen.\");\n const data = (await browser.image(runId)).toString(\"base64\");\n call.signal?.throwIfAborted();\n return { content: [\n { type: \"text\", text: \"Letzte Browseraufnahme dieses Runs.\" },\n { type: \"image\", data, mimeType: \"image/png\" },\n ] };\n } catch (error) {\n return { content: [{ type: \"text\", text: error instanceof Error ? error.message : String(error) }], isError: true };\n }\n },\n});\n", "import { spawn } from \"node:child_process\";\nimport { access, constants } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { chromium } from \"playwright-core\";\nimport { BROWSER_EXECUTABLE_VARIABLE } from \"@ragents/workspace-executor\";\nimport {\n hostPackageFolder,\n provisionGap,\n provisionReady,\n type PluginProvision,\n} from \"@ragents/host/plugin-support/provision.js\";\n\nconst executable = async (file: string): Promise<boolean> => access(file, constants.X_OK).then(() => true, () => false);\n\nconst playwrightCli = (): string => path.join(hostPackageFolder(\"playwright-core\"), \"cli.js\");\n\nconst install = (log: (line: string) => void): Promise<void> => new Promise((resolve, reject) => {\n const child = spawn(process.execPath, [playwrightCli(), \"install\", ...(process.platform === \"linux\" ? [\"--with-deps\"] : []), \"chromium\"], { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n for (const stream of [child.stdout, child.stderr]) stream.on(\"data\", (chunk: Buffer) => log(chunk.toString().trimEnd()));\n child.once(\"error\", reject);\n child.once(\"exit\", (code) => code === 0 ? resolve() : reject(new Error(`playwright-core install chromium endete mit Code ${code}`)));\n});\n\n// Playwright verwaltet seinen Browsercache selbst; der Werkzeugordner des Plugins bleibt leer.\nexport const createBrowserProvision = (): PluginProvision => ({\n check: async () => {\n const configured = process.env[BROWSER_EXECUTABLE_VARIABLE];\n if (configured) {\n return await executable(configured)\n ? provisionReady\n : provisionGap(\"browser\", `${BROWSER_EXECUTABLE_VARIABLE} nennt ${configured}; dort gibt es keinen ausf\u00FChrbaren Browser`, false);\n }\n const bundled = chromium.executablePath();\n return await executable(bundled)\n ? provisionReady\n : provisionGap(\"chromium\", `Chromium fehlt unter ${bundled}; entweder ${BROWSER_EXECUTABLE_VARIABLE} auf einen vorhandenen Chrome `\n + \"setzen (auf einem Server in der Profilsektion ragents.browser, auf einem Arbeitsplatz in seiner Umgebung) oder die \"\n + \"Provisionierung den Browser laden lassen\", true);\n },\n apply: async (_target, log) => {\n const state = await createBrowserProvision().check(\"\");\n if (state.kind === \"ready\") return;\n if (!state.installable) throw new Error(state.instruction);\n log(\"Chromium f\u00FCr playwright-core laden\");\n await install(log);\n },\n});\n\nexport const provision = createBrowserProvision();\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["path", "
|
|
3
|
+
"sources": ["../../../plugins/ragents.browser/server/index.ts", "../../../plugins/ragents.browser/executor/contract.ts", "../../../plugins/ragents.browser/server/browser.ts", "../../../plugins/ragents.browser/server/tools.ts", "../../../plugins/ragents.browser/provision.ts"],
|
|
4
|
+
"sourcesContent": ["import type { RAgentsPlugin } from \"@ragents/engine\";\nimport type { PluginModule } from \"@ragents/host/plugin-support/plugin-module.js\";\nimport { sandboxServicesToken } from \"@ragents/host/plugin-support/workspace-sandbox-host.js\";\nimport { documentStoreToken } from \"@ragents/host/ragents/document-store.js\";\nimport { BROWSER_EXECUTABLE_VARIABLE } from \"../executor/contract.js\";\nimport { RunBrowser } from \"./browser.js\";\nimport { browserRuntimeToken } from \"./contract.js\";\nimport { createBrowserFunctions, createBrowserImageContribution } from \"./tools.js\";\n\n/** Der Executor des Servers liest den Wert aus seiner Umgebung; ein Arbeitsplatz aus seiner eigenen, nie aus dem Profil. */\nexport const browserConfigDescriptors = [{ key: BROWSER_EXECUTABLE_VARIABLE, source: \"environment\" }] as const;\n\nconst browserPlugin: RAgentsPlugin = {\n manifest: { id: \"ragents.browser\" },\n register: (host) => {\n const documents = host.service(documentStoreToken);\n const browser = new RunBrowser({\n sandbox: host.service(sandboxServicesToken),\n filesFor: (runId) => documents.directoryFor(runId),\n });\n host.config(...browserConfigDescriptors);\n host.provide(browserRuntimeToken, browser);\n host.functions(...createBrowserFunctions(browser));\n host.agentRuntime(createBrowserImageContribution(browser));\n host.lifecycle({\n id: \"ragents.browser.lifecycle\",\n prepareSession: ({ runId }) => browser.restore(runId),\n stopSession: ({ runId }) => browser.close(runId),\n afterStopSession: ({ runId }) => browser.close(runId),\n deleteSession: ({ runId }) => browser.delete(runId),\n shutdown: () => browser.shutdown(),\n });\n },\n};\n\nexport const plugin: PluginModule = { requires: [\"ragents.documents\"], create: () => browserPlugin };\n", "export const BROWSER_OPERATIONS = {\n open: \"browser.open\",\n snapshot: \"browser.snapshot\",\n viewport: \"browser.viewport\",\n click: \"browser.click\",\n fill: \"browser.fill\",\n select: \"browser.select\",\n press: \"browser.press\",\n check: \"browser.check\",\n screenshot: \"browser.screenshot\",\n state: \"browser.state\",\n close: \"browser.close\",\n} as const;\n\n/** Nennt einen eigenen Chrome; auf einem Server setzt ihn die Profilsektion `ragents.browser`, auf einem Arbeitsplatz seine Umgebung. */\nexport const BROWSER_EXECUTABLE_VARIABLE = \"BROWSER_EXECUTABLE_PATH\";\n\nexport interface BrowserTarget {\n role?: string;\n name?: string;\n label?: string;\n text?: string;\n testId?: string;\n css?: string;\n frame?: string;\n nth?: number;\n first?: boolean;\n}\n\nexport interface BrowserViewport {\n width: number;\n height: number;\n}\n\nexport interface BrowserSnapshot {\n url: string;\n title: string;\n snapshot: string;\n truncated: boolean;\n errors: string[];\n}\n\nexport interface BrowserCheck {\n target?: BrowserTarget;\n text?: string;\n url?: string;\n count?: number;\n noErrors?: boolean;\n}\n\n/** Was eine bestandene Pr\u00FCfung belegt; die Zeit setzt, wer die Evidenz des Runs h\u00E4lt. */\nexport interface BrowserCheckResult {\n url: string;\n assertions: string[];\n}\n\n/** Der Stand der Seite nach einer Operation; der Aufrufer h\u00E4lt daraus die Evidenz des Runs. */\nexport interface BrowserPageState {\n url: string;\n /** Seit der letzten Aktion oder Navigation hat eine Pr\u00FCfung bestanden. */\n checked: boolean;\n errors: string[];\n /** Die Kennungen der Aufnahmen seit der letzten Aktion oder Navigation, so wie der Aufrufer sie vergeben hat. */\n screenshots: string[];\n}\n\n/** Das Ergebnis einer Operation an der Seite und der Stand, in dem sie die Seite hinterl\u00E4sst. */\nexport interface BrowserStep<T> {\n result: T;\n page: BrowserPageState;\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { SandboxServices } from \"@ragents/host/plugin-support/workspace-sandbox-host.js\";\nimport { documentsApiPrefix } from \"@ragents/plugins/ragents.documents/contract.js\";\nimport {\n BROWSER_OPERATIONS,\n type BrowserCheck,\n type BrowserCheckResult,\n type BrowserPageState,\n type BrowserSnapshot,\n type BrowserStep,\n type BrowserTarget,\n type BrowserViewport,\n} from \"../executor/contract.js\";\nimport type { BrowserCallOptions, BrowserEvidence, BrowserRuntime } from \"./contract.js\";\n\nexport const DEFAULT_VIEWPORT: BrowserViewport = { width: 1920, height: 1080 };\n\ninterface SavedCapture {\n name: string;\n path: string;\n}\n\n/** Was der Server von der Seite eines Runs wei\u00DF: den zuletzt gemeldeten Stand und die Zeit der letzten bestandenen Pr\u00FCfung. */\ninterface ObservedPage {\n url: string;\n checkedAt?: string;\n errors: string[];\n screenshots: string[];\n}\n\nexport interface BrowserOptions {\n sandbox: Pick<SandboxServices, \"execute\">;\n filesFor: (runId: string) => Promise<string>;\n}\n\nconst capturePath = (id: string): string => `browser/${id}.png`;\n\n/** Die Browserpr\u00FCfung eines Runs: die Seite lebt beim Executor des Runs, Evidenz, Aufnahmen und Viewport h\u00E4lt der Server. */\nexport class RunBrowser implements BrowserRuntime {\n readonly #options: BrowserOptions;\n readonly #pages = new Map<string, ObservedPage>();\n readonly #viewports = new Map<string, BrowserViewport>();\n readonly #captures = new Map<string, SavedCapture[]>();\n readonly #captureLoads = new Map<string, Promise<void>>();\n readonly #captureWrites = new Map<string, Promise<void>>();\n readonly #generations = new Map<string, number>();\n #shutdown = false;\n\n constructor(options: BrowserOptions) {\n this.#options = options;\n }\n\n restore(runId: string): Promise<void> {\n const loading = this.#captureLoads.get(runId);\n if (loading) return loading;\n const pending = this.#restore(runId).catch((error) => { this.#captureLoads.delete(runId); throw error; });\n this.#captureLoads.set(runId, pending);\n return pending;\n }\n\n async open(runId: string, url: string, options: BrowserCallOptions = {}): Promise<BrowserSnapshot> {\n options.signal?.throwIfAborted();\n this.#assertRunning();\n const generation = this.#generation(runId);\n await this.restore(runId);\n options.signal?.throwIfAborted();\n this.#assertRunning();\n if (generation !== this.#generation(runId)) throw new Error(\"Der Browser wurde beendet.\");\n return this.#run(runId, BROWSER_OPERATIONS.open, { url, viewport: this.#viewports.get(runId) ?? DEFAULT_VIEWPORT }, options);\n }\n\n snapshot(runId: string, options: BrowserCallOptions = {}): Promise<BrowserSnapshot> {\n return this.#run(runId, BROWSER_OPERATIONS.snapshot, null, options);\n }\n\n /** Der gew\u00E4hlte Viewport gilt f\u00FCr den Run, auch f\u00FCr einen sp\u00E4ter neu gestarteten Browser. */\n async viewport(runId: string, viewport: BrowserViewport, options: BrowserCallOptions = {}): Promise<BrowserSnapshot> {\n const snapshot = await this.#run<BrowserSnapshot>(runId, BROWSER_OPERATIONS.viewport, viewport, options);\n this.#viewports.set(runId, viewport);\n return snapshot;\n }\n\n click(runId: string, target: BrowserTarget, options: BrowserCallOptions = {}): Promise<BrowserSnapshot> {\n return this.#run(runId, BROWSER_OPERATIONS.click, { target }, options);\n }\n\n fill(runId: string, target: BrowserTarget, value: string, options: BrowserCallOptions = {}): Promise<BrowserSnapshot> {\n return this.#run(runId, BROWSER_OPERATIONS.fill, { target, value }, options);\n }\n\n select(runId: string, target: BrowserTarget, label: string, options: BrowserCallOptions = {}): Promise<BrowserSnapshot> {\n return this.#run(runId, BROWSER_OPERATIONS.select, { target, label }, options);\n }\n\n press(runId: string, target: BrowserTarget, key: string, options: BrowserCallOptions = {}): Promise<BrowserSnapshot> {\n return this.#run(runId, BROWSER_OPERATIONS.press, { target, key }, options);\n }\n\n /** Die Zeit einer bestandenen Pr\u00FCfung ist die des Servers, damit sie sich mit seinen \u00FCbrigen Zeiten vergleichen l\u00E4sst. */\n async check(runId: string, input: BrowserCheck, options: BrowserCallOptions = {}): Promise<{ checkedAt: string; url: string; assertions: string[] }> {\n const generation = this.#generation(runId);\n const { result, page } = await this.#execute<BrowserCheckResult>(runId, generation, BROWSER_OPERATIONS.check, input, options);\n const checkedAt = new Date().toISOString();\n this.#observe(runId, generation, page, checkedAt);\n return { checkedAt, url: result.url, assertions: result.assertions };\n }\n\n async screenshot(runId: string, input: { label?: string; fullPage?: boolean }, options: BrowserCallOptions = {}): Promise<{\n name: string;\n path: string;\n url: string;\n markdown: string;\n capturedAt: string;\n }> {\n await this.restore(runId);\n const id = randomUUID();\n const image = await this.#run<string>(runId, BROWSER_OPERATIONS.screenshot, { id, fullPage: input.fullPage ?? false }, options);\n const capture = { name: input.label?.trim() || \"Browseraufnahme\", path: capturePath(id) };\n await this.#store(runId, capture, Buffer.from(image, \"base64\"));\n const url = this.#captureUrl(runId, capture.path);\n return {\n ...capture,\n url,\n markdown: `![${capture.name.replace(/[\\[\\]\\\\]/g, \"\")}](${url})`,\n capturedAt: new Date().toISOString(),\n };\n }\n\n async image(runId: string): Promise<Buffer> {\n const latest = this.#captures.get(runId)?.at(-1);\n if (!latest) throw new Error(\"F\u00FCr diesen Run gibt es noch keinen Browser-Screenshot. Zuerst browser_screenshot aufrufen.\");\n return readFile(path.join(await this.#options.filesFor(runId), latest.path));\n }\n\n evidence(runId: string): BrowserEvidence {\n const captures = this.#captures.get(runId) ?? [];\n const shown = (capture: SavedCapture) => ({ name: capture.name, url: this.#captureUrl(runId, capture.path) });\n const screenshots = captures.map(shown);\n const page = this.#pages.get(runId);\n if (!page) return { screenshots, currentScreenshots: [], errors: [] };\n const current = page.screenshots\n .map((id) => captures.find((capture) => capture.path === capturePath(id)))\n .filter((capture): capture is SavedCapture => capture !== undefined);\n return {\n ...(page.checkedAt ? { checkedAt: page.checkedAt } : {}),\n url: page.url,\n screenshots,\n currentScreenshots: current.map(shown),\n errors: [...page.errors],\n };\n }\n\n /** Schlie\u00DFt den Browser beim Executor des Runs; ein nicht verbundener Arbeitsplatz h\u00E4lt nichts, was sich jetzt schlie\u00DFen lie\u00DFe. */\n async close(runId: string): Promise<void> {\n this.#forget(runId);\n await this.#options.sandbox.execute(runId, BROWSER_OPERATIONS.close, null, { whenReachable: true });\n }\n\n async delete(runId: string): Promise<void> {\n await this.close(runId);\n this.#viewports.delete(runId);\n this.#captures.delete(runId);\n this.#captureLoads.delete(runId);\n this.#captureWrites.delete(runId);\n }\n\n async shutdown(): Promise<void> {\n this.#shutdown = true;\n const results = await Promise.allSettled([...this.#pages.keys()].map((runId) => this.close(runId)));\n this.#viewports.clear();\n this.#captures.clear();\n this.#captureLoads.clear();\n this.#captureWrites.clear();\n const failed = results.find((result): result is PromiseRejectedResult => result.status === \"rejected\");\n if (failed) throw failed.reason;\n }\n\n #assertRunning(): void {\n if (this.#shutdown) throw new Error(\"Der Browserdienst ist beendet.\");\n }\n\n #generation(runId: string): number {\n return this.#generations.get(runId) ?? 0;\n }\n\n /** Ein geschlossener Browser hat keine Seite mehr; Ergebnisse, die vorher begonnen haben, z\u00E4hlen danach nicht. */\n #forget(runId: string): void {\n this.#generations.set(runId, this.#generation(runId) + 1);\n this.#pages.delete(runId);\n }\n\n async #run<T>(runId: string, operation: string, input: unknown, options: BrowserCallOptions): Promise<T> {\n const generation = this.#generation(runId);\n const { result, page } = await this.#execute<T>(runId, generation, operation, input, options);\n this.#observe(runId, generation, page);\n return result;\n }\n\n async #execute<T>(runId: string, generation: number, operation: string, input: unknown, options: BrowserCallOptions): Promise<BrowserStep<T>> {\n try {\n return await this.#options.sandbox.execute(runId, operation, input, options) as BrowserStep<T>;\n } catch (error) {\n await this.#resync(runId, generation);\n throw error;\n }\n }\n\n /** Nach einem gescheiterten Aufruf fragt der Server den Stand der Seite nach; wer ihn nicht nennen kann, hat keine Seite. */\n async #resync(runId: string, generation: number): Promise<void> {\n const page = await this.#options.sandbox.execute(runId, BROWSER_OPERATIONS.state, null, { whenReachable: true })\n .then((value) => value as BrowserPageState | null, () => null);\n this.#observe(runId, generation, page);\n }\n\n /** Nur eine bestandene Pr\u00FCfung setzt die Zeit; jeder andere Stand beh\u00E4lt sie, solange die Seite gepr\u00FCft bleibt. */\n #observe(runId: string, generation: number, page: BrowserPageState | null, checkedAt?: string): void {\n if (generation !== this.#generation(runId)) return;\n if (!page) {\n this.#pages.delete(runId);\n return;\n }\n const stamp = page.checked ? checkedAt ?? this.#pages.get(runId)?.checkedAt : undefined;\n this.#pages.set(runId, {\n url: page.url,\n errors: page.errors,\n screenshots: page.screenshots,\n ...(stamp ? { checkedAt: stamp } : {}),\n });\n }\n\n /** Legt eine Aufnahme in die Dateiablage des Runs und schreibt die Aufnahmeliste atomar; die Aufnahmen eines Runs der Reihe nach. */\n #store(runId: string, capture: SavedCapture, image: Buffer): Promise<void> {\n const previous = this.#captureWrites.get(runId) ?? Promise.resolve();\n const pending = previous.then(async () => {\n const directory = await this.#options.filesFor(runId);\n await mkdir(path.join(directory, \"browser\"), { recursive: true });\n await writeFile(path.join(directory, capture.path), image);\n const captures = [...this.#captures.get(runId) ?? [], capture];\n const manifest = path.join(directory, \"browser\", \".captures.json\");\n const temporary = `${manifest}.${randomUUID()}.tmp`;\n await writeFile(temporary, JSON.stringify(captures), \"utf8\");\n await rename(temporary, manifest);\n this.#captures.set(runId, captures);\n });\n this.#captureWrites.set(runId, pending.then(() => undefined, () => undefined));\n return pending;\n }\n\n #captureUrl(runId: string, filename: string): string {\n return `${documentsApiPrefix}/runs/${encodeURIComponent(runId)}/files/content?path=${encodeURIComponent(filename)}`;\n }\n\n async #restore(runId: string): Promise<void> {\n const directory = await this.#options.filesFor(runId);\n const manifest = path.join(directory, \"browser\", \".captures.json\");\n let content: string;\n try { content = await readFile(manifest, \"utf8\"); }\n catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n this.#captures.set(runId, []);\n return;\n }\n const captures: unknown = JSON.parse(content);\n if (!Array.isArray(captures) || captures.some((entry) => !entry || typeof entry.name !== \"string\"\n || typeof entry.path !== \"string\" || !/^browser\\/[a-f0-9-]{36}\\.png$/.test(entry.path))) {\n throw new Error(\"Die gespeicherte Browser-Aufnahmeliste dieses Runs ist besch\u00E4digt.\");\n }\n this.#captures.set(runId, captures);\n }\n}\n", "import { Type } from \"typebox\";\nimport { defineRunFunction, type AgentContribution, type RunFunction } from \"@ragents/engine\";\nimport { alwaysAvailable } from \"@ragents/host/plugin-support/tool-availability.js\";\nimport { RunBrowser } from \"./browser.js\";\n\nconst targetSchema = Type.Object({\n role: Type.Optional(Type.String({ minLength: 1, description: \"Accessible role, e.g. button, textbox, link, combobox.\" })),\n name: Type.Optional(Type.String({ description: \"Exact accessible name for role.\" })),\n label: Type.Optional(Type.String({ minLength: 1, description: \"Exact form label.\" })),\n text: Type.Optional(Type.String({ minLength: 1, description: \"Exact visible text.\" })),\n testId: Type.Optional(Type.String({ minLength: 1, description: \"data-testid value.\" })),\n css: Type.Optional(Type.String({ minLength: 1, description: \"CSS selector for elements without useful accessible names.\" })),\n frame: Type.Optional(Type.String({ minLength: 1, description: \"CSS selector of an iframe containing the target.\" })),\n nth: Type.Optional(Type.Integer({ minimum: 0, description: \"0-based index among all matches when the target matches several elements; not together with first.\" })),\n first: Type.Optional(Type.Boolean({ description: \"Use the first match when the target matches several elements; not together with nth.\" })),\n}, { additionalProperties: false, description: \"Use exactly one of role (with optional name), label, text, testId, css. Resolve semantic targets server-side; never copy snapshot element IDs. Ambiguous targets are errors naming the candidates unless nth or first selects one.\" });\n\nconst snapshotSchema = Type.Object({\n url: Type.String(),\n title: Type.String(),\n snapshot: Type.String(),\n truncated: Type.Boolean(),\n errors: Type.Array(Type.String()),\n}, { additionalProperties: false });\n\nconst emptySchema = Type.Object({}, { additionalProperties: false });\nconst targetInputSchema = Type.Object({ target: targetSchema }, { additionalProperties: false });\nconst screenshotDescription = \"Capture the real browser page into this run's document library. The returned URL and Markdown display it to the user. Call browser_view_screenshot to inspect the latest capture as an image without copying a path.\";\n\nexport const createBrowserFunctions = (browser: RunBrowser): RunFunction[] => [\n defineRunFunction({\n name: \"browser_open\",\n label: \"Browser \u00F6ffnen\",\n description: \"Open an HTTP(S) page in this run's isolated headless browser. Returns its accessible structure and browser errors. Reuses the current run browser; other runs have separate cookies and processes.\",\n schema: Type.Object({ url: Type.String({ minLength: 1 }) }, { additionalProperties: false }),\n resultSchema: snapshotSchema,\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller, signal }, toolCallId, input) => ({ ...await browser.open(caller.runId, input.url, { signal, toolCallId }) }),\n }),\n defineRunFunction({\n name: \"browser_snapshot\",\n label: \"Browser lesen\",\n description: \"Read the current real page's accessible structure, title, URL and errors. Use role/name or labels for subsequent actions; snapshot reference IDs never need to be copied.\",\n schema: emptySchema,\n resultSchema: snapshotSchema,\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller, signal }, toolCallId) => ({ ...await browser.snapshot(caller.runId, { signal, toolCallId }) }),\n }),\n defineRunFunction({\n name: \"browser_click\",\n label: \"Im Browser klicken\",\n description: \"Click a uniquely identified visible element with Playwright auto-waiting. Returns the actual resulting page. Ambiguous or absent targets are errors.\",\n schema: targetInputSchema,\n resultSchema: snapshotSchema,\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller, signal }, toolCallId, input) => ({ ...await browser.click(caller.runId, input.target, { signal, toolCallId }) }),\n }),\n defineRunFunction({\n name: \"browser_fill\",\n label: \"Browserfeld ausf\u00FCllen\",\n description: \"Fill an input or textarea by accessible label or another semantic target, firing the normal input events. Returns the resulting page.\",\n schema: Type.Object({ target: targetSchema, value: Type.String() }, { additionalProperties: false }),\n resultSchema: snapshotSchema,\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller, signal }, toolCallId, input) => ({ ...await browser.fill(caller.runId, input.target, input.value, { signal, toolCallId }) }),\n }),\n defineRunFunction({\n name: \"browser_select\",\n label: \"Im Browser ausw\u00E4hlen\",\n description: \"Choose an option by its visible label in a native select element. For custom dropdowns use browser_click on the trigger and the visible option.\",\n schema: Type.Object({ target: targetSchema, label: Type.String({ minLength: 1 }) }, { additionalProperties: false }),\n resultSchema: snapshotSchema,\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller, signal }, toolCallId, input) => ({ ...await browser.select(caller.runId, input.target, input.label, { signal, toolCallId }) }),\n }),\n defineRunFunction({\n name: \"browser_press\",\n label: \"Browsertaste dr\u00FCcken\",\n description: \"Focus a target and press a Playwright key or chord such as Enter, Escape, Tab or ControlOrMeta+A. Returns the resulting page.\",\n schema: Type.Object({ target: targetSchema, key: Type.String({ minLength: 1 }) }, { additionalProperties: false }),\n resultSchema: snapshotSchema,\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller, signal }, toolCallId, input) => ({ ...await browser.press(caller.runId, input.target, input.key, { signal, toolCallId }) }),\n }),\n defineRunFunction({\n name: \"browser_check\",\n label: \"Browserergebnis pr\u00FCfen\",\n description: \"Assert visible target/text, resulting URL and absence of browser errors. Fails on mismatch; records successful evidence for this page until the next action/navigation/error. Supply at least one assertion. Browser errors are checked by default. Visibility assertions wait at most 5 seconds, shorter than actions.\",\n schema: Type.Object({\n target: Type.Optional(targetSchema),\n text: Type.Optional(Type.String({ minLength: 1 })),\n url: Type.Optional(Type.String({ minLength: 1 })),\n count: Type.Optional(Type.Integer({ minimum: 0, description: \"Expected number of visible matches of target instead of exactly one; 0 asserts absence. Requires target without nth or first.\" })),\n noErrors: Type.Optional(Type.Boolean({ description: \"true (default): the check also fails on any browser error collected since the last navigation. false: ignore browser errors and judge only the assertions; use this when the page has known noise such as 404s or third-party script errors that are not part of the check.\" })),\n }, { additionalProperties: false }),\n resultSchema: Type.Object({ checkedAt: Type.String(), url: Type.String(), assertions: Type.Array(Type.String()) }, { additionalProperties: false }),\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: ({ caller, signal }, toolCallId, input) => browser.check(caller.runId, input, { signal, toolCallId }),\n }),\n defineRunFunction({\n name: \"browser_viewport\",\n label: \"Browsergr\u00F6\u00DFe setzen\",\n description: \"Resize the page viewport in CSS pixels, for example to check a narrow layout. The default is 1920 x 1080 (16:9) and screenshots use the viewport size at scale 1; the chosen size stays for the run until changed again. Returns the resulting page.\",\n schema: Type.Object({\n width: Type.Integer({ minimum: 320, maximum: 3840 }),\n height: Type.Integer({ minimum: 240, maximum: 2160 }),\n }, { additionalProperties: false }),\n resultSchema: snapshotSchema,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller, signal }, toolCallId, input) => ({ ...await browser.viewport(caller.runId, input, { signal, toolCallId }) }),\n }),\n defineRunFunction({\n name: \"browser_screenshot\",\n label: \"Browser aufnehmen\",\n description: screenshotDescription,\n schema: Type.Object({ label: Type.Optional(Type.String({ maxLength: 200 })), fullPage: Type.Optional(Type.Boolean()) }, { additionalProperties: false }),\n resultSchema: Type.Object({\n name: Type.String(),\n path: Type.String(),\n url: Type.String(),\n markdown: Type.String(),\n capturedAt: Type.String(),\n }, { additionalProperties: false }),\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: ({ caller, signal }, toolCallId, input) => browser.screenshot(caller.runId, input, { signal, toolCallId }),\n }),\n defineRunFunction({\n name: \"browser_view_screenshot\",\n label: \"Browseraufnahme ansehen\",\n description: \"View this run's latest screenshot as native image input without a path. Invoke this native tool directly to receive pixels; calling it through TypeScript only verifies image availability. Requires an image-capable model for native image input.\",\n nativeTool: true,\n schema: emptySchema,\n resultSchema: Type.String(),\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller, signal }) => {\n signal?.throwIfAborted();\n await browser.image(caller.runId);\n return \"Letzte Browseraufnahme dieses Runs ist verf\u00FCgbar.\";\n },\n }),\n defineRunFunction({\n name: \"browser_close\",\n label: \"Browser schlie\u00DFen\",\n description: \"Close this run's browser and discard its cookies. Saved screenshots remain in the document library.\",\n schema: emptySchema,\n resultSchema: Type.Object({ closed: Type.Boolean() }, { additionalProperties: false }),\n nativeTool: true,\n available: alwaysAvailable,\n executionMode: \"sequential\",\n run: async ({ caller }) => { await browser.close(caller.runId); return { closed: true }; },\n }),\n];\n\nexport const createBrowserImageContribution = (browser: RunBrowser): AgentContribution => ({\n id: \"ragents.browser.image\",\n afterToolCall: async ({ runId }, outcome, call) => {\n if (outcome.toolName !== \"browser_view_screenshot\" || outcome.isError) return undefined;\n try {\n call.signal?.throwIfAborted();\n if (!call.modelReadsImages) throw new Error(\"Das gew\u00E4hlte Modell unterst\u00FCtzt keine Bilder. Screenshot \u00FCber die Dokumente ansehen oder ein bildf\u00E4higes Modell w\u00E4hlen.\");\n const data = (await browser.image(runId)).toString(\"base64\");\n call.signal?.throwIfAborted();\n return { content: [\n { type: \"text\", text: \"Letzte Browseraufnahme dieses Runs.\" },\n { type: \"image\", data, mimeType: \"image/png\" },\n ] };\n } catch (error) {\n return { content: [{ type: \"text\", text: error instanceof Error ? error.message : String(error) }], isError: true };\n }\n },\n});\n", "import { spawn } from \"node:child_process\";\nimport { access, constants } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { chromium } from \"playwright-core\";\nimport {\n hostPackageFolder,\n provisionGap,\n provisionReady,\n type PluginProvision,\n} from \"@ragents/host/plugin-support/provision.js\";\nimport { BROWSER_EXECUTABLE_VARIABLE } from \"./executor/contract.js\";\n\nconst executable = async (file: string): Promise<boolean> => access(file, constants.X_OK).then(() => true, () => false);\n\nconst playwrightCli = (): string => path.join(hostPackageFolder(\"playwright-core\"), \"cli.js\");\n\nconst install = (log: (line: string) => void): Promise<void> => new Promise((resolve, reject) => {\n const child = spawn(process.execPath, [playwrightCli(), \"install\", ...(process.platform === \"linux\" ? [\"--with-deps\"] : []), \"chromium\"], { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n for (const stream of [child.stdout, child.stderr]) stream.on(\"data\", (chunk: Buffer) => log(chunk.toString().trimEnd()));\n child.once(\"error\", reject);\n child.once(\"exit\", (code) => code === 0 ? resolve() : reject(new Error(`playwright-core install chromium endete mit Code ${code}`)));\n});\n\n// Playwright verwaltet seinen Browsercache selbst; der Werkzeugordner des Plugins bleibt leer.\nexport const createBrowserProvision = (): PluginProvision => ({\n check: async () => {\n const configured = process.env[BROWSER_EXECUTABLE_VARIABLE];\n if (configured) {\n return await executable(configured)\n ? provisionReady\n : provisionGap(\"browser\", `${BROWSER_EXECUTABLE_VARIABLE} nennt ${configured}; dort gibt es keinen ausf\u00FChrbaren Browser`, false);\n }\n const bundled = chromium.executablePath();\n return await executable(bundled)\n ? provisionReady\n : provisionGap(\"chromium\", `Chromium fehlt unter ${bundled}; entweder ${BROWSER_EXECUTABLE_VARIABLE} auf einen vorhandenen Chrome `\n + \"setzen (auf einem Server in der Profilsektion ragents.browser, auf einem Arbeitsplatz in seiner Umgebung) oder die \"\n + \"Provisionierung den Browser laden lassen\", true);\n },\n apply: async (_target, log) => {\n const state = await createBrowserProvision().check(\"\");\n if (state.kind === \"ready\") return;\n if (!state.installable) throw new Error(state.instruction);\n log(\"Chromium f\u00FCr playwright-core laden\");\n await install(log);\n },\n});\n\nexport const provision = createBrowserProvision();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["path", "path"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"format":
|
|
2
|
+
"format": 4,
|
|
3
3
|
"id": "ragents.documents",
|
|
4
|
-
"api":
|
|
4
|
+
"api": 7,
|
|
5
5
|
"hostNames": {
|
|
6
6
|
"server": {
|
|
7
7
|
"@ragents/engine": [
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
}
|
|
102
102
|
},
|
|
103
103
|
"stand": "54b40df2365ff3facc92feab74c674d0dc8a14e091227de1df650cb8b28cdd46",
|
|
104
|
-
"sourceStand": "
|
|
104
|
+
"sourceStand": "0ca7e55ce809628cbfd53431f690df48d4b6207f59b2ac53d5e269532259fb68",
|
|
105
105
|
"server": "server/index.js",
|
|
106
106
|
"web": {
|
|
107
107
|
"entry": "web/index.js",
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { createRequire as __ragentsCreateRequire } from "node:module";
|
|
2
|
+
const require = __ragentsCreateRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
// executor.ts
|
|
5
|
+
import { existsSync } from "node:fs";
|
|
6
|
+
import { readFile } from "node:fs/promises";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { pathToFileURL } from "node:url";
|
|
9
|
+
var FSHARP_SERVER_VARIABLE = "FSHARP_LANGUAGE_SERVER";
|
|
10
|
+
var FSHARP_SERVER_FILE = "fsautocomplete/fsautocomplete.dll";
|
|
11
|
+
var languages = { ".fs": "fsharp", ".fsi": "fsharp", ".fsx": "fsharp" };
|
|
12
|
+
var fsharpLanguageServer = {
|
|
13
|
+
id: "fsharp",
|
|
14
|
+
label: "FSAC",
|
|
15
|
+
languages,
|
|
16
|
+
rootDescription: "the .sln file (or a single .fsproj)"
|
|
17
|
+
};
|
|
18
|
+
var PROJECT_LINE = /^Project\("\{[^}]+\}"\)\s*=\s*"[^"]*",\s*"([^"]+)"/gm;
|
|
19
|
+
var solutionProjects = async (solutionFile) => {
|
|
20
|
+
const text = await readFile(solutionFile, "utf8");
|
|
21
|
+
const directory = path.dirname(solutionFile);
|
|
22
|
+
return [...text.matchAll(PROJECT_LINE)].map((match) => match[1].replaceAll("\\", "/")).filter((relative) => /\.[a-z]+proj$/i.test(relative)).map((relative) => path.resolve(directory, relative));
|
|
23
|
+
};
|
|
24
|
+
var dotnetCommand = (server, args) => server.toLowerCase().endsWith(".dll") ? { command: "dotnet", args: [server, ...args] } : { command: server, args: [...args] };
|
|
25
|
+
var serverPath = (toolsDirectory) => {
|
|
26
|
+
const configured = process.env[FSHARP_SERVER_VARIABLE];
|
|
27
|
+
if (configured) return configured;
|
|
28
|
+
const provisioned = path.join(toolsDirectory, ...FSHARP_SERVER_FILE.split("/"));
|
|
29
|
+
if (existsSync(provisioned)) return provisioned;
|
|
30
|
+
throw new Error(`fsautocomplete gibt es auf diesem Rechner nicht: weder ${FSHARP_SERVER_VARIABLE} gesetzt noch ${provisioned} vorhanden. Ein Arbeitsplatz holt es mit pnpm provision --workspace, ein Server \xFCber pnpm provision <profil>; ${FSHARP_SERVER_VARIABLE} \xFCbersteuert beides`);
|
|
31
|
+
};
|
|
32
|
+
var contentOf = (params) => params?.content ?? "";
|
|
33
|
+
var executor = (machine) => ({
|
|
34
|
+
languageServers: [{
|
|
35
|
+
...fsharpLanguageServer,
|
|
36
|
+
resolveRoot: (workspaceRoot, root) => machine.resolveRootFile(workspaceRoot, root, [".sln", ".fsproj"]),
|
|
37
|
+
rootDirectory: (root) => path.dirname(root),
|
|
38
|
+
launch: async (context, root) => ({
|
|
39
|
+
label: "FSAC",
|
|
40
|
+
...dotnetCommand(serverPath(machine.toolsDirectory), ["--state-directory", path.join(context.logDirectory, "fsautocomplete")]),
|
|
41
|
+
cwd: path.dirname(root),
|
|
42
|
+
env: context.env,
|
|
43
|
+
uid: context.uid,
|
|
44
|
+
gid: context.gid,
|
|
45
|
+
rootUri: pathToFileURL(path.dirname(root)).href,
|
|
46
|
+
initializationOptions: { AutomaticWorkspaceInit: false },
|
|
47
|
+
languages
|
|
48
|
+
}),
|
|
49
|
+
open: async (session, root, timeoutMs) => {
|
|
50
|
+
const projects = root.toLowerCase().endsWith(".sln") ? (await solutionProjects(root)).filter((project) => project.toLowerCase().endsWith(".fsproj")) : [root];
|
|
51
|
+
if (projects.length === 0) throw new Error(`${path.basename(root)} enth\xE4lt keine F#-Projekte`);
|
|
52
|
+
const finished = session.waitForNotification(timeoutMs, "Projekte geladen", (method, params) => method === "fsharp/notifyWorkspace" && contentOf(params).includes('"workspaceLoad"') && contentOf(params).includes('"finished"'));
|
|
53
|
+
await session.request("fsharp/workspaceLoad", {
|
|
54
|
+
textDocuments: projects.map((project) => ({ uri: pathToFileURL(project).href }))
|
|
55
|
+
});
|
|
56
|
+
await finished;
|
|
57
|
+
return `${projects.length} F#-Projekt${projects.length === 1 ? "" : "e"} aus ${path.basename(root)} geladen`;
|
|
58
|
+
}
|
|
59
|
+
}]
|
|
60
|
+
});
|
|
61
|
+
export {
|
|
62
|
+
FSHARP_SERVER_FILE,
|
|
63
|
+
FSHARP_SERVER_VARIABLE,
|
|
64
|
+
executor,
|
|
65
|
+
fsharpLanguageServer,
|
|
66
|
+
solutionProjects
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../plugins/ragents.lsp-fsharp/executor.ts"],
|
|
4
|
+
"sourcesContent": ["import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { LanguageServerDescription, WorkspaceExecutorContribution } from \"@ragents/workspace-executor\";\n\nexport const FSHARP_SERVER_VARIABLE = \"FSHARP_LANGUAGE_SERVER\";\nexport const FSHARP_SERVER_FILE = \"fsautocomplete/fsautocomplete.dll\";\n\nconst languages = { \".fs\": \"fsharp\", \".fsi\": \"fsharp\", \".fsx\": \"fsharp\" } as const;\n\nexport const fsharpLanguageServer: LanguageServerDescription = {\n id: \"fsharp\",\n label: \"FSAC\",\n languages,\n rootDescription: \"the .sln file (or a single .fsproj)\",\n};\n\nconst PROJECT_LINE = /^Project\\(\"\\{[^}]+\\}\"\\)\\s*=\\s*\"[^\"]*\",\\s*\"([^\"]+)\"/gm;\n\n/** Die Projekte einer .sln, aufgel\u00F6st neben ihr; Ordnereintr\u00E4ge der Solution z\u00E4hlen nicht. */\nexport const solutionProjects = async (solutionFile: string): Promise<string[]> => {\n const text = await readFile(solutionFile, \"utf8\");\n const directory = path.dirname(solutionFile);\n return [...text.matchAll(PROJECT_LINE)]\n .map((match) => match[1].replaceAll(\"\\\\\", \"/\"))\n .filter((relative) => /\\.[a-z]+proj$/i.test(relative))\n .map((relative) => path.resolve(directory, relative));\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[FSHARP_SERVER_VARIABLE];\n if (configured) return configured;\n const provisioned = path.join(toolsDirectory, ...FSHARP_SERVER_FILE.split(\"/\"));\n if (existsSync(provisioned)) return provisioned;\n throw new Error(\"fsautocomplete gibt es auf diesem Rechner nicht: weder \"\n + `${FSHARP_SERVER_VARIABLE} gesetzt noch ${provisioned} vorhanden. Ein Arbeitsplatz holt es mit `\n + `pnpm provision --workspace, ein Server \u00FCber pnpm provision <profil>; ${FSHARP_SERVER_VARIABLE} \u00FCbersteuert beides`);\n};\n\nconst contentOf = (params: unknown): string => (params as { content?: string } | undefined)?.content ?? \"\";\n\nexport const executor: WorkspaceExecutorContribution = (machine) => ({\n languageServers: [{\n ...fsharpLanguageServer,\n resolveRoot: (workspaceRoot, root) => machine.resolveRootFile(workspaceRoot, root, [\".sln\", \".fsproj\"]),\n rootDirectory: (root) => path.dirname(root),\n launch: async (context, root) => ({\n label: \"FSAC\",\n ...dotnetCommand(serverPath(machine.toolsDirectory), [\"--state-directory\", path.join(context.logDirectory, \"fsautocomplete\")]),\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 initializationOptions: { AutomaticWorkspaceInit: false },\n languages,\n }),\n open: async (session, root, timeoutMs) => {\n const projects = root.toLowerCase().endsWith(\".sln\")\n ? (await solutionProjects(root)).filter((project) => project.toLowerCase().endsWith(\".fsproj\"))\n : [root];\n if (projects.length === 0) throw new Error(`${path.basename(root)} enth\u00E4lt keine F#-Projekte`);\n const finished = session.waitForNotification(timeoutMs, \"Projekte geladen\", (method, params) =>\n method === \"fsharp/notifyWorkspace\"\n && contentOf(params).includes(\"\\\"workspaceLoad\\\"\")\n && contentOf(params).includes(\"\\\"finished\\\"\"));\n await session.request(\"fsharp/workspaceLoad\", {\n textDocuments: projects.map((project) => ({ uri: pathToFileURL(project).href })),\n });\n await finished;\n return `${projects.length} F#-Projekt${projects.length === 1 ? \"\" : \"e\"} aus ${path.basename(root)} geladen`;\n },\n }],\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"format":
|
|
2
|
+
"format": 4,
|
|
3
3
|
"id": "ragents.lsp-fsharp",
|
|
4
|
-
"api":
|
|
4
|
+
"api": 7,
|
|
5
5
|
"hostNames": {
|
|
6
6
|
"server": {
|
|
7
7
|
"@ragents/host/plugin-support/language-server/plugin": [
|
|
@@ -17,11 +17,6 @@
|
|
|
17
17
|
"readZipNames",
|
|
18
18
|
"unpackArchive",
|
|
19
19
|
"writeProvisionStamp"
|
|
20
|
-
],
|
|
21
|
-
"@ragents/workspace-executor": [
|
|
22
|
-
"FSHARP_SERVER_FILE",
|
|
23
|
-
"FSHARP_SERVER_VARIABLE",
|
|
24
|
-
"fsharpAdapter"
|
|
25
20
|
]
|
|
26
21
|
},
|
|
27
22
|
"web": {
|
|
@@ -33,13 +28,14 @@
|
|
|
33
28
|
]
|
|
34
29
|
}
|
|
35
30
|
},
|
|
36
|
-
"stand": "
|
|
37
|
-
"sourceStand": "
|
|
31
|
+
"stand": "4c213b3b9447a430f9afc54ea8fb3ec22a9073b9d7422332c982c5f5cb5259b9",
|
|
32
|
+
"sourceStand": "d40d7a5d009b8d477f3118b677b049107a8df49b26ad27c54ef059067164fb5a",
|
|
38
33
|
"server": "server/index.js",
|
|
39
34
|
"web": {
|
|
40
35
|
"entry": "web/index.js",
|
|
41
36
|
"classes": "web/classes.json"
|
|
42
37
|
},
|
|
38
|
+
"executor": "executor/index.mjs",
|
|
43
39
|
"exports": {
|
|
44
40
|
"server": {},
|
|
45
41
|
"web": {}
|
|
@@ -2,15 +2,31 @@ import { createRequire as __ragentsCreateRequire } from "node:module";
|
|
|
2
2
|
const require = __ragentsCreateRequire(import.meta.url);
|
|
3
3
|
|
|
4
4
|
// server/index.ts
|
|
5
|
-
import { fsharpAdapter, FSHARP_SERVER_VARIABLE } from "@ragents/workspace-executor";
|
|
6
5
|
import { createLanguageServerPlugin } from "@ragents/host/plugin-support/language-server/plugin.js";
|
|
6
|
+
|
|
7
|
+
// executor.ts
|
|
8
|
+
import { existsSync } from "node:fs";
|
|
9
|
+
import { readFile } from "node:fs/promises";
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import { pathToFileURL } from "node:url";
|
|
12
|
+
var FSHARP_SERVER_VARIABLE = "FSHARP_LANGUAGE_SERVER";
|
|
13
|
+
var FSHARP_SERVER_FILE = "fsautocomplete/fsautocomplete.dll";
|
|
14
|
+
var languages = { ".fs": "fsharp", ".fsi": "fsharp", ".fsx": "fsharp" };
|
|
15
|
+
var fsharpLanguageServer = {
|
|
16
|
+
id: "fsharp",
|
|
17
|
+
label: "FSAC",
|
|
18
|
+
languages,
|
|
19
|
+
rootDescription: "the .sln file (or a single .fsproj)"
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// server/index.ts
|
|
7
23
|
var fsharpConfigDescriptors = [
|
|
8
24
|
{ key: FSHARP_SERVER_VARIABLE, source: "environment" }
|
|
9
25
|
];
|
|
10
26
|
var plugin = {
|
|
11
27
|
create: () => createLanguageServerPlugin({
|
|
12
28
|
id: "ragents.lsp-fsharp",
|
|
13
|
-
|
|
29
|
+
languageServer: fsharpLanguageServer,
|
|
14
30
|
tabLabel: "F#",
|
|
15
31
|
configDescriptors: fsharpConfigDescriptors
|
|
16
32
|
})
|
|
@@ -18,8 +34,7 @@ var plugin = {
|
|
|
18
34
|
|
|
19
35
|
// provision.ts
|
|
20
36
|
import { stat } from "node:fs/promises";
|
|
21
|
-
import
|
|
22
|
-
import { FSHARP_SERVER_FILE } from "@ragents/workspace-executor";
|
|
37
|
+
import path2 from "node:path";
|
|
23
38
|
import {
|
|
24
39
|
DOTNET_INSTRUCTION,
|
|
25
40
|
downloadArchive,
|
|
@@ -46,7 +61,7 @@ var toolPrefix = (names, majors) => {
|
|
|
46
61
|
return chosen.prefix;
|
|
47
62
|
};
|
|
48
63
|
var createFsharpProvision = (download = downloadArchive, runtimes = dotnetRuntimeMajors) => {
|
|
49
|
-
const serverFile = (target) =>
|
|
64
|
+
const serverFile = (target) => path2.join(target, ...FSHARP_SERVER_FILE.split("/"));
|
|
50
65
|
const check = async (target) => {
|
|
51
66
|
if (await runtimes() === void 0) return provisionGap("dotnet", DOTNET_INSTRUCTION, false);
|
|
52
67
|
const installed = await stat(serverFile(target)).catch(() => void 0);
|
|
@@ -69,7 +84,7 @@ var createFsharpProvision = (download = downloadArchive, runtimes = dotnetRuntim
|
|
|
69
84
|
throw new Error(`Das Paket ${PACKAGE} ${FSAUTOCOMPLETE_VERSION} enth\xE4lt ${prefix}fsautocomplete.dll nicht`);
|
|
70
85
|
}
|
|
71
86
|
await writeProvisionStamp(target, FSAUTOCOMPLETE_VERSION);
|
|
72
|
-
log(`${files} Dateien aus ${prefix} nach ${
|
|
87
|
+
log(`${files} Dateien aus ${prefix} nach ${path2.join(target, "fsautocomplete")}`);
|
|
73
88
|
}
|
|
74
89
|
};
|
|
75
90
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../plugins/ragents.lsp-fsharp/server/index.ts", "../../../plugins/ragents.lsp-fsharp/provision.ts"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": ";;;;AAAA,SAAS,
|
|
6
|
-
"names": []
|
|
3
|
+
"sources": ["../../../plugins/ragents.lsp-fsharp/server/index.ts", "../../../plugins/ragents.lsp-fsharp/executor.ts", "../../../plugins/ragents.lsp-fsharp/provision.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 { fsharpLanguageServer, FSHARP_SERVER_VARIABLE } from \"../executor.js\";\n\nexport const fsharpConfigDescriptors = [\n { key: FSHARP_SERVER_VARIABLE, source: \"environment\" },\n] as const;\n\nexport const plugin: PluginModule = {\n create: () => createLanguageServerPlugin({\n id: \"ragents.lsp-fsharp\",\n languageServer: fsharpLanguageServer,\n tabLabel: \"F#\",\n configDescriptors: fsharpConfigDescriptors,\n }),\n};\n", "import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { LanguageServerDescription, WorkspaceExecutorContribution } from \"@ragents/workspace-executor\";\n\nexport const FSHARP_SERVER_VARIABLE = \"FSHARP_LANGUAGE_SERVER\";\nexport const FSHARP_SERVER_FILE = \"fsautocomplete/fsautocomplete.dll\";\n\nconst languages = { \".fs\": \"fsharp\", \".fsi\": \"fsharp\", \".fsx\": \"fsharp\" } as const;\n\nexport const fsharpLanguageServer: LanguageServerDescription = {\n id: \"fsharp\",\n label: \"FSAC\",\n languages,\n rootDescription: \"the .sln file (or a single .fsproj)\",\n};\n\nconst PROJECT_LINE = /^Project\\(\"\\{[^}]+\\}\"\\)\\s*=\\s*\"[^\"]*\",\\s*\"([^\"]+)\"/gm;\n\n/** Die Projekte einer .sln, aufgel\u00F6st neben ihr; Ordnereintr\u00E4ge der Solution z\u00E4hlen nicht. */\nexport const solutionProjects = async (solutionFile: string): Promise<string[]> => {\n const text = await readFile(solutionFile, \"utf8\");\n const directory = path.dirname(solutionFile);\n return [...text.matchAll(PROJECT_LINE)]\n .map((match) => match[1].replaceAll(\"\\\\\", \"/\"))\n .filter((relative) => /\\.[a-z]+proj$/i.test(relative))\n .map((relative) => path.resolve(directory, relative));\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[FSHARP_SERVER_VARIABLE];\n if (configured) return configured;\n const provisioned = path.join(toolsDirectory, ...FSHARP_SERVER_FILE.split(\"/\"));\n if (existsSync(provisioned)) return provisioned;\n throw new Error(\"fsautocomplete gibt es auf diesem Rechner nicht: weder \"\n + `${FSHARP_SERVER_VARIABLE} gesetzt noch ${provisioned} vorhanden. Ein Arbeitsplatz holt es mit `\n + `pnpm provision --workspace, ein Server \u00FCber pnpm provision <profil>; ${FSHARP_SERVER_VARIABLE} \u00FCbersteuert beides`);\n};\n\nconst contentOf = (params: unknown): string => (params as { content?: string } | undefined)?.content ?? \"\";\n\nexport const executor: WorkspaceExecutorContribution = (machine) => ({\n languageServers: [{\n ...fsharpLanguageServer,\n resolveRoot: (workspaceRoot, root) => machine.resolveRootFile(workspaceRoot, root, [\".sln\", \".fsproj\"]),\n rootDirectory: (root) => path.dirname(root),\n launch: async (context, root) => ({\n label: \"FSAC\",\n ...dotnetCommand(serverPath(machine.toolsDirectory), [\"--state-directory\", path.join(context.logDirectory, \"fsautocomplete\")]),\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 initializationOptions: { AutomaticWorkspaceInit: false },\n languages,\n }),\n open: async (session, root, timeoutMs) => {\n const projects = root.toLowerCase().endsWith(\".sln\")\n ? (await solutionProjects(root)).filter((project) => project.toLowerCase().endsWith(\".fsproj\"))\n : [root];\n if (projects.length === 0) throw new Error(`${path.basename(root)} enth\u00E4lt keine F#-Projekte`);\n const finished = session.waitForNotification(timeoutMs, \"Projekte geladen\", (method, params) =>\n method === \"fsharp/notifyWorkspace\"\n && contentOf(params).includes(\"\\\"workspaceLoad\\\"\")\n && contentOf(params).includes(\"\\\"finished\\\"\"));\n await session.request(\"fsharp/workspaceLoad\", {\n textDocuments: projects.map((project) => ({ uri: pathToFileURL(project).href })),\n });\n await finished;\n return `${projects.length} F#-Projekt${projects.length === 1 ? \"\" : \"e\"} aus ${path.basename(root)} geladen`;\n },\n }],\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 readZipNames,\n unpackArchive,\n writeProvisionStamp,\n type ArchiveDownload,\n type PluginProvision,\n type ProvisionState,\n} from \"@ragents/host/plugin-support/provision.js\";\nimport { FSHARP_SERVER_FILE } from \"./executor.js\";\n\nexport const FSAUTOCOMPLETE_VERSION = \"0.83.0\";\n\nconst FEED = \"https://api.nuget.org/v3/flatcontainer\";\nconst PACKAGE = \"fsautocomplete\";\nconst TOOL_FOLDER = /^tools\\/net(\\d+)\\.0\\/any\\//;\n\nexport const fsautocompleteArchiveUrl = `${FEED}/${PACKAGE}/${FSAUTOCOMPLETE_VERSION}/${PACKAGE}.${FSAUTOCOMPLETE_VERSION}.nupkg`;\n\n/** Das Werkzeugpaket bringt je Zielplattform einen Ordner mit; genommen wird die h\u00F6chste Laufzeit, die es hier gibt. */\nconst toolPrefix = (names: readonly string[], majors: readonly number[]): string => {\n const offered = names\n .map((name) => TOOL_FOLDER.exec(name))\n .filter((match): match is RegExpExecArray => match !== null)\n .map((match) => ({ prefix: match[0], major: Number(match[1]) }));\n const usable = offered.filter((entry) => majors.includes(entry.major)).sort((left, right) => right.major - left.major);\n const chosen = usable[0];\n if (!chosen) {\n throw new Error(`${PACKAGE} ${FSAUTOCOMPLETE_VERSION} bringt nur ${[...new Set(offered.map((entry) => `net${entry.major}.0`))].join(\", \")} mit; `\n + `installiert sind die .NET-Laufzeiten ${majors.join(\", \")}`);\n }\n return chosen.prefix;\n};\n\nexport const createFsharpProvision = (\n download: ArchiveDownload = downloadArchive,\n runtimes: () => Promise<readonly number[] | undefined> = dotnetRuntimeMajors,\n): PluginProvision => {\n const serverFile = (target: string): string => path.join(target, ...FSHARP_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) === FSAUTOCOMPLETE_VERSION) return provisionReady;\n return provisionGap(\"fsautocomplete\", `fsautocomplete ${FSAUTOCOMPLETE_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 const majors = await runtimes();\n if (!majors) throw new Error(DOTNET_INSTRUCTION);\n log(`fsautocomplete ${FSAUTOCOMPLETE_VERSION} laden`);\n const archive = await download(fsautocompleteArchiveUrl);\n const prefix = toolPrefix(readZipNames(archive), majors);\n const files = await unpackArchive(archive, prefix, target, \"fsautocomplete\");\n if (!(await stat(serverFile(target)).catch(() => undefined))?.isFile()) {\n throw new Error(`Das Paket ${PACKAGE} ${FSAUTOCOMPLETE_VERSION} enth\u00E4lt ${prefix}fsautocomplete.dll nicht`);\n }\n await writeProvisionStamp(target, FSAUTOCOMPLETE_VERSION);\n log(`${files} Dateien aus ${prefix} nach ${path.join(target, \"fsautocomplete\")}`);\n },\n };\n};\n\nexport const provision = createFsharpProvision();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["path", "path"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { createRequire as __ragentsCreateRequire } from "node:module";
|
|
2
|
+
const require = __ragentsCreateRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
// executor.ts
|
|
5
|
+
import { existsSync } from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { pathToFileURL } from "node:url";
|
|
8
|
+
var ROSLYN_SERVER_VARIABLE = "ROSLYN_LANGUAGE_SERVER";
|
|
9
|
+
var ROSLYN_SERVER_FILE = "roslyn/Microsoft.CodeAnalysis.LanguageServer.dll";
|
|
10
|
+
var languages = { ".cs": "csharp" };
|
|
11
|
+
var roslynLanguageServer = {
|
|
12
|
+
id: "roslyn",
|
|
13
|
+
label: "Roslyn",
|
|
14
|
+
languages,
|
|
15
|
+
rootDescription: "the .sln file (or a single .csproj)",
|
|
16
|
+
solutionExtensions: [".sln", ".slnx"]
|
|
17
|
+
};
|
|
18
|
+
var dotnetCommand = (server, args) => server.toLowerCase().endsWith(".dll") ? { command: "dotnet", args: [server, ...args] } : { command: server, args: [...args] };
|
|
19
|
+
var serverPath = (toolsDirectory) => {
|
|
20
|
+
const configured = process.env[ROSLYN_SERVER_VARIABLE];
|
|
21
|
+
if (configured) return configured;
|
|
22
|
+
const provisioned = path.join(toolsDirectory, ...ROSLYN_SERVER_FILE.split("/"));
|
|
23
|
+
if (existsSync(provisioned)) return provisioned;
|
|
24
|
+
throw new Error(`Microsoft.CodeAnalysis.LanguageServer gibt es auf diesem Rechner nicht: weder ${ROSLYN_SERVER_VARIABLE} gesetzt noch ${provisioned} vorhanden. Ein Arbeitsplatz holt ihn mit pnpm provision --workspace, ein Server \xFCber pnpm provision <profil>; ${ROSLYN_SERVER_VARIABLE} \xFCbersteuert beides`);
|
|
25
|
+
};
|
|
26
|
+
var executor = (machine) => ({
|
|
27
|
+
languageServers: [{
|
|
28
|
+
...roslynLanguageServer,
|
|
29
|
+
resolveRoot: (workspaceRoot, root) => machine.resolveRootFile(workspaceRoot, root, [".sln", ".slnx", ".csproj"]),
|
|
30
|
+
rootDirectory: (root) => path.dirname(root),
|
|
31
|
+
launch: async (context, root) => ({
|
|
32
|
+
label: "Roslyn",
|
|
33
|
+
...dotnetCommand(serverPath(machine.toolsDirectory), [
|
|
34
|
+
"--stdio",
|
|
35
|
+
"--logLevel",
|
|
36
|
+
"Warning",
|
|
37
|
+
"--extensionLogDirectory",
|
|
38
|
+
path.join(context.logDirectory, "roslyn-logs")
|
|
39
|
+
]),
|
|
40
|
+
cwd: path.dirname(root),
|
|
41
|
+
env: context.env,
|
|
42
|
+
uid: context.uid,
|
|
43
|
+
gid: context.gid,
|
|
44
|
+
rootUri: pathToFileURL(path.dirname(root)).href,
|
|
45
|
+
languages,
|
|
46
|
+
newFileSettleMs: 2e3
|
|
47
|
+
}),
|
|
48
|
+
open: async (session, root, timeoutMs) => {
|
|
49
|
+
const uri = pathToFileURL(root).href;
|
|
50
|
+
const loaded = session.waitForNotification(
|
|
51
|
+
timeoutMs,
|
|
52
|
+
"Projekte geladen",
|
|
53
|
+
(method) => method === "workspace/projectInitializationComplete"
|
|
54
|
+
);
|
|
55
|
+
if (root.toLowerCase().endsWith(".csproj")) session.notify("project/open", { projects: [uri] });
|
|
56
|
+
else session.notify("solution/open", { solution: uri });
|
|
57
|
+
await loaded;
|
|
58
|
+
return `${path.basename(root)} geladen`;
|
|
59
|
+
}
|
|
60
|
+
}]
|
|
61
|
+
});
|
|
62
|
+
export {
|
|
63
|
+
ROSLYN_SERVER_FILE,
|
|
64
|
+
ROSLYN_SERVER_VARIABLE,
|
|
65
|
+
executor,
|
|
66
|
+
roslynLanguageServer
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../plugins/ragents.lsp-roslyn/executor.ts"],
|
|
4
|
+
"sourcesContent": ["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"],
|
|
5
|
+
"mappings": ";;;;AAAA,SAAS,kBAAkB;AAC3B,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAGvB,IAAM,yBAAyB;AAC/B,IAAM,qBAAqB;AAElC,IAAM,YAAY,EAAE,OAAO,SAAS;AAE7B,IAAM,uBAAkD;AAAA,EAC7D,IAAI;AAAA,EACJ,OAAO;AAAA,EACP;AAAA,EACA,iBAAiB;AAAA,EACjB,oBAAoB,CAAC,QAAQ,OAAO;AACtC;AAEA,IAAM,gBAAgB,CAAC,QAAgB,SACrC,OAAO,YAAY,EAAE,SAAS,MAAM,IAChC,EAAE,SAAS,UAAU,MAAM,CAAC,QAAQ,GAAG,IAAI,EAAE,IAC7C,EAAE,SAAS,QAAQ,MAAM,CAAC,GAAG,IAAI,EAAE;AAEzC,IAAM,aAAa,CAAC,mBAAmC;AACrD,QAAM,aAAa,QAAQ,IAAI,sBAAsB;AACrD,MAAI,WAAY,QAAO;AACvB,QAAM,cAAc,KAAK,KAAK,gBAAgB,GAAG,mBAAmB,MAAM,GAAG,CAAC;AAC9E,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,QAAM,IAAI,MAAM,iFACT,sBAAsB,iBAAiB,WAAW,qHACmB,sBAAsB,wBAAqB;AACzH;AAEO,IAAM,WAA0C,CAAC,aAAa;AAAA,EACnE,iBAAiB,CAAC;AAAA,IAChB,GAAG;AAAA,IACH,aAAa,CAAC,eAAe,SAAS,QAAQ,gBAAgB,eAAe,MAAM,CAAC,QAAQ,SAAS,SAAS,CAAC;AAAA,IAC/G,eAAe,CAAC,SAAS,KAAK,QAAQ,IAAI;AAAA,IAC1C,QAAQ,OAAO,SAAS,UAAU;AAAA,MAChC,OAAO;AAAA,MACP,GAAG,cAAc,WAAW,QAAQ,cAAc,GAAG;AAAA,QACnD;AAAA,QACA;AAAA,QAAc;AAAA,QACd;AAAA,QAA2B,KAAK,KAAK,QAAQ,cAAc,aAAa;AAAA,MAC1E,CAAC;AAAA,MACD,KAAK,KAAK,QAAQ,IAAI;AAAA,MACtB,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA,MACb,SAAS,cAAc,KAAK,QAAQ,IAAI,CAAC,EAAE;AAAA,MAC3C;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,IACA,MAAM,OAAO,SAAS,MAAM,cAAc;AACxC,YAAM,MAAM,cAAc,IAAI,EAAE;AAChC,YAAM,SAAS,QAAQ;AAAA,QAAoB;AAAA,QAAW;AAAA,QACpD,CAAC,WAAW,WAAW;AAAA,MAAyC;AAClE,UAAI,KAAK,YAAY,EAAE,SAAS,SAAS,EAAG,SAAQ,OAAO,gBAAgB,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC;AAAA,UACzF,SAAQ,OAAO,iBAAiB,EAAE,UAAU,IAAI,CAAC;AACtD,YAAM;AACN,aAAO,GAAG,KAAK,SAAS,IAAI,CAAC;AAAA,IAC/B;AAAA,EACF,CAAC;AACH;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"format":
|
|
2
|
+
"format": 4,
|
|
3
3
|
"id": "ragents.lsp-roslyn",
|
|
4
|
-
"api":
|
|
4
|
+
"api": 7,
|
|
5
5
|
"hostNames": {
|
|
6
6
|
"server": {
|
|
7
7
|
"@ragents/host/plugin-support/language-server/plugin": [
|
|
@@ -27,11 +27,8 @@
|
|
|
27
27
|
"runtimeProviderToken"
|
|
28
28
|
],
|
|
29
29
|
"@ragents/workspace-executor": [
|
|
30
|
-
"ROSLYN_SERVER_FILE",
|
|
31
|
-
"ROSLYN_SERVER_VARIABLE",
|
|
32
30
|
"languageServerOpenOperation",
|
|
33
|
-
"languageServerSolutionsOperation"
|
|
34
|
-
"roslynAdapter"
|
|
31
|
+
"languageServerSolutionsOperation"
|
|
35
32
|
]
|
|
36
33
|
},
|
|
37
34
|
"web": {
|
|
@@ -43,13 +40,14 @@
|
|
|
43
40
|
]
|
|
44
41
|
}
|
|
45
42
|
},
|
|
46
|
-
"stand": "
|
|
47
|
-
"sourceStand": "
|
|
43
|
+
"stand": "552bc2063377364860e8366cb35071b33d3de3cc618bf813772cfa8cda157d20",
|
|
44
|
+
"sourceStand": "6e5ff77a56d86c61d2a1bbeb52db7cf6d35c70a8fb4db58cb4e212f345c75dc9",
|
|
48
45
|
"server": "server/index.js",
|
|
49
46
|
"web": {
|
|
50
47
|
"entry": "web/index.js",
|
|
51
48
|
"classes": "web/classes.json"
|
|
52
49
|
},
|
|
50
|
+
"executor": "executor/index.mjs",
|
|
53
51
|
"exports": {
|
|
54
52
|
"server": {},
|
|
55
53
|
"web": {}
|