@schlenkr/ragents 0.1.10 → 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 +4 -4
- 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 +29 -29
- package/apps/server/src/api/core-methods.ts +17 -17
- 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 +6 -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 +39 -39
- 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 +61 -56
- 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 +23 -23
- package/apps/server/src/ragents/global-chat.ts +8 -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 +48 -48
- 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-BO4wLQtE.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 +53 -54
- package/apps/web/dist/help/guide-clients.md +50 -51
- 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 +196 -144
- package/apps/web/dist/help/mini-app.css +6 -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 +23 -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 +26 -26
- package/apps/web/src/panel/connection-state.ts +9 -9
- package/apps/web/src/panel/contract.ts +28 -28
- 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 +225 -225
- package/bundles/ragents.actor-programs/server/index.js.map +2 -2
- 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 -2
- 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-MBRPS477.js → chunk-IQBHK7MV.js} +2 -2
- package/bundles/ragents.ask/web/chunks/{chunk-MBRPS477.js.map → chunk-IQBHK7MV.js.map} +3 -3
- 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 +2 -2
- 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 +2 -2
- package/bundles/ragents.overseer/ragents-bundle.json +2 -2
- package/bundles/ragents.overseer/server/index.js +98 -98
- 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 +81 -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/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/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/plugin-host.ts +119 -119
- package/packages/ragents/src/plugin-types.ts +16 -16
- 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 +12 -12
- 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 +28 -28
- 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 +1 -1
- 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/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 -2
- 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/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 +22 -22
- 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 +9 -9
- 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 +6 -6
- 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 +54 -54
- 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 +7 -7
- package/plugins/ragents.workspace/server/index.ts +3 -3
- 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-DnnqWHkH.js +0 -11
- package/apps/web/dist/assets/mermaid-HWGCJPDP-BLLeth5_.js +0 -568
- package/apps/web/dist/assets/runPanel-DPm7s3KM.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/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
|
@@ -1 +1 @@
|
|
|
1
|
-
["a","access","actionId","actionViews","activate","active","additionalProperties","alert","answer","answerQuestion","answerTextOf","answered","
|
|
1
|
+
["a","access","actionId","actionViews","activate","active","actor","additionalProperties","alert","always","an","and","answer","answerQuestion","answerTextOf","answered","approved","aria-pressed","aria-pressed:bg-accent","aria-pressed:border-primary","as","ask","askContracts","askPayloadOf","askedBy","asker","askerHandle","asking","asks","assess","async","attention","attentionFor","await","bg-background","border","border-border","call","candidate","card","cardClasses","caught","choice","className","closes","configuredPlugin","const","data-question","defineOperation","description","descriptor","disabled","dismiss","dismissed","dismisses","either","entry","export","false","flex","flex-1","flex-col","flex-none","font-normal","for","free","freely","from","function","gap-1.5","gap-2","gap-2.5","gets","group-aria-pressed/button:border-primary","h-auto","handle","id","if","import","inline-flex","input","instanceof","interface","it","items-center","items-stretch","its","justify-center","justify-start","key","label","leading-normal","length","list-disc","lucide-react","maxLength","message","minLength","multi","multiple","needsRunView","new","null","o","object","of","onAnswer","onChange","onClick","onKeyDown","only","open","option","optionClasses","options","or","outline","outside","owner","payload","pending","pending-questions","pendingQuestions","person","pl-6","placeholder","plus","px-3","px-3.5","py-1.5","question","questions","react","read","recipient","record","rest","result","return","rights","role","rounded-sm","rpc","run","runId","s","selection","self-start","sendFreeText","sent","session","setError","setFreeText","setSelected","single","size","size-3.5","sm","stands","status","string","stringArrayOf","supersededBy","supersedingInputOf","text","text-[0.7rem]","text-destructive","text-left","text-muted-foreground","text-primary","text-sm","text-success","the","to","toggle","tool","true","type","typebox","typeof","undefined","unknown","useAccess","useState","user","value","variant","view","w-full","webPlugin","when","whitespace-normal","without","write"]
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a,b,c,d}from"/plugins/ragents.ask/web/chunks/chunk-
|
|
1
|
+
import{a,b,c,d}from"/plugins/ragents.ask/web/chunks/chunk-D6NNB5DS.js";export{a as ASK_PLUGIN_ID,b as SUPERSEDED_ANSWER,c as askPayloadOf,d as supersedingInputOf};
|
|
2
2
|
//# sourceMappingURL=/plugins/ragents.ask/web/exports/ask-payload.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{e as a}from"/plugins/ragents.ask/web/chunks/chunk-
|
|
1
|
+
import{e as a}from"/plugins/ragents.ask/web/chunks/chunk-IQBHK7MV.js";import"/plugins/ragents.ask/web/chunks/chunk-PWFIAMX4.js";export{a as QuestionCard};
|
|
2
2
|
//# sourceMappingURL=/plugins/ragents.ask/web/exports/web/QuestionCard.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a}from"/plugins/ragents.ask/web/chunks/chunk-
|
|
1
|
+
import{a}from"/plugins/ragents.ask/web/chunks/chunk-QHGKEESD.js";import"/plugins/ragents.ask/web/chunks/chunk-PWFIAMX4.js";export{a as answerQuestion};
|
|
2
2
|
//# sourceMappingURL=/plugins/ragents.ask/web/exports/web/api.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as s,b as l,c as i,d as g}from"/plugins/ragents.ask/web/chunks/chunk-
|
|
1
|
+
import{a as s,b as l,c as i,d as g}from"/plugins/ragents.ask/web/chunks/chunk-D6NNB5DS.js";import{a as w,b as A,c as a,d as P,e as V}from"/plugins/ragents.ask/web/chunks/chunk-IQBHK7MV.js";import{a as x}from"/plugins/ragents.ask/web/chunks/chunk-QHGKEESD.js";import{a as o}from"/plugins/ragents.ask/web/chunks/chunk-PWFIAMX4.js";var d=o("@ragents/web/run-view","runViewFrom");var f=o("@ragents/web/AccessContext","useAccess");var R=e=>typeof e=="string"?e:e==null?"":JSON.stringify(e);function y({action:e,session:t,text:n}){let r=f(),[p,c]=w(),m=i(e.payload);if(!m)return null;let S=k=>{c(void 0),x(t.session.id,e.actionId,k).catch(u=>c(u instanceof Error?u.message:String(u)))};return P(A,{children:[a(V,{answer:e.status===void 0?void 0:e.status==="approved"?R(e.result):g(e.result)!==void 0?l:"The user dismissed the question.",onAnswer:r.can("runs.write")?S:void 0,question:m,text:n}),p&&a("p",{className:"text-[0.7rem] text-destructive",role:"alert",children:p})]})}var C=e=>e.actions.filter(t=>t.owner===s&&t.status==="pending"),W=(e,t)=>e.actors.find(n=>n.id===t)?.handle??t,v=e=>{let t=d(e.runView);if(!t)return;let[n,...r]=C(t);if(n)return{active:!0,label:r.length===0?`@${W(t,i(n.payload)?.recipient??n.askedBy)} asks`:`${r.length+1} open questions`}},D=e=>({...e,needsRunView:!0,actionViews:[{owner:s,View:y}],attention:[{id:"ragents.ask.pending-questions",assess:v}]}),b={id:s},B={...b,activate:()=>D(b)};export{B as webPlugin};
|
|
2
2
|
//# sourceMappingURL=/plugins/ragents.ask/web/index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["ragents-host-value:@ragents/web/run-view#runViewFrom", "ragents-host-value:@ragents/web/AccessContext#useAccess", "../../../plugins/ragents.ask/web/AskActionView.tsx", "../../../plugins/ragents.ask/web/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { read } from \"ragents-host-read:read\";\nexport default read(\"@ragents/web/run-view\", \"runViewFrom\");\n", "import { read } from \"ragents-host-read:read\";\nexport default read(\"@ragents/web/AccessContext\", \"useAccess\");\n", "import { useAccess } from \"@ragents/web/AccessContext\";\nimport { useState } from \"react\";\nimport type { ActionViewContext } from \"@ragents/web/PluginRegistry\";\nimport { askPayloadOf, SUPERSEDED_ANSWER, supersedingInputOf } from \"../ask-payload\";\nimport { answerQuestion } from \"./api\";\nimport { QuestionCard } from \"./QuestionCard\";\n\nconst answerTextOf = (result: unknown): string =>\n typeof result === \"string\" ? result : result === null || result === undefined ? \"\" : JSON.stringify(result);\n\nexport function AskActionView({ action, session, text }: ActionViewContext) {\n const access = useAccess();\n const [error, setError] = useState<string>();\n const question = askPayloadOf(action.payload);\n if (!question) return null;\n\n const answer = (value: string) => {\n setError(undefined);\n answerQuestion(session.session.id, action.actionId, value)\n .catch((caught: unknown) => setError(caught instanceof Error ? caught.message : String(caught)));\n };\n\n return (\n <>\n <QuestionCard\n answer={action.status === undefined\n ? undefined\n : action.status === \"approved\" ? answerTextOf(action.result)\n : supersedingInputOf(action.result) !== undefined ? SUPERSEDED_ANSWER : \"
|
|
5
|
-
"mappings": "yUACA,IAAOA,EAAQC,EAAK,wBAAyB,aAAa,ECA1D,IAAOC,EAAQC,EAAK,6BAA8B,WAAW,ECM7D,IAAMC,EAAgBC,GACpB,OAAOA,GAAW,SAAWA,EAASA,GAAW,KAA+B,GAAK,KAAK,UAAUA,CAAM,EAErG,SAASC,EAAc,CAAE,OAAAC,EAAQ,QAAAC,EAAS,KAAAC,CAAK,EAAsB,CAC1E,IAAMC,EAASC,EAAU,EACnB,CAACC,EAAOC,CAAQ,EAAIC,EAAiB,EACrCC,EAAWC,EAAaT,EAAO,OAAO,EAC5C,GAAI,CAACQ,EAAU,OAAO,KAEtB,IAAME,EAAUC,GAAkB,CAChCL,EAAS,MAAS,EAClBM,EAAeX,EAAQ,QAAQ,GAAID,EAAO,SAAUW,CAAK,EACtD,MAAOE,GAAoBP,EAASO,aAAkB,MAAQA,EAAO,QAAU,OAAOA,CAAM,CAAC,CAAC,CACnG,EAEA,OACEC,EAAAC,EAAA,CACE,UAAAC,EAACC,EAAA,CACC,OAAQjB,EAAO,SAAW,OACtB,OACAA,EAAO,SAAW,WAAaH,EAAaG,EAAO,MAAM,EACzDkB,EAAmBlB,EAAO,MAAM,IAAM,OAAYmB,EAAoB,
|
|
4
|
+
"sourcesContent": ["import { read } from \"ragents-host-read:read\";\nexport default read(\"@ragents/web/run-view\", \"runViewFrom\");\n", "import { read } from \"ragents-host-read:read\";\nexport default read(\"@ragents/web/AccessContext\", \"useAccess\");\n", "import { useAccess } from \"@ragents/web/AccessContext\";\nimport { useState } from \"react\";\nimport type { ActionViewContext } from \"@ragents/web/PluginRegistry\";\nimport { askPayloadOf, SUPERSEDED_ANSWER, supersedingInputOf } from \"../ask-payload\";\nimport { answerQuestion } from \"./api\";\nimport { QuestionCard } from \"./QuestionCard\";\n\nconst answerTextOf = (result: unknown): string =>\n typeof result === \"string\" ? result : result === null || result === undefined ? \"\" : JSON.stringify(result);\n\nexport function AskActionView({ action, session, text }: ActionViewContext) {\n const access = useAccess();\n const [error, setError] = useState<string>();\n const question = askPayloadOf(action.payload);\n if (!question) return null;\n\n const answer = (value: string) => {\n setError(undefined);\n answerQuestion(session.session.id, action.actionId, value)\n .catch((caught: unknown) => setError(caught instanceof Error ? caught.message : String(caught)));\n };\n\n return (\n <>\n <QuestionCard\n answer={action.status === undefined\n ? undefined\n : action.status === \"approved\" ? answerTextOf(action.result)\n : supersedingInputOf(action.result) !== undefined ? SUPERSEDED_ANSWER : \"The user dismissed the question.\"}\n onAnswer={access.can(\"runs.write\") ? answer : undefined}\n question={question}\n text={text}\n />\n {error && <p className=\"text-[0.7rem] text-destructive\" role=\"alert\">{error}</p>}\n </>\n );\n}\n", "import {\n type SessionContext,\n type WebPlugin,\n type WebPluginDescriptor,\n} from \"@ragents/web/PluginRegistry\";\nimport { runViewFrom, type RunView } from \"@ragents/web/run-view\";\nimport { askPayloadOf, ASK_PLUGIN_ID } from \"../ask-payload\";\nimport { AskActionView } from \"./AskActionView\";\n\nconst pendingQuestions = (view: RunView) =>\n view.actions.filter((action) => action.owner === ASK_PLUGIN_ID && action.status === \"pending\");\n\nconst askerHandle = (view: RunView, askedBy: string): string =>\n view.actors.find((actor) => actor.id === askedBy)?.handle ?? askedBy;\n\nconst attentionFor = (session: SessionContext) => {\n const view = runViewFrom(session.runView);\n if (!view) return undefined;\n const [first, ...rest] = pendingQuestions(view);\n if (!first) return undefined;\n return {\n active: true as const,\n label: rest.length === 0\n ? `@${askerHandle(view, askPayloadOf(first.payload)?.recipient ?? first.askedBy)} asks`\n : `${rest.length + 1} open questions`,\n };\n};\n\nconst configuredPlugin = (descriptor: WebPluginDescriptor): WebPlugin => ({\n ...descriptor,\n needsRunView: true,\n actionViews: [{\n owner: ASK_PLUGIN_ID,\n View: AskActionView,\n }],\n attention: [{\n id: \"ragents.ask.pending-questions\",\n assess: attentionFor,\n }],\n});\n\nconst descriptor: WebPluginDescriptor = { id: ASK_PLUGIN_ID };\n\nexport const webPlugin: WebPlugin = {\n ...descriptor,\n activate: () => configuredPlugin(descriptor),\n};\n"],
|
|
5
|
+
"mappings": "yUACA,IAAOA,EAAQC,EAAK,wBAAyB,aAAa,ECA1D,IAAOC,EAAQC,EAAK,6BAA8B,WAAW,ECM7D,IAAMC,EAAgBC,GACpB,OAAOA,GAAW,SAAWA,EAASA,GAAW,KAA+B,GAAK,KAAK,UAAUA,CAAM,EAErG,SAASC,EAAc,CAAE,OAAAC,EAAQ,QAAAC,EAAS,KAAAC,CAAK,EAAsB,CAC1E,IAAMC,EAASC,EAAU,EACnB,CAACC,EAAOC,CAAQ,EAAIC,EAAiB,EACrCC,EAAWC,EAAaT,EAAO,OAAO,EAC5C,GAAI,CAACQ,EAAU,OAAO,KAEtB,IAAME,EAAUC,GAAkB,CAChCL,EAAS,MAAS,EAClBM,EAAeX,EAAQ,QAAQ,GAAID,EAAO,SAAUW,CAAK,EACtD,MAAOE,GAAoBP,EAASO,aAAkB,MAAQA,EAAO,QAAU,OAAOA,CAAM,CAAC,CAAC,CACnG,EAEA,OACEC,EAAAC,EAAA,CACE,UAAAC,EAACC,EAAA,CACC,OAAQjB,EAAO,SAAW,OACtB,OACAA,EAAO,SAAW,WAAaH,EAAaG,EAAO,MAAM,EACzDkB,EAAmBlB,EAAO,MAAM,IAAM,OAAYmB,EAAoB,mCAC1E,SAAUhB,EAAO,IAAI,YAAY,EAAIO,EAAS,OAC9C,SAAUF,EACV,KAAMN,EACR,EACCG,GAASW,EAAC,KAAE,UAAU,iCAAiC,KAAK,QAAS,SAAAX,EAAM,GAC9E,CAEJ,CC3BA,IAAMe,EAAoBC,GACxBA,EAAK,QAAQ,OAAQC,GAAWA,EAAO,QAAUC,GAAiBD,EAAO,SAAW,SAAS,EAEzFE,EAAc,CAACH,EAAeI,IAClCJ,EAAK,OAAO,KAAMK,GAAUA,EAAM,KAAOD,CAAO,GAAG,QAAUA,EAEzDE,EAAgBC,GAA4B,CAChD,IAAMP,EAAOQ,EAAYD,EAAQ,OAAO,EACxC,GAAI,CAACP,EAAM,OACX,GAAM,CAACS,EAAO,GAAGC,CAAI,EAAIX,EAAiBC,CAAI,EAC9C,GAAKS,EACL,MAAO,CACL,OAAQ,GACR,MAAOC,EAAK,SAAW,EACnB,IAAIP,EAAYH,EAAMW,EAAaF,EAAM,OAAO,GAAG,WAAaA,EAAM,OAAO,CAAC,QAC9E,GAAGC,EAAK,OAAS,CAAC,iBACxB,CACF,EAEME,EAAoBC,IAAgD,CACxE,GAAGA,EACH,aAAc,GACd,YAAa,CAAC,CACZ,MAAOX,EACP,KAAMY,CACR,CAAC,EACD,UAAW,CAAC,CACV,GAAI,gCACJ,OAAQR,CACV,CAAC,CACH,GAEMO,EAAkC,CAAE,GAAIX,CAAc,EAE/Ca,EAAuB,CAClC,GAAGF,EACH,SAAU,IAAMD,EAAiBC,CAAU,CAC7C",
|
|
6
6
|
"names": ["run_view_runViewFrom_default", "read", "AccessContext_useAccess_default", "read", "answerTextOf", "result", "AskActionView", "action", "session", "text", "access", "AccessContext_useAccess_default", "error", "setError", "react_useState_default", "question", "askPayloadOf", "answer", "value", "answerQuestion", "caught", "jsx_runtime_jsxs_default", "jsx_runtime_Fragment_default", "jsx_runtime_jsx_default", "QuestionCard", "supersedingInputOf", "SUPERSEDED_ANSWER", "pendingQuestions", "view", "action", "ASK_PLUGIN_ID", "askerHandle", "askedBy", "actor", "attentionFor", "session", "run_view_runViewFrom_default", "first", "rest", "askPayloadOf", "configuredPlugin", "descriptor", "AskActionView", "webPlugin"]
|
|
7
7
|
}
|
|
@@ -19,9 +19,9 @@ var BROWSER_EXECUTABLE_VARIABLE = "BROWSER_EXECUTABLE_PATH";
|
|
|
19
19
|
|
|
20
20
|
// executor/pages.ts
|
|
21
21
|
var errorText = (error) => error instanceof Error ? error.message : String(error);
|
|
22
|
-
var endedError = () => new Error("
|
|
22
|
+
var endedError = () => new Error("The browser service of this executor has ended.");
|
|
23
23
|
var maxSnapshotLength = 4e4;
|
|
24
|
-
var ambiguityHint = "
|
|
24
|
+
var ambiguityHint = "Pick one match with nth (0-based) or first: true in the target, or check the number with count in browser_check.";
|
|
25
25
|
var withAmbiguityHint = (error) => {
|
|
26
26
|
if (error instanceof Error && error.message.includes("strict mode violation")) throw new Error(`${error.message}
|
|
27
27
|
${ambiguityHint}`, { cause: error });
|
|
@@ -30,9 +30,9 @@ ${ambiguityHint}`, { cause: error });
|
|
|
30
30
|
var browserLocator = (page, target) => {
|
|
31
31
|
const selectors = [target.role, target.label, target.text, target.testId, target.css].filter((value) => value !== void 0);
|
|
32
32
|
if (selectors.length !== 1 || target.name !== void 0 && target.role === void 0) {
|
|
33
|
-
throw new Error("
|
|
33
|
+
throw new Error("A browser target needs exactly one of role (optional name), label, text, testId or css.");
|
|
34
34
|
}
|
|
35
|
-
if (target.nth !== void 0 && target.first) throw new Error("
|
|
35
|
+
if (target.nth !== void 0 && target.first) throw new Error("A browser target uses either nth or first, not both.");
|
|
36
36
|
const root = target.frame ? page.frameLocator(target.frame) : page;
|
|
37
37
|
const base = target.role ? root.getByRole(target.role, { name: target.name, exact: true }) : target.label ? root.getByLabel(target.label, { exact: true }) : target.text ? root.getByText(target.text, { exact: true }) : target.testId ? root.getByTestId(target.testId) : root.locator(target.css);
|
|
38
38
|
return target.first ? base.first() : target.nth !== void 0 ? base.nth(target.nth) : base;
|
|
@@ -47,13 +47,13 @@ var BrowserPages = class {
|
|
|
47
47
|
async open(runId, url, viewport, signal) {
|
|
48
48
|
if (this.#shutDown) throw endedError();
|
|
49
49
|
const parsed = new URL(url);
|
|
50
|
-
if (!["http:", "https:"].includes(parsed.protocol)) throw new Error("browser_open
|
|
50
|
+
if (!["http:", "https:"].includes(parsed.protocol)) throw new Error("browser_open needs an HTTP or HTTPS address.");
|
|
51
51
|
signal?.throwIfAborted();
|
|
52
52
|
if (!this.#sessions.has(runId)) this.#start(runId, viewport);
|
|
53
53
|
return this.#perform(runId, signal, async (session, page) => {
|
|
54
54
|
this.#resetEvidence(session);
|
|
55
55
|
const response = await page.goto(parsed.href, { waitUntil: "domcontentloaded" });
|
|
56
|
-
if (response && !response.ok()) throw new Error(`
|
|
56
|
+
if (response && !response.ok()) throw new Error(`Browser navigation failed: HTTP ${response.status()} (${page.url()}).`);
|
|
57
57
|
return this.#snapshot(session, page);
|
|
58
58
|
});
|
|
59
59
|
}
|
|
@@ -82,47 +82,47 @@ var BrowserPages = class {
|
|
|
82
82
|
return this.#perform(runId, signal, async (session, page) => {
|
|
83
83
|
session.checked = false;
|
|
84
84
|
if (!input.target && input.text === void 0 && input.url === void 0 && input.noErrors !== true) {
|
|
85
|
-
throw new Error("browser_check
|
|
85
|
+
throw new Error("browser_check needs at least target, text, url or noErrors: true.");
|
|
86
86
|
}
|
|
87
87
|
if (input.count !== void 0 && (!input.target || input.target.nth !== void 0 || input.target.first)) {
|
|
88
|
-
throw new Error("count in browser_check
|
|
88
|
+
throw new Error("count in browser_check needs a target without nth or first and counts its visible matches.");
|
|
89
89
|
}
|
|
90
90
|
const timeout = this.#options.checkTimeoutMs;
|
|
91
91
|
const assertions = [];
|
|
92
92
|
if (input.target && input.count !== void 0) {
|
|
93
93
|
const visible = browserLocator(page, input.target).filter({ visible: true });
|
|
94
94
|
const found = await this.#waitForCount(visible, input.count, timeout);
|
|
95
|
-
if (found !== input.count) throw new Error(`
|
|
96
|
-
assertions.push(`${input.count}
|
|
95
|
+
if (found !== input.count) throw new Error(`Expected ${input.count} visible matches, found ${found}.`);
|
|
96
|
+
assertions.push(`${input.count} visible matches`);
|
|
97
97
|
} else if (input.target) {
|
|
98
98
|
const locator = browserLocator(page, input.target);
|
|
99
99
|
await locator.waitFor({ state: "visible", timeout }).catch(withAmbiguityHint);
|
|
100
|
-
assertions.push("
|
|
100
|
+
assertions.push("Target is visible");
|
|
101
101
|
if (input.text !== void 0) {
|
|
102
102
|
try {
|
|
103
103
|
await locator.filter({ hasText: input.text }).waitFor({ state: "visible", timeout });
|
|
104
104
|
} catch (error) {
|
|
105
|
-
throw new Error(`
|
|
105
|
+
throw new Error(`Expected text is missing in the target: ${input.text}`, { cause: error });
|
|
106
106
|
}
|
|
107
|
-
assertions.push(`Text
|
|
107
|
+
assertions.push(`Text in target: ${input.text}`);
|
|
108
108
|
}
|
|
109
109
|
} else if (input.text !== void 0) {
|
|
110
110
|
await page.getByText(input.text, { exact: false }).first().waitFor({ state: "visible", timeout });
|
|
111
|
-
assertions.push(`
|
|
111
|
+
assertions.push(`Visible text: ${input.text}`);
|
|
112
112
|
}
|
|
113
113
|
if (input.url !== void 0) {
|
|
114
114
|
await page.waitForURL(input.url, { timeout });
|
|
115
|
-
assertions.push(`
|
|
115
|
+
assertions.push(`Address: ${input.url}`);
|
|
116
116
|
}
|
|
117
117
|
if (input.noErrors !== false) {
|
|
118
|
-
if (session.errors.length > 0) throw new Error(`
|
|
119
|
-
assertions.push("
|
|
118
|
+
if (session.errors.length > 0) throw new Error(`Browser errors: ${session.errors.join("\n")}`);
|
|
119
|
+
assertions.push("No captured browser or network errors since the navigation");
|
|
120
120
|
}
|
|
121
121
|
session.checked = true;
|
|
122
122
|
return { url: page.url(), assertions };
|
|
123
123
|
});
|
|
124
124
|
}
|
|
125
|
-
/**
|
|
125
|
+
/** Captures the page as PNG and returns it Base64-encoded; the page remembers `id` as the current screenshot. */
|
|
126
126
|
screenshot(runId, id, fullPage, signal) {
|
|
127
127
|
return this.#perform(runId, signal, async (session, page) => {
|
|
128
128
|
const image = await page.screenshot({ fullPage, type: "png", timeout: this.#options.timeoutMs });
|
|
@@ -130,7 +130,7 @@ var BrowserPages = class {
|
|
|
130
130
|
return image.toString("base64");
|
|
131
131
|
});
|
|
132
132
|
}
|
|
133
|
-
/**
|
|
133
|
+
/** The page state without waiting for running actions; `null` without an open page. */
|
|
134
134
|
state(runId) {
|
|
135
135
|
const session = this.#sessions.get(runId);
|
|
136
136
|
return session && !session.closed && session.page ? this.#stateOf(session, session.page) : null;
|
|
@@ -144,7 +144,7 @@ var BrowserPages = class {
|
|
|
144
144
|
if (browser) await browser.close();
|
|
145
145
|
await session.queue;
|
|
146
146
|
}
|
|
147
|
-
/**
|
|
147
|
+
/** Closes every browser; afterwards none starts anymore because nobody would close it. */
|
|
148
148
|
async shutdown() {
|
|
149
149
|
this.#shutDown = true;
|
|
150
150
|
const results = await Promise.allSettled([...this.#sessions.keys()].map((runId) => this.close(runId)));
|
|
@@ -187,10 +187,10 @@ var BrowserPages = class {
|
|
|
187
187
|
session.failedRequests = /* @__PURE__ */ new Set();
|
|
188
188
|
}
|
|
189
189
|
async #page(session) {
|
|
190
|
-
if (session.closed) throw new Error("
|
|
190
|
+
if (session.closed) throw new Error("The browser was closed.");
|
|
191
191
|
if (session.page) return session.page;
|
|
192
192
|
const browser = await session.browser;
|
|
193
|
-
if (session.closed) throw new Error("
|
|
193
|
+
if (session.closed) throw new Error("The browser was closed.");
|
|
194
194
|
const context = await browser.newContext({ viewport: session.viewport });
|
|
195
195
|
context.setDefaultTimeout(this.#options.timeoutMs);
|
|
196
196
|
context.setDefaultNavigationTimeout(this.#options.timeoutMs);
|
|
@@ -207,11 +207,11 @@ var BrowserPages = class {
|
|
|
207
207
|
page.on("console", (message) => {
|
|
208
208
|
if (message.type() !== "error") return;
|
|
209
209
|
const source = message.text().startsWith("Failed to load resource") ? message.location().url : "";
|
|
210
|
-
if (source) addRequestError(source, `
|
|
211
|
-
else addError(`
|
|
210
|
+
if (source) addRequestError(source, `Console: ${message.text()} (${source})`);
|
|
211
|
+
else addError(`Console: ${message.text()}`);
|
|
212
212
|
});
|
|
213
213
|
page.on("pageerror", (error) => addError(`JavaScript: ${error.message}`));
|
|
214
|
-
page.on("requestfailed", (request) => addRequestError(request.url(), `
|
|
214
|
+
page.on("requestfailed", (request) => addRequestError(request.url(), `Network: ${request.method()} ${request.url()} ${request.failure()?.errorText}`));
|
|
215
215
|
page.on("response", (response) => {
|
|
216
216
|
if (response.status() >= 400) addRequestError(response.url(), `HTTP ${response.status()}: ${response.url()}`);
|
|
217
217
|
});
|
|
@@ -219,8 +219,8 @@ var BrowserPages = class {
|
|
|
219
219
|
if (frame === page.mainFrame()) this.#resetEvidence(session);
|
|
220
220
|
});
|
|
221
221
|
page.on("popup", (popup) => {
|
|
222
|
-
addError(`
|
|
223
|
-
void popup.close().catch((error) => addError(`
|
|
222
|
+
addError(`The application opened a new window: ${popup.url()}. Popups are not operated.`);
|
|
223
|
+
void popup.close().catch((error) => addError(`Closing window: ${errorText(error)}`));
|
|
224
224
|
});
|
|
225
225
|
session.page = page;
|
|
226
226
|
return page;
|
|
@@ -228,11 +228,11 @@ var BrowserPages = class {
|
|
|
228
228
|
#perform(runId, signal, action) {
|
|
229
229
|
if (this.#shutDown) return Promise.reject(endedError());
|
|
230
230
|
const session = this.#sessions.get(runId);
|
|
231
|
-
if (!session || session.closed) return Promise.reject(new Error("
|
|
231
|
+
if (!session || session.closed) return Promise.reject(new Error("No browser is open for this run. Call browser_open first."));
|
|
232
232
|
const pending = session.queue.then(async () => {
|
|
233
233
|
signal?.throwIfAborted();
|
|
234
234
|
const abort = () => {
|
|
235
|
-
void this.close(runId).catch((error) => console.error("
|
|
235
|
+
void this.close(runId).catch((error) => console.error("Browser stop failed:", errorText(error)));
|
|
236
236
|
};
|
|
237
237
|
signal?.addEventListener("abort", abort, { once: true });
|
|
238
238
|
try {
|
|
@@ -240,7 +240,7 @@ var BrowserPages = class {
|
|
|
240
240
|
signal?.throwIfAborted();
|
|
241
241
|
const result = await action(session, page);
|
|
242
242
|
signal?.throwIfAborted();
|
|
243
|
-
if (session.closed) throw new Error("
|
|
243
|
+
if (session.closed) throw new Error("The browser was closed.");
|
|
244
244
|
return { result, page: this.#stateOf(session, page) };
|
|
245
245
|
} finally {
|
|
246
246
|
signal?.removeEventListener("abort", abort);
|
|
@@ -284,7 +284,7 @@ var browserExecutable = async (playwright, environment = process.env) => {
|
|
|
284
284
|
const configured = environment[BROWSER_EXECUTABLE_VARIABLE];
|
|
285
285
|
const candidate = configured ? configured : playwright.chromium.executablePath();
|
|
286
286
|
if (await access(candidate, constants.X_OK).then(() => true, () => false)) return candidate;
|
|
287
|
-
throw new Error((configured ? `${BROWSER_EXECUTABLE_VARIABLE}
|
|
287
|
+
throw new Error((configured ? `${BROWSER_EXECUTABLE_VARIABLE} names ${configured}; there is no executable browser there on this machine. ` : `There is no executable browser on this machine: ${BROWSER_EXECUTABLE_VARIABLE} is not set and Chromium is missing at ${candidate}. `) + `A workspace fetches Chromium with pnpm provision --workspace, a server with pnpm provision <profile>; ${BROWSER_EXECUTABLE_VARIABLE} names an existing Chrome, on a server in the profile section ragents.browser, on a workspace in its environment.`);
|
|
288
288
|
};
|
|
289
289
|
var launchChromium = async (machine, hostRoot, runId, timeoutMs) => {
|
|
290
290
|
const playwright = await hostPlaywright(machine, hostRoot);
|
|
@@ -301,23 +301,23 @@ var BROWSER_TIMEOUT_MS = 15e3;
|
|
|
301
301
|
var browserModule = (machine, options = {}) => (host) => {
|
|
302
302
|
const invalid = (message) => machine.operationError("browser-input-invalid", message, 400);
|
|
303
303
|
const fieldsOf = (input) => {
|
|
304
|
-
if (typeof input !== "object" || input === null || Array.isArray(input)) throw invalid("
|
|
304
|
+
if (typeof input !== "object" || input === null || Array.isArray(input)) throw invalid("The input of a browser operation is an object");
|
|
305
305
|
return input;
|
|
306
306
|
};
|
|
307
307
|
const textOf = (input, key) => {
|
|
308
308
|
const value = fieldsOf(input)[key];
|
|
309
|
-
if (typeof value !== "string") throw invalid(`
|
|
309
|
+
if (typeof value !== "string") throw invalid(`The browser operation needs ${key} as text`);
|
|
310
310
|
return value;
|
|
311
311
|
};
|
|
312
312
|
const targetOf = (input) => {
|
|
313
313
|
const value = fieldsOf(input).target;
|
|
314
|
-
if (typeof value !== "object" || value === null || Array.isArray(value)) throw invalid("
|
|
314
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) throw invalid("The browser operation needs a target");
|
|
315
315
|
return value;
|
|
316
316
|
};
|
|
317
317
|
const viewportOf = (input) => {
|
|
318
318
|
const { width, height } = fieldsOf(input);
|
|
319
319
|
if (typeof width !== "number" || typeof height !== "number" || !Number.isInteger(width) || !Number.isInteger(height) || width <= 0 || height <= 0) {
|
|
320
|
-
throw invalid("
|
|
320
|
+
throw invalid("A viewport needs width and height as positive integers");
|
|
321
321
|
}
|
|
322
322
|
return { width, height };
|
|
323
323
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../plugins/ragents.browser/executor/contract.ts", "../../../plugins/ragents.browser/executor/pages.ts", "../../../plugins/ragents.browser/executor/playwright.ts", "../../../plugins/ragents.browser/executor/module.ts", "../../../plugins/ragents.browser/executor/index.ts"],
|
|
4
|
-
"sourcesContent": ["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 type { Browser, Locator, Page } from \"playwright-core\";\nimport type {\n BrowserCheck,\n BrowserCheckResult,\n BrowserPageState,\n BrowserSnapshot,\n BrowserStep,\n BrowserTarget,\n BrowserViewport,\n} from \"./contract.js\";\n\ninterface BrowserSession {\n readonly browser: Promise<Browser>;\n readonly viewport: BrowserViewport;\n page?: Page;\n queue: Promise<void>;\n closed: boolean;\n checked: boolean;\n errors: string[];\n /** Adressen, deren fehlgeschlagene Anfrage schon gemeldet ist; HTTP-Status, Konsole und Netzwerk melden dieselbe Ursache nur einmal. */\n failedRequests: Set<string>;\n screenshots: string[];\n}\n\nexport interface BrowserPagesOptions {\n launch: (runId: string) => Promise<Browser>;\n timeoutMs: number;\n checkTimeoutMs: number;\n}\n\nconst errorText = (error: unknown): string => error instanceof Error ? error.message : String(error);\nconst endedError = (): Error => new Error(\"Der Browserdienst dieses Executors ist beendet.\");\nconst maxSnapshotLength = 40_000;\nconst ambiguityHint = \"W\u00E4hle mit nth (0-basiert) oder first: true im Ziel einen Treffer, oder pr\u00FCfe die Anzahl mit count in browser_check.\";\n\nconst withAmbiguityHint = (error: unknown): never => {\n if (error instanceof Error && error.message.includes(\"strict mode violation\")) throw new Error(`${error.message}\\n${ambiguityHint}`, { cause: error });\n throw error;\n};\n\nexport const browserLocator = (page: Page, target: BrowserTarget): Locator => {\n const selectors = [target.role, target.label, target.text, target.testId, target.css].filter((value) => value !== undefined);\n if (selectors.length !== 1 || (target.name !== undefined && target.role === undefined)) {\n throw new Error(\"Ein Browserziel braucht genau role (optional name), label, text, testId oder css.\");\n }\n if (target.nth !== undefined && target.first) throw new Error(\"Ein Browserziel verwendet entweder nth oder first, nicht beides.\");\n const root = target.frame ? page.frameLocator(target.frame) : page;\n const base = target.role ? root.getByRole(target.role as Parameters<Page[\"getByRole\"]>[0], { name: target.name, exact: true })\n : target.label ? root.getByLabel(target.label, { exact: true })\n : target.text ? root.getByText(target.text, { exact: true })\n : target.testId ? root.getByTestId(target.testId)\n : root.locator(target.css!);\n return target.first ? base.first() : target.nth !== undefined ? base.nth(target.nth) : base;\n};\n\n/** Je Run ein Browser mit einer Seite auf dieser Maschine; die Aktionen eines Runs laufen der Reihe nach. */\nexport class BrowserPages {\n readonly #options: BrowserPagesOptions;\n readonly #sessions = new Map<string, BrowserSession>();\n #shutDown = false;\n\n constructor(options: BrowserPagesOptions) {\n this.#options = options;\n }\n\n async open(runId: string, url: string, viewport: BrowserViewport, signal?: AbortSignal): Promise<BrowserStep<BrowserSnapshot>> {\n if (this.#shutDown) throw endedError();\n const parsed = new URL(url);\n if (![\"http:\", \"https:\"].includes(parsed.protocol)) throw new Error(\"browser_open braucht eine HTTP- oder HTTPS-Adresse.\");\n signal?.throwIfAborted();\n if (!this.#sessions.has(runId)) this.#start(runId, viewport);\n return this.#perform(runId, signal, async (session, page) => {\n this.#resetEvidence(session);\n const response = await page.goto(parsed.href, { waitUntil: \"domcontentloaded\" });\n if (response && !response.ok()) throw new Error(`Browsernavigation fehlgeschlagen: HTTP ${response.status()} (${page.url()}).`);\n return this.#snapshot(session, page);\n });\n }\n\n snapshot(runId: string, signal?: AbortSignal): Promise<BrowserStep<BrowserSnapshot>> {\n return this.#perform(runId, signal, (session, page) => this.#snapshot(session, page));\n }\n\n viewport(runId: string, viewport: BrowserViewport, signal?: AbortSignal): Promise<BrowserStep<BrowserSnapshot>> {\n return this.#perform(runId, signal, async (session, page) => {\n await page.setViewportSize(viewport);\n return this.#snapshot(session, page);\n });\n }\n\n click(runId: string, target: BrowserTarget, signal?: AbortSignal): Promise<BrowserStep<BrowserSnapshot>> {\n return this.#action(runId, target, signal, (locator) => locator.click());\n }\n\n fill(runId: string, target: BrowserTarget, value: string, signal?: AbortSignal): Promise<BrowserStep<BrowserSnapshot>> {\n return this.#action(runId, target, signal, (locator) => locator.fill(value));\n }\n\n select(runId: string, target: BrowserTarget, label: string, signal?: AbortSignal): Promise<BrowserStep<BrowserSnapshot>> {\n return this.#action(runId, target, signal, (locator) => locator.selectOption({ label }));\n }\n\n press(runId: string, target: BrowserTarget, key: string, signal?: AbortSignal): Promise<BrowserStep<BrowserSnapshot>> {\n return this.#action(runId, target, signal, (locator) => locator.press(key));\n }\n\n check(runId: string, input: BrowserCheck, signal?: AbortSignal): Promise<BrowserStep<BrowserCheckResult>> {\n return this.#perform(runId, signal, async (session, page) => {\n session.checked = false;\n if (!input.target && input.text === undefined && input.url === undefined && input.noErrors !== true) {\n throw new Error(\"browser_check braucht mindestens target, text, url oder noErrors: true.\");\n }\n if (input.count !== undefined && (!input.target || input.target.nth !== undefined || input.target.first)) {\n throw new Error(\"count in browser_check braucht ein target ohne nth oder first und z\u00E4hlt dessen sichtbare Treffer.\");\n }\n const timeout = this.#options.checkTimeoutMs;\n const assertions: string[] = [];\n if (input.target && input.count !== undefined) {\n const visible = browserLocator(page, input.target).filter({ visible: true });\n const found = await this.#waitForCount(visible, input.count, timeout);\n if (found !== input.count) throw new Error(`Erwartet ${input.count} sichtbare Treffer, gefunden ${found}.`);\n assertions.push(`${input.count} sichtbare Treffer`);\n } else if (input.target) {\n const locator = browserLocator(page, input.target);\n await locator.waitFor({ state: \"visible\", timeout }).catch(withAmbiguityHint);\n assertions.push(\"Ziel ist sichtbar\");\n if (input.text !== undefined) {\n try { await locator.filter({ hasText: input.text }).waitFor({ state: \"visible\", timeout }); }\n catch (error) { throw new Error(`Erwarteter Text fehlt im Ziel: ${input.text}`, { cause: error }); }\n assertions.push(`Text im Ziel: ${input.text}`);\n }\n } else if (input.text !== undefined) {\n await page.getByText(input.text, { exact: false }).first().waitFor({ state: \"visible\", timeout });\n assertions.push(`Sichtbarer Text: ${input.text}`);\n }\n if (input.url !== undefined) {\n await page.waitForURL(input.url, { timeout });\n assertions.push(`Adresse: ${input.url}`);\n }\n if (input.noErrors !== false) {\n if (session.errors.length > 0) throw new Error(`Browserfehler: ${session.errors.join(\"\\n\")}`);\n assertions.push(\"Keine erfassten Browser- oder Netzwerkfehler seit der Navigation\");\n }\n session.checked = true;\n return { url: page.url(), assertions };\n });\n }\n\n /** Nimmt die Seite als PNG auf und liefert es Base64-kodiert; `id` merkt sich die Seite als aktuelle Aufnahme. */\n screenshot(runId: string, id: string, fullPage: boolean, signal?: AbortSignal): Promise<BrowserStep<string>> {\n return this.#perform(runId, signal, async (session, page) => {\n const image = await page.screenshot({ fullPage, type: \"png\", timeout: this.#options.timeoutMs });\n session.screenshots.push(id);\n return image.toString(\"base64\");\n });\n }\n\n /** Der Stand der Seite, ohne auf laufende Aktionen zu warten; ohne offene Seite `null`. */\n state(runId: string): BrowserPageState | null {\n const session = this.#sessions.get(runId);\n return session && !session.closed && session.page ? this.#stateOf(session, session.page) : null;\n }\n\n async close(runId: string): Promise<void> {\n const session = this.#sessions.get(runId);\n if (!session) return;\n session.closed = true;\n this.#sessions.delete(runId);\n const browser = await session.browser.catch(() => undefined);\n if (browser) await browser.close();\n await session.queue;\n }\n\n /** Schlie\u00DFt jeden Browser; danach startet keiner mehr, weil niemand ihn schlie\u00DFen w\u00FCrde. */\n async shutdown(): Promise<void> {\n this.#shutDown = true;\n const results = await Promise.allSettled([...this.#sessions.keys()].map((runId) => this.close(runId)));\n const failed = results.find((result): result is PromiseRejectedResult => result.status === \"rejected\");\n if (failed) throw failed.reason;\n }\n\n #start(runId: string, viewport: BrowserViewport): void {\n const session: BrowserSession = {\n browser: this.#launch(runId),\n viewport,\n queue: Promise.resolve(),\n closed: false,\n checked: false,\n errors: [],\n failedRequests: new Set(),\n screenshots: [],\n };\n this.#sessions.set(runId, session);\n void session.browser.catch(() => {\n session.closed = true;\n if (this.#sessions.get(runId) === session) this.#sessions.delete(runId);\n });\n }\n\n async #launch(runId: string): Promise<Browser> {\n return this.#options.launch(runId);\n }\n\n async #waitForCount(locator: Locator, expected: number, timeout: number): Promise<number> {\n const deadline = Date.now() + timeout;\n let found = await locator.count();\n while (found !== expected && Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n found = await locator.count();\n }\n return found;\n }\n\n #resetEvidence(session: BrowserSession): void {\n session.checked = false;\n session.screenshots = [];\n session.errors = [];\n session.failedRequests = new Set();\n }\n\n async #page(session: BrowserSession): Promise<Page> {\n if (session.closed) throw new Error(\"Der Browser wurde beendet.\");\n if (session.page) return session.page;\n const browser = await session.browser;\n if (session.closed) throw new Error(\"Der Browser wurde beendet.\");\n const context = await browser.newContext({ viewport: session.viewport });\n context.setDefaultTimeout(this.#options.timeoutMs);\n context.setDefaultNavigationTimeout(this.#options.timeoutMs);\n const page = await context.newPage();\n const addError = (text: string) => {\n session.errors.push(text.slice(0, 2000));\n if (session.errors.length > 100) session.errors.shift();\n };\n const addRequestError = (url: string, text: string) => {\n if (session.failedRequests.has(url)) return;\n session.failedRequests.add(url);\n addError(text);\n };\n page.on(\"console\", (message) => {\n if (message.type() !== \"error\") return;\n const source = message.text().startsWith(\"Failed to load resource\") ? message.location().url : \"\";\n if (source) addRequestError(source, `Konsole: ${message.text()} (${source})`);\n else addError(`Konsole: ${message.text()}`);\n });\n page.on(\"pageerror\", (error) => addError(`JavaScript: ${error.message}`));\n page.on(\"requestfailed\", (request) => addRequestError(request.url(), `Netzwerk: ${request.method()} ${request.url()} ${request.failure()?.errorText}`));\n page.on(\"response\", (response) => { if (response.status() >= 400) addRequestError(response.url(), `HTTP ${response.status()}: ${response.url()}`); });\n page.on(\"framenavigated\", (frame) => { if (frame === page.mainFrame()) this.#resetEvidence(session); });\n page.on(\"popup\", (popup) => {\n addError(`Die Anwendung hat ein neues Fenster ge\u00F6ffnet: ${popup.url()}. Popups werden nicht bedient.`);\n void popup.close().catch((error) => addError(`Fenster schlie\u00DFen: ${errorText(error)}`));\n });\n session.page = page;\n return page;\n }\n\n #perform<T>(runId: string, signal: AbortSignal | undefined, action: (session: BrowserSession, page: Page) => Promise<T>): Promise<BrowserStep<T>> {\n if (this.#shutDown) return Promise.reject(endedError());\n const session = this.#sessions.get(runId);\n if (!session || session.closed) return Promise.reject(new Error(\"F\u00FCr diesen Run ist kein Browser offen. Zuerst browser_open aufrufen.\"));\n const pending = session.queue.then(async () => {\n signal?.throwIfAborted();\n const abort = () => { void this.close(runId).catch((error) => console.error(\"Browserstopp fehlgeschlagen:\", errorText(error))); };\n signal?.addEventListener(\"abort\", abort, { once: true });\n try {\n const page = await this.#page(session);\n signal?.throwIfAborted();\n const result = await action(session, page);\n signal?.throwIfAborted();\n if (session.closed) throw new Error(\"Der Browser wurde beendet.\");\n return { result, page: this.#stateOf(session, page) };\n } finally {\n signal?.removeEventListener(\"abort\", abort);\n }\n });\n session.queue = pending.then(() => undefined, () => undefined);\n return pending;\n }\n\n #action(runId: string, target: BrowserTarget, signal: AbortSignal | undefined, action: (locator: Locator) => Promise<unknown>): Promise<BrowserStep<BrowserSnapshot>> {\n return this.#perform(runId, signal, async (session, page) => {\n session.checked = false;\n session.screenshots = [];\n await action(browserLocator(page, target)).catch(withAmbiguityHint);\n return this.#snapshot(session, page);\n });\n }\n\n #stateOf(session: BrowserSession, page: Page): BrowserPageState {\n return { url: page.url(), checked: session.checked, errors: [...session.errors], screenshots: [...session.screenshots] };\n }\n\n async #snapshot(session: BrowserSession, page: Page): Promise<BrowserSnapshot> {\n const snapshot = await page.locator(\"body\").ariaSnapshot({ mode: \"ai\", timeout: this.#options.timeoutMs });\n return { url: page.url(), title: await page.title(), snapshot: snapshot.slice(0, maxSnapshotLength),\n truncated: snapshot.length > maxSnapshotLength, errors: [...session.errors] };\n }\n}\n", "import { constants } from \"node:fs\";\nimport { access } from \"node:fs/promises\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Browser } from \"playwright-core\";\nimport type { WorkspaceExecutorMachine } from \"@ragents/workspace-executor\";\nimport { BROWSER_EXECUTABLE_VARIABLE } from \"./contract.js\";\n\ntype Playwright = typeof import(\"playwright-core\");\n\n/** playwright-core liegt in den node_modules des Hosts dieser Maschine und wird erst im Aufruf geladen, nie mit dem Beitrag. */\nexport const hostPlaywright = async (machine: WorkspaceExecutorMachine, hostRoot: string | undefined): Promise<Playwright> => {\n const loaded = await import(pathToFileURL(machine.hostPackageFile(hostRoot, \"playwright-core\")).href) as { default: Playwright };\n return loaded.default;\n};\n\n/** Der Chrome dieser Maschine: der aus ihrer Umgebung, sonst das Chromium, das die Provisionierung f\u00FCr playwright-core holt. */\nexport const browserExecutable = async (playwright: Playwright, environment: NodeJS.ProcessEnv = process.env): Promise<string> => {\n const configured = environment[BROWSER_EXECUTABLE_VARIABLE];\n const candidate = configured ? configured : playwright.chromium.executablePath();\n if (await access(candidate, constants.X_OK).then(() => true, () => false)) return candidate;\n throw new Error((configured\n ? `${BROWSER_EXECUTABLE_VARIABLE} nennt ${configured}; dort gibt es auf diesem Rechner keinen ausf\u00FChrbaren Browser. `\n : `Auf diesem Rechner gibt es keinen ausf\u00FChrbaren Browser: ${BROWSER_EXECUTABLE_VARIABLE} ist nicht gesetzt und Chromium fehlt unter ${candidate}. `)\n + \"Ein Arbeitsplatz holt Chromium mit pnpm provision --workspace, ein Server mit pnpm provision <profil>; \"\n + `${BROWSER_EXECUTABLE_VARIABLE} nennt einen vorhandenen Chrome, auf einem Server in der Profilsektion ragents.browser, `\n + \"auf einem Arbeitsplatz in seiner Umgebung.\");\n};\n\n/** Startet Chrome headless mit der Umgebung dieser Maschine und dem Marker des Runs, damit die Prozessanzeige ihn zuordnet. */\nexport const launchChromium = async (machine: WorkspaceExecutorMachine, hostRoot: string | undefined, runId: string, timeoutMs: number): Promise<Browser> => {\n const playwright = await hostPlaywright(machine, hostRoot);\n return playwright.chromium.launch({\n executablePath: await browserExecutable(playwright),\n headless: true,\n timeout: timeoutMs,\n env: machine.processEnvironment(runId),\n });\n};\n", "import type { Browser } from \"playwright-core\";\nimport type { WorkspaceExecutorMachine, WorkspaceModuleFactory } from \"@ragents/workspace-executor\";\nimport { BROWSER_OPERATIONS, type BrowserCheck, type BrowserTarget, type BrowserViewport } from \"./contract.js\";\nimport { BrowserPages } from \"./pages.js\";\nimport { launchChromium } from \"./playwright.js\";\n\nconst BROWSER_TIMEOUT_MS = 15_000;\n\nexport interface BrowserModuleOptions {\n /** Startet den Browser eines Runs; ohne Angabe Chrome \u00FCber playwright-core aus dem Host dieser Maschine. */\n launch?: (runId: string) => Promise<Browser>;\n timeoutMs?: number;\n checkTimeoutMs?: number;\n}\n\n/** Der Browser eines Runs auf dieser Maschine: Seite, Aktionen, Pr\u00FCfungen und Aufnahmen; Evidenz und Ablage h\u00E4lt der Aufrufer. */\nexport const browserModule = (machine: WorkspaceExecutorMachine, options: BrowserModuleOptions = {}): WorkspaceModuleFactory => (host) => {\n const invalid = (message: string): Error => machine.operationError(\"browser-input-invalid\", message, 400);\n const fieldsOf = (input: unknown): Readonly<Record<string, unknown>> => {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) throw invalid(\"Die Eingabe einer Browseroperation ist ein Objekt\");\n return input as Readonly<Record<string, unknown>>;\n };\n const textOf = (input: unknown, key: string): string => {\n const value = fieldsOf(input)[key];\n if (typeof value !== \"string\") throw invalid(`Die Browseroperation braucht ${key} als Text`);\n return value;\n };\n const targetOf = (input: unknown): BrowserTarget => {\n const value = fieldsOf(input).target;\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) throw invalid(\"Die Browseroperation braucht ein Ziel\");\n return value as BrowserTarget;\n };\n const viewportOf = (input: unknown): BrowserViewport => {\n const { width, height } = fieldsOf(input);\n if (typeof width !== \"number\" || typeof height !== \"number\" || !Number.isInteger(width) || !Number.isInteger(height) || width <= 0 || height <= 0) {\n throw invalid(\"Ein Viewport braucht Breite und H\u00F6he als positive ganze Zahlen\");\n }\n return { width, height };\n };\n const timeoutMs = options.timeoutMs ?? BROWSER_TIMEOUT_MS;\n const pages = new BrowserPages({\n launch: options.launch ?? (async (runId) => launchChromium(machine, (await host.contextFor(runId)).hostRoot, runId, timeoutMs)),\n timeoutMs,\n checkTimeoutMs: options.checkTimeoutMs ?? Math.min(5_000, timeoutMs),\n });\n return {\n operations: {\n [BROWSER_OPERATIONS.open]: ({ runId, input, signal }) =>\n pages.open(runId, textOf(input, \"url\"), viewportOf(fieldsOf(input).viewport), signal),\n [BROWSER_OPERATIONS.snapshot]: ({ runId, signal }) => pages.snapshot(runId, signal),\n [BROWSER_OPERATIONS.viewport]: ({ runId, input, signal }) => pages.viewport(runId, viewportOf(input), signal),\n [BROWSER_OPERATIONS.click]: ({ runId, input, signal }) => pages.click(runId, targetOf(input), signal),\n [BROWSER_OPERATIONS.fill]: ({ runId, input, signal }) => pages.fill(runId, targetOf(input), textOf(input, \"value\"), signal),\n [BROWSER_OPERATIONS.select]: ({ runId, input, signal }) => pages.select(runId, targetOf(input), textOf(input, \"label\"), signal),\n [BROWSER_OPERATIONS.press]: ({ runId, input, signal }) => pages.press(runId, targetOf(input), textOf(input, \"key\"), signal),\n [BROWSER_OPERATIONS.check]: ({ runId, input, signal }) => pages.check(runId, fieldsOf(input) as BrowserCheck, signal),\n [BROWSER_OPERATIONS.screenshot]: ({ runId, input, signal }) =>\n pages.screenshot(runId, textOf(input, \"id\"), fieldsOf(input).fullPage === true, signal),\n [BROWSER_OPERATIONS.state]: async ({ runId }) => pages.state(runId),\n [BROWSER_OPERATIONS.close]: async ({ runId }) => {\n await pages.close(runId);\n return null;\n },\n },\n stopRun: (runId) => pages.close(runId),\n shutdown: () => pages.shutdown(),\n };\n};\n", "import type { WorkspaceExecutorContribution } from \"@ragents/workspace-executor\";\nimport { browserModule } from \"./module.js\";\n\n/** Der Browser l\u00E4uft dort, wo der Arbeitsbereich des Runs liegt: im Executor des Servers oder in dem des Arbeitsplatzes. */\nexport const executor: WorkspaceExecutorContribution = (machine) => ({ modules: [browserModule(machine)] });\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["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 type { Browser, Locator, Page } from \"playwright-core\";\nimport type {\n BrowserCheck,\n BrowserCheckResult,\n BrowserPageState,\n BrowserSnapshot,\n BrowserStep,\n BrowserTarget,\n BrowserViewport,\n} from \"./contract.js\";\n\ninterface BrowserSession {\n readonly browser: Promise<Browser>;\n readonly viewport: BrowserViewport;\n page?: Page;\n queue: Promise<void>;\n closed: boolean;\n checked: boolean;\n errors: string[];\n /** Addresses whose failed request is already reported; HTTP status, console and network report the same cause only once. */\n failedRequests: Set<string>;\n screenshots: string[];\n}\n\nexport interface BrowserPagesOptions {\n launch: (runId: string) => Promise<Browser>;\n timeoutMs: number;\n checkTimeoutMs: number;\n}\n\nconst errorText = (error: unknown): string => error instanceof Error ? error.message : String(error);\nconst endedError = (): Error => new Error(\"The browser service of this executor has ended.\");\nconst maxSnapshotLength = 40_000;\nconst ambiguityHint = \"Pick one match with nth (0-based) or first: true in the target, or check the number with count in browser_check.\";\n\nconst withAmbiguityHint = (error: unknown): never => {\n if (error instanceof Error && error.message.includes(\"strict mode violation\")) throw new Error(`${error.message}\\n${ambiguityHint}`, { cause: error });\n throw error;\n};\n\nexport const browserLocator = (page: Page, target: BrowserTarget): Locator => {\n const selectors = [target.role, target.label, target.text, target.testId, target.css].filter((value) => value !== undefined);\n if (selectors.length !== 1 || (target.name !== undefined && target.role === undefined)) {\n throw new Error(\"A browser target needs exactly one of role (optional name), label, text, testId or css.\");\n }\n if (target.nth !== undefined && target.first) throw new Error(\"A browser target uses either nth or first, not both.\");\n const root = target.frame ? page.frameLocator(target.frame) : page;\n const base = target.role ? root.getByRole(target.role as Parameters<Page[\"getByRole\"]>[0], { name: target.name, exact: true })\n : target.label ? root.getByLabel(target.label, { exact: true })\n : target.text ? root.getByText(target.text, { exact: true })\n : target.testId ? root.getByTestId(target.testId)\n : root.locator(target.css!);\n return target.first ? base.first() : target.nth !== undefined ? base.nth(target.nth) : base;\n};\n\n/** One browser with one page per run on this machine; a run's actions run one after another. */\nexport class BrowserPages {\n readonly #options: BrowserPagesOptions;\n readonly #sessions = new Map<string, BrowserSession>();\n #shutDown = false;\n\n constructor(options: BrowserPagesOptions) {\n this.#options = options;\n }\n\n async open(runId: string, url: string, viewport: BrowserViewport, signal?: AbortSignal): Promise<BrowserStep<BrowserSnapshot>> {\n if (this.#shutDown) throw endedError();\n const parsed = new URL(url);\n if (![\"http:\", \"https:\"].includes(parsed.protocol)) throw new Error(\"browser_open needs an HTTP or HTTPS address.\");\n signal?.throwIfAborted();\n if (!this.#sessions.has(runId)) this.#start(runId, viewport);\n return this.#perform(runId, signal, async (session, page) => {\n this.#resetEvidence(session);\n const response = await page.goto(parsed.href, { waitUntil: \"domcontentloaded\" });\n if (response && !response.ok()) throw new Error(`Browser navigation failed: HTTP ${response.status()} (${page.url()}).`);\n return this.#snapshot(session, page);\n });\n }\n\n snapshot(runId: string, signal?: AbortSignal): Promise<BrowserStep<BrowserSnapshot>> {\n return this.#perform(runId, signal, (session, page) => this.#snapshot(session, page));\n }\n\n viewport(runId: string, viewport: BrowserViewport, signal?: AbortSignal): Promise<BrowserStep<BrowserSnapshot>> {\n return this.#perform(runId, signal, async (session, page) => {\n await page.setViewportSize(viewport);\n return this.#snapshot(session, page);\n });\n }\n\n click(runId: string, target: BrowserTarget, signal?: AbortSignal): Promise<BrowserStep<BrowserSnapshot>> {\n return this.#action(runId, target, signal, (locator) => locator.click());\n }\n\n fill(runId: string, target: BrowserTarget, value: string, signal?: AbortSignal): Promise<BrowserStep<BrowserSnapshot>> {\n return this.#action(runId, target, signal, (locator) => locator.fill(value));\n }\n\n select(runId: string, target: BrowserTarget, label: string, signal?: AbortSignal): Promise<BrowserStep<BrowserSnapshot>> {\n return this.#action(runId, target, signal, (locator) => locator.selectOption({ label }));\n }\n\n press(runId: string, target: BrowserTarget, key: string, signal?: AbortSignal): Promise<BrowserStep<BrowserSnapshot>> {\n return this.#action(runId, target, signal, (locator) => locator.press(key));\n }\n\n check(runId: string, input: BrowserCheck, signal?: AbortSignal): Promise<BrowserStep<BrowserCheckResult>> {\n return this.#perform(runId, signal, async (session, page) => {\n session.checked = false;\n if (!input.target && input.text === undefined && input.url === undefined && input.noErrors !== true) {\n throw new Error(\"browser_check needs at least target, text, url or noErrors: true.\");\n }\n if (input.count !== undefined && (!input.target || input.target.nth !== undefined || input.target.first)) {\n throw new Error(\"count in browser_check needs a target without nth or first and counts its visible matches.\");\n }\n const timeout = this.#options.checkTimeoutMs;\n const assertions: string[] = [];\n if (input.target && input.count !== undefined) {\n const visible = browserLocator(page, input.target).filter({ visible: true });\n const found = await this.#waitForCount(visible, input.count, timeout);\n if (found !== input.count) throw new Error(`Expected ${input.count} visible matches, found ${found}.`);\n assertions.push(`${input.count} visible matches`);\n } else if (input.target) {\n const locator = browserLocator(page, input.target);\n await locator.waitFor({ state: \"visible\", timeout }).catch(withAmbiguityHint);\n assertions.push(\"Target is visible\");\n if (input.text !== undefined) {\n try { await locator.filter({ hasText: input.text }).waitFor({ state: \"visible\", timeout }); }\n catch (error) { throw new Error(`Expected text is missing in the target: ${input.text}`, { cause: error }); }\n assertions.push(`Text in target: ${input.text}`);\n }\n } else if (input.text !== undefined) {\n await page.getByText(input.text, { exact: false }).first().waitFor({ state: \"visible\", timeout });\n assertions.push(`Visible text: ${input.text}`);\n }\n if (input.url !== undefined) {\n await page.waitForURL(input.url, { timeout });\n assertions.push(`Address: ${input.url}`);\n }\n if (input.noErrors !== false) {\n if (session.errors.length > 0) throw new Error(`Browser errors: ${session.errors.join(\"\\n\")}`);\n assertions.push(\"No captured browser or network errors since the navigation\");\n }\n session.checked = true;\n return { url: page.url(), assertions };\n });\n }\n\n /** Captures the page as PNG and returns it Base64-encoded; the page remembers `id` as the current screenshot. */\n screenshot(runId: string, id: string, fullPage: boolean, signal?: AbortSignal): Promise<BrowserStep<string>> {\n return this.#perform(runId, signal, async (session, page) => {\n const image = await page.screenshot({ fullPage, type: \"png\", timeout: this.#options.timeoutMs });\n session.screenshots.push(id);\n return image.toString(\"base64\");\n });\n }\n\n /** The page state without waiting for running actions; `null` without an open page. */\n state(runId: string): BrowserPageState | null {\n const session = this.#sessions.get(runId);\n return session && !session.closed && session.page ? this.#stateOf(session, session.page) : null;\n }\n\n async close(runId: string): Promise<void> {\n const session = this.#sessions.get(runId);\n if (!session) return;\n session.closed = true;\n this.#sessions.delete(runId);\n const browser = await session.browser.catch(() => undefined);\n if (browser) await browser.close();\n await session.queue;\n }\n\n /** Closes every browser; afterwards none starts anymore because nobody would close it. */\n async shutdown(): Promise<void> {\n this.#shutDown = true;\n const results = await Promise.allSettled([...this.#sessions.keys()].map((runId) => this.close(runId)));\n const failed = results.find((result): result is PromiseRejectedResult => result.status === \"rejected\");\n if (failed) throw failed.reason;\n }\n\n #start(runId: string, viewport: BrowserViewport): void {\n const session: BrowserSession = {\n browser: this.#launch(runId),\n viewport,\n queue: Promise.resolve(),\n closed: false,\n checked: false,\n errors: [],\n failedRequests: new Set(),\n screenshots: [],\n };\n this.#sessions.set(runId, session);\n void session.browser.catch(() => {\n session.closed = true;\n if (this.#sessions.get(runId) === session) this.#sessions.delete(runId);\n });\n }\n\n async #launch(runId: string): Promise<Browser> {\n return this.#options.launch(runId);\n }\n\n async #waitForCount(locator: Locator, expected: number, timeout: number): Promise<number> {\n const deadline = Date.now() + timeout;\n let found = await locator.count();\n while (found !== expected && Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n found = await locator.count();\n }\n return found;\n }\n\n #resetEvidence(session: BrowserSession): void {\n session.checked = false;\n session.screenshots = [];\n session.errors = [];\n session.failedRequests = new Set();\n }\n\n async #page(session: BrowserSession): Promise<Page> {\n if (session.closed) throw new Error(\"The browser was closed.\");\n if (session.page) return session.page;\n const browser = await session.browser;\n if (session.closed) throw new Error(\"The browser was closed.\");\n const context = await browser.newContext({ viewport: session.viewport });\n context.setDefaultTimeout(this.#options.timeoutMs);\n context.setDefaultNavigationTimeout(this.#options.timeoutMs);\n const page = await context.newPage();\n const addError = (text: string) => {\n session.errors.push(text.slice(0, 2000));\n if (session.errors.length > 100) session.errors.shift();\n };\n const addRequestError = (url: string, text: string) => {\n if (session.failedRequests.has(url)) return;\n session.failedRequests.add(url);\n addError(text);\n };\n page.on(\"console\", (message) => {\n if (message.type() !== \"error\") return;\n const source = message.text().startsWith(\"Failed to load resource\") ? message.location().url : \"\";\n if (source) addRequestError(source, `Console: ${message.text()} (${source})`);\n else addError(`Console: ${message.text()}`);\n });\n page.on(\"pageerror\", (error) => addError(`JavaScript: ${error.message}`));\n page.on(\"requestfailed\", (request) => addRequestError(request.url(), `Network: ${request.method()} ${request.url()} ${request.failure()?.errorText}`));\n page.on(\"response\", (response) => { if (response.status() >= 400) addRequestError(response.url(), `HTTP ${response.status()}: ${response.url()}`); });\n page.on(\"framenavigated\", (frame) => { if (frame === page.mainFrame()) this.#resetEvidence(session); });\n page.on(\"popup\", (popup) => {\n addError(`The application opened a new window: ${popup.url()}. Popups are not operated.`);\n void popup.close().catch((error) => addError(`Closing window: ${errorText(error)}`));\n });\n session.page = page;\n return page;\n }\n\n #perform<T>(runId: string, signal: AbortSignal | undefined, action: (session: BrowserSession, page: Page) => Promise<T>): Promise<BrowserStep<T>> {\n if (this.#shutDown) return Promise.reject(endedError());\n const session = this.#sessions.get(runId);\n if (!session || session.closed) return Promise.reject(new Error(\"No browser is open for this run. Call browser_open first.\"));\n const pending = session.queue.then(async () => {\n signal?.throwIfAborted();\n const abort = () => { void this.close(runId).catch((error) => console.error(\"Browser stop failed:\", errorText(error))); };\n signal?.addEventListener(\"abort\", abort, { once: true });\n try {\n const page = await this.#page(session);\n signal?.throwIfAborted();\n const result = await action(session, page);\n signal?.throwIfAborted();\n if (session.closed) throw new Error(\"The browser was closed.\");\n return { result, page: this.#stateOf(session, page) };\n } finally {\n signal?.removeEventListener(\"abort\", abort);\n }\n });\n session.queue = pending.then(() => undefined, () => undefined);\n return pending;\n }\n\n #action(runId: string, target: BrowserTarget, signal: AbortSignal | undefined, action: (locator: Locator) => Promise<unknown>): Promise<BrowserStep<BrowserSnapshot>> {\n return this.#perform(runId, signal, async (session, page) => {\n session.checked = false;\n session.screenshots = [];\n await action(browserLocator(page, target)).catch(withAmbiguityHint);\n return this.#snapshot(session, page);\n });\n }\n\n #stateOf(session: BrowserSession, page: Page): BrowserPageState {\n return { url: page.url(), checked: session.checked, errors: [...session.errors], screenshots: [...session.screenshots] };\n }\n\n async #snapshot(session: BrowserSession, page: Page): Promise<BrowserSnapshot> {\n const snapshot = await page.locator(\"body\").ariaSnapshot({ mode: \"ai\", timeout: this.#options.timeoutMs });\n return { url: page.url(), title: await page.title(), snapshot: snapshot.slice(0, maxSnapshotLength),\n truncated: snapshot.length > maxSnapshotLength, errors: [...session.errors] };\n }\n}\n", "import { constants } from \"node:fs\";\nimport { access } from \"node:fs/promises\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Browser } from \"playwright-core\";\nimport type { WorkspaceExecutorMachine } from \"@ragents/workspace-executor\";\nimport { BROWSER_EXECUTABLE_VARIABLE } from \"./contract.js\";\n\ntype Playwright = typeof import(\"playwright-core\");\n\n/** playwright-core lives in the node_modules of this machine's host and is loaded only on call, never with the contribution. */\nexport const hostPlaywright = async (machine: WorkspaceExecutorMachine, hostRoot: string | undefined): Promise<Playwright> => {\n const loaded = await import(pathToFileURL(machine.hostPackageFile(hostRoot, \"playwright-core\")).href) as { default: Playwright };\n return loaded.default;\n};\n\n/** This machine's Chrome: the one from its environment, otherwise the Chromium that provisioning fetches for playwright-core. */\nexport const browserExecutable = async (playwright: Playwright, environment: NodeJS.ProcessEnv = process.env): Promise<string> => {\n const configured = environment[BROWSER_EXECUTABLE_VARIABLE];\n const candidate = configured ? configured : playwright.chromium.executablePath();\n if (await access(candidate, constants.X_OK).then(() => true, () => false)) return candidate;\n throw new Error((configured\n ? `${BROWSER_EXECUTABLE_VARIABLE} names ${configured}; there is no executable browser there on this machine. `\n : `There is no executable browser on this machine: ${BROWSER_EXECUTABLE_VARIABLE} is not set and Chromium is missing at ${candidate}. `)\n + \"A workspace fetches Chromium with pnpm provision --workspace, a server with pnpm provision <profile>; \"\n + `${BROWSER_EXECUTABLE_VARIABLE} names an existing Chrome, on a server in the profile section ragents.browser, `\n + \"on a workspace in its environment.\");\n};\n\n/** Starts Chrome headless with this machine's environment and the run's marker so the process view can attribute it. */\nexport const launchChromium = async (machine: WorkspaceExecutorMachine, hostRoot: string | undefined, runId: string, timeoutMs: number): Promise<Browser> => {\n const playwright = await hostPlaywright(machine, hostRoot);\n return playwright.chromium.launch({\n executablePath: await browserExecutable(playwright),\n headless: true,\n timeout: timeoutMs,\n env: machine.processEnvironment(runId),\n });\n};\n", "import type { Browser } from \"playwright-core\";\nimport type { WorkspaceExecutorMachine, WorkspaceModuleFactory } from \"@ragents/workspace-executor\";\nimport { BROWSER_OPERATIONS, type BrowserCheck, type BrowserTarget, type BrowserViewport } from \"./contract.js\";\nimport { BrowserPages } from \"./pages.js\";\nimport { launchChromium } from \"./playwright.js\";\n\nconst BROWSER_TIMEOUT_MS = 15_000;\n\nexport interface BrowserModuleOptions {\n /** Starts a run's browser; if omitted, Chrome via playwright-core from this machine's host. */\n launch?: (runId: string) => Promise<Browser>;\n timeoutMs?: number;\n checkTimeoutMs?: number;\n}\n\n/** A run's browser on this machine: page, actions, checks and screenshots; the caller holds evidence and storage. */\nexport const browserModule = (machine: WorkspaceExecutorMachine, options: BrowserModuleOptions = {}): WorkspaceModuleFactory => (host) => {\n const invalid = (message: string): Error => machine.operationError(\"browser-input-invalid\", message, 400);\n const fieldsOf = (input: unknown): Readonly<Record<string, unknown>> => {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) throw invalid(\"The input of a browser operation is an object\");\n return input as Readonly<Record<string, unknown>>;\n };\n const textOf = (input: unknown, key: string): string => {\n const value = fieldsOf(input)[key];\n if (typeof value !== \"string\") throw invalid(`The browser operation needs ${key} as text`);\n return value;\n };\n const targetOf = (input: unknown): BrowserTarget => {\n const value = fieldsOf(input).target;\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) throw invalid(\"The browser operation needs a target\");\n return value as BrowserTarget;\n };\n const viewportOf = (input: unknown): BrowserViewport => {\n const { width, height } = fieldsOf(input);\n if (typeof width !== \"number\" || typeof height !== \"number\" || !Number.isInteger(width) || !Number.isInteger(height) || width <= 0 || height <= 0) {\n throw invalid(\"A viewport needs width and height as positive integers\");\n }\n return { width, height };\n };\n const timeoutMs = options.timeoutMs ?? BROWSER_TIMEOUT_MS;\n const pages = new BrowserPages({\n launch: options.launch ?? (async (runId) => launchChromium(machine, (await host.contextFor(runId)).hostRoot, runId, timeoutMs)),\n timeoutMs,\n checkTimeoutMs: options.checkTimeoutMs ?? Math.min(5_000, timeoutMs),\n });\n return {\n operations: {\n [BROWSER_OPERATIONS.open]: ({ runId, input, signal }) =>\n pages.open(runId, textOf(input, \"url\"), viewportOf(fieldsOf(input).viewport), signal),\n [BROWSER_OPERATIONS.snapshot]: ({ runId, signal }) => pages.snapshot(runId, signal),\n [BROWSER_OPERATIONS.viewport]: ({ runId, input, signal }) => pages.viewport(runId, viewportOf(input), signal),\n [BROWSER_OPERATIONS.click]: ({ runId, input, signal }) => pages.click(runId, targetOf(input), signal),\n [BROWSER_OPERATIONS.fill]: ({ runId, input, signal }) => pages.fill(runId, targetOf(input), textOf(input, \"value\"), signal),\n [BROWSER_OPERATIONS.select]: ({ runId, input, signal }) => pages.select(runId, targetOf(input), textOf(input, \"label\"), signal),\n [BROWSER_OPERATIONS.press]: ({ runId, input, signal }) => pages.press(runId, targetOf(input), textOf(input, \"key\"), signal),\n [BROWSER_OPERATIONS.check]: ({ runId, input, signal }) => pages.check(runId, fieldsOf(input) as BrowserCheck, signal),\n [BROWSER_OPERATIONS.screenshot]: ({ runId, input, signal }) =>\n pages.screenshot(runId, textOf(input, \"id\"), fieldsOf(input).fullPage === true, signal),\n [BROWSER_OPERATIONS.state]: async ({ runId }) => pages.state(runId),\n [BROWSER_OPERATIONS.close]: async ({ runId }) => {\n await pages.close(runId);\n return null;\n },\n },\n stopRun: (runId) => pages.close(runId),\n shutdown: () => pages.shutdown(),\n };\n};\n", "import type { WorkspaceExecutorContribution } from \"@ragents/workspace-executor\";\nimport { browserModule } from \"./module.js\";\n\n/** The browser runs where the run's workspace lives: in the server's executor or in the workspace's. */\nexport const executor: WorkspaceExecutorContribution = (machine) => ({ modules: [browserModule(machine)] });\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
},
|
|
32
32
|
"web": {}
|
|
33
33
|
},
|
|
34
|
-
"stand": "
|
|
35
|
-
"sourceStand": "
|
|
34
|
+
"stand": "333c6a9b57576a4ab95556e201da67ed864acdf02787ce5edbd653e7beba6020",
|
|
35
|
+
"sourceStand": "f898635fb2a9873568fe23da263a7794339e9e0bf990b485d32b4efb555454e1",
|
|
36
36
|
"server": "server/index.js",
|
|
37
37
|
"executor": "executor/index.mjs",
|
|
38
38
|
"exports": {
|
package/bundles/ragents.browser/server/chunks/{chunk-CWLX4VA5.js.map → chunk-PYEISBNE.js.map}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../plugins/ragents.browser/server/contract.ts"],
|
|
4
|
-
"sourcesContent": ["import { serviceToken } from \"@ragents/engine\";\nimport type { BrowserSnapshot } from \"../executor/contract.js\";\n\nexport type { BrowserSnapshot, BrowserTarget } from \"../executor/contract.js\";\n\nexport interface BrowserEvidence {\n checkedAt?: string;\n url?: string;\n screenshots: { name: string; url: string }[];\n currentScreenshots: { name: string; url: string }[];\n errors: string[];\n}\n\n/**
|
|
4
|
+
"sourcesContent": ["import { serviceToken } from \"@ragents/engine\";\nimport type { BrowserSnapshot } from \"../executor/contract.js\";\n\nexport type { BrowserSnapshot, BrowserTarget } from \"../executor/contract.js\";\n\nexport interface BrowserEvidence {\n checkedAt?: string;\n url?: string;\n screenshots: { name: string; url: string }[];\n currentScreenshots: { name: string; url: string }[];\n errors: string[];\n}\n\n/** Who triggers an operation on the page: for a tool call its id, plus the abort signal. */\nexport interface BrowserCallOptions {\n signal?: AbortSignal;\n toolCallId?: string;\n}\n\nexport interface BrowserRuntime {\n open: (runId: string, url: string, options?: BrowserCallOptions) => Promise<BrowserSnapshot>;\n evidence: (runId: string) => BrowserEvidence;\n}\n\nexport const browserRuntimeToken = serviceToken<BrowserRuntime>(\"ragents.browser.runtime\");\n"],
|
|
5
5
|
"mappings": ";;;;AAAA,SAAS,oBAAoB;AAwBtB,IAAM,sBAAsB,aAA6B,yBAAyB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -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
|
export {
|
|
7
7
|
browserRuntimeToken
|
|
8
8
|
};
|