@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
|
@@ -6,7 +6,7 @@ import { SandboxManager, type SandboxRuntimeConfig } from "@anthropic-ai/sandbox
|
|
|
6
6
|
import { containsWorkspacePath, type ProcessLaunch, type ProcessSandbox } from "@ragents/workspace-executor";
|
|
7
7
|
import { hostRoot } from "../host-version.js";
|
|
8
8
|
|
|
9
|
-
/**
|
|
9
|
+
/** Package sources and git hosting that builds in the workspace need; the own server is always added. */
|
|
10
10
|
export const PROCESS_SANDBOX_DEFAULT_NETWORK: readonly string[] = [
|
|
11
11
|
"registry.npmjs.org",
|
|
12
12
|
"api.nuget.org",
|
|
@@ -16,25 +16,27 @@ export const PROCESS_SANDBOX_DEFAULT_NETWORK: readonly string[] = [
|
|
|
16
16
|
"*.githubusercontent.com",
|
|
17
17
|
];
|
|
18
18
|
|
|
19
|
-
/**
|
|
19
|
+
/** The folders of a run from which its rules are made; everything else under the protected roots stays hidden from it. */
|
|
20
20
|
export interface RunSandboxFolders {
|
|
21
21
|
readonly writable: readonly string[];
|
|
22
22
|
readonly readable: readonly string[];
|
|
23
|
-
/**
|
|
23
|
+
/** The run's own temp folder; it is writable and set in TMPDIR. */
|
|
24
24
|
readonly temporary: string;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
/**
|
|
27
|
+
/** What the sandbox host needs from the process sandbox per run. */
|
|
28
28
|
export interface RunProcessSandboxes {
|
|
29
29
|
readonly forRun: (folders: RunSandboxFolders) => ProcessSandbox;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
export interface ServerProcessSandboxOptions {
|
|
33
|
-
/**
|
|
33
|
+
/** Allowed network targets, domains as in the profile file; everything else fails at the proxy. */
|
|
34
34
|
readonly network: readonly string[];
|
|
35
|
-
/**
|
|
35
|
+
/** The address of this server, such as http://127.0.0.1:4710; none without HTTP. */
|
|
36
36
|
readonly serverAddress: string | undefined;
|
|
37
37
|
readonly dataDirectory: string;
|
|
38
|
+
/** How the operator turns the sandbox off, as written in the profile file; every message that prevents the start names it. */
|
|
39
|
+
readonly disableSetting: string;
|
|
38
40
|
readonly hostRoot?: string;
|
|
39
41
|
readonly platform?: NodeJS.Platform;
|
|
40
42
|
readonly environment?: NodeJS.ProcessEnv;
|
|
@@ -46,7 +48,7 @@ const shellWord = (value: string): string => `'${value.replaceAll("'", "'\\''")}
|
|
|
46
48
|
|
|
47
49
|
const shellCommand = (words: readonly string[]): string => words.map(shellWord).join(" ");
|
|
48
50
|
|
|
49
|
-
/**
|
|
51
|
+
/** The environment inside the sandbox: its own temp folder, and every network call goes through the proxy, including the one to the own server. */
|
|
50
52
|
const insideEnvironment = (temporary: string, searchPath: string, platform: NodeJS.Platform): readonly string[] => [
|
|
51
53
|
`PATH=${searchPath}`,
|
|
52
54
|
`TMPDIR=${temporary}`,
|
|
@@ -55,13 +57,13 @@ const insideEnvironment = (temporary: string, searchPath: string, platform: Node
|
|
|
55
57
|
"NO_PROXY=",
|
|
56
58
|
"no_proxy=",
|
|
57
59
|
"NODE_USE_ENV_PROXY=1",
|
|
58
|
-
// .NET
|
|
60
|
+
// Otherwise .NET connects to the proxy over IPv4-mapped IPv6 addresses, which the macOS sandbox does not recognize as localhost.
|
|
59
61
|
"DOTNET_SYSTEM_NET_DISABLEIPV6=1",
|
|
60
|
-
//
|
|
62
|
+
// .NET build nodes and compiler servers outlive the command and would otherwise accept builds of other runs in their own sandbox.
|
|
61
63
|
"MSBUILDDISABLENODEREUSE=1",
|
|
62
64
|
"DOTNET_CLI_USE_MSBUILD_SERVER=0",
|
|
63
65
|
"UseSharedCompilation=false",
|
|
64
|
-
//
|
|
66
|
+
// Otherwise the macOS tool shims (git, clang) create their cache in the server's blocked temp.
|
|
65
67
|
...platform === "darwin" ? [`xcrun_db=${path.join(temporary, "xcrun_db")}`] : [],
|
|
66
68
|
];
|
|
67
69
|
|
|
@@ -74,7 +76,7 @@ const serverTarget = (address: string | undefined): readonly string[] => {
|
|
|
74
76
|
const homeRoots = (platform: NodeJS.Platform): readonly string[] =>
|
|
75
77
|
platform === "darwin" ? ["/Users"] : ["/home", "/root"];
|
|
76
78
|
|
|
77
|
-
/**
|
|
79
|
+
/** The real path, even for a folder that does not exist yet: its nearest existing ancestor is resolved. */
|
|
78
80
|
const realOrGiven = (entry: string): string => {
|
|
79
81
|
try {
|
|
80
82
|
return realpathSync(entry);
|
|
@@ -84,17 +86,17 @@ const realOrGiven = (entry: string): string => {
|
|
|
84
86
|
}
|
|
85
87
|
};
|
|
86
88
|
|
|
87
|
-
/**
|
|
89
|
+
/** An entry is often a symlink (fnm, Homebrew, /tmp on macOS); the sandbox checks the target. */
|
|
88
90
|
const resolvedTarget = (entry: string): readonly string[] => {
|
|
89
91
|
const target = realOrGiven(entry);
|
|
90
92
|
return target === entry ? [] : [target];
|
|
91
93
|
};
|
|
92
94
|
|
|
93
|
-
/**
|
|
95
|
+
/** On Linux all Unix sockets are allowed; the sockets that lead out of the sandbox therefore stay invisible. */
|
|
94
96
|
const hostSockets = (platform: NodeJS.Platform): readonly string[] =>
|
|
95
97
|
platform === "linux" ? ["/var/run/docker.sock", "/run/docker.sock"].filter((socket) => existsSync(socket)) : [];
|
|
96
98
|
|
|
97
|
-
/**
|
|
99
|
+
/** Where secrets and other runs can live: home folders, temp and the server's data folder. */
|
|
98
100
|
const protectedRoots = (options: ServerProcessSandboxOptions, platform: NodeJS.Platform): readonly string[] => [
|
|
99
101
|
os.homedir(),
|
|
100
102
|
...homeRoots(platform),
|
|
@@ -104,16 +106,16 @@ const protectedRoots = (options: ServerProcessSandboxOptions, platform: NodeJS.P
|
|
|
104
106
|
...hostSockets(platform),
|
|
105
107
|
].map(realOrGiven);
|
|
106
108
|
|
|
107
|
-
/**
|
|
109
|
+
/** What all runs must share: on macOS .NET creates its named mutexes and MSBuild the sockets of its build nodes at fixed places under /tmp; on Linux /tmp is a separate empty folder per command. */
|
|
108
110
|
const sharedWritable = (platform: NodeJS.Platform): readonly string[] => platform === "darwin"
|
|
109
111
|
? [".dotnet", `.dotnet-uid${os.userInfo().uid}`, "MSBuild*"].map((name) => path.join(realOrGiven("/tmp"), name))
|
|
110
112
|
: [];
|
|
111
113
|
|
|
112
|
-
/**
|
|
114
|
+
/** Where sandbox processes create and reach Unix sockets: in the data folder (temp of the runs) and on macOS in /tmp for the MSBuild build nodes. */
|
|
113
115
|
const socketRoots = (dataDirectory: string, platform: NodeJS.Platform): readonly string[] =>
|
|
114
116
|
[dataDirectory, ...platform === "darwin" ? ["/tmp"] : []].map(realOrGiven);
|
|
115
117
|
|
|
116
|
-
/**
|
|
118
|
+
/** The sandbox does not read a symlink in a blocked folder (such as fnm under ~/.local/state); PATH therefore names the targets. */
|
|
117
119
|
const resolvedSearchPath = (environment: NodeJS.ProcessEnv): string =>
|
|
118
120
|
[...new Set((environment.PATH ?? "").split(path.delimiter).filter((entry) => entry !== "").map(realOrGiven))].join(path.delimiter);
|
|
119
121
|
|
|
@@ -127,14 +129,14 @@ const entriesOf = (directory: string): readonly string[] => {
|
|
|
127
129
|
}
|
|
128
130
|
};
|
|
129
131
|
|
|
130
|
-
/**
|
|
132
|
+
/** An allowed folder that contains a blocked one is split into its remaining entries; otherwise it would override the block, or the block the allowances inside it. */
|
|
131
133
|
const besideProtected = (entry: string, hidden: readonly string[]): readonly string[] => {
|
|
132
134
|
if (hidden.some((root) => isInside(root, entry))) return [];
|
|
133
135
|
if (!hidden.some((root) => isInside(entry, root))) return [entry];
|
|
134
136
|
return entriesOf(entry).flatMap((child) => besideProtected(child, hidden));
|
|
135
137
|
};
|
|
136
138
|
|
|
137
|
-
/** Bubblewrap
|
|
139
|
+
/** Bubblewrap binds readable folders after the writable ones; a readable ancestor would cover a writable folder inside it as read-only and is therefore split into its remaining entries. */
|
|
138
140
|
const readableBeside = (entry: string, writable: readonly string[]): readonly string[] => {
|
|
139
141
|
const inside = writable.filter((candidate) => isInside(entry, candidate));
|
|
140
142
|
if (inside.length === 0) return [entry];
|
|
@@ -142,7 +144,7 @@ const readableBeside = (entry: string, writable: readonly string[]): readonly st
|
|
|
142
144
|
return entriesOf(entry).flatMap((child) => readableBeside(child, inside));
|
|
143
145
|
};
|
|
144
146
|
|
|
145
|
-
/** Toolchains
|
|
147
|
+
/** Toolchains under a protected folder (such as Node from fnm or dotnet tools in the home folder) stay readable, but never an ancestor of the data folder. */
|
|
146
148
|
const toolchainDirectories = (options: ServerProcessSandboxOptions, protectedPaths: readonly string[]): readonly string[] => {
|
|
147
149
|
const environment = options.environment ?? process.env;
|
|
148
150
|
const entries = [
|
|
@@ -158,13 +160,13 @@ const toolchainDirectories = (options: ServerProcessSandboxOptions, protectedPat
|
|
|
158
160
|
return [...new Set(safe)];
|
|
159
161
|
};
|
|
160
162
|
|
|
161
|
-
/**
|
|
163
|
+
/** What a server grants the sandbox for all its runs: network targets and the folders in which Unix sockets may live. */
|
|
162
164
|
interface SandboxGrant {
|
|
163
165
|
readonly network: readonly string[];
|
|
164
166
|
readonly unixSockets: readonly string[];
|
|
165
167
|
}
|
|
166
168
|
|
|
167
|
-
/**
|
|
169
|
+
/** The library has exactly one state per process; several hosts in one process share it, and their network grants are merged. */
|
|
168
170
|
class SharedSandboxRuntime {
|
|
169
171
|
readonly #holders = new Map<object, SandboxGrant>();
|
|
170
172
|
#started: Promise<void> | undefined;
|
|
@@ -176,11 +178,11 @@ class SharedSandboxRuntime {
|
|
|
176
178
|
allowedDomains: [...new Set(grants.flatMap((grant) => grant.network))],
|
|
177
179
|
deniedDomains: [],
|
|
178
180
|
allowUnixSockets: [...new Set(grants.flatMap((grant) => grant.unixSockets))],
|
|
179
|
-
// Linux
|
|
181
|
+
// Linux can block Unix sockets only all or nothing; the build tools (MSBuild nodes) need them.
|
|
180
182
|
...process.platform === "linux" ? { allowAllUnixSockets: true } : {},
|
|
181
183
|
},
|
|
182
184
|
filesystem: { denyRead: [], allowWrite: [], denyWrite: [], allowGitConfig: true },
|
|
183
|
-
//
|
|
185
|
+
// On macOS .NET and Go check certificates via trustd; without this service every TLS connection fails.
|
|
184
186
|
...process.platform === "darwin" ? { enableWeakerNetworkIsolation: true } : {},
|
|
185
187
|
};
|
|
186
188
|
}
|
|
@@ -213,43 +215,42 @@ class SharedSandboxRuntime {
|
|
|
213
215
|
|
|
214
216
|
const sharedRuntime = new SharedSandboxRuntime();
|
|
215
217
|
|
|
216
|
-
const unsupported = (platform: NodeJS.Platform): Error => new Error(platform === "win32"
|
|
217
|
-
? "
|
|
218
|
-
+
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
+ "PROCESS_SANDBOX: \"off\" in der Sektion ragents.workspace schaltet sie ausdrücklich ab.");
|
|
218
|
+
const unsupported = (platform: NodeJS.Platform, disableSetting: string): Error => new Error(platform === "win32"
|
|
219
|
+
? "The process sandbox does not exist on a Windows server: the folder rules per run cannot be set there. "
|
|
220
|
+
+ `Whoever runs the server on Windows anyway turns it off explicitly in the profile file: ${disableSetting}.`
|
|
221
|
+
: `The process sandbox does not know the platform ${platform}; macOS and Linux are supported. `
|
|
222
|
+
+ `${disableSetting} turns it off explicitly.`);
|
|
222
223
|
|
|
223
|
-
const missingDependencies = (errors: readonly string[]): Error => new Error(
|
|
224
|
-
`
|
|
225
|
-
+ "
|
|
226
|
-
+
|
|
224
|
+
const missingDependencies = (errors: readonly string[], disableSetting: string): Error => new Error(
|
|
225
|
+
`The process sandbox cannot start: ${errors.join("; ")}. `
|
|
226
|
+
+ "On Linux it needs bubblewrap, socat and ripgrep (Debian/Ubuntu: apt-get install bubblewrap socat ripgrep). "
|
|
227
|
+
+ `${disableSetting} turns it off explicitly.`);
|
|
227
228
|
|
|
228
|
-
const failedSelfTest = (detail: string): Error => new Error(
|
|
229
|
-
`
|
|
230
|
-
+ "
|
|
231
|
-
+
|
|
229
|
+
const failedSelfTest = (detail: string, disableSetting: string): Error => new Error(
|
|
230
|
+
`The process sandbox cannot be started on this machine: ${detail.trim() || "no output"}. `
|
|
231
|
+
+ "On Linux bubblewrap needs user namespaces; in a container the container's profile must allow them. "
|
|
232
|
+
+ `${disableSetting} turns it off explicitly.`);
|
|
232
233
|
|
|
233
|
-
const runSelfTest = (launch: ProcessLaunch, environment: NodeJS.ProcessEnv): Promise<void> => new Promise((resolve, reject) => {
|
|
234
|
+
const runSelfTest = (launch: ProcessLaunch, environment: NodeJS.ProcessEnv, disableSetting: string): Promise<void> => new Promise((resolve, reject) => {
|
|
234
235
|
const child = spawn(launch.command, [...launch.args], { stdio: ["ignore", "ignore", "pipe"], env: environment });
|
|
235
236
|
let stderr = "";
|
|
236
237
|
const timer = setTimeout(() => {
|
|
237
238
|
child.kill("SIGKILL");
|
|
238
|
-
reject(failedSelfTest(`
|
|
239
|
+
reject(failedSelfTest(`no response after ${SELF_TEST_TIMEOUT_MS / 1000} seconds`, disableSetting));
|
|
239
240
|
}, SELF_TEST_TIMEOUT_MS);
|
|
240
241
|
child.stderr.on("data", (chunk: Buffer) => { stderr = (stderr + chunk.toString("utf8")).slice(-2_000); });
|
|
241
242
|
child.once("error", (error) => {
|
|
242
243
|
clearTimeout(timer);
|
|
243
|
-
reject(failedSelfTest(error.message));
|
|
244
|
+
reject(failedSelfTest(error.message, disableSetting));
|
|
244
245
|
});
|
|
245
246
|
child.once("close", (code) => {
|
|
246
247
|
clearTimeout(timer);
|
|
247
248
|
if (code === 0) resolve();
|
|
248
|
-
else reject(failedSelfTest(`
|
|
249
|
+
else reject(failedSelfTest(`code ${code ?? "signal"}: ${stderr}`, disableSetting));
|
|
249
250
|
});
|
|
250
251
|
});
|
|
251
252
|
|
|
252
|
-
/**
|
|
253
|
+
/** The server's process sandbox: every process of a run that the server's executor starts runs with the folders and network targets of its run. */
|
|
253
254
|
export class ServerProcessSandbox implements RunProcessSandboxes {
|
|
254
255
|
readonly #options: ServerProcessSandboxOptions;
|
|
255
256
|
readonly #platform: NodeJS.Platform;
|
|
@@ -260,23 +261,23 @@ export class ServerProcessSandbox implements RunProcessSandboxes {
|
|
|
260
261
|
constructor(options: ServerProcessSandboxOptions) {
|
|
261
262
|
this.#options = options;
|
|
262
263
|
this.#platform = options.platform ?? process.platform;
|
|
263
|
-
if (this.#platform !== "darwin" && this.#platform !== "linux") throw unsupported(this.#platform);
|
|
264
|
+
if (this.#platform !== "darwin" && this.#platform !== "linux") throw unsupported(this.#platform, options.disableSetting);
|
|
264
265
|
this.#protected = protectedRoots(options, this.#platform);
|
|
265
266
|
this.#readable = [options.hostRoot ?? hostRoot(), ...toolchainDirectories(options, this.#protected)];
|
|
266
267
|
this.#searchPath = resolvedSearchPath(options.environment ?? process.env);
|
|
267
268
|
}
|
|
268
269
|
|
|
269
|
-
/**
|
|
270
|
+
/** Checks the prerequisites, starts the network proxy and starts one process in the sandbox once; every failure is a start error. */
|
|
270
271
|
async start(): Promise<void> {
|
|
271
272
|
const { errors } = SandboxManager.checkDependencies();
|
|
272
|
-
if (errors.length > 0) throw missingDependencies(errors);
|
|
273
|
+
if (errors.length > 0) throw missingDependencies(errors, this.#options.disableSetting);
|
|
273
274
|
await sharedRuntime.acquire(this, {
|
|
274
275
|
network: [...this.#options.network, ...serverTarget(this.#options.serverAddress)],
|
|
275
276
|
unixSockets: socketRoots(this.#options.dataDirectory, this.#platform),
|
|
276
277
|
});
|
|
277
278
|
try {
|
|
278
279
|
const probe = this.forRun({ writable: [], readable: [], temporary: path.join(this.#options.dataDirectory, "sandbox-self-test") });
|
|
279
|
-
await runSelfTest(await probe.wrap({ command: "true", args: [] }), this.#options.environment ?? process.env);
|
|
280
|
+
await runSelfTest(await probe.wrap({ command: "true", args: [] }), this.#options.environment ?? process.env, this.#options.disableSetting);
|
|
280
281
|
} catch (error) {
|
|
281
282
|
await sharedRuntime.release(this);
|
|
282
283
|
throw error;
|
|
@@ -14,18 +14,18 @@ export interface ProductModelSettings {
|
|
|
14
14
|
|
|
15
15
|
const settings = openJson<ProductModelSettings>("ProductModelSettings");
|
|
16
16
|
|
|
17
|
-
/**
|
|
17
|
+
/** One pair per product plugin: read and save the model defaults. */
|
|
18
18
|
export const productModelSettingsContracts = (pluginId: string) => ({
|
|
19
19
|
read: defineOperation({
|
|
20
20
|
id: `${pluginId}.modelSettings.read`,
|
|
21
|
-
description: "
|
|
21
|
+
description: "The model defaults of the roles with the available model catalog. Right: settings.read.",
|
|
22
22
|
rights: ["settings.read"],
|
|
23
23
|
input: Type.Object({}, { additionalProperties: false }),
|
|
24
24
|
result: settings,
|
|
25
25
|
}),
|
|
26
26
|
save: defineOperation({
|
|
27
27
|
id: `${pluginId}.modelSettings.save`,
|
|
28
|
-
description: "
|
|
28
|
+
description: "Save the model defaults of the roles. Rights: settings.read and settings.write.",
|
|
29
29
|
rights: ["settings.read", "settings.write"],
|
|
30
30
|
input: Type.Object({ value: openJson<ProductModelDraft>("ProductModelDraft") }, { additionalProperties: false }),
|
|
31
31
|
result: settings,
|
|
@@ -11,8 +11,8 @@ type AgentModelProfile = Extract<AgentProfile, { driver: "agent" }>;
|
|
|
11
11
|
const invalid = (message: string): DomainError => new DomainError("product-model-invalid", message, 400);
|
|
12
12
|
|
|
13
13
|
const objectOf = (value: unknown, fields: readonly string[]): Record<string, unknown> => {
|
|
14
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) throw invalid(`${fields.join(", ")}
|
|
15
|
-
if (Object.keys(value).some((key) => !fields.includes(key))) throw invalid(`
|
|
14
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) throw invalid(`${fields.join(", ")} are required.`);
|
|
15
|
+
if (Object.keys(value).some((key) => !fields.includes(key))) throw invalid(`Only ${fields.join(", ")} are allowed.`);
|
|
16
16
|
return value as Record<string, unknown>;
|
|
17
17
|
};
|
|
18
18
|
|
|
@@ -53,7 +53,7 @@ export class ProductModelSettingsStore {
|
|
|
53
53
|
const selected = this.#selection(profile.name);
|
|
54
54
|
return {
|
|
55
55
|
...profile, ...selected,
|
|
56
|
-
description: `${selected.model}
|
|
56
|
+
description: `${selected.model} with thinking level ${selected.thinking}. ${profile.description}`,
|
|
57
57
|
};
|
|
58
58
|
});
|
|
59
59
|
|
|
@@ -87,25 +87,25 @@ export class ProductModelSettingsStore {
|
|
|
87
87
|
|
|
88
88
|
#selection(name: string): ProductModelDraft["profiles"][number] {
|
|
89
89
|
const selected = this.#current.profiles.find((profile) => profile.name === name);
|
|
90
|
-
if (!selected) throw invalid(`
|
|
90
|
+
if (!selected) throw invalid(`The role ${name} has no model default.`);
|
|
91
91
|
return selected;
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
#validate(value: unknown): ProductModelDraft {
|
|
95
95
|
const { profiles } = objectOf(value, ["profiles"]);
|
|
96
96
|
const expected = this.#agentProfiles();
|
|
97
|
-
if (!Array.isArray(profiles) || profiles.length !== expected.length) throw invalid(`
|
|
97
|
+
if (!Array.isArray(profiles) || profiles.length !== expected.length) throw invalid(`All of these roles are required: ${expected.map((profile) => profile.name).join(", ")}.`);
|
|
98
98
|
const seen = new Set<string>();
|
|
99
99
|
const validated = profiles.map((item: unknown) => {
|
|
100
100
|
const entry = objectOf(item, ["name", "model", "thinking"]);
|
|
101
101
|
const profile = expected.find((candidate) => candidate.name === entry.name);
|
|
102
|
-
if (!profile) throw invalid(`
|
|
103
|
-
if (seen.has(profile.name)) throw invalid(`
|
|
102
|
+
if (!profile) throw invalid(`Unknown role ${String(entry.name)}.`);
|
|
103
|
+
if (seen.has(profile.name)) throw invalid(`The role ${profile.name} is listed twice.`);
|
|
104
104
|
seen.add(profile.name);
|
|
105
|
-
if (profile.provider !== this.#choice.provider) throw invalid(`
|
|
106
|
-
if (typeof entry.model !== "string" || !this.#choice.options.includes(entry.model)) throw invalid(`
|
|
105
|
+
if (profile.provider !== this.#choice.provider) throw invalid(`The role ${profile.name} uses a different provider.`);
|
|
106
|
+
if (typeof entry.model !== "string" || !this.#choice.options.includes(entry.model)) throw invalid(`The model ${String(entry.model)} is not available for selection.`);
|
|
107
107
|
const allowed = this.#choice.thinkingOptionsFor(entry.model);
|
|
108
|
-
if (!isThinkingLevel(entry.thinking) || !allowed.includes(entry.thinking)) throw invalid(`
|
|
108
|
+
if (!isThinkingLevel(entry.thinking) || !allowed.includes(entry.thinking)) throw invalid(`The thinking level ${String(entry.thinking)} is not available for ${entry.model} (valid: ${allowed.join(", ")}).`);
|
|
109
109
|
return { name: profile.name, model: entry.model, thinking: entry.thinking };
|
|
110
110
|
});
|
|
111
111
|
return { profiles: expected.map((profile) => validated.find((entry) => entry.name === profile.name)!) };
|
|
@@ -10,7 +10,7 @@ export interface RelayConnection {
|
|
|
10
10
|
readonly token: string;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
/**
|
|
13
|
+
/** What the relay reveals per alias about the model behind it, including the alias's compaction values; the real name stays with the server. */
|
|
14
14
|
export interface RelayCatalogEntry {
|
|
15
15
|
readonly id: string;
|
|
16
16
|
readonly object: "model";
|
|
@@ -46,8 +46,8 @@ const isEntry = (value: unknown): value is RelayCatalogEntry => {
|
|
|
46
46
|
export const relayBaseUrl = (url: string): string => {
|
|
47
47
|
let parsed: URL;
|
|
48
48
|
try { parsed = new URL(url); }
|
|
49
|
-
catch { throw new Error(`RELAY_URL
|
|
50
|
-
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") throw new Error(`RELAY_URL
|
|
49
|
+
catch { throw new Error(`RELAY_URL is not a valid address: ${url}`); }
|
|
50
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") throw new Error(`RELAY_URL needs http or https: ${url}`);
|
|
51
51
|
return `${parsed.origin}${parsed.pathname.replace(/\/+$/, "")}${RELAY_API_PATH}`;
|
|
52
52
|
};
|
|
53
53
|
|
|
@@ -67,7 +67,7 @@ const modelOf = (entry: RelayCatalogEntry, baseUrl: string): Model<"openai-compl
|
|
|
67
67
|
...(entry.catalog.compat ? { compat: entry.catalog.compat as Model<"openai-completions">["compat"] } : {}),
|
|
68
68
|
});
|
|
69
69
|
|
|
70
|
-
/**
|
|
70
|
+
/** Fetches the relay's alias catalog exactly once; without a reachable relay the start is an error with address and cause. */
|
|
71
71
|
export const createRelayCatalog = (connection: RelayConnection, fetchImpl: typeof fetch = fetch): RelayCatalog => {
|
|
72
72
|
const baseUrl = relayBaseUrl(connection.url);
|
|
73
73
|
let loading: Promise<readonly Model<Api>[]> | undefined;
|
|
@@ -78,14 +78,14 @@ export const createRelayCatalog = (connection: RelayConnection, fetchImpl: typeo
|
|
|
78
78
|
try {
|
|
79
79
|
response = await fetchImpl(address, { headers: { authorization: `Bearer ${connection.token}` }, signal: AbortSignal.timeout(15_000) });
|
|
80
80
|
} catch (error) {
|
|
81
|
-
throw new Error(`
|
|
81
|
+
throw new Error(`The model relay ${address} is unreachable: ${error instanceof Error ? error.message : String(error)}`);
|
|
82
82
|
}
|
|
83
83
|
if (!response.ok) {
|
|
84
|
-
throw new Error(`
|
|
84
|
+
throw new Error(`The model relay ${address} rejects the catalog request: ${response.status} ${(await response.text()).slice(0, 200)}`);
|
|
85
85
|
}
|
|
86
86
|
const body = await response.json() as { data?: unknown };
|
|
87
|
-
if (!Array.isArray(body.data) || !body.data.every(isEntry)) throw new Error(`
|
|
88
|
-
if (body.data.length === 0) throw new Error(`
|
|
87
|
+
if (!Array.isArray(body.data) || !body.data.every(isEntry)) throw new Error(`The model relay ${address} does not return a valid alias catalog`);
|
|
88
|
+
if (body.data.length === 0) throw new Error(`The model relay ${address} offers no models`);
|
|
89
89
|
for (const entry of body.data) {
|
|
90
90
|
const problem = compactionProblem(entry.catalog.compaction, entry.catalog);
|
|
91
91
|
if (problem) throw new Error(`The model relay ${address} offers ${entry.id} without valid compaction values: ${problem}`);
|
|
@@ -98,7 +98,7 @@ export const createRelayCatalog = (connection: RelayConnection, fetchImpl: typeo
|
|
|
98
98
|
baseUrl,
|
|
99
99
|
load,
|
|
100
100
|
models: () => {
|
|
101
|
-
if (!loaded) throw new Error(`
|
|
101
|
+
if (!loaded) throw new Error(`The model catalog of the relay ${baseUrl} is not loaded yet`);
|
|
102
102
|
return loaded;
|
|
103
103
|
},
|
|
104
104
|
registration: async () => ({
|
|
@@ -28,14 +28,14 @@ const systemPromptSchema = Type.Object({
|
|
|
28
28
|
export const modelStartOption = (choice: ModelChoice, preferredThinking: ThinkingLevel | (() => ThinkingLevel)): StartOptionContribution => {
|
|
29
29
|
const resolved = (model: string, wanted: string | undefined): ModelStartOptionValue => {
|
|
30
30
|
if (!choice.options.includes(model)) {
|
|
31
|
-
throw new DomainError("model-unknown", `
|
|
31
|
+
throw new DomainError("model-unknown", `The model ${model} is not available for selection.`, 404);
|
|
32
32
|
}
|
|
33
33
|
const allowed = choice.thinkingOptionsFor(model);
|
|
34
34
|
if (wanted !== undefined) {
|
|
35
35
|
if (!isThinkingLevel(wanted) || !allowed.includes(wanted)) {
|
|
36
36
|
throw new DomainError(
|
|
37
37
|
"thinking-unknown",
|
|
38
|
-
`
|
|
38
|
+
`The reasoning ${wanted} is not available for this model (valid: ${allowed.join(", ")}).`,
|
|
39
39
|
400,
|
|
40
40
|
);
|
|
41
41
|
}
|
|
@@ -80,11 +80,11 @@ export const systemPromptStartOption = (catalog: () => SystemPromptCatalog): Sta
|
|
|
80
80
|
const current = catalog();
|
|
81
81
|
for (const promptId of promptIds) {
|
|
82
82
|
if (!current.options.some((option) => option.id === promptId)) {
|
|
83
|
-
throw new DomainError("prompt-unknown", `
|
|
83
|
+
throw new DomainError("prompt-unknown", `The system prompt ${promptId} is not configured.`, 404);
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
const duplicate = promptIds.find((id, index) => promptIds.indexOf(id) !== index);
|
|
87
|
-
if (duplicate) throw new DomainError("prompt-duplicate", `
|
|
87
|
+
if (duplicate) throw new DomainError("prompt-duplicate", `The system prompt ${duplicate} is listed twice.`, 400);
|
|
88
88
|
return { promptIds: [...promptIds], shareWithAgents };
|
|
89
89
|
},
|
|
90
90
|
describe: () => {
|
|
@@ -29,7 +29,7 @@ export const boundToTools = (
|
|
|
29
29
|
...toolNames: readonly string[]
|
|
30
30
|
): PromptContribution => {
|
|
31
31
|
if (toolNames.length === 0) {
|
|
32
|
-
throw new Error(`
|
|
32
|
+
throw new Error(`The prompt contribution ${contribution.id} names no tool it is bound to`);
|
|
33
33
|
}
|
|
34
34
|
return { ...contribution, delivery: contribution.delivery ?? "on-demand", requiresTools: toolNames };
|
|
35
35
|
};
|
|
@@ -11,7 +11,7 @@ export type ProvisionState =
|
|
|
11
11
|
| { readonly kind: "ready" }
|
|
12
12
|
| { readonly kind: "gap"; readonly name: string; readonly instruction: string; readonly installable: boolean };
|
|
13
13
|
|
|
14
|
-
/**
|
|
14
|
+
/** What a plugin exports in `provision.ts`: the tool folder is its only storage location. */
|
|
15
15
|
export interface PluginProvision {
|
|
16
16
|
readonly check: (target: string) => Promise<ProvisionState>;
|
|
17
17
|
readonly apply: (target: string, log: (line: string) => void) => Promise<void>;
|
|
@@ -36,11 +36,11 @@ export type ArchiveDownload = (url: string) => Promise<Buffer>;
|
|
|
36
36
|
|
|
37
37
|
export const downloadArchive: ArchiveDownload = async (url) => {
|
|
38
38
|
const response = await fetch(url);
|
|
39
|
-
if (!response.ok) throw new Error(`${url}
|
|
39
|
+
if (!response.ok) throw new Error(`${url} does not arrive: ${response.status} ${response.statusText}`);
|
|
40
40
|
return Buffer.from(await response.arrayBuffer());
|
|
41
41
|
};
|
|
42
42
|
|
|
43
|
-
/**
|
|
43
|
+
/** Stores the entries below `prefix` as a fresh folder `directory` in the tool folder. */
|
|
44
44
|
export const unpackArchive = async (
|
|
45
45
|
archive: Buffer,
|
|
46
46
|
prefix: string,
|
|
@@ -48,13 +48,13 @@ export const unpackArchive = async (
|
|
|
48
48
|
directory: string,
|
|
49
49
|
): Promise<number> => {
|
|
50
50
|
const entries = readZipEntries(archive, (name) => name.startsWith(prefix));
|
|
51
|
-
if (entries.length === 0) throw new Error(`
|
|
51
|
+
if (entries.length === 0) throw new Error(`The archive contains no entries under ${prefix}`);
|
|
52
52
|
const destination = path.join(target, directory);
|
|
53
53
|
await rm(destination, { recursive: true, force: true });
|
|
54
54
|
for (const entry of entries) {
|
|
55
55
|
const relative = entry.name.slice(prefix.length).split("/");
|
|
56
56
|
if (relative.some((segment) => segment === "" || segment === "." || segment === "..")) {
|
|
57
|
-
throw new Error(`
|
|
57
|
+
throw new Error(`The archive entry ${entry.name} leaves the tool folder`);
|
|
58
58
|
}
|
|
59
59
|
const file = path.join(destination, ...relative);
|
|
60
60
|
await mkdir(path.dirname(file), { recursive: true });
|
|
@@ -79,7 +79,7 @@ export const writeProvisionStamp = async (target: string, version: string): Prom
|
|
|
79
79
|
|
|
80
80
|
const run = promisify(execFile);
|
|
81
81
|
|
|
82
|
-
/**
|
|
82
|
+
/** The major versions of the installed .NET runtimes, or undefined when there is no dotnet. */
|
|
83
83
|
export const dotnetRuntimeMajors = async (): Promise<readonly number[] | undefined> => {
|
|
84
84
|
const output = await run("dotnet", ["--list-runtimes"], { maxBuffer: 4 * 1024 * 1024 }).catch(() => undefined);
|
|
85
85
|
if (!output) return undefined;
|
|
@@ -87,5 +87,5 @@ export const dotnetRuntimeMajors = async (): Promise<readonly number[] | undefin
|
|
|
87
87
|
return [...new Set(majors)].sort((left, right) => left - right);
|
|
88
88
|
};
|
|
89
89
|
|
|
90
|
-
export const DOTNET_INSTRUCTION = "dotnet
|
|
91
|
-
+ "
|
|
90
|
+
export const DOTNET_INSTRUCTION = "dotnet is missing on this machine; install the .NET SDK from https://dotnet.microsoft.com/download "
|
|
91
|
+
+ "and make sure dotnet is on the PATH";
|
|
@@ -10,18 +10,18 @@ const RUN_FIELDS = ["title", "description", "order", "guide", "tags", "coordinat
|
|
|
10
10
|
|
|
11
11
|
const requiredFile = (directory: string, name: string): string => {
|
|
12
12
|
const file = path.join(directory, name);
|
|
13
|
-
if (!statSync(file, { throwIfNoEntry: false })?.isFile()) throw new Error(`
|
|
13
|
+
if (!statSync(file, { throwIfNoEntry: false })?.isFile()) throw new Error(`The run script ${directory} is missing the file ${name}`);
|
|
14
14
|
return file;
|
|
15
15
|
};
|
|
16
16
|
|
|
17
|
-
/**
|
|
17
|
+
/** The header line fixed-start-options is a JSON object on one line: start option id to fixed value. */
|
|
18
18
|
const fixedStartOptionsOf = (file: string, value: string | undefined): Readonly<Record<string, JsonValue>> | undefined => {
|
|
19
19
|
if (value === undefined) return undefined;
|
|
20
20
|
let parsed: unknown;
|
|
21
21
|
try { parsed = JSON.parse(value); }
|
|
22
|
-
catch (error) { throw new Error(`${file}: fixed-start-options
|
|
22
|
+
catch (error) { throw new Error(`${file}: fixed-start-options is not JSON (${error instanceof Error ? error.message : String(error)})`); }
|
|
23
23
|
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
24
|
-
throw new Error(`${file}: fixed-start-options
|
|
24
|
+
throw new Error(`${file}: fixed-start-options must be a JSON object of start option id and value`);
|
|
25
25
|
}
|
|
26
26
|
return parsed as Record<string, JsonValue>;
|
|
27
27
|
};
|
|
@@ -34,7 +34,7 @@ const packageFiles = (directory: string, relative = ""): ActorProgramFile[] =>
|
|
|
34
34
|
if (!relative && ["actors", "RUN.md"].includes(entry.name)) return [];
|
|
35
35
|
const filePath = path.posix.join(relative, entry.name);
|
|
36
36
|
if (entry.isDirectory()) return packageFiles(directory, filePath);
|
|
37
|
-
if (!entry.isFile()) throw new Error(`${directory}: ${filePath}
|
|
37
|
+
if (!entry.isFile()) throw new Error(`${directory}: ${filePath} is not a regular package file`);
|
|
38
38
|
return [{path: filePath, content: readFileSync(path.join(directory, filePath), "utf8")}];
|
|
39
39
|
});
|
|
40
40
|
|
|
@@ -45,29 +45,29 @@ const filesOf = (directory: string): ActorProgramFile[] => {
|
|
|
45
45
|
|
|
46
46
|
const runScriptFrom = (directory: string, name: string, id: string): ScriptStartEntry => {
|
|
47
47
|
if (!PACKAGE_NAME.test(name))
|
|
48
|
-
throw new Error(`${directory}:
|
|
48
|
+
throw new Error(`${directory}: the folder name ${name} is not a handle (lowercase letters, digits, hyphen)`);
|
|
49
49
|
const runFile = requiredFile(directory, "RUN.md");
|
|
50
|
-
const {fields} = frontMatterOf(runFile, readFileSync(runFile, "utf8"), "title
|
|
50
|
+
const {fields} = frontMatterOf(runFile, readFileSync(runFile, "utf8"), "title and description");
|
|
51
51
|
const unknown = [...fields.keys()].filter((key) => !RUN_FIELDS.includes(key));
|
|
52
|
-
if (unknown.length > 0) throw new Error(`${runFile}:
|
|
52
|
+
if (unknown.length > 0) throw new Error(`${runFile}: unknown header lines ${unknown.join(", ")}`);
|
|
53
53
|
const title = fields.get("title");
|
|
54
54
|
const description = fields.get("description");
|
|
55
|
-
if (!title) throw new Error(`${runFile}: title
|
|
56
|
-
if (!description) throw new Error(`${runFile}: description
|
|
55
|
+
if (!title) throw new Error(`${runFile}: title is missing`);
|
|
56
|
+
if (!description) throw new Error(`${runFile}: description is missing`);
|
|
57
57
|
const order = numberOf(runFile, "order", fields.get("order"));
|
|
58
58
|
const guide = fields.get("guide");
|
|
59
59
|
const tags = tagsOf(runFile, fields.get("tags"));
|
|
60
60
|
const category = fields.get("category");
|
|
61
|
-
if (category !== undefined && !category.trim()) throw new Error(`${runFile}: category
|
|
61
|
+
if (category !== undefined && !category.trim()) throw new Error(`${runFile}: category is empty`);
|
|
62
62
|
const fixedStartOptions = fixedStartOptionsOf(runFile, fields.get("fixed-start-options"));
|
|
63
63
|
const programsDirectory = path.join(directory, "actors");
|
|
64
64
|
const programsStats = statSync(programsDirectory, {throwIfNoEntry: false});
|
|
65
|
-
if (programsStats && !programsStats.isDirectory()) throw new Error(`${programsDirectory}
|
|
65
|
+
if (programsStats && !programsStats.isDirectory()) throw new Error(`${programsDirectory} must be a directory`);
|
|
66
66
|
const programs = programsStats ? readdirSync(programsDirectory, {withFileTypes: true})
|
|
67
67
|
.sort((left, right) => left.name.localeCompare(right.name))
|
|
68
68
|
.map((entry) => {
|
|
69
69
|
if (!entry.isDirectory() || !PACKAGE_NAME.test(entry.name))
|
|
70
|
-
throw new Error(`${programsDirectory}: ${entry.name}
|
|
70
|
+
throw new Error(`${programsDirectory}: ${entry.name} is not an actor program folder`);
|
|
71
71
|
return {name: entry.name, files: filesOf(path.join(programsDirectory, entry.name))};
|
|
72
72
|
}) : [];
|
|
73
73
|
return {
|
|
@@ -90,16 +90,16 @@ export const runScriptsFromDirectory = (directory: string, idPrefix: string): re
|
|
|
90
90
|
const resolved = path.resolve(directory);
|
|
91
91
|
let entries;
|
|
92
92
|
try { entries = readdirSync(resolved, {withFileTypes: true}); }
|
|
93
|
-
catch (error) { throw new Error(`
|
|
93
|
+
catch (error) { throw new Error(`The run script directory ${resolved} is not readable (${error instanceof Error ? error.message : String(error)})`); }
|
|
94
94
|
const packages = entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort();
|
|
95
95
|
const stray = entries.filter((entry) => !entry.isDirectory()).map((entry) => entry.name);
|
|
96
|
-
if (stray.length > 0) throw new Error(`${resolved}
|
|
97
|
-
if (packages.length === 0) throw new Error(`${resolved}
|
|
96
|
+
if (stray.length > 0) throw new Error(`${resolved} contains files instead of run script folders: ${stray.join(", ")}`);
|
|
97
|
+
if (packages.length === 0) throw new Error(`${resolved} contains no run script folder`);
|
|
98
98
|
return packages.map((name) => runScriptFrom(path.join(resolved, name), name, `${idPrefix}.${name}`));
|
|
99
99
|
};
|
|
100
100
|
|
|
101
101
|
export const runScriptFromDirectory = (directory: string): ScriptStartEntry => {
|
|
102
|
-
if (!path.isAbsolute(directory)) throw new Error("
|
|
102
|
+
if (!path.isAbsolute(directory)) throw new Error("The run script package needs an absolute server file path");
|
|
103
103
|
const resolved = path.resolve(directory);
|
|
104
104
|
return runScriptFrom(resolved, path.basename(resolved), `local.${path.basename(resolved)}`);
|
|
105
105
|
};
|