@schlenkr/ragents 0.1.9 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/server/package.json +1 -1
- package/apps/server/src/access-projection.ts +9 -39
- package/apps/server/src/access-service.ts +3 -3
- package/apps/server/src/access-session.ts +19 -19
- package/apps/server/src/api/contracts.ts +32 -29
- package/apps/server/src/api/core-methods.ts +21 -19
- package/apps/server/src/api/delivery.ts +2 -2
- package/apps/server/src/api/reference.ts +27 -27
- package/apps/server/src/api/rights.ts +18 -18
- package/apps/server/src/chat-handler.ts +5 -5
- package/apps/server/src/config-definition.ts +37 -10
- package/apps/server/src/config-file.ts +49 -49
- package/apps/server/src/config.ts +2 -0
- package/apps/server/src/data-directory.ts +2 -2
- package/apps/server/src/external-access.ts +1 -1
- package/apps/server/src/folder-install.ts +1 -1
- package/apps/server/src/help-files.ts +1 -1
- package/apps/server/src/host-api.json +8 -1
- package/apps/server/src/host-api.ts +3 -2
- package/apps/server/src/host-record.ts +3 -3
- package/apps/server/src/host-resolution-hooks.mjs +4 -4
- package/apps/server/src/host-version.ts +17 -17
- package/apps/server/src/host-web.ts +5 -5
- package/apps/server/src/main.ts +6 -6
- package/apps/server/src/missing-environment.ts +6 -6
- package/apps/server/src/parent-watch.ts +4 -4
- package/apps/server/src/plugin-build/build.ts +31 -31
- package/apps/server/src/plugin-build/host-api-names.ts +7 -7
- package/apps/server/src/plugin-build/plugin-description.ts +15 -15
- package/apps/server/src/plugin-build/typecheck.ts +1 -1
- package/apps/server/src/plugin-support/actor-programs/app-project.ts +19 -19
- package/apps/server/src/plugin-support/actor-programs/client-compiler.ts +4 -4
- package/apps/server/src/plugin-support/actor-programs/client-contracts.ts +11 -11
- package/apps/server/src/plugin-support/actor-programs/contract.ts +17 -17
- package/apps/server/src/plugin-support/actor-programs/runtime-libraries.ts +1 -1
- package/apps/server/src/plugin-support/actor-programs/workflow/index.ts +5 -5
- package/apps/server/src/plugin-support/actor-programs/workflow/prompt-reader.ts +2 -2
- package/apps/server/src/plugin-support/chat-display-policy.ts +2 -2
- package/apps/server/src/plugin-support/front-matter.ts +6 -6
- package/apps/server/src/plugin-support/http.ts +2 -2
- package/apps/server/src/plugin-support/language-server/contract.ts +8 -8
- package/apps/server/src/plugin-support/language-server/plugin.ts +2 -2
- package/apps/server/src/plugin-support/language-server/snapshot-method.ts +1 -1
- package/apps/server/src/plugin-support/language-server/tools.ts +11 -11
- package/apps/server/src/plugin-support/model-aliases.ts +30 -20
- package/apps/server/src/plugin-support/model-choice.ts +15 -15
- package/apps/server/src/plugin-support/model-completion.ts +44 -23
- package/apps/server/src/plugin-support/model-providers.ts +170 -0
- package/apps/server/src/plugin-support/model-upstreams.ts +1 -1
- package/apps/server/src/plugin-support/native-typescript-child.ts +4 -4
- package/apps/server/src/plugin-support/native-typescript-executor.ts +12 -12
- package/apps/server/src/plugin-support/plugin-config.ts +3 -3
- package/apps/server/src/plugin-support/plugin-folder.ts +2 -2
- package/apps/server/src/plugin-support/plugins-root.ts +2 -2
- package/apps/server/src/plugin-support/process-sandbox.ts +48 -47
- package/apps/server/src/plugin-support/product-model-settings-contract.ts +3 -3
- package/apps/server/src/plugin-support/product-model-settings.ts +10 -10
- package/apps/server/src/plugin-support/product-relay.ts +9 -9
- package/apps/server/src/plugin-support/product-start-options.ts +4 -4
- package/apps/server/src/plugin-support/prompt.ts +1 -1
- package/apps/server/src/plugin-support/provision.ts +8 -8
- package/apps/server/src/plugin-support/run-scripts.ts +17 -17
- package/apps/server/src/plugin-support/skills.ts +18 -18
- package/apps/server/src/plugin-support/start-entries-contract.ts +17 -17
- package/apps/server/src/plugin-support/start-options-contract.ts +5 -5
- package/apps/server/src/plugin-support/system-prompts.ts +11 -11
- package/apps/server/src/plugin-support/thinking-level.ts +2 -2
- package/apps/server/src/plugin-support/tool-availability.ts +2 -2
- package/apps/server/src/plugin-support/workspace-ownership.ts +5 -5
- package/apps/server/src/plugin-support/workspace-sandbox-host.ts +37 -37
- package/apps/server/src/plugin-support/zip.ts +7 -7
- package/apps/server/src/profile/bundle-manifest.ts +17 -17
- package/apps/server/src/profile/compose.ts +12 -7
- package/apps/server/src/profile/plugin-discovery.ts +12 -12
- package/apps/server/src/profile/provisioning.ts +5 -5
- package/apps/server/src/profile-target.ts +10 -10
- package/apps/server/src/protocol.ts +2 -2
- package/apps/server/src/provider.ts +63 -58
- package/apps/server/src/ragents/actor-chat-history.ts +8 -8
- package/apps/server/src/ragents/chat-text-positions.ts +2 -2
- package/apps/server/src/ragents/coordinator.ts +2 -2
- package/apps/server/src/ragents/engine.ts +25 -24
- package/apps/server/src/ragents/global-chat.ts +14 -8
- package/apps/server/src/ragents/host-services.ts +6 -3
- package/apps/server/src/ragents/journal-chat-events.ts +1 -1
- package/apps/server/src/ragents/run-owner.ts +2 -2
- package/apps/server/src/ragents/session.ts +49 -49
- package/apps/server/src/ragents/typescript-tools.ts +12 -12
- package/apps/server/src/ragents/workspace-runtime.ts +28 -28
- package/apps/server/src/rpc/dispatcher.ts +19 -19
- package/apps/server/src/rpc/http-transport.ts +11 -11
- package/apps/server/src/rpc/stdio-transport.ts +3 -3
- package/apps/server/src/run-preparation-input.ts +5 -5
- package/apps/server/src/run-preparation.ts +24 -24
- package/apps/server/src/run-transfer.ts +39 -39
- package/apps/server/src/server.ts +51 -49
- package/apps/server/src/settings.ts +1 -1
- package/apps/server/src/startup.ts +3 -3
- package/apps/server/src/title-compactor.ts +9 -9
- package/apps/server/src/title-settings.ts +3 -3
- package/apps/server/src/web-bundles.ts +2 -2
- package/apps/server/src/web-stylesheet.ts +2 -2
- package/apps/web/dist/assets/{highlighted-body-KPVGNVTW-xXXhTDbh.js → highlighted-body-KPVGNVTW-BfNSGxjB.js} +1 -1
- package/apps/web/dist/assets/main-D6bsKcIK.js +11 -0
- package/apps/web/dist/assets/mermaid-HWGCJPDP-DROEqEeg.js +608 -0
- package/apps/web/dist/assets/runPanel-Dumuuqry.js +21 -0
- package/apps/web/dist/help/guide-access.html +5 -5
- package/apps/web/dist/help/guide-access.md +2 -2
- package/apps/web/dist/help/guide-clients.html +64 -55
- package/apps/web/dist/help/guide-clients.md +62 -52
- package/apps/web/dist/help/guide-distributed.html +12 -7
- package/apps/web/dist/help/guide-distributed.md +9 -4
- package/apps/web/dist/help/guide-functions.html +3 -3
- package/apps/web/dist/help/guide-getting-started.html +24 -15
- package/apps/web/dist/help/guide-getting-started.md +22 -12
- package/apps/web/dist/help/guide-ideas.html +3 -3
- package/apps/web/dist/help/guide-plugins.html +5 -4
- package/apps/web/dist/help/guide-plugins.md +2 -1
- package/apps/web/dist/help/guide-programs.html +3 -3
- package/apps/web/dist/help/guide-runtime.html +6 -6
- package/apps/web/dist/help/guide-runtime.md +3 -3
- package/apps/web/dist/help/guide.html +3 -3
- package/apps/web/dist/help/index.html +1997 -942
- package/apps/web/dist/help/mini-app.css +30 -0
- package/apps/web/dist/help/mini-app.js +14 -14
- package/apps/web/dist/host-web.json +90 -90
- package/apps/web/dist/index.html +3 -3
- package/apps/web/dist/run-panel.html +3 -3
- package/apps/web/package.json +1 -1
- package/apps/web/src/AccessContext.tsx +15 -15
- package/apps/web/src/App.tsx +13 -13
- package/apps/web/src/DiffCode.tsx +2 -2
- package/apps/web/src/HelpDialog.tsx +3 -3
- package/apps/web/src/Overview.tsx +13 -13
- package/apps/web/src/PluginActivation.ts +1 -1
- package/apps/web/src/PluginChat.tsx +15 -15
- package/apps/web/src/PluginFailureNotice.tsx +1 -1
- package/apps/web/src/PluginRegistry.tsx +44 -44
- package/apps/web/src/RunPreparationChat.tsx +11 -11
- package/apps/web/src/RunStore.ts +1 -1
- package/apps/web/src/SessionList.tsx +14 -14
- package/apps/web/src/SettingsModal.tsx +112 -112
- package/apps/web/src/StartOptions.tsx +11 -11
- package/apps/web/src/StartSelection.tsx +11 -11
- package/apps/web/src/StartTiles.tsx +8 -8
- package/apps/web/src/SurfaceShortcuts.tsx +3 -3
- package/apps/web/src/ThemeSettings.tsx +8 -8
- package/apps/web/src/TitleModelSettings.tsx +13 -13
- package/apps/web/src/WorkspacePanel.tsx +9 -9
- package/apps/web/src/access-session.ts +4 -4
- package/apps/web/src/access-token.ts +5 -5
- package/apps/web/src/actor-conversation.ts +3 -3
- package/apps/web/src/actor-programs/client-ui/DataTable.tsx +8 -8
- package/apps/web/src/actor-programs/client-ui/FilePicker.tsx +4 -4
- package/apps/web/src/actor-programs/client-ui/FlowDiagram.tsx +13 -13
- package/apps/web/src/actor-programs/client-ui/Viewers.tsx +4 -4
- package/apps/web/src/actor-programs/client-ui/WorkflowDiagram.tsx +1 -1
- package/apps/web/src/actor-programs/client-ui/file-contracts.d.ts +4 -4
- package/apps/web/src/actor-programs/client-ui/file-selection.ts +1 -1
- package/apps/web/src/actor-programs/client-ui/viewer-contracts.d.ts +3 -3
- package/apps/web/src/api.ts +7 -7
- package/apps/web/src/chat/StoppedActorNotice.tsx +5 -5
- package/apps/web/src/chat/chat-target.ts +3 -3
- package/apps/web/src/chat/requests.ts +2 -2
- package/apps/web/src/chat/useAttachmentCapabilities.ts +2 -2
- package/apps/web/src/chat-view-settings.tsx +5 -6
- package/apps/web/src/diff-view.css +1 -1
- package/apps/web/src/highlighting.css +1 -1
- package/apps/web/src/language-server/language-server-plugin.tsx +30 -30
- package/apps/web/src/lib/labels.ts +6 -6
- package/apps/web/src/main.tsx +4 -4
- package/apps/web/src/offered-machines.ts +2 -2
- package/apps/web/src/page-opener.tsx +1 -1
- package/apps/web/src/panel/ConnectionsPage.tsx +26 -23
- package/apps/web/src/panel/LoginForm.tsx +6 -6
- package/apps/web/src/panel/PanelDialogs.tsx +22 -22
- package/apps/web/src/panel/PanelHeader.tsx +2 -2
- package/apps/web/src/panel/PanelPage.tsx +1 -1
- package/apps/web/src/panel/RunLine.tsx +4 -4
- package/apps/web/src/panel/RunsPage.tsx +15 -15
- package/apps/web/src/panel/StartPage.tsx +29 -26
- package/apps/web/src/panel/connection-state.ts +9 -9
- package/apps/web/src/panel/contract.ts +34 -27
- package/apps/web/src/panel.tsx +1 -1
- package/apps/web/src/plugin-bootstrap.ts +5 -5
- package/apps/web/src/product/ModelControl.tsx +3 -3
- package/apps/web/src/product/ProductModelSettings.tsx +16 -16
- package/apps/web/src/product/SystemPromptControl.tsx +11 -11
- package/apps/web/src/product/model-settings.ts +2 -2
- package/apps/web/src/rpc/client.ts +16 -16
- package/apps/web/src/rpc.ts +1 -1
- package/apps/web/src/run-overview.ts +1 -1
- package/apps/web/src/run-panel/RunPanelApp.tsx +39 -39
- package/apps/web/src/run-panel/RunPanelHeader.tsx +6 -6
- package/apps/web/src/run-panel/RunPanelMenu.tsx +6 -6
- package/apps/web/src/run-panel/RunPanelRail.tsx +4 -4
- package/apps/web/src/run-panel/RunPanelWorkspace.tsx +3 -3
- package/apps/web/src/run-panel/clipboard.ts +3 -3
- package/apps/web/src/run-panel/host-contract.ts +5 -5
- package/apps/web/src/run-panel/host.ts +15 -15
- package/apps/web/src/run-panel/input-bridge.ts +1 -1
- package/apps/web/src/run-panel/run-panel-location.ts +5 -5
- package/apps/web/src/run-panel/use-session-list.ts +1 -1
- package/apps/web/src/run-panel/workspace-state.ts +3 -3
- package/apps/web/src/run-panel.tsx +4 -4
- package/apps/web/src/run-preparation.ts +2 -2
- package/apps/web/src/run-view.ts +3 -3
- package/apps/web/src/settings-contributions.ts +32 -32
- package/apps/web/src/theme.ts +9 -9
- package/apps/web/src/title-model-settings.ts +6 -6
- package/apps/web/src/ui/ListDetail.tsx +9 -9
- package/apps/web/src/ui/dialog.tsx +2 -2
- package/apps/web/src/ui/modal-controller.ts +3 -3
- package/apps/web/src/ui/modal.tsx +2 -2
- package/apps/web/src/ui/popover.tsx +1 -1
- package/apps/web/src/ui/relative-time.ts +8 -8
- package/apps/web/src/ui/startup-notice.tsx +2 -2
- package/apps/web/src/ui/state-icon.tsx +1 -1
- package/apps/web/src/ui/state-vocabulary.ts +16 -16
- package/apps/web/src/ui/stop-button.tsx +2 -2
- package/bundles/ragents.activity/ragents-bundle.json +2 -2
- package/bundles/ragents.activity/web/classes.json +1 -1
- package/bundles/ragents.activity/web/index.js +1 -1
- package/bundles/ragents.activity/web/index.js.map +2 -2
- package/bundles/ragents.actor-programs/ragents-bundle.json +2 -2
- package/bundles/ragents.actor-programs/server/index.js +256 -228
- package/bundles/ragents.actor-programs/server/index.js.map +4 -4
- package/bundles/ragents.actor-programs/web/classes.json +1 -1
- package/bundles/ragents.actor-programs/web/index.js +1 -1
- package/bundles/ragents.actor-programs/web/index.js.map +3 -3
- package/bundles/ragents.ask/ragents-bundle.json +2 -4
- package/bundles/ragents.ask/server/chunks/{chunk-PDJO75SQ.js → chunk-YOV27MAR.js} +2 -2
- package/bundles/ragents.ask/server/chunks/chunk-YOV27MAR.js.map +7 -0
- package/bundles/ragents.ask/server/exports/server/contract.js +1 -1
- package/bundles/ragents.ask/server/index.js +23 -23
- package/bundles/ragents.ask/server/index.js.map +2 -2
- package/bundles/ragents.ask/web/chunks/{chunk-WFN4374U.js → chunk-D6NNB5DS.js} +1 -1
- package/bundles/ragents.ask/web/chunks/chunk-D6NNB5DS.js.map +7 -0
- package/bundles/ragents.ask/web/chunks/{chunk-V7W3QDVS.js → chunk-IQBHK7MV.js} +2 -2
- package/bundles/ragents.ask/web/chunks/{chunk-V7W3QDVS.js.map → chunk-IQBHK7MV.js.map} +4 -4
- package/bundles/ragents.ask/web/chunks/chunk-PWFIAMX4.js +2 -0
- package/bundles/ragents.ask/web/chunks/chunk-PWFIAMX4.js.map +7 -0
- package/bundles/ragents.ask/web/chunks/chunk-QHGKEESD.js +2 -0
- package/bundles/ragents.ask/web/chunks/chunk-QHGKEESD.js.map +7 -0
- package/bundles/ragents.ask/web/classes.json +1 -1
- package/bundles/ragents.ask/web/exports/ask-payload.js +1 -1
- package/bundles/ragents.ask/web/exports/web/QuestionCard.js +1 -1
- package/bundles/ragents.ask/web/exports/web/api.js +1 -1
- package/bundles/ragents.ask/web/index.js +1 -1
- package/bundles/ragents.ask/web/index.js.map +4 -4
- package/bundles/ragents.browser/executor/index.mjs +35 -35
- package/bundles/ragents.browser/executor/index.mjs.map +2 -2
- package/bundles/ragents.browser/ragents-bundle.json +2 -2
- package/bundles/ragents.browser/server/chunks/{chunk-CWLX4VA5.js → chunk-PYEISBNE.js} +1 -1
- package/bundles/ragents.browser/server/chunks/{chunk-CWLX4VA5.js.map → chunk-PYEISBNE.js.map} +1 -1
- package/bundles/ragents.browser/server/exports/server/contract.js +1 -1
- package/bundles/ragents.browser/server/index.js +31 -31
- package/bundles/ragents.browser/server/index.js.map +2 -2
- package/bundles/ragents.browser/skills/browser-testing/SKILL.md +30 -30
- package/bundles/ragents.documents/prompt.hbs +1 -1
- package/bundles/ragents.documents/ragents-bundle.json +2 -2
- package/bundles/ragents.documents/server/chunks/{chunk-QIECRZ7C.js → chunk-KMZWOVTI.js} +3 -3
- package/bundles/ragents.documents/server/chunks/{chunk-QIECRZ7C.js.map → chunk-KMZWOVTI.js.map} +2 -2
- package/bundles/ragents.documents/server/exports/contract.js +1 -1
- package/bundles/ragents.documents/server/index.js +26 -26
- package/bundles/ragents.documents/server/index.js.map +2 -2
- package/bundles/ragents.documents/web/classes.json +1 -1
- package/bundles/ragents.documents/web/index.js +1 -1
- package/bundles/ragents.documents/web/index.js.map +3 -3
- package/bundles/ragents.lsp-fsharp/executor/index.mjs +4 -4
- package/bundles/ragents.lsp-fsharp/executor/index.mjs.map +2 -2
- package/bundles/ragents.lsp-fsharp/ragents-bundle.json +2 -2
- package/bundles/ragents.lsp-fsharp/server/index.js +5 -5
- package/bundles/ragents.lsp-fsharp/server/index.js.map +2 -2
- package/bundles/ragents.lsp-fsharp/web/index.js +1 -1
- package/bundles/ragents.lsp-fsharp/web/index.js.map +2 -2
- package/bundles/ragents.lsp-roslyn/executor/index.mjs +3 -3
- package/bundles/ragents.lsp-roslyn/executor/index.mjs.map +2 -2
- package/bundles/ragents.lsp-roslyn/ragents-bundle.json +2 -2
- package/bundles/ragents.lsp-roslyn/server/index.js +17 -17
- package/bundles/ragents.lsp-roslyn/server/index.js.map +2 -2
- package/bundles/ragents.lsp-roslyn/web/index.js +1 -1
- package/bundles/ragents.lsp-roslyn/web/index.js.map +2 -2
- package/bundles/ragents.lsp-typescript/executor/index.mjs +2 -2
- package/bundles/ragents.lsp-typescript/executor/index.mjs.map +2 -2
- package/bundles/ragents.lsp-typescript/ragents-bundle.json +2 -2
- package/bundles/ragents.lsp-typescript/server/index.js.map +1 -1
- package/bundles/ragents.lsp-typescript/web/index.js +1 -1
- package/bundles/ragents.lsp-typescript/web/index.js.map +2 -2
- package/bundles/ragents.model-relay/ragents-bundle.json +7 -3
- package/bundles/ragents.model-relay/server/index.js +25 -21
- package/bundles/ragents.model-relay/server/index.js.map +2 -2
- package/bundles/ragents.orchestration/ragents-bundle.json +2 -2
- package/bundles/ragents.orchestration/server/index.js +28 -28
- package/bundles/ragents.orchestration/server/index.js.map +2 -2
- package/bundles/ragents.orchestration/web/chunks/{chunk-OSKPH6SZ.js → chunk-CFMJD5ZI.js} +2 -2
- package/bundles/ragents.orchestration/web/chunks/chunk-HOBLI364.js +2 -0
- package/bundles/ragents.orchestration/web/chunks/{chunk-OQYCNYXN.js.map → chunk-HOBLI364.js.map} +2 -2
- package/bundles/ragents.orchestration/web/chunks/{chunk-ODMMQGX2.js → chunk-UCIMT2R4.js} +2 -2
- package/bundles/ragents.orchestration/web/classes.json +1 -1
- package/bundles/ragents.orchestration/web/exports/web/program-slot.js +1 -1
- package/bundles/ragents.orchestration/web/exports/web/surface-entities.js +1 -1
- package/bundles/ragents.orchestration/web/index.js +8 -8
- package/bundles/ragents.orchestration/web/index.js.map +3 -3
- package/bundles/ragents.overseer/ragents-bundle.json +2 -2
- package/bundles/ragents.overseer/server/index.js +99 -99
- package/bundles/ragents.overseer/server/index.js.map +2 -2
- package/bundles/ragents.overseer/web/classes.json +1 -1
- package/bundles/ragents.overseer/web/index.js +1 -1
- package/bundles/ragents.overseer/web/index.js.map +2 -2
- package/bundles/ragents.processes/ragents-bundle.json +2 -2
- package/bundles/ragents.processes/server/index.js +11 -11
- package/bundles/ragents.processes/server/index.js.map +2 -2
- package/bundles/ragents.processes/web/classes.json +1 -1
- package/bundles/ragents.processes/web/index.js +3 -3
- package/bundles/ragents.processes/web/index.js.map +2 -2
- package/bundles/ragents.product/ragents-bundle.json +2 -2
- package/bundles/ragents.product/server/index.js +12 -13
- package/bundles/ragents.product/server/index.js.map +2 -2
- package/bundles/ragents.product/web/classes.json +1 -1
- package/bundles/ragents.product/web/index.js +1 -1
- package/bundles/ragents.product/web/index.js.map +2 -2
- package/bundles/ragents.profile-distribution/ragents-bundle.json +2 -2
- package/bundles/ragents.profile-distribution/server/index.js +31 -31
- package/bundles/ragents.profile-distribution/server/index.js.map +2 -2
- package/bundles/ragents.reference/ragents-bundle.json +2 -2
- package/bundles/ragents.reference/run-scripts/balcony-wizard/RUN.md +19 -19
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +2 -2
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +14 -14
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +2 -2
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +49 -49
- package/bundles/ragents.reference/run-scripts/balcony-wizard/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/balcony-wizard/src/server.ts +9 -9
- package/bundles/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +9 -9
- package/bundles/ragents.reference/run-scripts/conversation-circle/RUN.md +7 -7
- package/bundles/ragents.reference/run-scripts/conversation-circle/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/conversation-circle/src/server.ts +13 -13
- package/bundles/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +1 -1
- package/bundles/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +8 -8
- package/bundles/ragents.reference/run-scripts/learning-afternoon/RUN.md +16 -16
- package/bundles/ragents.reference/run-scripts/learning-afternoon/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -1
- package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +3 -3
- package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -1
- package/bundles/ragents.reference/run-scripts/learning-afternoon/src/server.ts +9 -9
- package/bundles/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +39 -39
- package/bundles/ragents.reference/run-scripts/moderated-round/RUN.md +7 -7
- package/bundles/ragents.reference/run-scripts/moderated-round/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/moderated-round/src/server.ts +9 -9
- package/bundles/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +1 -1
- package/bundles/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +6 -6
- package/bundles/ragents.reference/run-scripts/shared-actor-list/RUN.md +12 -12
- package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +2 -2
- package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +3 -3
- package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +4 -4
- package/bundles/ragents.reference/run-scripts/shared-actor-list/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/shared-actor-list/src/server.ts +11 -11
- package/bundles/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +1 -1
- package/bundles/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +13 -13
- package/bundles/ragents.reference/run-scripts/word-game/RUN.md +18 -18
- package/bundles/ragents.reference/run-scripts/word-game/package.json +2 -2
- package/bundles/ragents.reference/run-scripts/word-game/src/client.tsx +1 -1
- package/bundles/ragents.reference/run-scripts/word-game/src/contract.ts +2 -2
- package/bundles/ragents.reference/run-scripts/word-game/src/server.ts +16 -16
- package/bundles/ragents.reference/run-scripts/word-game/tests/program.test.ts +39 -39
- package/bundles/ragents.reference/skills/100-shared-actor-list/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/110-all-card-slots/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/150-editorial-workbench/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/160-learning-companion/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/170-photo-collection/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/180-decision-workbench/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/190-review-queue/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/20-circle-of-four/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/210-moderator-handover/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/220-actor-approval-list/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/230-shared-state-views/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/240-live-result-list/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/250-balcony-wizard/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/35-actor-input-fifo/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/40-subscription-matrix/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/50-subscription-removal/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/70-headless-counter/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/75-lsp-demo/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/80-actor-text-analysis/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/90-actor-notes/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/95-hello-world/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/decision-brief/SKILL.md +24 -24
- package/bundles/ragents.reference/skills/learning-sprint/SKILL.md +24 -24
- package/bundles/ragents.reference/web/classes.json +1 -1
- package/bundles/ragents.reference/web/index.js +1 -1
- package/bundles/ragents.reference/web/index.js.map +2 -2
- package/bundles/ragents.todo/ragents-bundle.json +2 -2
- package/bundles/ragents.todo/server/index.js +5 -5
- package/bundles/ragents.todo/server/index.js.map +2 -2
- package/bundles/ragents.todo/web/classes.json +1 -1
- package/bundles/ragents.todo/web/index.js +1 -1
- package/bundles/ragents.todo/web/index.js.map +2 -2
- package/bundles/ragents.transcript/ragents-bundle.json +2 -2
- package/bundles/ragents.transcript/server/index.js +11 -11
- package/bundles/ragents.transcript/server/index.js.map +2 -2
- package/bundles/ragents.watch/ragents-bundle.json +2 -2
- package/bundles/ragents.watch/server/index.js +48 -48
- package/bundles/ragents.watch/server/index.js.map +2 -2
- package/bundles/ragents.workspace/ragents-bundle.json +2 -2
- package/bundles/ragents.workspace/server/index.js +83 -81
- package/bundles/ragents.workspace/server/index.js.map +2 -2
- package/bundles/ragents.workspace/web/classes.json +1 -1
- package/bundles/ragents.workspace/web/index.js +1 -1
- package/bundles/ragents.workspace/web/index.js.map +2 -2
- package/package.json +4 -4
- package/packages/agent/dist/core/model-runtime.d.ts +7 -2
- package/packages/agent/dist/core/tools/bash.d.ts +1 -1
- package/packages/agent/dist/index.d.ts +1 -1
- package/packages/agent/dist/loop/agent-loop.d.ts +2 -2
- package/packages/agent/src/core/compaction/utils.ts +1 -1
- package/packages/agent/src/core/model-runtime.ts +45 -5
- package/packages/agent/src/core/tools/bash.ts +1 -1
- package/packages/agent/src/index.ts +1 -1
- package/packages/agent/src/loop/agent-loop.ts +2 -2
- package/packages/ai/dist/models.d.ts +1 -0
- package/packages/ai/dist/models.generated.d.ts +4544 -983
- package/packages/ai/dist/providers/openrouter.models.d.ts +4544 -983
- package/packages/ai/src/api/ai-sdk.ts +33 -7
- package/packages/ai/src/api-registry.ts +1 -1
- package/packages/ai/src/index.ts +2 -2
- package/packages/ai/src/models.generated.ts +1 -1
- package/packages/ai/src/models.ts +1 -1
- package/packages/ai/src/providers/openrouter.models.ts +3723 -550
- package/packages/ragents/src/access.ts +12 -12
- package/packages/ragents/src/agents/actor-input.ts +33 -33
- package/packages/ragents/src/agents/catalog.ts +1 -1
- package/packages/ragents/src/agents/delivery.ts +17 -17
- package/packages/ragents/src/agents/plugins.ts +1 -1
- package/packages/ragents/src/agents/scheduler.ts +7 -7
- package/packages/ragents/src/agents/schemas.ts +1 -1
- package/packages/ragents/src/agents/tool-orientation.ts +4 -4
- package/packages/ragents/src/agents/tools.ts +20 -20
- package/packages/ragents/src/agents/toolset.ts +5 -5
- package/packages/ragents/src/agents/workspaces.ts +1 -1
- package/packages/ragents/src/domain/events.ts +1 -1
- package/packages/ragents/src/domain/model.ts +5 -5
- package/packages/ragents/src/drivers/agent-runtime.ts +1 -1
- package/packages/ragents/src/drivers/agent-turn.ts +4 -4
- package/packages/ragents/src/drivers/agent.ts +2 -2
- package/packages/ragents/src/drivers/attachments.ts +4 -4
- package/packages/ragents/src/http/contracts.ts +14 -14
- package/packages/ragents/src/http/methods.ts +6 -6
- package/packages/ragents/src/index.ts +1 -0
- package/packages/ragents/src/plugin-host.ts +162 -116
- package/packages/ragents/src/plugin-types.ts +29 -10
- package/packages/ragents/src/rpc/contract.ts +5 -5
- package/packages/ragents/src/rpc/contribution.ts +2 -2
- package/packages/ragents/src/rpc/peer.ts +11 -11
- package/packages/ragents/src/rpc/protocol.ts +2 -2
- package/packages/ragents/src/runtime/decisions/turns.ts +1 -1
- package/packages/ragents/src/runtime/journal.ts +10 -10
- package/packages/ragents/src/runtime/orchestration.ts +8 -8
- package/packages/ragents/src/runtime/stop.ts +2 -2
- package/packages/ragents/src/script/mediators.ts +35 -35
- package/packages/ragents/src/typescript/async-compiler.ts +14 -14
- package/packages/ragents/src/typescript/compiler-worker.ts +2 -2
- package/packages/ragents/src/typescript/compiler.ts +7 -7
- package/packages/ragents/src/typescript/snippet.ts +5 -5
- package/packages/workspace-executor/src/bash-launch.ts +13 -13
- package/packages/workspace-executor/src/commands.ts +18 -18
- package/packages/workspace-executor/src/context.ts +15 -15
- package/packages/workspace-executor/src/contributions.ts +35 -35
- package/packages/workspace-executor/src/errors.ts +1 -1
- package/packages/workspace-executor/src/executor.ts +15 -15
- package/packages/workspace-executor/src/files.ts +30 -30
- package/packages/workspace-executor/src/language-server/contract.ts +2 -2
- package/packages/workspace-executor/src/language-server/diagnostics.ts +4 -4
- package/packages/workspace-executor/src/language-server/host.ts +35 -35
- package/packages/workspace-executor/src/language-server/json-rpc.ts +4 -4
- package/packages/workspace-executor/src/language-server/module.ts +11 -11
- package/packages/workspace-executor/src/language-server/roots.ts +3 -3
- package/packages/workspace-executor/src/language-server/session.ts +15 -15
- package/packages/workspace-executor/src/language-server/workspace-solutions.ts +2 -2
- package/packages/workspace-executor/src/managed-process.ts +35 -7
- package/packages/workspace-executor/src/module.ts +8 -8
- package/packages/workspace-executor/src/modules.ts +3 -3
- package/packages/workspace-executor/src/paths.ts +11 -11
- package/packages/workspace-executor/src/process-sandbox.ts +3 -3
- package/packages/workspace-executor/src/processes/module.ts +3 -3
- package/packages/workspace-executor/src/processes/process-table.ts +20 -20
- package/packages/workspace-executor/src/processes/scanner.ts +3 -3
- package/packages/workspace-executor/src/processes/snapshot.ts +2 -2
- package/packages/workspace-executor/src/processes/terminator.ts +13 -13
- package/packages/workspace-executor/src/run-folders.ts +3 -3
- package/packages/workspace-executor/src/safe-environment.ts +4 -4
- package/packages/workspace-executor/src/sandbox-tools.ts +37 -31
- package/packages/workspace-executor/src/session-ident.ts +2 -2
- package/packages/workspace-executor/src/shell-platform.ts +2 -2
- package/packages/workspace-executor/src/tools.ts +5 -5
- package/plugins/ragents.activity/web/ActivityHeader.tsx +3 -3
- package/plugins/ragents.activity/web/activity.ts +2 -2
- package/plugins/ragents.actor-programs/server/access-projections.ts +31 -0
- package/plugins/ragents.actor-programs/server/agent-tools.ts +2 -2
- package/plugins/ragents.actor-programs/server/capability-resolver.ts +3 -3
- package/plugins/ragents.actor-programs/server/controls-template.ts +46 -46
- package/plugins/ragents.actor-programs/server/controls-tool.ts +4 -4
- package/plugins/ragents.actor-programs/server/index.ts +2 -0
- package/plugins/ragents.actor-programs/server/limits.ts +3 -3
- package/plugins/ragents.actor-programs/server/methods.ts +1 -1
- package/plugins/ragents.actor-programs/server/project-diagnostics.ts +8 -8
- package/plugins/ragents.actor-programs/server/routes.ts +8 -8
- package/plugins/ragents.actor-programs/server/runtime.ts +90 -90
- package/plugins/ragents.actor-programs/server/templates.ts +59 -59
- package/plugins/ragents.actor-programs/server/test-report.ts +5 -5
- package/plugins/ragents.actor-programs/server/tool-contributor.ts +1 -1
- package/plugins/ragents.actor-programs/web/ActorViewFrame.tsx +17 -17
- package/plugins/ragents.actor-programs/web/AppsPanel.tsx +26 -26
- package/plugins/ragents.actor-programs/web/EmbeddedApps.tsx +3 -3
- package/plugins/ragents.actor-programs/web/FullscreenHost.tsx +2 -2
- package/plugins/ragents.actor-programs/web/FunctionForm.tsx +16 -16
- package/plugins/ragents.actor-programs/web/ProgramSource.tsx +5 -5
- package/plugins/ragents.actor-programs/web/api.ts +36 -36
- package/plugins/ragents.actor-programs/web/bridge.ts +8 -8
- package/plugins/ragents.actor-programs/web/chat-state.ts +4 -4
- package/plugins/ragents.actor-programs/web/context.ts +1 -1
- package/plugins/ragents.actor-programs/web/function-input.ts +6 -6
- package/plugins/ragents.actor-programs/web/index.tsx +1 -1
- package/plugins/ragents.actor-programs/web/program-state.ts +4 -4
- package/plugins/ragents.ask/ask-payload.ts +1 -1
- package/plugins/ragents.ask/contract.ts +5 -5
- package/plugins/ragents.ask/server/answer-method.ts +1 -1
- package/plugins/ragents.ask/server/ask-service.ts +9 -9
- package/plugins/ragents.ask/server/ask-tool.ts +10 -10
- package/plugins/ragents.ask/server/contract.ts +5 -5
- package/plugins/ragents.ask/web/AskActionView.tsx +1 -1
- package/plugins/ragents.ask/web/QuestionCard.tsx +22 -22
- package/plugins/ragents.ask/web/index.tsx +2 -8
- package/plugins/ragents.browser/executor/contract.ts +6 -6
- package/plugins/ragents.browser/executor/index.ts +1 -1
- package/plugins/ragents.browser/executor/module.ts +6 -6
- package/plugins/ragents.browser/executor/pages.ts +32 -32
- package/plugins/ragents.browser/executor/playwright.ts +8 -8
- package/plugins/ragents.browser/provision.ts +7 -7
- package/plugins/ragents.browser/server/browser.ts +14 -14
- package/plugins/ragents.browser/server/contract.ts +1 -1
- package/plugins/ragents.browser/server/index.ts +1 -1
- package/plugins/ragents.browser/server/tools.ts +14 -14
- package/plugins/ragents.browser/skills/browser-testing/SKILL.md +30 -30
- package/plugins/ragents.documents/contract.ts +2 -2
- package/plugins/ragents.documents/prompt.hbs +1 -1
- package/plugins/ragents.documents/server/document-write-tool.ts +12 -12
- package/plugins/ragents.documents/server/files-route.ts +6 -6
- package/plugins/ragents.documents/server/show-document-tool.ts +26 -26
- package/plugins/ragents.documents/server/store.ts +1 -1
- package/plugins/ragents.documents/web/DocumentViewer.tsx +37 -37
- package/plugins/ragents.documents/web/index.tsx +11 -11
- package/plugins/ragents.lsp-fsharp/executor.ts +7 -7
- package/plugins/ragents.lsp-fsharp/provision.ts +7 -7
- package/plugins/ragents.lsp-roslyn/executor.ts +5 -5
- package/plugins/ragents.lsp-roslyn/provision.ts +4 -4
- package/plugins/ragents.lsp-roslyn/server/index.ts +5 -5
- package/plugins/ragents.lsp-roslyn/server/solution-on-start.ts +13 -13
- package/plugins/ragents.lsp-typescript/executor.ts +3 -3
- package/plugins/ragents.model-relay/server/config.ts +6 -2
- package/plugins/ragents.model-relay/server/index.ts +2 -2
- package/plugins/ragents.model-relay/server/relay.ts +23 -22
- package/plugins/ragents.orchestration/contract.ts +8 -8
- package/plugins/ragents.orchestration/server/index.ts +4 -4
- package/plugins/ragents.orchestration/server/run-stop-tool.ts +3 -3
- package/plugins/ragents.orchestration/server/surface-tool.ts +5 -5
- package/plugins/ragents.orchestration/tiled-layout.ts +11 -11
- package/plugins/ragents.orchestration/web/ActorChat.tsx +2 -2
- package/plugins/ragents.orchestration/web/ActorChatControls.tsx +4 -4
- package/plugins/ragents.orchestration/web/ActorChatPreview.tsx +1 -1
- package/plugins/ragents.orchestration/web/ActorPopout.tsx +1 -1
- package/plugins/ragents.orchestration/web/ActorShortcut.tsx +6 -6
- package/plugins/ragents.orchestration/web/ActorSurfaceControls.tsx +15 -15
- package/plugins/ragents.orchestration/web/ActorTile.tsx +1 -1
- package/plugins/ragents.orchestration/web/Center.tsx +5 -5
- package/plugins/ragents.orchestration/web/DocumentsSection.tsx +2 -2
- package/plugins/ragents.orchestration/web/ExecutionsPanel.tsx +15 -15
- package/plugins/ragents.orchestration/web/FlowInspector.tsx +103 -103
- package/plugins/ragents.orchestration/web/JournalStatus.tsx +11 -11
- package/plugins/ragents.orchestration/web/MaterialBody.tsx +2 -2
- package/plugins/ragents.orchestration/web/StopRunButton.tsx +6 -6
- package/plugins/ragents.orchestration/web/TiledSurface.tsx +9 -9
- package/plugins/ragents.orchestration/web/actor-header-settings.ts +5 -5
- package/plugins/ragents.orchestration/web/constants.ts +2 -2
- package/plugins/ragents.orchestration/web/executions.ts +6 -6
- package/plugins/ragents.orchestration/web/format.ts +1 -1
- package/plugins/ragents.orchestration/web/index.tsx +2 -2
- package/plugins/ragents.orchestration/web/run-panel/AddresseeControl.tsx +7 -7
- package/plugins/ragents.orchestration/web/run-panel/AddresseeTree.tsx +8 -8
- package/plugins/ragents.orchestration/web/run-panel/RunPanel.tsx +29 -28
- package/plugins/ragents.orchestration/web/run-panel/RunPanelSettings.tsx +7 -7
- package/plugins/ragents.orchestration/web/run-panel/addressee-tree.ts +13 -13
- package/plugins/ragents.orchestration/web/run-panel/run-panel-actors.ts +3 -3
- package/plugins/ragents.orchestration/web/run-panel/run-panel-settings.ts +2 -2
- package/plugins/ragents.orchestration/web/run-panel/run-panel-startup.ts +3 -3
- package/plugins/ragents.orchestration/web/run-panel/run-panel-state.ts +7 -7
- package/plugins/ragents.orchestration/web/run-panel/sheet-status.ts +10 -10
- package/plugins/ragents.orchestration/web/surface-startup.ts +8 -8
- package/plugins/ragents.orchestration/web/surface-view-settings.ts +1 -1
- package/plugins/ragents.orchestration/web/tiled-view-settings.ts +1 -1
- package/plugins/ragents.overseer/contract.ts +20 -20
- package/plugins/ragents.overseer/server/api.ts +8 -8
- package/plugins/ragents.overseer/server/coordinator-prompt.ts +10 -10
- package/plugins/ragents.overseer/server/coordinator.ts +4 -4
- package/plugins/ragents.overseer/server/index.ts +24 -24
- package/plugins/ragents.overseer/server/orientation.ts +8 -8
- package/plugins/ragents.overseer/server/quick-answer.ts +9 -9
- package/plugins/ragents.overseer/server/run-directory.ts +5 -5
- package/plugins/ragents.overseer/server/settings.ts +6 -6
- package/plugins/ragents.overseer/server/user-location.ts +16 -16
- package/plugins/ragents.overseer/web/ModelSettings.tsx +9 -9
- package/plugins/ragents.overseer/web/index.tsx +20 -20
- package/plugins/ragents.overseer/web/model-settings.ts +1 -1
- package/plugins/ragents.overseer/web/quick-answers.ts +2 -2
- package/plugins/ragents.processes/contract.ts +5 -5
- package/plugins/ragents.processes/server/methods.ts +4 -4
- package/plugins/ragents.processes/server/observer.ts +8 -8
- package/plugins/ragents.processes/server/run-processes.ts +2 -2
- package/plugins/ragents.processes/web/ProcessHeader.tsx +10 -10
- package/plugins/ragents.processes/web/processes.ts +10 -10
- package/plugins/ragents.product/server/config.ts +1 -1
- package/plugins/ragents.product/server/index.ts +4 -4
- package/plugins/ragents.product/server/runtime.ts +9 -10
- package/plugins/ragents.product/web/index.tsx +1 -1
- package/plugins/ragents.profile-distribution/contract.ts +10 -10
- package/plugins/ragents.profile-distribution/server/archive.ts +20 -20
- package/plugins/ragents.profile-distribution/server/config.ts +2 -2
- package/plugins/ragents.profile-distribution/server/index.ts +4 -4
- package/plugins/ragents.reference/examples.ts +27 -27
- package/plugins/ragents.reference/run-scripts/balcony-wizard/RUN.md +19 -19
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +2 -2
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +14 -14
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +2 -2
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +49 -49
- package/plugins/ragents.reference/run-scripts/balcony-wizard/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/balcony-wizard/src/server.ts +9 -9
- package/plugins/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +9 -9
- package/plugins/ragents.reference/run-scripts/conversation-circle/RUN.md +7 -7
- package/plugins/ragents.reference/run-scripts/conversation-circle/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/conversation-circle/src/server.ts +13 -13
- package/plugins/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +1 -1
- package/plugins/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +8 -8
- package/plugins/ragents.reference/run-scripts/learning-afternoon/RUN.md +16 -16
- package/plugins/ragents.reference/run-scripts/learning-afternoon/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +3 -3
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/server.ts +9 -9
- package/plugins/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +39 -39
- package/plugins/ragents.reference/run-scripts/moderated-round/RUN.md +7 -7
- package/plugins/ragents.reference/run-scripts/moderated-round/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/moderated-round/src/server.ts +9 -9
- package/plugins/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +1 -1
- package/plugins/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +6 -6
- package/plugins/ragents.reference/run-scripts/shared-actor-list/RUN.md +12 -12
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +2 -2
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +3 -3
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +4 -4
- package/plugins/ragents.reference/run-scripts/shared-actor-list/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/shared-actor-list/src/server.ts +11 -11
- package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +1 -1
- package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +13 -13
- package/plugins/ragents.reference/run-scripts/word-game/RUN.md +18 -18
- package/plugins/ragents.reference/run-scripts/word-game/package.json +2 -2
- package/plugins/ragents.reference/run-scripts/word-game/src/client.tsx +1 -1
- package/plugins/ragents.reference/run-scripts/word-game/src/contract.ts +2 -2
- package/plugins/ragents.reference/run-scripts/word-game/src/server.ts +16 -16
- package/plugins/ragents.reference/run-scripts/word-game/tests/program.test.ts +39 -39
- package/plugins/ragents.reference/skills/100-shared-actor-list/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/110-all-card-slots/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/150-editorial-workbench/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/160-learning-companion/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/170-photo-collection/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/180-decision-workbench/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/190-review-queue/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/20-circle-of-four/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/210-moderator-handover/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/220-actor-approval-list/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/230-shared-state-views/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/240-live-result-list/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/250-balcony-wizard/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/35-actor-input-fifo/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/40-subscription-matrix/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/50-subscription-removal/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/70-headless-counter/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/75-lsp-demo/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/80-actor-text-analysis/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/90-actor-notes/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/95-hello-world/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/decision-brief/SKILL.md +24 -24
- package/plugins/ragents.reference/skills/learning-sprint/SKILL.md +24 -24
- package/plugins/ragents.reference/walkthroughs.ts +128 -128
- package/plugins/ragents.reference/web/StartGuides.tsx +23 -23
- package/plugins/ragents.todo/server/todo-tool.ts +6 -6
- package/plugins/ragents.todo/web/TodoSection.tsx +1 -1
- package/plugins/ragents.transcript/server/transcript.ts +11 -11
- package/plugins/ragents.watch/server/condition.ts +4 -4
- package/plugins/ragents.watch/server/functions.ts +27 -27
- package/plugins/ragents.watch/server/observation.ts +2 -2
- package/plugins/ragents.watch/server/service.ts +14 -14
- package/plugins/ragents.workspace/client/transport.ts +1 -1
- package/plugins/ragents.workspace/client/workspace-client.ts +62 -49
- package/plugins/ragents.workspace/contract.ts +46 -46
- package/plugins/ragents.workspace/server/binding.ts +20 -20
- package/plugins/ragents.workspace/server/browse-route.ts +8 -8
- package/plugins/ragents.workspace/server/clients.ts +42 -42
- package/plugins/ragents.workspace/server/config.ts +8 -5
- package/plugins/ragents.workspace/server/index.ts +5 -4
- package/plugins/ragents.workspace/server/runtime.ts +26 -26
- package/plugins/ragents.workspace/server/shell-platform.ts +1 -1
- package/plugins/ragents.workspace/web/FileBrowser.tsx +10 -10
- package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +24 -24
- package/plugins/ragents.workspace/web/index.tsx +1 -1
- package/ragents.config.core.ts +1 -1
- package/ragents.config.developer.ts +3 -3
- package/ragents.config.showcase.ts +2 -2
- package/scripts/agent/agent-cli.ts +96 -96
- package/scripts/agent/journal.ts +5 -5
- package/scripts/agent/turn-control.ts +4 -4
- package/scripts/package/build-package.ts +29 -29
- package/scripts/package/host-links.mjs +3 -3
- package/scripts/package/publish-package.ts +29 -29
- package/scripts/package/ragents.mjs +19 -19
- package/scripts/plugin/build-builtin-plugins.ts +5 -5
- package/scripts/plugin/plugin-cli.ts +14 -14
- package/scripts/provision/run-provision.ts +14 -15
- package/scripts/remote/connect.ts +46 -46
- package/scripts/remote/start.ts +18 -18
- package/scripts/workspace-client/run-workspace-client.ts +23 -23
- package/apps/web/dist/assets/main-C7JeZFjs.js +0 -6
- package/apps/web/dist/assets/mermaid-HWGCJPDP-DfsU5ofC.js +0 -478
- package/apps/web/dist/assets/runPanel-ZT6TPDLM.js +0 -21
- package/bundles/ragents.ask/server/chunks/chunk-PDJO75SQ.js.map +0 -7
- package/bundles/ragents.ask/web/chunks/chunk-4VXWWEG7.js +0 -2
- package/bundles/ragents.ask/web/chunks/chunk-4VXWWEG7.js.map +0 -7
- package/bundles/ragents.ask/web/chunks/chunk-VUBJDIKQ.js +0 -2
- package/bundles/ragents.ask/web/chunks/chunk-VUBJDIKQ.js.map +0 -7
- package/bundles/ragents.ask/web/chunks/chunk-WFN4374U.js.map +0 -7
- package/bundles/ragents.orchestration/web/chunks/chunk-OQYCNYXN.js +0 -2
- package/plugins/ragents.ask/web/QuestionSection.tsx +0 -48
- /package/bundles/ragents.orchestration/web/chunks/{chunk-OSKPH6SZ.js.map → chunk-CFMJD5ZI.js.map} +0 -0
- /package/bundles/ragents.orchestration/web/chunks/{chunk-ODMMQGX2.js.map → chunk-UCIMT2R4.js.map} +0 -0
|
@@ -18,7 +18,7 @@ export const FILE_OPERATIONS = {
|
|
|
18
18
|
attach: "files.attach",
|
|
19
19
|
} as const;
|
|
20
20
|
|
|
21
|
-
/**
|
|
21
|
+
/** The subfolder of the root in which attached files of a run are stored. */
|
|
22
22
|
export const ATTACHMENT_DIRECTORY = "attachments";
|
|
23
23
|
|
|
24
24
|
export interface FileEntry {
|
|
@@ -29,7 +29,7 @@ export interface FileEntry {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
export interface FileListing {
|
|
32
|
-
/**
|
|
32
|
+
/** The real path of the root on this machine. */
|
|
33
33
|
location: string;
|
|
34
34
|
path: string;
|
|
35
35
|
entries: FileEntry[];
|
|
@@ -40,7 +40,7 @@ export type FileText =
|
|
|
40
40
|
| { path: string; size: number; previewable: true; content: string }
|
|
41
41
|
| { path: string; size: number; previewable: false; reason: string };
|
|
42
42
|
|
|
43
|
-
/**
|
|
43
|
+
/** First `ready` once the watch is in place, then `changed` per debounced change. */
|
|
44
44
|
export type FileWatchProgress = { kind: "ready" } | { kind: "changed" };
|
|
45
45
|
|
|
46
46
|
export interface FileWatchListener {
|
|
@@ -57,11 +57,11 @@ const missing = (error: unknown): boolean => {
|
|
|
57
57
|
return code === "ENOENT" || code === "ENOTDIR";
|
|
58
58
|
};
|
|
59
59
|
|
|
60
|
-
/**
|
|
60
|
+
/** A path below a root: relative, separated by `/` and without `..`; `.` and empty segments are dropped. */
|
|
61
61
|
export const relativeWorkspacePath = (value: string): string => {
|
|
62
62
|
const segments = value.split("/").filter((segment) => segment !== "" && segment !== ".");
|
|
63
63
|
if (value.includes("\0") || value.includes("\\") || path.isAbsolute(value) || segments.includes("..")) {
|
|
64
|
-
throw invalid(`
|
|
64
|
+
throw invalid(`Invalid path: ${value}`);
|
|
65
65
|
}
|
|
66
66
|
return segments.join("/");
|
|
67
67
|
};
|
|
@@ -70,25 +70,25 @@ const realRoot = async (root: string): Promise<string> => {
|
|
|
70
70
|
try {
|
|
71
71
|
return await realpath(root);
|
|
72
72
|
} catch (error) {
|
|
73
|
-
if (missing(error)) throw notFound(`
|
|
73
|
+
if (missing(error)) throw notFound(`The folder ${root} does not exist`);
|
|
74
74
|
throw error;
|
|
75
75
|
}
|
|
76
76
|
};
|
|
77
77
|
|
|
78
|
-
/**
|
|
78
|
+
/** Resolves a checked relative path; a symlink must not lead out of the root. */
|
|
79
79
|
const inside = async (base: string, relative: string): Promise<string> => {
|
|
80
80
|
let real: string;
|
|
81
81
|
try {
|
|
82
82
|
real = await realpath(relative ? path.join(base, ...relative.split("/")) : base);
|
|
83
83
|
} catch (error) {
|
|
84
|
-
if (missing(error)) throw notFound(`
|
|
84
|
+
if (missing(error)) throw notFound(`Not found: ${relative || "."}`);
|
|
85
85
|
throw error;
|
|
86
86
|
}
|
|
87
|
-
if (!containsWorkspacePath(base, real)) throw invalid(`
|
|
87
|
+
if (!containsWorkspacePath(base, real)) throw invalid(`Path outside the working directory: ${relative}`);
|
|
88
88
|
return real;
|
|
89
89
|
};
|
|
90
90
|
|
|
91
|
-
/**
|
|
91
|
+
/** An entry that disappears between listing and querying no longer belongs to the folder. */
|
|
92
92
|
const entryOf = async (directory: string, name: string, isDirectory: boolean): Promise<FileEntry | undefined> => {
|
|
93
93
|
try {
|
|
94
94
|
const info = await lstat(path.join(directory, name));
|
|
@@ -105,15 +105,15 @@ const byKindThenName = (left: FileEntry, right: FileEntry): number =>
|
|
|
105
105
|
|
|
106
106
|
const directoryIn = async (base: string, checked: string): Promise<string> => {
|
|
107
107
|
const directory = await inside(base, checked);
|
|
108
|
-
if (!(await lstat(directory)).isDirectory()) throw invalid(`
|
|
108
|
+
if (!(await lstat(directory)).isDirectory()) throw invalid(`Not a directory: ${checked || "."}`);
|
|
109
109
|
return directory;
|
|
110
110
|
};
|
|
111
111
|
|
|
112
|
-
/**
|
|
112
|
+
/** The real path of a folder below the root, checked like every path of this module. */
|
|
113
113
|
export const workspaceDirectory = async (root: string, relative: string): Promise<string> =>
|
|
114
114
|
directoryIn(await realRoot(root), relativeWorkspacePath(relative));
|
|
115
115
|
|
|
116
|
-
/**
|
|
116
|
+
/** Lists a folder below the root: folders first, then alphabetically, at most `FILE_LIST_LIMIT` entries. */
|
|
117
117
|
export const listDirectory = async (root: string, relative: string): Promise<FileListing> => {
|
|
118
118
|
const checked = relativeWorkspacePath(relative);
|
|
119
119
|
const base = await realRoot(root);
|
|
@@ -130,26 +130,26 @@ export const listDirectory = async (root: string, relative: string): Promise<Fil
|
|
|
130
130
|
};
|
|
131
131
|
};
|
|
132
132
|
|
|
133
|
-
/**
|
|
133
|
+
/** Reads a text file below the root; a file that is too large or binary names the reason instead of the content. */
|
|
134
134
|
export const readTextFile = async (root: string, relative: string): Promise<FileText> => {
|
|
135
135
|
const checked = relativeWorkspacePath(relative);
|
|
136
136
|
const file = await inside(await realRoot(root), checked);
|
|
137
137
|
const info = await lstat(file);
|
|
138
|
-
if (!info.isFile()) throw invalid(`
|
|
138
|
+
if (!info.isFile()) throw invalid(`Not a file: ${checked || "."}`);
|
|
139
139
|
const described = { path: checked, size: info.size };
|
|
140
140
|
if (info.size > FILE_READ_LIMIT) {
|
|
141
|
-
return { ...described, previewable: false, reason: `
|
|
141
|
+
return { ...described, previewable: false, reason: `The file is larger than ${FILE_READ_LIMIT / 1024} KB and is not read` };
|
|
142
142
|
}
|
|
143
143
|
const content = await readFile(file);
|
|
144
|
-
if (content.includes(0)) return { ...described, previewable: false, reason: "
|
|
144
|
+
if (content.includes(0)) return { ...described, previewable: false, reason: "The file is binary" };
|
|
145
145
|
return { ...described, previewable: true, content: content.toString("utf8") };
|
|
146
146
|
};
|
|
147
147
|
|
|
148
|
-
/**
|
|
148
|
+
/** Stores an attached file under a free name in `attachments` below the root, never over an existing one. */
|
|
149
149
|
export const storeAttachment = async (root: string, original: string, content: Uint8Array): Promise<string> => {
|
|
150
150
|
const directory = path.join(await realRoot(root), ATTACHMENT_DIRECTORY);
|
|
151
151
|
await mkdir(directory, { recursive: true, mode: 0o755 });
|
|
152
|
-
if (!(await lstat(directory)).isDirectory()) throw invalid("
|
|
152
|
+
if (!(await lstat(directory)).isDirectory()) throw invalid("The attachments directory is not a regular directory.");
|
|
153
153
|
const name = path.basename(original).replace(/[^a-zA-Z0-9._-]/g, "_") || "attachment";
|
|
154
154
|
for (let index = 1; index <= 10000; index += 1) {
|
|
155
155
|
const candidate = index === 1 ? name : `${index}-${name}`;
|
|
@@ -160,10 +160,10 @@ export const storeAttachment = async (root: string, original: string, content: U
|
|
|
160
160
|
if ((error as NodeJS.ErrnoException).code !== "EEXIST") throw error;
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
|
-
throw invalid("
|
|
163
|
+
throw invalid("The attachments directory has too many files with the same name.");
|
|
164
164
|
};
|
|
165
165
|
|
|
166
|
-
/**
|
|
166
|
+
/** Watches a folder recursively and reports changes debounced; the return value ends the watch. */
|
|
167
167
|
export const watchDirectory = async (root: string, listener: FileWatchListener): Promise<() => void> => {
|
|
168
168
|
const directory = await realRoot(root);
|
|
169
169
|
let debounce: NodeJS.Timeout | undefined;
|
|
@@ -183,17 +183,17 @@ export const watchDirectory = async (root: string, listener: FileWatchListener):
|
|
|
183
183
|
|
|
184
184
|
const pathOf = (input: unknown): string => {
|
|
185
185
|
const value = (input as { path?: unknown } | null)?.path;
|
|
186
|
-
if (typeof value !== "string") throw invalid("
|
|
186
|
+
if (typeof value !== "string") throw invalid("The input needs a path as text");
|
|
187
187
|
return value;
|
|
188
188
|
};
|
|
189
189
|
|
|
190
|
-
/**
|
|
190
|
+
/** With an alias the input addresses its root, otherwise the one of the run. */
|
|
191
191
|
const aliasFootprint = (input: unknown): OperationFootprint => {
|
|
192
192
|
const alias = (input as { alias?: unknown } | null)?.alias;
|
|
193
193
|
return { roots: typeof alias === "string" ? { aliases: [aliasOf(alias) ?? alias], runRoot: false } : { aliases: [], runRoot: true } };
|
|
194
194
|
};
|
|
195
195
|
|
|
196
|
-
/**
|
|
196
|
+
/** Watches until aborted; a failed watch ends the operation with its cause. */
|
|
197
197
|
const watchUntilAborted = (root: string, signal: AbortSignal, progress: (value: FileWatchProgress) => void): Promise<null> =>
|
|
198
198
|
new Promise((resolve, reject) => {
|
|
199
199
|
let close: (() => void) | undefined;
|
|
@@ -219,16 +219,16 @@ const watchUntilAborted = (root: string, signal: AbortSignal, progress: (value:
|
|
|
219
219
|
}, finish);
|
|
220
220
|
});
|
|
221
221
|
|
|
222
|
-
/**
|
|
222
|
+
/** Files of the run on this machine: list, read text, watch and store attachments, relative to the root of the run or of an alias. */
|
|
223
223
|
export const fileModule: WorkspaceModuleFactory = (host) => {
|
|
224
|
-
/**
|
|
224
|
+
/** The open watches per run; stop and shutdown end them, even if their caller never aborts. */
|
|
225
225
|
const watches = new Map<string, Set<AbortController>>();
|
|
226
226
|
let closed = false;
|
|
227
227
|
const endWatches = (runId: string): void => {
|
|
228
228
|
for (const controller of watches.get(runId) ?? []) controller.abort();
|
|
229
229
|
watches.delete(runId);
|
|
230
230
|
};
|
|
231
|
-
/** Alias
|
|
231
|
+
/** Alias and path together form a location; under a shared alias like `@skills` the path names the folder of the root first. */
|
|
232
232
|
const locate = async (runId: string, input: unknown): Promise<{ root: string; path: string }> => {
|
|
233
233
|
const context = await host.contextFor(runId);
|
|
234
234
|
const alias = (input as { alias?: unknown } | null)?.alias;
|
|
@@ -246,7 +246,7 @@ export const fileModule: WorkspaceModuleFactory = (host) => {
|
|
|
246
246
|
};
|
|
247
247
|
const attach: WorkspaceOperation = async ({ runId, input }) => {
|
|
248
248
|
const { name, content } = (input ?? {}) as { name?: unknown; content?: unknown };
|
|
249
|
-
if (typeof name !== "string" || typeof content !== "string") throw invalid("
|
|
249
|
+
if (typeof name !== "string" || typeof content !== "string") throw invalid("An attachment needs name and content (Base64) as text");
|
|
250
250
|
return { name: await storeAttachment((await host.contextFor(runId)).root, name, Buffer.from(content, "base64")) };
|
|
251
251
|
};
|
|
252
252
|
const read: WorkspaceOperation = async ({ runId, input }) => {
|
|
@@ -254,8 +254,8 @@ export const fileModule: WorkspaceModuleFactory = (host) => {
|
|
|
254
254
|
return readTextFile(root, requested);
|
|
255
255
|
};
|
|
256
256
|
const watchFiles: WorkspaceOperation = async ({ runId, signal, progress }) => {
|
|
257
|
-
if (!signal || !progress) throw new Error(`${FILE_OPERATIONS.watch}
|
|
258
|
-
if (closed) throw new Error("
|
|
257
|
+
if (!signal || !progress) throw new Error(`${FILE_OPERATIONS.watch} runs until aborted and needs an abort signal and progress`);
|
|
258
|
+
if (closed) throw new Error("The file module has ended and watches nothing anymore");
|
|
259
259
|
const own = new AbortController();
|
|
260
260
|
const running = watches.get(runId) ?? new Set<AbortController>();
|
|
261
261
|
watches.set(runId, running.add(own));
|
|
@@ -27,7 +27,7 @@ export interface LanguageServerSnapshot {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
export interface LanguageServerSolution {
|
|
30
|
-
/**
|
|
30
|
+
/** Relative to the root of the workspace, with forward slashes. */
|
|
31
31
|
path: string;
|
|
32
32
|
root: string;
|
|
33
33
|
state: LanguageServerState | null;
|
|
@@ -36,6 +36,6 @@ export interface LanguageServerSolution {
|
|
|
36
36
|
export interface LanguageServerSolutions {
|
|
37
37
|
source: "git" | "directory";
|
|
38
38
|
solutions: readonly LanguageServerSolution[];
|
|
39
|
-
/**
|
|
39
|
+
/** Whether an instance of this language is already open or being opened in the run. */
|
|
40
40
|
opened: boolean;
|
|
41
41
|
}
|
|
@@ -51,12 +51,12 @@ export const formatDiagnostics = (
|
|
|
51
51
|
const warnings = diagnostics.filter((diagnostic) => severityOf(diagnostic) === WARNING);
|
|
52
52
|
const warningNote = warnings.length === 0
|
|
53
53
|
? ""
|
|
54
|
-
: `, ${warnings.length} ${warnings.length === 1 ? "
|
|
54
|
+
: `, ${warnings.length} ${warnings.length === 1 ? "warning" : "warnings"}`;
|
|
55
55
|
const heading = errors.length === 0
|
|
56
|
-
? `
|
|
57
|
-
: `
|
|
56
|
+
? `Diagnostics (${label}) ${relativePath}: no errors${warningNote}`
|
|
57
|
+
: `Diagnostics (${label}) ${relativePath}: ${errors.length} ${errors.length === 1 ? "error" : "errors"}${warningNote}`;
|
|
58
58
|
const listed = [...errors, ...(includeWarnings ? warnings : [])].sort(byPlace);
|
|
59
59
|
const lines = listed.slice(0, MAX_LINES).map((diagnostic) => lineOf(relativePath, diagnostic));
|
|
60
|
-
if (listed.length > MAX_LINES) lines.push(`...
|
|
60
|
+
if (listed.length > MAX_LINES) lines.push(`... and ${listed.length - MAX_LINES} more`);
|
|
61
61
|
return [heading, ...lines].join("\n");
|
|
62
62
|
};
|
|
@@ -19,7 +19,7 @@ export interface LanguageServerAdapter {
|
|
|
19
19
|
label: string;
|
|
20
20
|
languages: Readonly<Record<string, string>>;
|
|
21
21
|
rootDescription: string;
|
|
22
|
-
/**
|
|
22
|
+
/** The extensions of the solutions that `<id>_solutions` searches for in the workspace; without them there is neither search nor switching. */
|
|
23
23
|
solutionExtensions?: readonly string[];
|
|
24
24
|
resolveRoot: (workspaceRoot: string, root: string) => Promise<string>;
|
|
25
25
|
rootDirectory: (root: string) => string;
|
|
@@ -27,7 +27,7 @@ export interface LanguageServerAdapter {
|
|
|
27
27
|
open: (session: LanguageServerSession, root: string, timeoutMs: number) => Promise<string>;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
/**
|
|
30
|
+
/** What the server must know about a language server to describe tools and tabs; it is only started in the executor. */
|
|
31
31
|
export type LanguageServerDescription = Pick<LanguageServerAdapter, "id" | "label" | "languages" | "rootDescription" | "solutionExtensions">;
|
|
32
32
|
|
|
33
33
|
export interface LanguageServerHostOptions {
|
|
@@ -64,7 +64,7 @@ const keyOf = (runId: string, root: string): string => `${runId}\n${root}`;
|
|
|
64
64
|
|
|
65
65
|
const runOf = (key: string): string => key.slice(0, key.indexOf("\n"));
|
|
66
66
|
|
|
67
|
-
const instanceCount = (count: number): string => `${count}
|
|
67
|
+
const instanceCount = (count: number): string => `${count} open instance${count === 1 ? "" : "s"}`;
|
|
68
68
|
|
|
69
69
|
const git = async (
|
|
70
70
|
context: WorkspaceProcessContext,
|
|
@@ -73,13 +73,13 @@ const git = async (
|
|
|
73
73
|
args: readonly string[],
|
|
74
74
|
): Promise<string> => {
|
|
75
75
|
const result = await runGit(context, directory, args).catch((error: unknown) => {
|
|
76
|
-
throw new Error(`
|
|
76
|
+
throw new Error(`Without paths ${tool} needs a Git working directory: ${messageOf(error)}`);
|
|
77
77
|
});
|
|
78
|
-
if (result.code !== 0) throw new Error(`
|
|
78
|
+
if (result.code !== 0) throw new Error(`Without paths ${tool} needs a Git working directory (git ${args[0]}: code ${result.code})`);
|
|
79
79
|
return result.output;
|
|
80
80
|
};
|
|
81
81
|
|
|
82
|
-
/** Git
|
|
82
|
+
/** Git names its paths relative to the repo root; `-- .` narrows them to the root of the instance. */
|
|
83
83
|
export const changedWorkspaceFiles = async (
|
|
84
84
|
context: WorkspaceProcessContext,
|
|
85
85
|
directory: string,
|
|
@@ -130,11 +130,11 @@ export class LanguageServerHost {
|
|
|
130
130
|
return this.adapter.languages[path.extname(filePath).toLowerCase()] !== undefined;
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
-
/**
|
|
133
|
+
/** With `ifNoneOpen` the call checks and claims the run without interruption: if an open is already running or an instance exists, it loads nothing. */
|
|
134
134
|
async open(runId: string, root: string, ifNoneOpen = false): Promise<string> {
|
|
135
135
|
const lifetime = this.#lifetime(runId);
|
|
136
136
|
if (ifNoneOpen && !this.#idle(runId)) {
|
|
137
|
-
return `${this.adapter.label}
|
|
137
|
+
return `${this.adapter.label} does not load ${root}: an instance is already open or starting in this run`;
|
|
138
138
|
}
|
|
139
139
|
this.#requests.set(runId, (this.#requests.get(runId) ?? 0) + 1);
|
|
140
140
|
try {
|
|
@@ -148,7 +148,7 @@ export class LanguageServerHost {
|
|
|
148
148
|
|
|
149
149
|
async solutions(runId: string): Promise<LanguageServerSolutions> {
|
|
150
150
|
const extensions = this.adapter.solutionExtensions;
|
|
151
|
-
if (!extensions) throw new Error(`${this.adapter.label}
|
|
151
|
+
if (!extensions) throw new Error(`${this.adapter.label} does not search for solutions`);
|
|
152
152
|
if (this.#closed) throw this.#stopped();
|
|
153
153
|
const found = await workspaceSolutions(await this.#contextFor(runId), extensions);
|
|
154
154
|
return {
|
|
@@ -158,7 +158,7 @@ export class LanguageServerHost {
|
|
|
158
158
|
};
|
|
159
159
|
}
|
|
160
160
|
|
|
161
|
-
/**
|
|
161
|
+
/** Loads the root and ends every other instance of the run; does not wait for the loading, `null` ends all. */
|
|
162
162
|
async switchTo(runId: string, root: string | null): Promise<string> {
|
|
163
163
|
if (root === null) return this.close(runId);
|
|
164
164
|
const lifetime = this.#lifetime(runId);
|
|
@@ -168,10 +168,10 @@ export class LanguageServerHost {
|
|
|
168
168
|
this.#assertLifetime(runId, lifetime);
|
|
169
169
|
const current = this.#current(runId, absoluteRoot);
|
|
170
170
|
const kept = current !== undefined && current.state !== "failed";
|
|
171
|
-
//
|
|
171
|
+
// A failure is recorded with its cause in the state of the instance.
|
|
172
172
|
if (!kept) void this.#start(runId, context, absoluteRoot).catch(() => undefined);
|
|
173
|
-
const closed = others.length === 0 ? "" : `; ${others.length === 1 ? "
|
|
174
|
-
return `${this.adapter.label} ${kept ? "
|
|
173
|
+
const closed = others.length === 0 ? "" : `; ${others.length === 1 ? "one other instance" : `${others.length} other instances`} ended`;
|
|
174
|
+
return `${this.adapter.label} ${kept ? "keeps" : "loads"} ${absoluteRoot}${closed}`;
|
|
175
175
|
}
|
|
176
176
|
|
|
177
177
|
async #open(runId: string, lifetime: object, root: string): Promise<string> {
|
|
@@ -184,26 +184,26 @@ export class LanguageServerHost {
|
|
|
184
184
|
});
|
|
185
185
|
this.#assertCurrent(current);
|
|
186
186
|
this.#touch(runId, absoluteRoot);
|
|
187
|
-
return this.#openMessage(runId, `${this.adapter.label}
|
|
187
|
+
return this.#openMessage(runId, `${this.adapter.label} is already open for ${absoluteRoot}: ${server.summary}`);
|
|
188
188
|
}
|
|
189
189
|
const server = await this.#start(runId, context, absoluteRoot);
|
|
190
190
|
this.#assertLifetime(runId, lifetime);
|
|
191
191
|
if (this.#servers.get(keyOf(runId, absoluteRoot))?.server !== server) throw this.#stopped();
|
|
192
|
-
return this.#openMessage(runId, `${server.summary} (
|
|
192
|
+
return this.#openMessage(runId, `${server.summary} (root ${absoluteRoot})`);
|
|
193
193
|
}
|
|
194
194
|
|
|
195
195
|
async close(runId: string, root?: string): Promise<string> {
|
|
196
196
|
if (root === undefined) {
|
|
197
197
|
const roots = this.#openRoots(runId);
|
|
198
|
-
if (roots.length === 0) return `${this.adapter.label}
|
|
198
|
+
if (roots.length === 0) return `${this.adapter.label} is not open in this run`;
|
|
199
199
|
await Promise.all(roots.map((entry) => this.#closeInstance(runId, entry)));
|
|
200
|
-
const closed = roots.length === 1 ? "
|
|
201
|
-
return `${this.adapter.label}: ${closed}
|
|
200
|
+
const closed = roots.length === 1 ? "one instance" : `${roots.length} instances`;
|
|
201
|
+
return `${this.adapter.label}: ${closed} ended; no open instance left in this run`;
|
|
202
202
|
}
|
|
203
203
|
const context = await this.#contextFor(runId);
|
|
204
204
|
const chosen = await this.#known(runId, context, root);
|
|
205
205
|
await this.#closeInstance(runId, chosen);
|
|
206
|
-
return `${this.adapter.label}
|
|
206
|
+
return `${this.adapter.label} for ${chosen} ended; ${instanceCount(this.#openRoots(runId).length)} in this run`;
|
|
207
207
|
}
|
|
208
208
|
|
|
209
209
|
async snapshot(runId: string): Promise<LanguageServerSnapshot> {
|
|
@@ -225,14 +225,14 @@ export class LanguageServerHost {
|
|
|
225
225
|
const context = await this.#contextFor(runId);
|
|
226
226
|
this.#assertLifetime(runId, lifetime);
|
|
227
227
|
const roots = root === undefined ? this.#openRoots(runId) : [await this.#known(runId, context, root)];
|
|
228
|
-
if (roots.length === 0) throw new Error(`
|
|
228
|
+
if (roots.length === 0) throw new Error(`No ${this.adapter.label} server open; call ${this.adapter.id}_open first`);
|
|
229
229
|
if (paths !== undefined && paths.length > 0) return (await this.#requested(runId, context, roots, paths, includeWarnings)).join("\n\n");
|
|
230
230
|
const failed = root === undefined ? roots.filter((entry) => this.#current(runId, entry)?.state === "failed") : [];
|
|
231
231
|
const failures = failed.map((entry) =>
|
|
232
|
-
`${this.adapter.label}
|
|
232
|
+
`${this.adapter.label} not open for ${entry}: ${this.#current(runId, entry)!.summary}; ${this.adapter.id}_open opens the root again`);
|
|
233
233
|
if (failed.length === roots.length) throw new Error(failures.join("\n"));
|
|
234
234
|
const results = await this.#changed(runId, context, roots.filter((entry) => !failed.includes(entry)), includeWarnings);
|
|
235
|
-
const text = results.length === 0 ? `
|
|
235
|
+
const text = results.length === 0 ? `No changed ${this.adapter.label} files in the open roots` : results.join("\n\n");
|
|
236
236
|
return [text, ...failures].join("\n\n");
|
|
237
237
|
}
|
|
238
238
|
|
|
@@ -248,7 +248,7 @@ export class LanguageServerHost {
|
|
|
248
248
|
const server = await this.#ensure(runId, context, chosen);
|
|
249
249
|
return await this.#format(context, server, file, false);
|
|
250
250
|
} catch (error) {
|
|
251
|
-
return `
|
|
251
|
+
return `Diagnostics (${this.adapter.label}) failed: ${messageOf(error)}`;
|
|
252
252
|
}
|
|
253
253
|
}
|
|
254
254
|
|
|
@@ -276,7 +276,7 @@ export class LanguageServerHost {
|
|
|
276
276
|
const failures = results
|
|
277
277
|
.filter((result): result is PromiseRejectedResult => result.status === "rejected")
|
|
278
278
|
.map((result) => result.reason);
|
|
279
|
-
if (failures.length > 0) throw new AggregateError(failures, `${this.adapter.label}
|
|
279
|
+
if (failures.length > 0) throw new AggregateError(failures, `${this.adapter.label} shutdown failed`);
|
|
280
280
|
}
|
|
281
281
|
|
|
282
282
|
async #prepare(
|
|
@@ -320,7 +320,7 @@ export class LanguageServerHost {
|
|
|
320
320
|
}
|
|
321
321
|
|
|
322
322
|
#openMessage(runId: string, text: string): string {
|
|
323
|
-
return `${text}; ${instanceCount(this.#openRoots(runId).length)}
|
|
323
|
+
return `${text}; ${instanceCount(this.#openRoots(runId).length)} of ${this.adapter.label} in this run`;
|
|
324
324
|
}
|
|
325
325
|
|
|
326
326
|
async #instanceSnapshot(runId: string, root: string): Promise<LanguageServerInstanceSnapshot | undefined> {
|
|
@@ -385,11 +385,11 @@ export class LanguageServerHost {
|
|
|
385
385
|
for (const requested of paths) {
|
|
386
386
|
const file = await allowedWorkspacePath(path.resolve(context.root, expandWorkspaceAlias(requested, context.workspaceAliases ?? {})), [context.root, ...context.additionalRoots ?? []]);
|
|
387
387
|
if (!this.handles(file)) {
|
|
388
|
-
throw new Error(`${path.relative(context.root, file)}
|
|
388
|
+
throw new Error(`${path.relative(context.root, file)} has no ${this.adapter.label} extension (${Object.keys(this.adapter.languages).join(", ")})`);
|
|
389
389
|
}
|
|
390
390
|
const chosen = this.#match(roots, file);
|
|
391
391
|
if (!chosen) {
|
|
392
|
-
throw new Error(`${path.relative(context.root, file)}
|
|
392
|
+
throw new Error(`${path.relative(context.root, file)} is in no open ${this.adapter.label} root; open: ${roots.join(", ")}`);
|
|
393
393
|
}
|
|
394
394
|
results.push(await this.#format(context, await this.#ensure(runId, context, chosen), file, includeWarnings));
|
|
395
395
|
}
|
|
@@ -404,11 +404,11 @@ export class LanguageServerHost {
|
|
|
404
404
|
|
|
405
405
|
async #known(runId: string, context: WorkspaceProcessContext, root: string): Promise<string> {
|
|
406
406
|
const roots = this.#openRoots(runId);
|
|
407
|
-
if (roots.length === 0) throw new Error(`
|
|
407
|
+
if (roots.length === 0) throw new Error(`No ${this.adapter.label} server open; call ${this.adapter.id}_open first`);
|
|
408
408
|
const lexical = path.resolve(context.root, expandWorkspaceAlias(root, context.workspaceAliases ?? {}));
|
|
409
409
|
const requested = await resolvedWorkspacePath(lexical);
|
|
410
410
|
const found = roots.find((open) => open === requested || open === lexical);
|
|
411
|
-
if (!found) throw new Error(`
|
|
411
|
+
if (!found) throw new Error(`No ${this.adapter.label} server is open for ${root}; open: ${roots.join(", ")}`);
|
|
412
412
|
return found;
|
|
413
413
|
}
|
|
414
414
|
|
|
@@ -465,7 +465,7 @@ export class LanguageServerHost {
|
|
|
465
465
|
const current = this.#servers.get(key);
|
|
466
466
|
if (current?.server?.session.exited) {
|
|
467
467
|
this.#servers.delete(key);
|
|
468
|
-
void this.#dispose(current).catch((error) => console.error(`${this.adapter.label}:
|
|
468
|
+
void this.#dispose(current).catch((error) => console.error(`${this.adapter.label}: cleanup failed: ${messageOf(error)}`));
|
|
469
469
|
return undefined;
|
|
470
470
|
}
|
|
471
471
|
return current;
|
|
@@ -488,7 +488,7 @@ export class LanguageServerHost {
|
|
|
488
488
|
const previous = this.#servers.get(key);
|
|
489
489
|
const closing = previous ? this.#dispose(previous) : undefined;
|
|
490
490
|
const entry: ServerEntry = {
|
|
491
|
-
runId, root, state: "opening", summary: `${this.adapter.label}
|
|
491
|
+
runId, root, state: "opening", summary: `${this.adapter.label} loads ${root}`, controller: new AbortController(),
|
|
492
492
|
};
|
|
493
493
|
this.#servers.set(key, entry);
|
|
494
494
|
this.#remember(runId, root);
|
|
@@ -513,13 +513,13 @@ export class LanguageServerHost {
|
|
|
513
513
|
summary = await withTimeout(
|
|
514
514
|
Promise.race([this.adapter.open(session, root, this.#openTimeoutMs), cancelled]),
|
|
515
515
|
this.#openTimeoutMs,
|
|
516
|
-
() => new Error(`${this.adapter.label}: ${root}
|
|
516
|
+
() => new Error(`${this.adapter.label}: ${root} not loaded within ${Math.round(this.#openTimeoutMs / 1000)} s`),
|
|
517
517
|
);
|
|
518
518
|
} finally {
|
|
519
519
|
entry.controller.signal.removeEventListener("abort", aborted);
|
|
520
520
|
}
|
|
521
521
|
this.#assertCurrent(entry);
|
|
522
|
-
if (session.exited) throw new Error(`${this.adapter.label}
|
|
522
|
+
if (session.exited) throw new Error(`${this.adapter.label} ended while loading`);
|
|
523
523
|
const server = { root, session, summary };
|
|
524
524
|
entry.server = server;
|
|
525
525
|
entry.state = "ready";
|
|
@@ -585,7 +585,7 @@ export class LanguageServerHost {
|
|
|
585
585
|
}
|
|
586
586
|
|
|
587
587
|
#stopped(): Error {
|
|
588
|
-
return new Error(`${this.adapter.label}
|
|
588
|
+
return new Error(`${this.adapter.label} start was ended`);
|
|
589
589
|
}
|
|
590
590
|
|
|
591
591
|
#touch(runId: string, root: string): void {
|
|
@@ -597,7 +597,7 @@ export class LanguageServerHost {
|
|
|
597
597
|
const timer = setTimeout(() => {
|
|
598
598
|
this.#idleTimers.delete(key);
|
|
599
599
|
if (this.#servers.get(key) !== entry) return;
|
|
600
|
-
void this.#close(key).catch((error) => console.error(`${this.adapter.label}:
|
|
600
|
+
void this.#close(key).catch((error) => console.error(`${this.adapter.label}: ending after idle time failed: ${messageOf(error)}`));
|
|
601
601
|
}, this.#idleMs);
|
|
602
602
|
timer.unref();
|
|
603
603
|
this.#idleTimers.set(key, timer);
|
|
@@ -45,13 +45,13 @@ export class JsonRpcConnection {
|
|
|
45
45
|
this.#connection.onNotification("$/progress", (params) => options.onNotification("$/progress", params));
|
|
46
46
|
this.#connection.onNotification("$/logTrace", (params) => options.onNotification("$/logTrace", params));
|
|
47
47
|
this.#connection.onError(([error]) => this.#fail(error));
|
|
48
|
-
this.#connection.onClose(() => this.#fail(new Error("
|
|
48
|
+
this.#connection.onClose(() => this.#fail(new Error("Connection closed")));
|
|
49
49
|
this.#connection.listen();
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
async request(method: string, params: unknown, signal?: AbortSignal): Promise<unknown> {
|
|
53
53
|
if (this.#closed) throw this.#closed;
|
|
54
|
-
const abortError = () => signal?.reason instanceof Error ? signal.reason : new Error(`${method}
|
|
54
|
+
const abortError = () => signal?.reason instanceof Error ? signal.reason : new Error(`${method} was cancelled`);
|
|
55
55
|
if (signal?.aborted) throw abortError();
|
|
56
56
|
const parameters = params === null || params === undefined ? [] : [params];
|
|
57
57
|
const cancellation = new CancellationTokenSource();
|
|
@@ -68,7 +68,7 @@ export class JsonRpcConnection {
|
|
|
68
68
|
else if (error instanceof ResponseError) {
|
|
69
69
|
reject(new ResponseError(
|
|
70
70
|
error.code,
|
|
71
|
-
`${this.#options.label}: ${method}
|
|
71
|
+
`${this.#options.label}: ${method} failed: ${error.message}`,
|
|
72
72
|
error.data,
|
|
73
73
|
));
|
|
74
74
|
} else reject(error);
|
|
@@ -96,7 +96,7 @@ export class JsonRpcConnection {
|
|
|
96
96
|
|
|
97
97
|
#fail(error: Error): void {
|
|
98
98
|
if (this.#closed) return;
|
|
99
|
-
const failure = new Error(`${this.#options.label}: JSON-RPC
|
|
99
|
+
const failure = new Error(`${this.#options.label}: JSON-RPC connection failed: ${error.message}`, { cause: error });
|
|
100
100
|
this.close(failure);
|
|
101
101
|
this.#options.onError(failure);
|
|
102
102
|
}
|
|
@@ -28,13 +28,13 @@ const invalid = (operation: string, message: string): WorkspaceOperationError =>
|
|
|
28
28
|
|
|
29
29
|
const fieldsOf = (operation: string, input: unknown): Readonly<Record<string, unknown>> => {
|
|
30
30
|
const fields = input ?? {};
|
|
31
|
-
if (typeof fields !== "object" || Array.isArray(fields)) throw invalid(operation, "
|
|
31
|
+
if (typeof fields !== "object" || Array.isArray(fields)) throw invalid(operation, "The input must be an object");
|
|
32
32
|
return fields as Readonly<Record<string, unknown>>;
|
|
33
33
|
};
|
|
34
34
|
|
|
35
35
|
const optionalRoot = (operation: string, value: unknown): string | undefined => {
|
|
36
36
|
if (value === undefined) return undefined;
|
|
37
|
-
if (typeof value !== "string") throw invalid(operation, "root
|
|
37
|
+
if (typeof value !== "string") throw invalid(operation, "root must be a text");
|
|
38
38
|
return value;
|
|
39
39
|
};
|
|
40
40
|
|
|
@@ -44,7 +44,7 @@ const solutionOperationsOf = (server: LanguageServerHost): Array<readonly [strin
|
|
|
44
44
|
[languageServerSolutionsOperation(server.adapter.id), ({ runId }) => server.solutions(runId)],
|
|
45
45
|
[change, ({ runId, input }) => {
|
|
46
46
|
const { root } = fieldsOf(change, input);
|
|
47
|
-
if (root !== null && typeof root !== "string") throw invalid(change, "root
|
|
47
|
+
if (root !== null && typeof root !== "string") throw invalid(change, "root must be a text or null");
|
|
48
48
|
return server.switchTo(runId, root);
|
|
49
49
|
}],
|
|
50
50
|
];
|
|
@@ -59,15 +59,15 @@ const operationsOf = (server: LanguageServerHost): Array<readonly [string, Works
|
|
|
59
59
|
[open, ({ runId, input }) => {
|
|
60
60
|
const { root, ifNoneOpen } = fieldsOf(open, input);
|
|
61
61
|
const checked = optionalRoot(open, root);
|
|
62
|
-
if (checked === undefined) throw invalid(open, "root
|
|
63
|
-
if (ifNoneOpen !== undefined && typeof ifNoneOpen !== "boolean") throw invalid(open, "ifNoneOpen
|
|
62
|
+
if (checked === undefined) throw invalid(open, "root is missing");
|
|
63
|
+
if (ifNoneOpen !== undefined && typeof ifNoneOpen !== "boolean") throw invalid(open, "ifNoneOpen must be true or false");
|
|
64
64
|
return server.open(runId, checked, ifNoneOpen ?? false);
|
|
65
65
|
}],
|
|
66
66
|
[close, ({ runId, input }) => server.close(runId, optionalRoot(close, fieldsOf(close, input).root))],
|
|
67
67
|
[diagnostics, ({ runId, input }) => {
|
|
68
68
|
const { paths, warnings, root } = fieldsOf(diagnostics, input);
|
|
69
|
-
if (paths !== undefined && (!Array.isArray(paths) || !paths.every((entry) => typeof entry === "string"))) throw invalid(diagnostics, "paths
|
|
70
|
-
if (warnings !== undefined && typeof warnings !== "boolean") throw invalid(diagnostics, "warnings
|
|
69
|
+
if (paths !== undefined && (!Array.isArray(paths) || !paths.every((entry) => typeof entry === "string"))) throw invalid(diagnostics, "paths must be a list of texts");
|
|
70
|
+
if (warnings !== undefined && typeof warnings !== "boolean") throw invalid(diagnostics, "warnings must be true or false");
|
|
71
71
|
return server.diagnostics(runId, paths as readonly string[] | undefined, warnings ?? false, optionalRoot(diagnostics, root));
|
|
72
72
|
}],
|
|
73
73
|
[languageServerSnapshotOperation(id), ({ runId }) => server.snapshot(runId)],
|
|
@@ -75,7 +75,7 @@ const operationsOf = (server: LanguageServerHost): Array<readonly [string, Works
|
|
|
75
75
|
];
|
|
76
76
|
};
|
|
77
77
|
|
|
78
|
-
/**
|
|
78
|
+
/** Open and close address the root of their instance, diagnostics also the roots of its files; without root and files no specific one. */
|
|
79
79
|
const footprintsOf = (server: LanguageServerHost): Array<readonly [string, (input: unknown) => OperationFootprint]> => {
|
|
80
80
|
const { id } = server.adapter;
|
|
81
81
|
return [
|
|
@@ -85,13 +85,13 @@ const footprintsOf = (server: LanguageServerHost): Array<readonly [string, (inpu
|
|
|
85
85
|
];
|
|
86
86
|
};
|
|
87
87
|
|
|
88
|
-
/**
|
|
88
|
+
/** The language servers of this machine: per adapter open, diagnostics, close and state, with solutions also search and switching, plus the diagnostics of written files. */
|
|
89
89
|
export const languageServerModule = (
|
|
90
90
|
adapters: readonly LanguageServerAdapter[],
|
|
91
91
|
options: LanguageServerHostOptions = {},
|
|
92
92
|
): WorkspaceModuleFactory => {
|
|
93
93
|
const duplicate = adapters.find((adapter, index) => adapters.findIndex((other) => other.id === adapter.id) !== index);
|
|
94
|
-
if (duplicate) throw new Error(`
|
|
94
|
+
if (duplicate) throw new Error(`The language server ${duplicate.id} occurs twice in the executor; its operations belong to exactly one contribution`);
|
|
95
95
|
return (host) => languageServersOn(host, adapters, options);
|
|
96
96
|
};
|
|
97
97
|
|
|
@@ -107,7 +107,7 @@ const languageServersOn = (
|
|
|
107
107
|
annotate: async (runId, absolutePath) => {
|
|
108
108
|
const notes = await Promise.all(servers.map((server) =>
|
|
109
109
|
server.annotate(runId, absolutePath).catch((error: unknown) =>
|
|
110
|
-
`
|
|
110
|
+
`Diagnostics (${server.adapter.label}) failed: ${messageOf(error)}`)));
|
|
111
111
|
const text = notes.filter((note): note is string => Boolean(note)).join("\n");
|
|
112
112
|
return text || undefined;
|
|
113
113
|
},
|
|
@@ -9,16 +9,16 @@ export const resolveRootFile = async (
|
|
|
9
9
|
): Promise<string> => {
|
|
10
10
|
const absolute = await allowedWorkspacePath(path.resolve(workspaceRoot, requested), [workspaceRoot]);
|
|
11
11
|
if (!extensions.includes(path.extname(absolute).toLowerCase())) {
|
|
12
|
-
throw new Error(`${requested}
|
|
12
|
+
throw new Error(`${requested} has none of the extensions ${extensions.join(", ")}`);
|
|
13
13
|
}
|
|
14
14
|
const info = await stat(absolute).catch(() => undefined);
|
|
15
|
-
if (!info?.isFile()) throw new Error(`${requested}
|
|
15
|
+
if (!info?.isFile()) throw new Error(`${requested} does not exist in the working directory`);
|
|
16
16
|
return absolute;
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
export const resolveRootDirectory = async (workspaceRoot: string, requested: string): Promise<string> => {
|
|
20
20
|
const absolute = await allowedWorkspacePath(path.resolve(workspaceRoot, requested), [workspaceRoot]);
|
|
21
21
|
const info = await stat(absolute).catch(() => undefined);
|
|
22
|
-
if (!info?.isDirectory()) throw new Error(`${requested}
|
|
22
|
+
if (!info?.isDirectory()) throw new Error(`${requested} is not a directory in the working directory`);
|
|
23
23
|
return absolute;
|
|
24
24
|
};
|