@schlenkr/ragents 0.1.9 → 0.1.11
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 +9 -39
- package/apps/server/src/access-service.ts +3 -3
- package/apps/server/src/access-session.ts +19 -19
- package/apps/server/src/api/contracts.ts +32 -29
- package/apps/server/src/api/core-methods.ts +21 -19
- package/apps/server/src/api/delivery.ts +2 -2
- package/apps/server/src/api/reference.ts +27 -27
- package/apps/server/src/api/rights.ts +18 -18
- package/apps/server/src/chat-handler.ts +5 -5
- package/apps/server/src/config-definition.ts +37 -10
- package/apps/server/src/config-file.ts +49 -49
- package/apps/server/src/config.ts +2 -0
- package/apps/server/src/data-directory.ts +2 -2
- package/apps/server/src/external-access.ts +1 -1
- package/apps/server/src/folder-install.ts +1 -1
- package/apps/server/src/help-files.ts +1 -1
- package/apps/server/src/host-api.json +8 -1
- package/apps/server/src/host-api.ts +3 -2
- package/apps/server/src/host-record.ts +3 -3
- package/apps/server/src/host-resolution-hooks.mjs +4 -4
- package/apps/server/src/host-version.ts +17 -17
- package/apps/server/src/host-web.ts +5 -5
- package/apps/server/src/main.ts +6 -6
- package/apps/server/src/missing-environment.ts +6 -6
- package/apps/server/src/parent-watch.ts +4 -4
- package/apps/server/src/plugin-build/build.ts +31 -31
- package/apps/server/src/plugin-build/host-api-names.ts +7 -7
- package/apps/server/src/plugin-build/plugin-description.ts +15 -15
- package/apps/server/src/plugin-build/typecheck.ts +1 -1
- package/apps/server/src/plugin-support/actor-programs/app-project.ts +19 -19
- package/apps/server/src/plugin-support/actor-programs/client-compiler.ts +4 -4
- package/apps/server/src/plugin-support/actor-programs/client-contracts.ts +11 -11
- package/apps/server/src/plugin-support/actor-programs/contract.ts +17 -17
- package/apps/server/src/plugin-support/actor-programs/runtime-libraries.ts +1 -1
- package/apps/server/src/plugin-support/actor-programs/workflow/index.ts +5 -5
- package/apps/server/src/plugin-support/actor-programs/workflow/prompt-reader.ts +2 -2
- package/apps/server/src/plugin-support/chat-display-policy.ts +2 -2
- package/apps/server/src/plugin-support/front-matter.ts +6 -6
- package/apps/server/src/plugin-support/http.ts +2 -2
- package/apps/server/src/plugin-support/language-server/contract.ts +8 -8
- package/apps/server/src/plugin-support/language-server/plugin.ts +2 -2
- package/apps/server/src/plugin-support/language-server/snapshot-method.ts +1 -1
- package/apps/server/src/plugin-support/language-server/tools.ts +11 -11
- package/apps/server/src/plugin-support/model-aliases.ts +30 -20
- package/apps/server/src/plugin-support/model-choice.ts +15 -15
- package/apps/server/src/plugin-support/model-completion.ts +44 -23
- package/apps/server/src/plugin-support/model-providers.ts +170 -0
- package/apps/server/src/plugin-support/model-upstreams.ts +1 -1
- package/apps/server/src/plugin-support/native-typescript-child.ts +4 -4
- package/apps/server/src/plugin-support/native-typescript-executor.ts +12 -12
- package/apps/server/src/plugin-support/plugin-config.ts +3 -3
- package/apps/server/src/plugin-support/plugin-folder.ts +2 -2
- package/apps/server/src/plugin-support/plugins-root.ts +2 -2
- package/apps/server/src/plugin-support/process-sandbox.ts +48 -47
- package/apps/server/src/plugin-support/product-model-settings-contract.ts +3 -3
- package/apps/server/src/plugin-support/product-model-settings.ts +10 -10
- package/apps/server/src/plugin-support/product-relay.ts +9 -9
- package/apps/server/src/plugin-support/product-start-options.ts +4 -4
- package/apps/server/src/plugin-support/prompt.ts +1 -1
- package/apps/server/src/plugin-support/provision.ts +8 -8
- package/apps/server/src/plugin-support/run-scripts.ts +17 -17
- package/apps/server/src/plugin-support/skills.ts +18 -18
- package/apps/server/src/plugin-support/start-entries-contract.ts +17 -17
- package/apps/server/src/plugin-support/start-options-contract.ts +5 -5
- package/apps/server/src/plugin-support/system-prompts.ts +11 -11
- package/apps/server/src/plugin-support/thinking-level.ts +2 -2
- package/apps/server/src/plugin-support/tool-availability.ts +2 -2
- package/apps/server/src/plugin-support/workspace-ownership.ts +5 -5
- package/apps/server/src/plugin-support/workspace-sandbox-host.ts +37 -37
- package/apps/server/src/plugin-support/zip.ts +7 -7
- package/apps/server/src/profile/bundle-manifest.ts +17 -17
- package/apps/server/src/profile/compose.ts +12 -7
- package/apps/server/src/profile/plugin-discovery.ts +12 -12
- package/apps/server/src/profile/provisioning.ts +5 -5
- package/apps/server/src/profile-target.ts +10 -10
- package/apps/server/src/protocol.ts +2 -2
- package/apps/server/src/provider.ts +63 -58
- package/apps/server/src/ragents/actor-chat-history.ts +8 -8
- package/apps/server/src/ragents/chat-text-positions.ts +2 -2
- package/apps/server/src/ragents/coordinator.ts +2 -2
- package/apps/server/src/ragents/engine.ts +25 -24
- package/apps/server/src/ragents/global-chat.ts +14 -8
- package/apps/server/src/ragents/host-services.ts +6 -3
- package/apps/server/src/ragents/journal-chat-events.ts +1 -1
- package/apps/server/src/ragents/run-owner.ts +2 -2
- package/apps/server/src/ragents/session.ts +49 -49
- package/apps/server/src/ragents/typescript-tools.ts +12 -12
- package/apps/server/src/ragents/workspace-runtime.ts +28 -28
- package/apps/server/src/rpc/dispatcher.ts +19 -19
- package/apps/server/src/rpc/http-transport.ts +11 -11
- package/apps/server/src/rpc/stdio-transport.ts +3 -3
- package/apps/server/src/run-preparation-input.ts +5 -5
- package/apps/server/src/run-preparation.ts +24 -24
- package/apps/server/src/run-transfer.ts +39 -39
- package/apps/server/src/server.ts +51 -49
- package/apps/server/src/settings.ts +1 -1
- package/apps/server/src/startup.ts +3 -3
- package/apps/server/src/title-compactor.ts +9 -9
- package/apps/server/src/title-settings.ts +3 -3
- package/apps/server/src/web-bundles.ts +2 -2
- package/apps/server/src/web-stylesheet.ts +2 -2
- package/apps/web/dist/assets/{highlighted-body-KPVGNVTW-xXXhTDbh.js → highlighted-body-KPVGNVTW-BfNSGxjB.js} +1 -1
- package/apps/web/dist/assets/main-D6bsKcIK.js +11 -0
- package/apps/web/dist/assets/mermaid-HWGCJPDP-DROEqEeg.js +608 -0
- package/apps/web/dist/assets/runPanel-Dumuuqry.js +21 -0
- package/apps/web/dist/help/guide-access.html +5 -5
- package/apps/web/dist/help/guide-access.md +2 -2
- package/apps/web/dist/help/guide-clients.html +64 -55
- package/apps/web/dist/help/guide-clients.md +62 -52
- package/apps/web/dist/help/guide-distributed.html +12 -7
- package/apps/web/dist/help/guide-distributed.md +9 -4
- package/apps/web/dist/help/guide-functions.html +3 -3
- package/apps/web/dist/help/guide-getting-started.html +24 -15
- package/apps/web/dist/help/guide-getting-started.md +22 -12
- package/apps/web/dist/help/guide-ideas.html +3 -3
- package/apps/web/dist/help/guide-plugins.html +5 -4
- package/apps/web/dist/help/guide-plugins.md +2 -1
- package/apps/web/dist/help/guide-programs.html +3 -3
- package/apps/web/dist/help/guide-runtime.html +6 -6
- package/apps/web/dist/help/guide-runtime.md +3 -3
- package/apps/web/dist/help/guide.html +3 -3
- package/apps/web/dist/help/index.html +1997 -942
- package/apps/web/dist/help/mini-app.css +30 -0
- package/apps/web/dist/help/mini-app.js +14 -14
- package/apps/web/dist/host-web.json +90 -90
- package/apps/web/dist/index.html +3 -3
- package/apps/web/dist/run-panel.html +3 -3
- package/apps/web/package.json +1 -1
- package/apps/web/src/AccessContext.tsx +15 -15
- package/apps/web/src/App.tsx +13 -13
- package/apps/web/src/DiffCode.tsx +2 -2
- package/apps/web/src/HelpDialog.tsx +3 -3
- package/apps/web/src/Overview.tsx +13 -13
- package/apps/web/src/PluginActivation.ts +1 -1
- package/apps/web/src/PluginChat.tsx +15 -15
- package/apps/web/src/PluginFailureNotice.tsx +1 -1
- package/apps/web/src/PluginRegistry.tsx +44 -44
- package/apps/web/src/RunPreparationChat.tsx +11 -11
- package/apps/web/src/RunStore.ts +1 -1
- package/apps/web/src/SessionList.tsx +14 -14
- package/apps/web/src/SettingsModal.tsx +112 -112
- package/apps/web/src/StartOptions.tsx +11 -11
- package/apps/web/src/StartSelection.tsx +11 -11
- package/apps/web/src/StartTiles.tsx +8 -8
- package/apps/web/src/SurfaceShortcuts.tsx +3 -3
- package/apps/web/src/ThemeSettings.tsx +8 -8
- package/apps/web/src/TitleModelSettings.tsx +13 -13
- package/apps/web/src/WorkspacePanel.tsx +9 -9
- package/apps/web/src/access-session.ts +4 -4
- package/apps/web/src/access-token.ts +5 -5
- package/apps/web/src/actor-conversation.ts +3 -3
- package/apps/web/src/actor-programs/client-ui/DataTable.tsx +8 -8
- package/apps/web/src/actor-programs/client-ui/FilePicker.tsx +4 -4
- package/apps/web/src/actor-programs/client-ui/FlowDiagram.tsx +13 -13
- package/apps/web/src/actor-programs/client-ui/Viewers.tsx +4 -4
- package/apps/web/src/actor-programs/client-ui/WorkflowDiagram.tsx +1 -1
- package/apps/web/src/actor-programs/client-ui/file-contracts.d.ts +4 -4
- package/apps/web/src/actor-programs/client-ui/file-selection.ts +1 -1
- package/apps/web/src/actor-programs/client-ui/viewer-contracts.d.ts +3 -3
- package/apps/web/src/api.ts +7 -7
- package/apps/web/src/chat/StoppedActorNotice.tsx +5 -5
- package/apps/web/src/chat/chat-target.ts +3 -3
- package/apps/web/src/chat/requests.ts +2 -2
- package/apps/web/src/chat/useAttachmentCapabilities.ts +2 -2
- package/apps/web/src/chat-view-settings.tsx +5 -6
- package/apps/web/src/diff-view.css +1 -1
- package/apps/web/src/highlighting.css +1 -1
- package/apps/web/src/language-server/language-server-plugin.tsx +30 -30
- package/apps/web/src/lib/labels.ts +6 -6
- package/apps/web/src/main.tsx +4 -4
- package/apps/web/src/offered-machines.ts +2 -2
- package/apps/web/src/page-opener.tsx +1 -1
- package/apps/web/src/panel/ConnectionsPage.tsx +26 -23
- package/apps/web/src/panel/LoginForm.tsx +6 -6
- package/apps/web/src/panel/PanelDialogs.tsx +22 -22
- package/apps/web/src/panel/PanelHeader.tsx +2 -2
- package/apps/web/src/panel/PanelPage.tsx +1 -1
- package/apps/web/src/panel/RunLine.tsx +4 -4
- package/apps/web/src/panel/RunsPage.tsx +15 -15
- package/apps/web/src/panel/StartPage.tsx +29 -26
- package/apps/web/src/panel/connection-state.ts +9 -9
- package/apps/web/src/panel/contract.ts +34 -27
- package/apps/web/src/panel.tsx +1 -1
- package/apps/web/src/plugin-bootstrap.ts +5 -5
- package/apps/web/src/product/ModelControl.tsx +3 -3
- package/apps/web/src/product/ProductModelSettings.tsx +16 -16
- package/apps/web/src/product/SystemPromptControl.tsx +11 -11
- package/apps/web/src/product/model-settings.ts +2 -2
- package/apps/web/src/rpc/client.ts +16 -16
- package/apps/web/src/rpc.ts +1 -1
- package/apps/web/src/run-overview.ts +1 -1
- package/apps/web/src/run-panel/RunPanelApp.tsx +39 -39
- package/apps/web/src/run-panel/RunPanelHeader.tsx +6 -6
- package/apps/web/src/run-panel/RunPanelMenu.tsx +6 -6
- package/apps/web/src/run-panel/RunPanelRail.tsx +4 -4
- package/apps/web/src/run-panel/RunPanelWorkspace.tsx +3 -3
- package/apps/web/src/run-panel/clipboard.ts +3 -3
- package/apps/web/src/run-panel/host-contract.ts +5 -5
- package/apps/web/src/run-panel/host.ts +15 -15
- package/apps/web/src/run-panel/input-bridge.ts +1 -1
- package/apps/web/src/run-panel/run-panel-location.ts +5 -5
- package/apps/web/src/run-panel/use-session-list.ts +1 -1
- package/apps/web/src/run-panel/workspace-state.ts +3 -3
- package/apps/web/src/run-panel.tsx +4 -4
- package/apps/web/src/run-preparation.ts +2 -2
- package/apps/web/src/run-view.ts +3 -3
- package/apps/web/src/settings-contributions.ts +32 -32
- package/apps/web/src/theme.ts +9 -9
- package/apps/web/src/title-model-settings.ts +6 -6
- package/apps/web/src/ui/ListDetail.tsx +9 -9
- package/apps/web/src/ui/dialog.tsx +2 -2
- package/apps/web/src/ui/modal-controller.ts +3 -3
- package/apps/web/src/ui/modal.tsx +2 -2
- package/apps/web/src/ui/popover.tsx +1 -1
- package/apps/web/src/ui/relative-time.ts +8 -8
- package/apps/web/src/ui/startup-notice.tsx +2 -2
- package/apps/web/src/ui/state-icon.tsx +1 -1
- package/apps/web/src/ui/state-vocabulary.ts +16 -16
- package/apps/web/src/ui/stop-button.tsx +2 -2
- package/bundles/ragents.activity/ragents-bundle.json +2 -2
- package/bundles/ragents.activity/web/classes.json +1 -1
- package/bundles/ragents.activity/web/index.js +1 -1
- package/bundles/ragents.activity/web/index.js.map +2 -2
- package/bundles/ragents.actor-programs/ragents-bundle.json +2 -2
- package/bundles/ragents.actor-programs/server/index.js +256 -228
- package/bundles/ragents.actor-programs/server/index.js.map +4 -4
- package/bundles/ragents.actor-programs/web/classes.json +1 -1
- package/bundles/ragents.actor-programs/web/index.js +1 -1
- package/bundles/ragents.actor-programs/web/index.js.map +3 -3
- package/bundles/ragents.ask/ragents-bundle.json +2 -4
- package/bundles/ragents.ask/server/chunks/{chunk-PDJO75SQ.js → chunk-YOV27MAR.js} +2 -2
- package/bundles/ragents.ask/server/chunks/chunk-YOV27MAR.js.map +7 -0
- package/bundles/ragents.ask/server/exports/server/contract.js +1 -1
- package/bundles/ragents.ask/server/index.js +23 -23
- package/bundles/ragents.ask/server/index.js.map +2 -2
- package/bundles/ragents.ask/web/chunks/{chunk-WFN4374U.js → chunk-D6NNB5DS.js} +1 -1
- package/bundles/ragents.ask/web/chunks/chunk-D6NNB5DS.js.map +7 -0
- package/bundles/ragents.ask/web/chunks/{chunk-V7W3QDVS.js → chunk-IQBHK7MV.js} +2 -2
- package/bundles/ragents.ask/web/chunks/{chunk-V7W3QDVS.js.map → chunk-IQBHK7MV.js.map} +4 -4
- package/bundles/ragents.ask/web/chunks/chunk-PWFIAMX4.js +2 -0
- package/bundles/ragents.ask/web/chunks/chunk-PWFIAMX4.js.map +7 -0
- package/bundles/ragents.ask/web/chunks/chunk-QHGKEESD.js +2 -0
- package/bundles/ragents.ask/web/chunks/chunk-QHGKEESD.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/exports/web/api.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 +35 -35
- package/bundles/ragents.browser/executor/index.mjs.map +2 -2
- package/bundles/ragents.browser/ragents-bundle.json +2 -2
- package/bundles/ragents.browser/server/chunks/{chunk-CWLX4VA5.js → chunk-PYEISBNE.js} +1 -1
- package/bundles/ragents.browser/server/chunks/{chunk-CWLX4VA5.js.map → chunk-PYEISBNE.js.map} +1 -1
- package/bundles/ragents.browser/server/exports/server/contract.js +1 -1
- package/bundles/ragents.browser/server/index.js +31 -31
- package/bundles/ragents.browser/server/index.js.map +2 -2
- package/bundles/ragents.browser/skills/browser-testing/SKILL.md +30 -30
- package/bundles/ragents.documents/prompt.hbs +1 -1
- package/bundles/ragents.documents/ragents-bundle.json +2 -2
- package/bundles/ragents.documents/server/chunks/{chunk-QIECRZ7C.js → chunk-KMZWOVTI.js} +3 -3
- package/bundles/ragents.documents/server/chunks/{chunk-QIECRZ7C.js.map → chunk-KMZWOVTI.js.map} +2 -2
- package/bundles/ragents.documents/server/exports/contract.js +1 -1
- package/bundles/ragents.documents/server/index.js +26 -26
- package/bundles/ragents.documents/server/index.js.map +2 -2
- package/bundles/ragents.documents/web/classes.json +1 -1
- package/bundles/ragents.documents/web/index.js +1 -1
- package/bundles/ragents.documents/web/index.js.map +3 -3
- package/bundles/ragents.lsp-fsharp/executor/index.mjs +4 -4
- package/bundles/ragents.lsp-fsharp/executor/index.mjs.map +2 -2
- package/bundles/ragents.lsp-fsharp/ragents-bundle.json +2 -2
- package/bundles/ragents.lsp-fsharp/server/index.js +5 -5
- package/bundles/ragents.lsp-fsharp/server/index.js.map +2 -2
- package/bundles/ragents.lsp-fsharp/web/index.js +1 -1
- package/bundles/ragents.lsp-fsharp/web/index.js.map +2 -2
- package/bundles/ragents.lsp-roslyn/executor/index.mjs +3 -3
- package/bundles/ragents.lsp-roslyn/executor/index.mjs.map +2 -2
- package/bundles/ragents.lsp-roslyn/ragents-bundle.json +2 -2
- package/bundles/ragents.lsp-roslyn/server/index.js +17 -17
- package/bundles/ragents.lsp-roslyn/server/index.js.map +2 -2
- package/bundles/ragents.lsp-roslyn/web/index.js +1 -1
- package/bundles/ragents.lsp-roslyn/web/index.js.map +2 -2
- package/bundles/ragents.lsp-typescript/executor/index.mjs +2 -2
- package/bundles/ragents.lsp-typescript/executor/index.mjs.map +2 -2
- package/bundles/ragents.lsp-typescript/ragents-bundle.json +2 -2
- package/bundles/ragents.lsp-typescript/server/index.js.map +1 -1
- package/bundles/ragents.lsp-typescript/web/index.js +1 -1
- package/bundles/ragents.lsp-typescript/web/index.js.map +2 -2
- package/bundles/ragents.model-relay/ragents-bundle.json +7 -3
- package/bundles/ragents.model-relay/server/index.js +25 -21
- package/bundles/ragents.model-relay/server/index.js.map +2 -2
- package/bundles/ragents.orchestration/ragents-bundle.json +2 -2
- package/bundles/ragents.orchestration/server/index.js +28 -28
- package/bundles/ragents.orchestration/server/index.js.map +2 -2
- package/bundles/ragents.orchestration/web/chunks/{chunk-OSKPH6SZ.js → chunk-CFMJD5ZI.js} +2 -2
- package/bundles/ragents.orchestration/web/chunks/chunk-HOBLI364.js +2 -0
- package/bundles/ragents.orchestration/web/chunks/{chunk-OQYCNYXN.js.map → chunk-HOBLI364.js.map} +2 -2
- package/bundles/ragents.orchestration/web/chunks/{chunk-ODMMQGX2.js → chunk-UCIMT2R4.js} +2 -2
- package/bundles/ragents.orchestration/web/classes.json +1 -1
- package/bundles/ragents.orchestration/web/exports/web/program-slot.js +1 -1
- package/bundles/ragents.orchestration/web/exports/web/surface-entities.js +1 -1
- package/bundles/ragents.orchestration/web/index.js +8 -8
- package/bundles/ragents.orchestration/web/index.js.map +3 -3
- package/bundles/ragents.overseer/ragents-bundle.json +2 -2
- package/bundles/ragents.overseer/server/index.js +99 -99
- package/bundles/ragents.overseer/server/index.js.map +2 -2
- package/bundles/ragents.overseer/web/classes.json +1 -1
- package/bundles/ragents.overseer/web/index.js +1 -1
- package/bundles/ragents.overseer/web/index.js.map +2 -2
- package/bundles/ragents.processes/ragents-bundle.json +2 -2
- package/bundles/ragents.processes/server/index.js +11 -11
- package/bundles/ragents.processes/server/index.js.map +2 -2
- package/bundles/ragents.processes/web/classes.json +1 -1
- package/bundles/ragents.processes/web/index.js +3 -3
- package/bundles/ragents.processes/web/index.js.map +2 -2
- package/bundles/ragents.product/ragents-bundle.json +2 -2
- package/bundles/ragents.product/server/index.js +12 -13
- package/bundles/ragents.product/server/index.js.map +2 -2
- package/bundles/ragents.product/web/classes.json +1 -1
- package/bundles/ragents.product/web/index.js +1 -1
- package/bundles/ragents.product/web/index.js.map +2 -2
- package/bundles/ragents.profile-distribution/ragents-bundle.json +2 -2
- package/bundles/ragents.profile-distribution/server/index.js +31 -31
- package/bundles/ragents.profile-distribution/server/index.js.map +2 -2
- package/bundles/ragents.reference/ragents-bundle.json +2 -2
- package/bundles/ragents.reference/run-scripts/balcony-wizard/RUN.md +19 -19
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +2 -2
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +14 -14
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +2 -2
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +49 -49
- package/bundles/ragents.reference/run-scripts/balcony-wizard/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/balcony-wizard/src/server.ts +9 -9
- package/bundles/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +9 -9
- package/bundles/ragents.reference/run-scripts/conversation-circle/RUN.md +7 -7
- package/bundles/ragents.reference/run-scripts/conversation-circle/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/conversation-circle/src/server.ts +13 -13
- package/bundles/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +1 -1
- package/bundles/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +8 -8
- package/bundles/ragents.reference/run-scripts/learning-afternoon/RUN.md +16 -16
- package/bundles/ragents.reference/run-scripts/learning-afternoon/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -1
- package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +3 -3
- package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -1
- package/bundles/ragents.reference/run-scripts/learning-afternoon/src/server.ts +9 -9
- package/bundles/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +39 -39
- package/bundles/ragents.reference/run-scripts/moderated-round/RUN.md +7 -7
- package/bundles/ragents.reference/run-scripts/moderated-round/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/moderated-round/src/server.ts +9 -9
- package/bundles/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +1 -1
- package/bundles/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +6 -6
- package/bundles/ragents.reference/run-scripts/shared-actor-list/RUN.md +12 -12
- package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +2 -2
- package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +3 -3
- package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +4 -4
- package/bundles/ragents.reference/run-scripts/shared-actor-list/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/shared-actor-list/src/server.ts +11 -11
- package/bundles/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +1 -1
- package/bundles/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +13 -13
- package/bundles/ragents.reference/run-scripts/word-game/RUN.md +18 -18
- package/bundles/ragents.reference/run-scripts/word-game/package.json +2 -2
- package/bundles/ragents.reference/run-scripts/word-game/src/client.tsx +1 -1
- package/bundles/ragents.reference/run-scripts/word-game/src/contract.ts +2 -2
- package/bundles/ragents.reference/run-scripts/word-game/src/server.ts +16 -16
- package/bundles/ragents.reference/run-scripts/word-game/tests/program.test.ts +39 -39
- package/bundles/ragents.reference/skills/100-shared-actor-list/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/110-all-card-slots/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/150-editorial-workbench/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/160-learning-companion/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/170-photo-collection/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/180-decision-workbench/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/190-review-queue/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/20-circle-of-four/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/210-moderator-handover/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/220-actor-approval-list/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/230-shared-state-views/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/240-live-result-list/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/250-balcony-wizard/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/35-actor-input-fifo/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/40-subscription-matrix/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/50-subscription-removal/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/70-headless-counter/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/75-lsp-demo/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/80-actor-text-analysis/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/90-actor-notes/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/95-hello-world/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/decision-brief/SKILL.md +24 -24
- package/bundles/ragents.reference/skills/learning-sprint/SKILL.md +24 -24
- package/bundles/ragents.reference/web/classes.json +1 -1
- package/bundles/ragents.reference/web/index.js +1 -1
- package/bundles/ragents.reference/web/index.js.map +2 -2
- package/bundles/ragents.todo/ragents-bundle.json +2 -2
- package/bundles/ragents.todo/server/index.js +5 -5
- package/bundles/ragents.todo/server/index.js.map +2 -2
- package/bundles/ragents.todo/web/classes.json +1 -1
- package/bundles/ragents.todo/web/index.js +1 -1
- package/bundles/ragents.todo/web/index.js.map +2 -2
- package/bundles/ragents.transcript/ragents-bundle.json +2 -2
- package/bundles/ragents.transcript/server/index.js +11 -11
- package/bundles/ragents.transcript/server/index.js.map +2 -2
- package/bundles/ragents.watch/ragents-bundle.json +2 -2
- package/bundles/ragents.watch/server/index.js +48 -48
- package/bundles/ragents.watch/server/index.js.map +2 -2
- package/bundles/ragents.workspace/ragents-bundle.json +2 -2
- package/bundles/ragents.workspace/server/index.js +83 -81
- package/bundles/ragents.workspace/server/index.js.map +2 -2
- 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 +2 -2
- package/package.json +4 -4
- package/packages/agent/dist/core/model-runtime.d.ts +7 -2
- package/packages/agent/dist/core/tools/bash.d.ts +1 -1
- package/packages/agent/dist/index.d.ts +1 -1
- package/packages/agent/dist/loop/agent-loop.d.ts +2 -2
- package/packages/agent/src/core/compaction/utils.ts +1 -1
- package/packages/agent/src/core/model-runtime.ts +45 -5
- package/packages/agent/src/core/tools/bash.ts +1 -1
- package/packages/agent/src/index.ts +1 -1
- package/packages/agent/src/loop/agent-loop.ts +2 -2
- package/packages/ai/dist/models.d.ts +1 -0
- package/packages/ai/dist/models.generated.d.ts +4544 -983
- package/packages/ai/dist/providers/openrouter.models.d.ts +4544 -983
- package/packages/ai/src/api/ai-sdk.ts +33 -7
- package/packages/ai/src/api-registry.ts +1 -1
- package/packages/ai/src/index.ts +2 -2
- package/packages/ai/src/models.generated.ts +1 -1
- package/packages/ai/src/models.ts +1 -1
- package/packages/ai/src/providers/openrouter.models.ts +3723 -550
- package/packages/ragents/src/access.ts +12 -12
- package/packages/ragents/src/agents/actor-input.ts +33 -33
- package/packages/ragents/src/agents/catalog.ts +1 -1
- package/packages/ragents/src/agents/delivery.ts +17 -17
- package/packages/ragents/src/agents/plugins.ts +1 -1
- package/packages/ragents/src/agents/scheduler.ts +7 -7
- package/packages/ragents/src/agents/schemas.ts +1 -1
- package/packages/ragents/src/agents/tool-orientation.ts +4 -4
- package/packages/ragents/src/agents/tools.ts +20 -20
- package/packages/ragents/src/agents/toolset.ts +5 -5
- package/packages/ragents/src/agents/workspaces.ts +1 -1
- package/packages/ragents/src/domain/events.ts +1 -1
- package/packages/ragents/src/domain/model.ts +5 -5
- package/packages/ragents/src/drivers/agent-runtime.ts +1 -1
- package/packages/ragents/src/drivers/agent-turn.ts +4 -4
- package/packages/ragents/src/drivers/agent.ts +2 -2
- package/packages/ragents/src/drivers/attachments.ts +4 -4
- package/packages/ragents/src/http/contracts.ts +14 -14
- package/packages/ragents/src/http/methods.ts +6 -6
- package/packages/ragents/src/index.ts +1 -0
- package/packages/ragents/src/plugin-host.ts +162 -116
- package/packages/ragents/src/plugin-types.ts +29 -10
- package/packages/ragents/src/rpc/contract.ts +5 -5
- package/packages/ragents/src/rpc/contribution.ts +2 -2
- package/packages/ragents/src/rpc/peer.ts +11 -11
- package/packages/ragents/src/rpc/protocol.ts +2 -2
- package/packages/ragents/src/runtime/decisions/turns.ts +1 -1
- package/packages/ragents/src/runtime/journal.ts +10 -10
- package/packages/ragents/src/runtime/orchestration.ts +8 -8
- package/packages/ragents/src/runtime/stop.ts +2 -2
- package/packages/ragents/src/script/mediators.ts +35 -35
- package/packages/ragents/src/typescript/async-compiler.ts +14 -14
- package/packages/ragents/src/typescript/compiler-worker.ts +2 -2
- package/packages/ragents/src/typescript/compiler.ts +7 -7
- package/packages/ragents/src/typescript/snippet.ts +5 -5
- package/packages/workspace-executor/src/bash-launch.ts +13 -13
- package/packages/workspace-executor/src/commands.ts +18 -18
- package/packages/workspace-executor/src/context.ts +15 -15
- package/packages/workspace-executor/src/contributions.ts +35 -35
- package/packages/workspace-executor/src/errors.ts +1 -1
- package/packages/workspace-executor/src/executor.ts +15 -15
- package/packages/workspace-executor/src/files.ts +30 -30
- package/packages/workspace-executor/src/language-server/contract.ts +2 -2
- package/packages/workspace-executor/src/language-server/diagnostics.ts +4 -4
- package/packages/workspace-executor/src/language-server/host.ts +35 -35
- package/packages/workspace-executor/src/language-server/json-rpc.ts +4 -4
- package/packages/workspace-executor/src/language-server/module.ts +11 -11
- package/packages/workspace-executor/src/language-server/roots.ts +3 -3
- package/packages/workspace-executor/src/language-server/session.ts +15 -15
- package/packages/workspace-executor/src/language-server/workspace-solutions.ts +2 -2
- package/packages/workspace-executor/src/managed-process.ts +35 -7
- package/packages/workspace-executor/src/module.ts +8 -8
- package/packages/workspace-executor/src/modules.ts +3 -3
- package/packages/workspace-executor/src/paths.ts +11 -11
- package/packages/workspace-executor/src/process-sandbox.ts +3 -3
- package/packages/workspace-executor/src/processes/module.ts +3 -3
- package/packages/workspace-executor/src/processes/process-table.ts +20 -20
- package/packages/workspace-executor/src/processes/scanner.ts +3 -3
- package/packages/workspace-executor/src/processes/snapshot.ts +2 -2
- package/packages/workspace-executor/src/processes/terminator.ts +13 -13
- package/packages/workspace-executor/src/run-folders.ts +3 -3
- package/packages/workspace-executor/src/safe-environment.ts +4 -4
- package/packages/workspace-executor/src/sandbox-tools.ts +37 -31
- package/packages/workspace-executor/src/session-ident.ts +2 -2
- package/packages/workspace-executor/src/shell-platform.ts +2 -2
- package/packages/workspace-executor/src/tools.ts +5 -5
- package/plugins/ragents.activity/web/ActivityHeader.tsx +3 -3
- package/plugins/ragents.activity/web/activity.ts +2 -2
- package/plugins/ragents.actor-programs/server/access-projections.ts +31 -0
- package/plugins/ragents.actor-programs/server/agent-tools.ts +2 -2
- package/plugins/ragents.actor-programs/server/capability-resolver.ts +3 -3
- package/plugins/ragents.actor-programs/server/controls-template.ts +46 -46
- package/plugins/ragents.actor-programs/server/controls-tool.ts +4 -4
- package/plugins/ragents.actor-programs/server/index.ts +2 -0
- package/plugins/ragents.actor-programs/server/limits.ts +3 -3
- package/plugins/ragents.actor-programs/server/methods.ts +1 -1
- package/plugins/ragents.actor-programs/server/project-diagnostics.ts +8 -8
- package/plugins/ragents.actor-programs/server/routes.ts +8 -8
- package/plugins/ragents.actor-programs/server/runtime.ts +90 -90
- package/plugins/ragents.actor-programs/server/templates.ts +59 -59
- package/plugins/ragents.actor-programs/server/test-report.ts +5 -5
- package/plugins/ragents.actor-programs/server/tool-contributor.ts +1 -1
- package/plugins/ragents.actor-programs/web/ActorViewFrame.tsx +17 -17
- package/plugins/ragents.actor-programs/web/AppsPanel.tsx +26 -26
- package/plugins/ragents.actor-programs/web/EmbeddedApps.tsx +3 -3
- package/plugins/ragents.actor-programs/web/FullscreenHost.tsx +2 -2
- package/plugins/ragents.actor-programs/web/FunctionForm.tsx +16 -16
- package/plugins/ragents.actor-programs/web/ProgramSource.tsx +5 -5
- package/plugins/ragents.actor-programs/web/api.ts +36 -36
- package/plugins/ragents.actor-programs/web/bridge.ts +8 -8
- package/plugins/ragents.actor-programs/web/chat-state.ts +4 -4
- package/plugins/ragents.actor-programs/web/context.ts +1 -1
- package/plugins/ragents.actor-programs/web/function-input.ts +6 -6
- package/plugins/ragents.actor-programs/web/index.tsx +1 -1
- package/plugins/ragents.actor-programs/web/program-state.ts +4 -4
- package/plugins/ragents.ask/ask-payload.ts +1 -1
- package/plugins/ragents.ask/contract.ts +5 -5
- package/plugins/ragents.ask/server/answer-method.ts +1 -1
- package/plugins/ragents.ask/server/ask-service.ts +9 -9
- package/plugins/ragents.ask/server/ask-tool.ts +10 -10
- package/plugins/ragents.ask/server/contract.ts +5 -5
- package/plugins/ragents.ask/web/AskActionView.tsx +1 -1
- package/plugins/ragents.ask/web/QuestionCard.tsx +22 -22
- package/plugins/ragents.ask/web/index.tsx +2 -8
- package/plugins/ragents.browser/executor/contract.ts +6 -6
- package/plugins/ragents.browser/executor/index.ts +1 -1
- package/plugins/ragents.browser/executor/module.ts +6 -6
- package/plugins/ragents.browser/executor/pages.ts +32 -32
- package/plugins/ragents.browser/executor/playwright.ts +8 -8
- package/plugins/ragents.browser/provision.ts +7 -7
- package/plugins/ragents.browser/server/browser.ts +14 -14
- package/plugins/ragents.browser/server/contract.ts +1 -1
- package/plugins/ragents.browser/server/index.ts +1 -1
- package/plugins/ragents.browser/server/tools.ts +14 -14
- package/plugins/ragents.browser/skills/browser-testing/SKILL.md +30 -30
- package/plugins/ragents.documents/contract.ts +2 -2
- package/plugins/ragents.documents/prompt.hbs +1 -1
- package/plugins/ragents.documents/server/document-write-tool.ts +12 -12
- package/plugins/ragents.documents/server/files-route.ts +6 -6
- package/plugins/ragents.documents/server/show-document-tool.ts +26 -26
- package/plugins/ragents.documents/server/store.ts +1 -1
- package/plugins/ragents.documents/web/DocumentViewer.tsx +37 -37
- package/plugins/ragents.documents/web/index.tsx +11 -11
- package/plugins/ragents.lsp-fsharp/executor.ts +7 -7
- package/plugins/ragents.lsp-fsharp/provision.ts +7 -7
- package/plugins/ragents.lsp-roslyn/executor.ts +5 -5
- package/plugins/ragents.lsp-roslyn/provision.ts +4 -4
- package/plugins/ragents.lsp-roslyn/server/index.ts +5 -5
- package/plugins/ragents.lsp-roslyn/server/solution-on-start.ts +13 -13
- package/plugins/ragents.lsp-typescript/executor.ts +3 -3
- package/plugins/ragents.model-relay/server/config.ts +6 -2
- package/plugins/ragents.model-relay/server/index.ts +2 -2
- package/plugins/ragents.model-relay/server/relay.ts +23 -22
- package/plugins/ragents.orchestration/contract.ts +8 -8
- package/plugins/ragents.orchestration/server/index.ts +4 -4
- package/plugins/ragents.orchestration/server/run-stop-tool.ts +3 -3
- package/plugins/ragents.orchestration/server/surface-tool.ts +5 -5
- package/plugins/ragents.orchestration/tiled-layout.ts +11 -11
- package/plugins/ragents.orchestration/web/ActorChat.tsx +2 -2
- package/plugins/ragents.orchestration/web/ActorChatControls.tsx +4 -4
- package/plugins/ragents.orchestration/web/ActorChatPreview.tsx +1 -1
- package/plugins/ragents.orchestration/web/ActorPopout.tsx +1 -1
- package/plugins/ragents.orchestration/web/ActorShortcut.tsx +6 -6
- package/plugins/ragents.orchestration/web/ActorSurfaceControls.tsx +15 -15
- package/plugins/ragents.orchestration/web/ActorTile.tsx +1 -1
- package/plugins/ragents.orchestration/web/Center.tsx +5 -5
- package/plugins/ragents.orchestration/web/DocumentsSection.tsx +2 -2
- package/plugins/ragents.orchestration/web/ExecutionsPanel.tsx +15 -15
- package/plugins/ragents.orchestration/web/FlowInspector.tsx +103 -103
- package/plugins/ragents.orchestration/web/JournalStatus.tsx +11 -11
- package/plugins/ragents.orchestration/web/MaterialBody.tsx +2 -2
- package/plugins/ragents.orchestration/web/StopRunButton.tsx +6 -6
- package/plugins/ragents.orchestration/web/TiledSurface.tsx +9 -9
- package/plugins/ragents.orchestration/web/actor-header-settings.ts +5 -5
- package/plugins/ragents.orchestration/web/constants.ts +2 -2
- package/plugins/ragents.orchestration/web/executions.ts +6 -6
- package/plugins/ragents.orchestration/web/format.ts +1 -1
- package/plugins/ragents.orchestration/web/index.tsx +2 -2
- package/plugins/ragents.orchestration/web/run-panel/AddresseeControl.tsx +7 -7
- package/plugins/ragents.orchestration/web/run-panel/AddresseeTree.tsx +8 -8
- package/plugins/ragents.orchestration/web/run-panel/RunPanel.tsx +29 -28
- package/plugins/ragents.orchestration/web/run-panel/RunPanelSettings.tsx +7 -7
- package/plugins/ragents.orchestration/web/run-panel/addressee-tree.ts +13 -13
- package/plugins/ragents.orchestration/web/run-panel/run-panel-actors.ts +3 -3
- package/plugins/ragents.orchestration/web/run-panel/run-panel-settings.ts +2 -2
- package/plugins/ragents.orchestration/web/run-panel/run-panel-startup.ts +3 -3
- package/plugins/ragents.orchestration/web/run-panel/run-panel-state.ts +7 -7
- package/plugins/ragents.orchestration/web/run-panel/sheet-status.ts +10 -10
- package/plugins/ragents.orchestration/web/surface-startup.ts +8 -8
- package/plugins/ragents.orchestration/web/surface-view-settings.ts +1 -1
- package/plugins/ragents.orchestration/web/tiled-view-settings.ts +1 -1
- package/plugins/ragents.overseer/contract.ts +20 -20
- package/plugins/ragents.overseer/server/api.ts +8 -8
- package/plugins/ragents.overseer/server/coordinator-prompt.ts +10 -10
- package/plugins/ragents.overseer/server/coordinator.ts +4 -4
- package/plugins/ragents.overseer/server/index.ts +24 -24
- package/plugins/ragents.overseer/server/orientation.ts +8 -8
- package/plugins/ragents.overseer/server/quick-answer.ts +9 -9
- package/plugins/ragents.overseer/server/run-directory.ts +5 -5
- package/plugins/ragents.overseer/server/settings.ts +6 -6
- package/plugins/ragents.overseer/server/user-location.ts +16 -16
- package/plugins/ragents.overseer/web/ModelSettings.tsx +9 -9
- package/plugins/ragents.overseer/web/index.tsx +20 -20
- package/plugins/ragents.overseer/web/model-settings.ts +1 -1
- package/plugins/ragents.overseer/web/quick-answers.ts +2 -2
- package/plugins/ragents.processes/contract.ts +5 -5
- package/plugins/ragents.processes/server/methods.ts +4 -4
- package/plugins/ragents.processes/server/observer.ts +8 -8
- package/plugins/ragents.processes/server/run-processes.ts +2 -2
- package/plugins/ragents.processes/web/ProcessHeader.tsx +10 -10
- package/plugins/ragents.processes/web/processes.ts +10 -10
- package/plugins/ragents.product/server/config.ts +1 -1
- package/plugins/ragents.product/server/index.ts +4 -4
- package/plugins/ragents.product/server/runtime.ts +9 -10
- package/plugins/ragents.product/web/index.tsx +1 -1
- package/plugins/ragents.profile-distribution/contract.ts +10 -10
- package/plugins/ragents.profile-distribution/server/archive.ts +20 -20
- package/plugins/ragents.profile-distribution/server/config.ts +2 -2
- package/plugins/ragents.profile-distribution/server/index.ts +4 -4
- package/plugins/ragents.reference/examples.ts +27 -27
- package/plugins/ragents.reference/run-scripts/balcony-wizard/RUN.md +19 -19
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +2 -2
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +14 -14
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +2 -2
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +49 -49
- package/plugins/ragents.reference/run-scripts/balcony-wizard/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/balcony-wizard/src/server.ts +9 -9
- package/plugins/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +9 -9
- package/plugins/ragents.reference/run-scripts/conversation-circle/RUN.md +7 -7
- package/plugins/ragents.reference/run-scripts/conversation-circle/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/conversation-circle/src/server.ts +13 -13
- package/plugins/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +1 -1
- package/plugins/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +8 -8
- package/plugins/ragents.reference/run-scripts/learning-afternoon/RUN.md +16 -16
- package/plugins/ragents.reference/run-scripts/learning-afternoon/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +3 -3
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/server.ts +9 -9
- package/plugins/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +39 -39
- package/plugins/ragents.reference/run-scripts/moderated-round/RUN.md +7 -7
- package/plugins/ragents.reference/run-scripts/moderated-round/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/moderated-round/src/server.ts +9 -9
- package/plugins/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +1 -1
- package/plugins/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +6 -6
- package/plugins/ragents.reference/run-scripts/shared-actor-list/RUN.md +12 -12
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +2 -2
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +3 -3
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +4 -4
- package/plugins/ragents.reference/run-scripts/shared-actor-list/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/shared-actor-list/src/server.ts +11 -11
- package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +1 -1
- package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +13 -13
- package/plugins/ragents.reference/run-scripts/word-game/RUN.md +18 -18
- package/plugins/ragents.reference/run-scripts/word-game/package.json +2 -2
- package/plugins/ragents.reference/run-scripts/word-game/src/client.tsx +1 -1
- package/plugins/ragents.reference/run-scripts/word-game/src/contract.ts +2 -2
- package/plugins/ragents.reference/run-scripts/word-game/src/server.ts +16 -16
- package/plugins/ragents.reference/run-scripts/word-game/tests/program.test.ts +39 -39
- package/plugins/ragents.reference/skills/100-shared-actor-list/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/110-all-card-slots/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/150-editorial-workbench/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/160-learning-companion/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/170-photo-collection/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/180-decision-workbench/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/190-review-queue/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/20-circle-of-four/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/210-moderator-handover/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/220-actor-approval-list/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/230-shared-state-views/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/240-live-result-list/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/250-balcony-wizard/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/35-actor-input-fifo/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/40-subscription-matrix/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/50-subscription-removal/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/70-headless-counter/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/75-lsp-demo/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/80-actor-text-analysis/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/90-actor-notes/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/95-hello-world/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/decision-brief/SKILL.md +24 -24
- package/plugins/ragents.reference/skills/learning-sprint/SKILL.md +24 -24
- package/plugins/ragents.reference/walkthroughs.ts +128 -128
- package/plugins/ragents.reference/web/StartGuides.tsx +23 -23
- package/plugins/ragents.todo/server/todo-tool.ts +6 -6
- package/plugins/ragents.todo/web/TodoSection.tsx +1 -1
- package/plugins/ragents.transcript/server/transcript.ts +11 -11
- package/plugins/ragents.watch/server/condition.ts +4 -4
- package/plugins/ragents.watch/server/functions.ts +27 -27
- package/plugins/ragents.watch/server/observation.ts +2 -2
- package/plugins/ragents.watch/server/service.ts +14 -14
- package/plugins/ragents.workspace/client/transport.ts +1 -1
- package/plugins/ragents.workspace/client/workspace-client.ts +62 -49
- package/plugins/ragents.workspace/contract.ts +46 -46
- package/plugins/ragents.workspace/server/binding.ts +20 -20
- package/plugins/ragents.workspace/server/browse-route.ts +8 -8
- package/plugins/ragents.workspace/server/clients.ts +42 -42
- package/plugins/ragents.workspace/server/config.ts +8 -5
- package/plugins/ragents.workspace/server/index.ts +5 -4
- package/plugins/ragents.workspace/server/runtime.ts +26 -26
- package/plugins/ragents.workspace/server/shell-platform.ts +1 -1
- package/plugins/ragents.workspace/web/FileBrowser.tsx +10 -10
- package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +24 -24
- package/plugins/ragents.workspace/web/index.tsx +1 -1
- package/ragents.config.core.ts +1 -1
- package/ragents.config.developer.ts +3 -3
- package/ragents.config.showcase.ts +2 -2
- package/scripts/agent/agent-cli.ts +96 -96
- package/scripts/agent/journal.ts +5 -5
- package/scripts/agent/turn-control.ts +4 -4
- package/scripts/package/build-package.ts +29 -29
- package/scripts/package/host-links.mjs +3 -3
- package/scripts/package/publish-package.ts +29 -29
- package/scripts/package/ragents.mjs +19 -19
- package/scripts/plugin/build-builtin-plugins.ts +5 -5
- package/scripts/plugin/plugin-cli.ts +14 -14
- package/scripts/provision/run-provision.ts +14 -15
- package/scripts/remote/connect.ts +46 -46
- package/scripts/remote/start.ts +18 -18
- package/scripts/workspace-client/run-workspace-client.ts +23 -23
- 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/assets/runPanel-ZT6TPDLM.js +0 -21
- package/bundles/ragents.ask/server/chunks/chunk-PDJO75SQ.js.map +0 -7
- package/bundles/ragents.ask/web/chunks/chunk-4VXWWEG7.js +0 -2
- package/bundles/ragents.ask/web/chunks/chunk-4VXWWEG7.js.map +0 -7
- package/bundles/ragents.ask/web/chunks/chunk-VUBJDIKQ.js +0 -2
- package/bundles/ragents.ask/web/chunks/chunk-VUBJDIKQ.js.map +0 -7
- package/bundles/ragents.ask/web/chunks/chunk-WFN4374U.js.map +0 -7
- package/bundles/ragents.orchestration/web/chunks/chunk-OQYCNYXN.js +0 -2
- package/plugins/ragents.ask/web/QuestionSection.tsx +0 -48
- /package/bundles/ragents.orchestration/web/chunks/{chunk-OSKPH6SZ.js.map → chunk-CFMJD5ZI.js.map} +0 -0
- /package/bundles/ragents.orchestration/web/chunks/{chunk-ODMMQGX2.js.map → chunk-UCIMT2R4.js.map} +0 -0
|
@@ -2,7 +2,7 @@ import { createRequire as __ragentsCreateRequire } from "node:module";
|
|
|
2
2
|
const require = __ragentsCreateRequire(import.meta.url);
|
|
3
3
|
import {
|
|
4
4
|
browserRuntimeToken
|
|
5
|
-
} from "./chunks/chunk-
|
|
5
|
+
} from "./chunks/chunk-PYEISBNE.js";
|
|
6
6
|
|
|
7
7
|
// server/index.ts
|
|
8
8
|
import { sandboxServicesToken } from "@ragents/host/plugin-support/workspace-sandbox-host.js";
|
|
@@ -60,13 +60,13 @@ var RunBrowser = class {
|
|
|
60
60
|
await this.restore(runId);
|
|
61
61
|
options.signal?.throwIfAborted();
|
|
62
62
|
this.#assertRunning();
|
|
63
|
-
if (generation !== this.#generation(runId)) throw new Error("
|
|
63
|
+
if (generation !== this.#generation(runId)) throw new Error("The browser was closed.");
|
|
64
64
|
return this.#run(runId, BROWSER_OPERATIONS.open, { url, viewport: this.#viewports.get(runId) ?? DEFAULT_VIEWPORT }, options);
|
|
65
65
|
}
|
|
66
66
|
snapshot(runId, options = {}) {
|
|
67
67
|
return this.#run(runId, BROWSER_OPERATIONS.snapshot, null, options);
|
|
68
68
|
}
|
|
69
|
-
/**
|
|
69
|
+
/** The chosen viewport applies to the run, including a browser restarted later. */
|
|
70
70
|
async viewport(runId, viewport, options = {}) {
|
|
71
71
|
const snapshot = await this.#run(runId, BROWSER_OPERATIONS.viewport, viewport, options);
|
|
72
72
|
this.#viewports.set(runId, viewport);
|
|
@@ -84,7 +84,7 @@ var RunBrowser = class {
|
|
|
84
84
|
press(runId, target, key, options = {}) {
|
|
85
85
|
return this.#run(runId, BROWSER_OPERATIONS.press, { target, key }, options);
|
|
86
86
|
}
|
|
87
|
-
/**
|
|
87
|
+
/** The time of a passed check is the server's, so it compares with its other times. */
|
|
88
88
|
async check(runId, input, options = {}) {
|
|
89
89
|
const generation = this.#generation(runId);
|
|
90
90
|
const { result, page } = await this.#execute(runId, generation, BROWSER_OPERATIONS.check, input, options);
|
|
@@ -96,7 +96,7 @@ var RunBrowser = class {
|
|
|
96
96
|
await this.restore(runId);
|
|
97
97
|
const id = randomUUID();
|
|
98
98
|
const image = await this.#run(runId, BROWSER_OPERATIONS.screenshot, { id, fullPage: input.fullPage ?? false }, options);
|
|
99
|
-
const capture = { name: input.label?.trim() || "
|
|
99
|
+
const capture = { name: input.label?.trim() || "Browser screenshot", path: capturePath(id) };
|
|
100
100
|
await this.#store(runId, capture, Buffer.from(image, "base64"));
|
|
101
101
|
const url = this.#captureUrl(runId, capture.path);
|
|
102
102
|
return {
|
|
@@ -108,7 +108,7 @@ var RunBrowser = class {
|
|
|
108
108
|
}
|
|
109
109
|
async image(runId) {
|
|
110
110
|
const latest = this.#captures.get(runId)?.at(-1);
|
|
111
|
-
if (!latest) throw new Error("
|
|
111
|
+
if (!latest) throw new Error("There is no browser screenshot for this run yet. Call browser_screenshot first.");
|
|
112
112
|
return readFile(path.join(await this.#options.filesFor(runId), latest.path));
|
|
113
113
|
}
|
|
114
114
|
evidence(runId) {
|
|
@@ -126,7 +126,7 @@ var RunBrowser = class {
|
|
|
126
126
|
errors: [...page.errors]
|
|
127
127
|
};
|
|
128
128
|
}
|
|
129
|
-
/**
|
|
129
|
+
/** Closes the browser in the run's executor; a disconnected workspace holds nothing that could be closed now. */
|
|
130
130
|
async close(runId) {
|
|
131
131
|
this.#forget(runId);
|
|
132
132
|
await this.#options.sandbox.execute(runId, BROWSER_OPERATIONS.close, null, { whenReachable: true });
|
|
@@ -149,12 +149,12 @@ var RunBrowser = class {
|
|
|
149
149
|
if (failed) throw failed.reason;
|
|
150
150
|
}
|
|
151
151
|
#assertRunning() {
|
|
152
|
-
if (this.#shutdown) throw new Error("
|
|
152
|
+
if (this.#shutdown) throw new Error("The browser service has ended.");
|
|
153
153
|
}
|
|
154
154
|
#generation(runId) {
|
|
155
155
|
return this.#generations.get(runId) ?? 0;
|
|
156
156
|
}
|
|
157
|
-
/**
|
|
157
|
+
/** A closed browser has no page anymore; results that started before no longer count afterwards. */
|
|
158
158
|
#forget(runId) {
|
|
159
159
|
this.#generations.set(runId, this.#generation(runId) + 1);
|
|
160
160
|
this.#pages.delete(runId);
|
|
@@ -173,12 +173,12 @@ var RunBrowser = class {
|
|
|
173
173
|
throw error;
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
|
-
/**
|
|
176
|
+
/** After a failed call the server asks for the page state; whoever cannot report it has no page. */
|
|
177
177
|
async #resync(runId, generation) {
|
|
178
178
|
const page = await this.#options.sandbox.execute(runId, BROWSER_OPERATIONS.state, null, { whenReachable: true }).then((value) => value, () => null);
|
|
179
179
|
this.#observe(runId, generation, page);
|
|
180
180
|
}
|
|
181
|
-
/**
|
|
181
|
+
/** Only a passed check sets the time; every other state keeps it as long as the page stays checked. */
|
|
182
182
|
#observe(runId, generation, page, checkedAt) {
|
|
183
183
|
if (generation !== this.#generation(runId)) return;
|
|
184
184
|
if (!page) {
|
|
@@ -193,7 +193,7 @@ var RunBrowser = class {
|
|
|
193
193
|
...stamp ? { checkedAt: stamp } : {}
|
|
194
194
|
});
|
|
195
195
|
}
|
|
196
|
-
/**
|
|
196
|
+
/** Puts a screenshot into the run's file storage and writes the screenshot list atomically; a run's screenshots one after another. */
|
|
197
197
|
#store(runId, capture, image) {
|
|
198
198
|
const previous = this.#captureWrites.get(runId) ?? Promise.resolve();
|
|
199
199
|
const pending = previous.then(async () => {
|
|
@@ -226,7 +226,7 @@ var RunBrowser = class {
|
|
|
226
226
|
}
|
|
227
227
|
const captures = JSON.parse(content);
|
|
228
228
|
if (!Array.isArray(captures) || captures.some((entry) => !entry || typeof entry.name !== "string" || typeof entry.path !== "string" || !/^browser\/[a-f0-9-]{36}\.png$/.test(entry.path))) {
|
|
229
|
-
throw new Error("
|
|
229
|
+
throw new Error("The stored browser screenshot list of this run is corrupt.");
|
|
230
230
|
}
|
|
231
231
|
this.#captures.set(runId, captures);
|
|
232
232
|
}
|
|
@@ -260,7 +260,7 @@ var screenshotDescription = "Capture the real browser page into this run's docum
|
|
|
260
260
|
var createBrowserFunctions = (browser) => [
|
|
261
261
|
defineRunFunction({
|
|
262
262
|
name: "browser_open",
|
|
263
|
-
label: "
|
|
263
|
+
label: "Open browser",
|
|
264
264
|
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.",
|
|
265
265
|
schema: Type.Object({ url: Type.String({ minLength: 1 }) }, { additionalProperties: false }),
|
|
266
266
|
resultSchema: snapshotSchema,
|
|
@@ -271,7 +271,7 @@ var createBrowserFunctions = (browser) => [
|
|
|
271
271
|
}),
|
|
272
272
|
defineRunFunction({
|
|
273
273
|
name: "browser_snapshot",
|
|
274
|
-
label: "
|
|
274
|
+
label: "Read browser",
|
|
275
275
|
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.",
|
|
276
276
|
schema: emptySchema,
|
|
277
277
|
resultSchema: snapshotSchema,
|
|
@@ -282,7 +282,7 @@ var createBrowserFunctions = (browser) => [
|
|
|
282
282
|
}),
|
|
283
283
|
defineRunFunction({
|
|
284
284
|
name: "browser_click",
|
|
285
|
-
label: "
|
|
285
|
+
label: "Click in browser",
|
|
286
286
|
description: "Click a uniquely identified visible element with Playwright auto-waiting. Returns the actual resulting page. Ambiguous or absent targets are errors.",
|
|
287
287
|
schema: targetInputSchema,
|
|
288
288
|
resultSchema: snapshotSchema,
|
|
@@ -293,7 +293,7 @@ var createBrowserFunctions = (browser) => [
|
|
|
293
293
|
}),
|
|
294
294
|
defineRunFunction({
|
|
295
295
|
name: "browser_fill",
|
|
296
|
-
label: "
|
|
296
|
+
label: "Fill browser field",
|
|
297
297
|
description: "Fill an input or textarea by accessible label or another semantic target, firing the normal input events. Returns the resulting page.",
|
|
298
298
|
schema: Type.Object({ target: targetSchema, value: Type.String() }, { additionalProperties: false }),
|
|
299
299
|
resultSchema: snapshotSchema,
|
|
@@ -304,7 +304,7 @@ var createBrowserFunctions = (browser) => [
|
|
|
304
304
|
}),
|
|
305
305
|
defineRunFunction({
|
|
306
306
|
name: "browser_select",
|
|
307
|
-
label: "
|
|
307
|
+
label: "Select in browser",
|
|
308
308
|
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.",
|
|
309
309
|
schema: Type.Object({ target: targetSchema, label: Type.String({ minLength: 1 }) }, { additionalProperties: false }),
|
|
310
310
|
resultSchema: snapshotSchema,
|
|
@@ -315,7 +315,7 @@ var createBrowserFunctions = (browser) => [
|
|
|
315
315
|
}),
|
|
316
316
|
defineRunFunction({
|
|
317
317
|
name: "browser_press",
|
|
318
|
-
label: "
|
|
318
|
+
label: "Press browser key",
|
|
319
319
|
description: "Focus a target and press a Playwright key or chord such as Enter, Escape, Tab or ControlOrMeta+A. Returns the resulting page.",
|
|
320
320
|
schema: Type.Object({ target: targetSchema, key: Type.String({ minLength: 1 }) }, { additionalProperties: false }),
|
|
321
321
|
resultSchema: snapshotSchema,
|
|
@@ -326,7 +326,7 @@ var createBrowserFunctions = (browser) => [
|
|
|
326
326
|
}),
|
|
327
327
|
defineRunFunction({
|
|
328
328
|
name: "browser_check",
|
|
329
|
-
label: "
|
|
329
|
+
label: "Check browser result",
|
|
330
330
|
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.",
|
|
331
331
|
schema: Type.Object({
|
|
332
332
|
target: Type.Optional(targetSchema),
|
|
@@ -343,7 +343,7 @@ var createBrowserFunctions = (browser) => [
|
|
|
343
343
|
}),
|
|
344
344
|
defineRunFunction({
|
|
345
345
|
name: "browser_viewport",
|
|
346
|
-
label: "
|
|
346
|
+
label: "Set browser size",
|
|
347
347
|
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.",
|
|
348
348
|
schema: Type.Object({
|
|
349
349
|
width: Type.Integer({ minimum: 320, maximum: 3840 }),
|
|
@@ -356,7 +356,7 @@ var createBrowserFunctions = (browser) => [
|
|
|
356
356
|
}),
|
|
357
357
|
defineRunFunction({
|
|
358
358
|
name: "browser_screenshot",
|
|
359
|
-
label: "
|
|
359
|
+
label: "Capture browser",
|
|
360
360
|
description: screenshotDescription,
|
|
361
361
|
schema: Type.Object({ label: Type.Optional(Type.String({ maxLength: 200 })), fullPage: Type.Optional(Type.Boolean()) }, { additionalProperties: false }),
|
|
362
362
|
resultSchema: Type.Object({
|
|
@@ -373,7 +373,7 @@ var createBrowserFunctions = (browser) => [
|
|
|
373
373
|
}),
|
|
374
374
|
defineRunFunction({
|
|
375
375
|
name: "browser_view_screenshot",
|
|
376
|
-
label: "
|
|
376
|
+
label: "View browser screenshot",
|
|
377
377
|
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.",
|
|
378
378
|
nativeTool: true,
|
|
379
379
|
schema: emptySchema,
|
|
@@ -383,12 +383,12 @@ var createBrowserFunctions = (browser) => [
|
|
|
383
383
|
run: async ({ caller, signal }) => {
|
|
384
384
|
signal?.throwIfAborted();
|
|
385
385
|
await browser.image(caller.runId);
|
|
386
|
-
return "
|
|
386
|
+
return "The latest browser screenshot of this run is available.";
|
|
387
387
|
}
|
|
388
388
|
}),
|
|
389
389
|
defineRunFunction({
|
|
390
390
|
name: "browser_close",
|
|
391
|
-
label: "
|
|
391
|
+
label: "Close browser",
|
|
392
392
|
description: "Close this run's browser and discard its cookies. Saved screenshots remain in the document library.",
|
|
393
393
|
schema: emptySchema,
|
|
394
394
|
resultSchema: Type.Object({ closed: Type.Boolean() }, { additionalProperties: false }),
|
|
@@ -407,11 +407,11 @@ var createBrowserImageContribution = (browser) => ({
|
|
|
407
407
|
if (outcome.toolName !== "browser_view_screenshot" || outcome.isError) return void 0;
|
|
408
408
|
try {
|
|
409
409
|
call.signal?.throwIfAborted();
|
|
410
|
-
if (!call.modelReadsImages) throw new Error("
|
|
410
|
+
if (!call.modelReadsImages) throw new Error("The selected model does not support images. View the screenshot in the documents or choose an image-capable model.");
|
|
411
411
|
const data = (await browser.image(runId)).toString("base64");
|
|
412
412
|
call.signal?.throwIfAborted();
|
|
413
413
|
return { content: [
|
|
414
|
-
{ type: "text", text: "
|
|
414
|
+
{ type: "text", text: "Latest browser screenshot of this run." },
|
|
415
415
|
{ type: "image", data, mimeType: "image/png" }
|
|
416
416
|
] };
|
|
417
417
|
} catch (error) {
|
|
@@ -462,22 +462,22 @@ var install = (log) => new Promise((resolve, reject) => {
|
|
|
462
462
|
const child = spawn(process.execPath, [playwrightCli(), "install", ...process.platform === "linux" ? ["--with-deps"] : [], "chromium"], { stdio: ["ignore", "pipe", "pipe"] });
|
|
463
463
|
for (const stream of [child.stdout, child.stderr]) stream.on("data", (chunk) => log(chunk.toString().trimEnd()));
|
|
464
464
|
child.once("error", reject);
|
|
465
|
-
child.once("exit", (code) => code === 0 ? resolve() : reject(new Error(`playwright-core install chromium
|
|
465
|
+
child.once("exit", (code) => code === 0 ? resolve() : reject(new Error(`playwright-core install chromium exited with code ${code}`)));
|
|
466
466
|
});
|
|
467
467
|
var createBrowserProvision = () => ({
|
|
468
468
|
check: async () => {
|
|
469
469
|
const configured = process.env[BROWSER_EXECUTABLE_VARIABLE];
|
|
470
470
|
if (configured) {
|
|
471
|
-
return await executable(configured) ? provisionReady : provisionGap("browser", `${BROWSER_EXECUTABLE_VARIABLE}
|
|
471
|
+
return await executable(configured) ? provisionReady : provisionGap("browser", `${BROWSER_EXECUTABLE_VARIABLE} names ${configured}; there is no executable browser there`, false);
|
|
472
472
|
}
|
|
473
473
|
const bundled = chromium.executablePath();
|
|
474
|
-
return await executable(bundled) ? provisionReady : provisionGap("chromium", `Chromium
|
|
474
|
+
return await executable(bundled) ? provisionReady : provisionGap("chromium", `Chromium is missing at ${bundled}; either set ${BROWSER_EXECUTABLE_VARIABLE} to an existing Chrome (on a server in the profile section ragents.browser, on a workspace in its environment) or let provisioning download the browser`, true);
|
|
475
475
|
},
|
|
476
476
|
apply: async (_target, log) => {
|
|
477
477
|
const state = await createBrowserProvision().check("");
|
|
478
478
|
if (state.kind === "ready") return;
|
|
479
479
|
if (!state.installable) throw new Error(state.instruction);
|
|
480
|
-
log("Chromium
|
|
480
|
+
log("Downloading Chromium for playwright-core");
|
|
481
481
|
await install(log);
|
|
482
482
|
}
|
|
483
483
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
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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",
|
|
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/** The server's executor reads the value from its environment; a workspace from its own, never from the profile. */\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/** Names a custom Chrome; on a server the profile section `ragents.browser` sets it, on a workspace its environment. */\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/** What a passed check proves; the time is set by whoever holds the run's evidence. */\nexport interface BrowserCheckResult {\n url: string;\n assertions: string[];\n}\n\n/** The page state after an operation; the caller derives the run's evidence from it. */\nexport interface BrowserPageState {\n url: string;\n /** A check has passed since the last action or navigation. */\n checked: boolean;\n errors: string[];\n /** The ids of the screenshots since the last action or navigation, as the caller assigned them. */\n screenshots: string[];\n}\n\n/** The result of an operation on the page and the state it leaves the page in. */\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/** What the server knows about a run's page: the last reported state and the time of the last passed check. */\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/** A run's browser testing: the page lives in the run's executor, the server holds evidence, screenshots and viewport. */\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(\"The browser was closed.\");\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 /** The chosen viewport applies to the run, including a browser restarted later. */\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 /** The time of a passed check is the server's, so it compares with its other times. */\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() || \"Browser screenshot\", 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(\"There is no browser screenshot for this run yet. Call browser_screenshot first.\");\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 /** Closes the browser in the run's executor; a disconnected workspace holds nothing that could be closed now. */\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(\"The browser service has ended.\");\n }\n\n #generation(runId: string): number {\n return this.#generations.get(runId) ?? 0;\n }\n\n /** A closed browser has no page anymore; results that started before no longer count afterwards. */\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 /** After a failed call the server asks for the page state; whoever cannot report it has no page. */\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 /** Only a passed check sets the time; every other state keeps it as long as the page stays checked. */\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 /** Puts a screenshot into the run's file storage and writes the screenshot list atomically; a run's screenshots one after another. */\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(\"The stored browser screenshot list of this run is corrupt.\");\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: \"Open browser\",\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: \"Read browser\",\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: \"Click in browser\",\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: \"Fill browser field\",\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: \"Select in browser\",\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: \"Press browser key\",\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: \"Check browser result\",\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: \"Set browser size\",\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: \"Capture browser\",\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: \"View browser screenshot\",\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 \"The latest browser screenshot of this run is available.\";\n },\n }),\n defineRunFunction({\n name: \"browser_close\",\n label: \"Close browser\",\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(\"The selected model does not support images. View the screenshot in the documents or choose an image-capable model.\");\n const data = (await browser.image(runId)).toString(\"base64\");\n call.signal?.throwIfAborted();\n return { content: [\n { type: \"text\", text: \"Latest browser screenshot of this run.\" },\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 exited with code ${code}`)));\n});\n\n// Playwright manages its browser cache itself; the plugin's tool folder stays empty.\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} names ${configured}; there is no executable browser there`, false);\n }\n const bundled = chromium.executablePath();\n return await executable(bundled)\n ? provisionReady\n : provisionGap(\"chromium\", `Chromium is missing at ${bundled}; either set ${BROWSER_EXECUTABLE_VARIABLE} to an existing Chrome `\n + \"(on a server in the profile section ragents.browser, on a workspace in its environment) or let \"\n + \"provisioning download the browser\", 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(\"Downloading Chromium for playwright-core\");\n await install(log);\n },\n});\n\nexport const provision = createBrowserProvision();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["path", "path"]
|
|
7
7
|
}
|
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: browser-testing
|
|
3
|
-
description:
|
|
3
|
+
description: Test a running web application with real browser actions, visible results, and screenshots.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Testing a web application
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Use the TypeScript functions `browser_open`, `browser_snapshot`, `browser_click`,
|
|
9
9
|
`browser_fill`, `browser_select`, `browser_press`, `browser_check`, `browser_viewport`,
|
|
10
|
-
`browser_screenshot`
|
|
10
|
+
`browser_screenshot` and `browser_close`. Load their exact contracts with `typescript_api`.
|
|
11
11
|
|
|
12
|
-
1.
|
|
13
|
-
2.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
3.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
4.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
5.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
1920 x 1080 (16:9);
|
|
28
|
-
`browser_viewport`
|
|
29
|
-
6.
|
|
30
|
-
|
|
12
|
+
1. Start the application with its actual services and wait until they are ready.
|
|
13
|
+
2. Open its HTTP address with `browser_open`. Every run has its own browser without an
|
|
14
|
+
inherited sign-in. It runs on the machine of your workspace; you reach an application
|
|
15
|
+
started there via `localhost`. Report missing services and browser prerequisites
|
|
16
|
+
explicitly.
|
|
17
|
+
3. Read the snapshot and follow the actual user path. Choose targets by visible
|
|
18
|
+
roles/names or field labels, for example `{ role: "button", name: "Save" }`.
|
|
19
|
+
Resolution happens in the browser. Snapshot IDs are not copied.
|
|
20
|
+
4. Check success and relevant error cases with `browser_check`: visible result, target address
|
|
21
|
+
and browser errors. A typecheck or screenshot alone does not prove a successful user path.
|
|
22
|
+
Every action needs a new check. Do not invent results when the network is missing.
|
|
23
|
+
5. Create real screenshots with `browser_screenshot`. Put `url` or `markdown`
|
|
24
|
+
programmatically into the result report or the mini-app. The image lives in the file storage
|
|
25
|
+
of this run. The native tool `browser_view_screenshot` shows you the latest screenshot
|
|
26
|
+
without a path; for that your model needs image support. The viewport defaults to
|
|
27
|
+
1920 x 1080 (16:9); for narrow layouts or small screens you change it with
|
|
28
|
+
`browser_viewport` and check again afterwards.
|
|
29
|
+
6. Name the checked steps and remaining limits. Close the browser when you are done;
|
|
30
|
+
screenshots are kept. Stopping the run and shutting down the server close it as well.
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
The browser actions use Playwright locators with automatic waiting. Ambiguous targets
|
|
33
|
+
are errors that name the candidates; then pick one match with `nth` (0-based) or `first: true` in
|
|
34
|
+
the target, or check the number of visible matches with `count` in `browser_check`.
|
|
35
|
+
Visibility checks wait at most 5 seconds, actions longer; a missing element
|
|
36
|
+
therefore costs no long wait. Native selects use `browser_select`; custom dropdown menus are clicked.
|
|
37
|
+
With `target.frame` you choose an iframe by CSS. New windows are reported explicitly;
|
|
38
|
+
this flow operates one page. Hidden elements are not clicked via JavaScript.
|
|
@@ -8,7 +8,7 @@ to put something there is the tool `document_write`.
|
|
|
8
8
|
they are part of the actual assignment.
|
|
9
9
|
- `document_write` takes the full `content` of the file. For a file of the working directory,
|
|
10
10
|
`read` it first and pass the content here.
|
|
11
|
-
- The user sees these files in the "
|
|
11
|
+
- The user sees these files in the "Documents" area of the interface, grouped by subdirectory.
|
|
12
12
|
- When you spawn agents, name in their assignment the store path they are supposed to write to.
|
|
13
13
|
|
|
14
14
|
If the user wants to see the content of a file or a document, show it COMPLETELY via
|
|
@@ -100,8 +100,8 @@
|
|
|
100
100
|
]
|
|
101
101
|
}
|
|
102
102
|
},
|
|
103
|
-
"stand": "
|
|
104
|
-
"sourceStand": "
|
|
103
|
+
"stand": "05ca6d8d04b7d78376a9726d2472099d2150a1a9e62f5999dacf88aa62a336b0",
|
|
104
|
+
"sourceStand": "1155d601a90f992be381a6592a07ca3fc76ae236e49002f91915888700e55628",
|
|
105
105
|
"server": "server/index.js",
|
|
106
106
|
"web": {
|
|
107
107
|
"entry": "web/index.js",
|
|
@@ -21,10 +21,10 @@ var filesListing = Type.Object({
|
|
|
21
21
|
var documentsContracts = {
|
|
22
22
|
files: defineOperation({
|
|
23
23
|
id: "ragents.documents.files",
|
|
24
|
-
description: "
|
|
24
|
+
description: "A run's file store as groups and loose files. Right: runs.read.",
|
|
25
25
|
rights: ["runs.read"],
|
|
26
26
|
input: Type.Object({
|
|
27
|
-
runId: Type.String({ minLength: 1, maxLength: 64, description: "
|
|
27
|
+
runId: Type.String({ minLength: 1, maxLength: 64, description: "Run id" })
|
|
28
28
|
}, { additionalProperties: false }),
|
|
29
29
|
result: filesListing
|
|
30
30
|
})
|
|
@@ -34,4 +34,4 @@ export {
|
|
|
34
34
|
documentsApiPrefix,
|
|
35
35
|
documentsContracts
|
|
36
36
|
};
|
|
37
|
-
//# sourceMappingURL=chunk-
|
|
37
|
+
//# sourceMappingURL=chunk-KMZWOVTI.js.map
|