@schlenkr/ragents 0.1.10 → 0.1.12
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/README.md +1 -1
- package/apps/server/package.json +1 -1
- package/apps/server/src/access-projection.ts +6 -6
- package/apps/server/src/access-service.ts +3 -3
- package/apps/server/src/access-session.ts +19 -19
- package/apps/server/src/api/contracts.ts +29 -29
- package/apps/server/src/api/core-methods.ts +17 -17
- package/apps/server/src/api/delivery.ts +2 -2
- package/apps/server/src/api/reference.ts +27 -27
- package/apps/server/src/api/rights.ts +18 -18
- package/apps/server/src/chat-handler.ts +5 -5
- package/apps/server/src/config-definition.ts +37 -10
- package/apps/server/src/config-file.ts +49 -49
- package/apps/server/src/config.ts +2 -0
- package/apps/server/src/data-directory.ts +2 -2
- package/apps/server/src/external-access.ts +1 -1
- package/apps/server/src/folder-install.ts +1 -1
- package/apps/server/src/help-files.ts +1 -1
- package/apps/server/src/host-api.json +6 -1
- package/apps/server/src/host-api.ts +3 -2
- package/apps/server/src/host-record.ts +3 -3
- package/apps/server/src/host-resolution-hooks.mjs +4 -4
- package/apps/server/src/host-version.ts +17 -17
- package/apps/server/src/host-web.ts +5 -5
- package/apps/server/src/main.ts +6 -6
- package/apps/server/src/missing-environment.ts +6 -6
- package/apps/server/src/parent-watch.ts +4 -4
- package/apps/server/src/plugin-build/build.ts +38 -38
- package/apps/server/src/plugin-build/host-api-names.ts +7 -7
- package/apps/server/src/plugin-build/plugin-description.ts +15 -15
- package/apps/server/src/plugin-build/typecheck.ts +1 -1
- package/apps/server/src/plugin-support/actor-programs/app-project.ts +19 -19
- package/apps/server/src/plugin-support/actor-programs/client-compiler.ts +4 -4
- package/apps/server/src/plugin-support/actor-programs/client-contracts.ts +11 -11
- package/apps/server/src/plugin-support/actor-programs/contract.ts +17 -17
- package/apps/server/src/plugin-support/actor-programs/runtime-libraries.ts +1 -1
- package/apps/server/src/plugin-support/actor-programs/workflow/index.ts +5 -5
- package/apps/server/src/plugin-support/actor-programs/workflow/prompt-reader.ts +2 -2
- package/apps/server/src/plugin-support/chat-display-policy.ts +2 -2
- package/apps/server/src/plugin-support/front-matter.ts +6 -6
- package/apps/server/src/plugin-support/http.ts +2 -2
- package/apps/server/src/plugin-support/language-server/contract.ts +8 -8
- package/apps/server/src/plugin-support/language-server/plugin.ts +2 -2
- package/apps/server/src/plugin-support/language-server/snapshot-method.ts +1 -1
- package/apps/server/src/plugin-support/language-server/tools.ts +11 -11
- package/apps/server/src/plugin-support/model-aliases.ts +30 -20
- package/apps/server/src/plugin-support/model-choice.ts +15 -15
- package/apps/server/src/plugin-support/model-completion.ts +44 -23
- package/apps/server/src/plugin-support/model-providers.ts +170 -0
- package/apps/server/src/plugin-support/model-upstreams.ts +1 -1
- package/apps/server/src/plugin-support/native-typescript-child.ts +4 -4
- package/apps/server/src/plugin-support/native-typescript-executor.ts +12 -12
- package/apps/server/src/plugin-support/plugin-config.ts +3 -3
- package/apps/server/src/plugin-support/plugin-folder.ts +2 -2
- package/apps/server/src/plugin-support/plugins-root.ts +2 -2
- package/apps/server/src/plugin-support/process-sandbox.ts +39 -39
- package/apps/server/src/plugin-support/product-model-settings-contract.ts +3 -3
- package/apps/server/src/plugin-support/product-model-settings.ts +10 -10
- package/apps/server/src/plugin-support/product-relay.ts +9 -9
- package/apps/server/src/plugin-support/product-start-options.ts +4 -4
- package/apps/server/src/plugin-support/prompt.ts +1 -1
- package/apps/server/src/plugin-support/provision.ts +8 -8
- package/apps/server/src/plugin-support/run-scripts.ts +17 -17
- package/apps/server/src/plugin-support/skills.ts +18 -18
- package/apps/server/src/plugin-support/start-entries-contract.ts +17 -17
- package/apps/server/src/plugin-support/start-options-contract.ts +5 -5
- package/apps/server/src/plugin-support/system-prompts.ts +11 -11
- package/apps/server/src/plugin-support/thinking-level.ts +2 -2
- package/apps/server/src/plugin-support/tool-availability.ts +2 -2
- package/apps/server/src/plugin-support/workspace-ownership.ts +5 -5
- package/apps/server/src/plugin-support/workspace-sandbox-host.ts +37 -37
- package/apps/server/src/plugin-support/zip.ts +7 -7
- package/apps/server/src/profile/bundle-manifest.ts +27 -27
- package/apps/server/src/profile/compose.ts +12 -7
- package/apps/server/src/profile/plugin-discovery.ts +14 -14
- 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 +62 -57
- package/apps/server/src/ragents/actor-chat-history.ts +8 -8
- package/apps/server/src/ragents/chat-text-positions.ts +2 -2
- package/apps/server/src/ragents/coordinator.ts +2 -2
- package/apps/server/src/ragents/engine.ts +23 -23
- package/apps/server/src/ragents/global-chat.ts +8 -8
- package/apps/server/src/ragents/host-services.ts +6 -3
- package/apps/server/src/ragents/journal-chat-events.ts +1 -1
- package/apps/server/src/ragents/run-owner.ts +2 -2
- package/apps/server/src/ragents/session.ts +49 -49
- package/apps/server/src/ragents/typescript-tools.ts +12 -12
- package/apps/server/src/ragents/workspace-runtime.ts +28 -28
- package/apps/server/src/rpc/dispatcher.ts +19 -19
- package/apps/server/src/rpc/http-transport.ts +11 -11
- package/apps/server/src/rpc/stdio-transport.ts +3 -3
- package/apps/server/src/run-preparation-input.ts +5 -5
- package/apps/server/src/run-preparation.ts +24 -24
- package/apps/server/src/run-transfer.ts +39 -39
- package/apps/server/src/server.ts +48 -48
- package/apps/server/src/settings.ts +1 -1
- package/apps/server/src/startup.ts +3 -3
- package/apps/server/src/title-compactor.ts +9 -9
- package/apps/server/src/title-settings.ts +3 -3
- package/apps/server/src/web-bundles.ts +2 -2
- package/apps/server/src/web-stylesheet.ts +2 -2
- package/apps/web/dist/assets/{highlighted-body-KPVGNVTW-BO4wLQtE.js → highlighted-body-KPVGNVTW-CpPi6QLr.js} +1 -1
- package/apps/web/dist/assets/main-DJmCHGzM.js +11 -0
- package/apps/web/dist/assets/mermaid-HWGCJPDP-q-mf1kLN.js +608 -0
- package/apps/web/dist/assets/runPanel-nk_aMxSn.js +21 -0
- package/apps/web/dist/help/guide-access.html +5 -5
- package/apps/web/dist/help/guide-access.md +2 -2
- package/apps/web/dist/help/guide-clients.html +53 -54
- package/apps/web/dist/help/guide-clients.md +50 -51
- package/apps/web/dist/help/guide-distributed.html +12 -7
- package/apps/web/dist/help/guide-distributed.md +9 -4
- package/apps/web/dist/help/guide-functions.html +3 -3
- package/apps/web/dist/help/guide-getting-started.html +24 -15
- package/apps/web/dist/help/guide-getting-started.md +22 -12
- package/apps/web/dist/help/guide-ideas.html +3 -3
- package/apps/web/dist/help/guide-plugins.html +5 -4
- package/apps/web/dist/help/guide-plugins.md +2 -1
- package/apps/web/dist/help/guide-programs.html +3 -3
- package/apps/web/dist/help/guide-runtime.html +6 -6
- package/apps/web/dist/help/guide-runtime.md +3 -3
- package/apps/web/dist/help/guide.html +3 -3
- package/apps/web/dist/help/index.html +196 -144
- package/apps/web/dist/help/mini-app.css +6 -0
- package/apps/web/dist/help/mini-app.js +14 -14
- package/apps/web/dist/host-web.json +91 -91
- 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/QuasselHost.tsx +1 -1
- package/apps/web/src/chat/StoppedActorNotice.tsx +5 -5
- package/apps/web/src/chat/chat-target.ts +3 -3
- package/apps/web/src/chat/requests.ts +2 -2
- package/apps/web/src/chat/useAttachmentCapabilities.ts +2 -2
- package/apps/web/src/chat-view-settings.tsx +5 -6
- package/apps/web/src/diff-view.css +1 -1
- package/apps/web/src/highlighting.css +1 -1
- package/apps/web/src/language-server/language-server-plugin.tsx +30 -30
- package/apps/web/src/lib/labels.ts +6 -6
- package/apps/web/src/main.tsx +4 -4
- package/apps/web/src/offered-machines.ts +2 -2
- package/apps/web/src/page-opener.tsx +1 -1
- package/apps/web/src/panel/ConnectionsPage.tsx +23 -23
- package/apps/web/src/panel/LoginForm.tsx +6 -6
- package/apps/web/src/panel/PanelDialogs.tsx +22 -22
- package/apps/web/src/panel/PanelHeader.tsx +2 -2
- package/apps/web/src/panel/PanelPage.tsx +1 -1
- package/apps/web/src/panel/RunLine.tsx +4 -4
- package/apps/web/src/panel/RunsPage.tsx +15 -15
- package/apps/web/src/panel/StartPage.tsx +26 -26
- package/apps/web/src/panel/connection-state.ts +9 -9
- package/apps/web/src/panel/contract.ts +28 -28
- package/apps/web/src/panel.tsx +1 -1
- package/apps/web/src/plugin-bootstrap.ts +5 -5
- package/apps/web/src/product/ModelControl.tsx +3 -3
- package/apps/web/src/product/ProductModelSettings.tsx +16 -16
- package/apps/web/src/product/SystemPromptControl.tsx +11 -11
- package/apps/web/src/product/model-settings.ts +2 -2
- package/apps/web/src/rpc/client.ts +16 -16
- package/apps/web/src/rpc.ts +1 -1
- package/apps/web/src/run-overview.ts +1 -1
- package/apps/web/src/run-panel/RunPanelApp.tsx +39 -39
- package/apps/web/src/run-panel/RunPanelHeader.tsx +6 -6
- package/apps/web/src/run-panel/RunPanelMenu.tsx +6 -6
- package/apps/web/src/run-panel/RunPanelRail.tsx +4 -4
- package/apps/web/src/run-panel/RunPanelWorkspace.tsx +3 -3
- package/apps/web/src/run-panel/clipboard.ts +3 -3
- package/apps/web/src/run-panel/host-contract.ts +5 -5
- package/apps/web/src/run-panel/host.ts +15 -15
- package/apps/web/src/run-panel/input-bridge.ts +1 -1
- package/apps/web/src/run-panel/run-panel-location.ts +5 -5
- package/apps/web/src/run-panel/use-session-list.ts +1 -1
- package/apps/web/src/run-panel/workspace-state.ts +3 -3
- package/apps/web/src/run-panel.tsx +4 -4
- package/apps/web/src/run-preparation.ts +2 -2
- package/apps/web/src/run-view.ts +3 -3
- package/apps/web/src/settings-contributions.ts +32 -32
- package/apps/web/src/theme.ts +9 -9
- package/apps/web/src/title-model-settings.ts +6 -6
- package/apps/web/src/ui/ListDetail.tsx +9 -9
- package/apps/web/src/ui/dialog.tsx +2 -2
- package/apps/web/src/ui/modal-controller.ts +3 -3
- package/apps/web/src/ui/modal.tsx +2 -2
- package/apps/web/src/ui/popover.tsx +1 -1
- package/apps/web/src/ui/relative-time.ts +8 -8
- package/apps/web/src/ui/startup-notice.tsx +2 -2
- package/apps/web/src/ui/state-icon.tsx +1 -1
- package/apps/web/src/ui/state-vocabulary.ts +16 -16
- package/apps/web/src/ui/stop-button.tsx +2 -2
- package/bundles/ragents.activity/ragents-bundle.json +3 -3
- 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 +3 -3
- package/bundles/ragents.actor-programs/server/index.js +225 -225
- package/bundles/ragents.actor-programs/server/index.js.map +2 -2
- package/bundles/ragents.actor-programs/web/classes.json +1 -1
- package/bundles/ragents.actor-programs/web/index.js +1 -1
- package/bundles/ragents.actor-programs/web/index.js.map +3 -3
- package/bundles/ragents.ask/ragents-bundle.json +3 -3
- package/bundles/ragents.ask/server/chunks/{chunk-PDJO75SQ.js → chunk-YOV27MAR.js} +2 -2
- package/bundles/ragents.ask/server/chunks/chunk-YOV27MAR.js.map +7 -0
- package/bundles/ragents.ask/server/exports/server/contract.js +1 -1
- package/bundles/ragents.ask/server/index.js +23 -23
- package/bundles/ragents.ask/server/index.js.map +2 -2
- package/bundles/ragents.ask/web/chunks/{chunk-WFN4374U.js → chunk-D6NNB5DS.js} +1 -1
- package/bundles/ragents.ask/web/chunks/chunk-D6NNB5DS.js.map +7 -0
- package/bundles/ragents.ask/web/chunks/{chunk-MBRPS477.js → chunk-IQBHK7MV.js} +2 -2
- package/bundles/ragents.ask/web/chunks/{chunk-MBRPS477.js.map → chunk-IQBHK7MV.js.map} +3 -3
- package/bundles/ragents.ask/web/chunks/chunk-PWFIAMX4.js +2 -0
- package/bundles/ragents.ask/web/chunks/chunk-PWFIAMX4.js.map +7 -0
- package/bundles/ragents.ask/web/chunks/chunk-QHGKEESD.js +2 -0
- package/bundles/ragents.ask/web/chunks/chunk-QHGKEESD.js.map +7 -0
- package/bundles/ragents.ask/web/classes.json +1 -1
- package/bundles/ragents.ask/web/exports/ask-payload.js +1 -1
- package/bundles/ragents.ask/web/exports/web/QuestionCard.js +1 -1
- package/bundles/ragents.ask/web/exports/web/api.js +1 -1
- package/bundles/ragents.ask/web/index.js +1 -1
- package/bundles/ragents.ask/web/index.js.map +2 -2
- package/bundles/ragents.browser/executor/index.mjs +35 -35
- package/bundles/ragents.browser/executor/index.mjs.map +2 -2
- package/bundles/ragents.browser/ragents-bundle.json +3 -3
- 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 +3 -3
- 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 +3 -3
- 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 +3 -3
- 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 +3 -3
- 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 +8 -4
- 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 +3 -3
- package/bundles/ragents.orchestration/server/index.js +28 -28
- package/bundles/ragents.orchestration/server/index.js.map +2 -2
- package/bundles/ragents.orchestration/web/chunks/{chunk-OSKPH6SZ.js → chunk-CFMJD5ZI.js} +2 -2
- package/bundles/ragents.orchestration/web/chunks/chunk-HOBLI364.js +2 -0
- package/bundles/ragents.orchestration/web/chunks/{chunk-OQYCNYXN.js.map → chunk-HOBLI364.js.map} +2 -2
- package/bundles/ragents.orchestration/web/chunks/{chunk-ODMMQGX2.js → chunk-UCIMT2R4.js} +2 -2
- package/bundles/ragents.orchestration/web/classes.json +1 -1
- package/bundles/ragents.orchestration/web/exports/web/program-slot.js +1 -1
- package/bundles/ragents.orchestration/web/exports/web/surface-entities.js +1 -1
- package/bundles/ragents.orchestration/web/index.js +8 -8
- package/bundles/ragents.orchestration/web/index.js.map +2 -2
- package/bundles/ragents.overseer/ragents-bundle.json +3 -3
- package/bundles/ragents.overseer/server/index.js +98 -98
- package/bundles/ragents.overseer/server/index.js.map +2 -2
- package/bundles/ragents.overseer/web/classes.json +1 -1
- package/bundles/ragents.overseer/web/index.js +1 -1
- package/bundles/ragents.overseer/web/index.js.map +2 -2
- package/bundles/ragents.processes/ragents-bundle.json +3 -3
- 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 +3 -3
- 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 +3 -3
- 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 +3 -3
- 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 +3 -3
- package/bundles/ragents.todo/server/index.js +5 -8
- 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 +3 -3
- 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 +3 -3
- 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 +3 -3
- package/bundles/ragents.workspace/server/index.js +83 -83
- package/bundles/ragents.workspace/server/index.js.map +2 -2
- package/bundles/ragents.workspace/web/classes.json +1 -1
- package/bundles/ragents.workspace/web/index.js +1 -1
- package/bundles/ragents.workspace/web/index.js.map +2 -2
- package/package.json +4 -4
- package/packages/agent/dist/core/model-runtime.d.ts +7 -2
- package/packages/agent/dist/index.d.ts +1 -1
- package/packages/agent/dist/loop/agent-loop.d.ts +2 -2
- package/packages/agent/src/core/compaction/utils.ts +1 -1
- package/packages/agent/src/core/model-runtime.ts +45 -5
- package/packages/agent/src/index.ts +1 -1
- package/packages/agent/src/loop/agent-loop.ts +2 -2
- package/packages/ai/dist/models.d.ts +1 -0
- package/packages/ai/dist/models.generated.d.ts +4544 -983
- package/packages/ai/dist/providers/openrouter.models.d.ts +4544 -983
- package/packages/ai/src/api/ai-sdk.ts +33 -7
- package/packages/ai/src/api-registry.ts +1 -1
- package/packages/ai/src/index.ts +2 -2
- package/packages/ai/src/models.generated.ts +1 -1
- package/packages/ai/src/models.ts +1 -1
- package/packages/ai/src/providers/openrouter.models.ts +3725 -552
- package/packages/ragents/src/access.ts +12 -12
- package/packages/ragents/src/agents/actor-input.ts +33 -33
- package/packages/ragents/src/agents/catalog.ts +1 -1
- package/packages/ragents/src/agents/delivery.ts +17 -17
- package/packages/ragents/src/agents/plugins.ts +1 -1
- package/packages/ragents/src/agents/scheduler.ts +7 -7
- package/packages/ragents/src/agents/schemas.ts +1 -1
- package/packages/ragents/src/agents/tool-orientation.ts +4 -4
- package/packages/ragents/src/agents/tools.ts +20 -20
- package/packages/ragents/src/agents/toolset.ts +5 -5
- package/packages/ragents/src/agents/workspaces.ts +1 -1
- package/packages/ragents/src/domain/events.ts +1 -1
- package/packages/ragents/src/domain/model.ts +5 -5
- package/packages/ragents/src/drivers/agent-runtime.ts +1 -1
- package/packages/ragents/src/drivers/agent-turn.ts +4 -4
- package/packages/ragents/src/drivers/agent.ts +2 -2
- package/packages/ragents/src/drivers/attachments.ts +4 -4
- package/packages/ragents/src/http/contracts.ts +14 -14
- package/packages/ragents/src/http/methods.ts +6 -6
- package/packages/ragents/src/plugin-host.ts +119 -119
- package/packages/ragents/src/plugin-types.ts +16 -16
- package/packages/ragents/src/rpc/contract.ts +5 -5
- package/packages/ragents/src/rpc/contribution.ts +2 -2
- package/packages/ragents/src/rpc/peer.ts +11 -11
- package/packages/ragents/src/rpc/protocol.ts +2 -2
- package/packages/ragents/src/runtime/decisions/turns.ts +1 -1
- package/packages/ragents/src/runtime/journal-storage.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 +44 -44
- package/packages/workspace-executor/src/errors.ts +1 -1
- package/packages/workspace-executor/src/executor.ts +16 -16
- package/packages/workspace-executor/src/files.ts +31 -31
- package/packages/workspace-executor/src/index.ts +1 -1
- 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 +36 -36
- 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 +3 -3
- package/packages/workspace-executor/src/managed-process.ts +12 -12
- package/packages/workspace-executor/src/module.ts +8 -8
- package/packages/workspace-executor/src/modules.ts +3 -3
- package/packages/workspace-executor/src/paths.ts +11 -11
- package/packages/workspace-executor/src/process-sandbox.ts +3 -3
- package/packages/workspace-executor/src/processes/module.ts +3 -3
- package/packages/workspace-executor/src/processes/process-table.ts +20 -20
- package/packages/workspace-executor/src/processes/scanner.ts +3 -3
- package/packages/workspace-executor/src/processes/snapshot.ts +2 -2
- package/packages/workspace-executor/src/processes/terminator.ts +13 -13
- package/packages/workspace-executor/src/run-folders.ts +3 -3
- package/packages/workspace-executor/src/safe-environment.ts +4 -4
- package/packages/workspace-executor/src/sandbox-tools.ts +28 -28
- package/packages/workspace-executor/src/session-ident.ts +2 -2
- package/packages/workspace-executor/src/shell-platform.ts +2 -2
- package/packages/workspace-executor/src/tools.ts +5 -5
- package/plugins/ragents.activity/web/ActivityHeader.tsx +3 -3
- package/plugins/ragents.activity/web/activity.ts +2 -2
- package/plugins/ragents.actor-programs/server/access-projections.ts +1 -1
- package/plugins/ragents.actor-programs/server/agent-tools.ts +2 -2
- package/plugins/ragents.actor-programs/server/capability-resolver.ts +3 -3
- package/plugins/ragents.actor-programs/server/controls-template.ts +46 -46
- package/plugins/ragents.actor-programs/server/controls-tool.ts +4 -4
- package/plugins/ragents.actor-programs/server/limits.ts +3 -3
- package/plugins/ragents.actor-programs/server/methods.ts +1 -1
- package/plugins/ragents.actor-programs/server/project-diagnostics.ts +8 -8
- package/plugins/ragents.actor-programs/server/routes.ts +8 -8
- package/plugins/ragents.actor-programs/server/runtime.ts +90 -90
- package/plugins/ragents.actor-programs/server/templates.ts +59 -59
- package/plugins/ragents.actor-programs/server/test-report.ts +5 -5
- package/plugins/ragents.actor-programs/server/tool-contributor.ts +1 -1
- package/plugins/ragents.actor-programs/web/ActorViewFrame.tsx +17 -17
- package/plugins/ragents.actor-programs/web/AppsPanel.tsx +26 -26
- package/plugins/ragents.actor-programs/web/EmbeddedApps.tsx +3 -3
- package/plugins/ragents.actor-programs/web/FullscreenHost.tsx +2 -2
- package/plugins/ragents.actor-programs/web/FunctionForm.tsx +16 -16
- package/plugins/ragents.actor-programs/web/ProgramSource.tsx +5 -5
- package/plugins/ragents.actor-programs/web/api.ts +36 -36
- package/plugins/ragents.actor-programs/web/bridge.ts +8 -8
- package/plugins/ragents.actor-programs/web/chat-state.ts +4 -4
- package/plugins/ragents.actor-programs/web/context.ts +1 -1
- package/plugins/ragents.actor-programs/web/function-input.ts +6 -6
- package/plugins/ragents.actor-programs/web/index.tsx +1 -1
- package/plugins/ragents.actor-programs/web/program-state.ts +4 -4
- package/plugins/ragents.ask/ask-payload.ts +1 -1
- package/plugins/ragents.ask/contract.ts +5 -5
- package/plugins/ragents.ask/server/answer-method.ts +1 -1
- package/plugins/ragents.ask/server/ask-service.ts +9 -9
- package/plugins/ragents.ask/server/ask-tool.ts +10 -10
- package/plugins/ragents.ask/server/contract.ts +5 -5
- package/plugins/ragents.ask/web/AskActionView.tsx +1 -1
- package/plugins/ragents.ask/web/QuestionCard.tsx +22 -22
- package/plugins/ragents.ask/web/index.tsx +2 -2
- package/plugins/ragents.browser/executor/contract.ts +6 -6
- package/plugins/ragents.browser/executor/index.ts +1 -1
- package/plugins/ragents.browser/executor/module.ts +6 -6
- package/plugins/ragents.browser/executor/pages.ts +32 -32
- package/plugins/ragents.browser/executor/playwright.ts +8 -8
- package/plugins/ragents.browser/provision.ts +7 -7
- package/plugins/ragents.browser/server/browser.ts +14 -14
- package/plugins/ragents.browser/server/contract.ts +1 -1
- package/plugins/ragents.browser/server/index.ts +1 -1
- package/plugins/ragents.browser/server/tools.ts +14 -14
- package/plugins/ragents.browser/skills/browser-testing/SKILL.md +30 -30
- package/plugins/ragents.documents/contract.ts +2 -2
- package/plugins/ragents.documents/prompt.hbs +1 -1
- package/plugins/ragents.documents/server/document-write-tool.ts +12 -12
- package/plugins/ragents.documents/server/files-route.ts +6 -6
- package/plugins/ragents.documents/server/show-document-tool.ts +26 -26
- package/plugins/ragents.documents/server/store.ts +1 -1
- package/plugins/ragents.documents/web/DocumentViewer.tsx +37 -37
- package/plugins/ragents.documents/web/index.tsx +11 -11
- package/plugins/ragents.lsp-fsharp/executor.ts +7 -7
- package/plugins/ragents.lsp-fsharp/provision.ts +7 -7
- package/plugins/ragents.lsp-roslyn/executor.ts +5 -5
- package/plugins/ragents.lsp-roslyn/provision.ts +4 -4
- package/plugins/ragents.lsp-roslyn/server/index.ts +5 -5
- package/plugins/ragents.lsp-roslyn/server/solution-on-start.ts +13 -13
- package/plugins/ragents.lsp-typescript/executor.ts +3 -3
- package/plugins/ragents.model-relay/server/config.ts +6 -2
- package/plugins/ragents.model-relay/server/index.ts +2 -2
- package/plugins/ragents.model-relay/server/relay.ts +23 -22
- package/plugins/ragents.orchestration/contract.ts +8 -8
- package/plugins/ragents.orchestration/server/index.ts +4 -4
- package/plugins/ragents.orchestration/server/run-stop-tool.ts +3 -3
- package/plugins/ragents.orchestration/server/surface-tool.ts +5 -5
- package/plugins/ragents.orchestration/tiled-layout.ts +11 -11
- package/plugins/ragents.orchestration/web/ActorChat.tsx +3 -3
- package/plugins/ragents.orchestration/web/ActorChatControls.tsx +4 -5
- package/plugins/ragents.orchestration/web/ActorChatPreview.tsx +1 -1
- package/plugins/ragents.orchestration/web/ActorPopout.tsx +1 -1
- package/plugins/ragents.orchestration/web/ActorShortcut.tsx +6 -6
- package/plugins/ragents.orchestration/web/ActorSurfaceControls.tsx +15 -15
- package/plugins/ragents.orchestration/web/Center.tsx +5 -5
- package/plugins/ragents.orchestration/web/DocumentsSection.tsx +2 -2
- package/plugins/ragents.orchestration/web/ExecutionsPanel.tsx +15 -15
- package/plugins/ragents.orchestration/web/FlowInspector.tsx +103 -103
- package/plugins/ragents.orchestration/web/JournalStatus.tsx +11 -11
- package/plugins/ragents.orchestration/web/MaterialBody.tsx +2 -2
- package/plugins/ragents.orchestration/web/StopRunButton.tsx +6 -6
- package/plugins/ragents.orchestration/web/TiledSurface.tsx +9 -9
- package/plugins/ragents.orchestration/web/actor-header-settings.ts +5 -5
- package/plugins/ragents.orchestration/web/constants.ts +2 -2
- package/plugins/ragents.orchestration/web/executions.ts +6 -6
- package/plugins/ragents.orchestration/web/format.ts +1 -1
- package/plugins/ragents.orchestration/web/index.tsx +2 -2
- package/plugins/ragents.orchestration/web/run-panel/AddresseeControl.tsx +7 -7
- package/plugins/ragents.orchestration/web/run-panel/AddresseeTree.tsx +8 -8
- package/plugins/ragents.orchestration/web/run-panel/RunPanel.tsx +22 -22
- package/plugins/ragents.orchestration/web/run-panel/RunPanelSettings.tsx +7 -7
- package/plugins/ragents.orchestration/web/run-panel/addressee-tree.ts +13 -13
- package/plugins/ragents.orchestration/web/run-panel/run-panel-actors.ts +3 -3
- package/plugins/ragents.orchestration/web/run-panel/run-panel-settings.ts +2 -2
- package/plugins/ragents.orchestration/web/run-panel/run-panel-startup.ts +3 -3
- package/plugins/ragents.orchestration/web/run-panel/run-panel-state.ts +7 -7
- package/plugins/ragents.orchestration/web/run-panel/sheet-status.ts +9 -9
- package/plugins/ragents.orchestration/web/surface-startup.ts +8 -8
- package/plugins/ragents.orchestration/web/surface-view-settings.ts +1 -1
- package/plugins/ragents.orchestration/web/tiled-view-settings.ts +1 -1
- package/plugins/ragents.overseer/contract.ts +20 -20
- package/plugins/ragents.overseer/server/api.ts +6 -6
- package/plugins/ragents.overseer/server/coordinator-prompt.ts +10 -10
- package/plugins/ragents.overseer/server/coordinator.ts +4 -4
- package/plugins/ragents.overseer/server/index.ts +24 -24
- package/plugins/ragents.overseer/server/orientation.ts +8 -8
- package/plugins/ragents.overseer/server/quick-answer.ts +9 -9
- package/plugins/ragents.overseer/server/run-directory.ts +5 -5
- package/plugins/ragents.overseer/server/settings.ts +6 -6
- package/plugins/ragents.overseer/server/user-location.ts +16 -16
- package/plugins/ragents.overseer/web/ModelSettings.tsx +9 -9
- package/plugins/ragents.overseer/web/index.tsx +20 -20
- package/plugins/ragents.overseer/web/model-settings.ts +1 -1
- package/plugins/ragents.overseer/web/quick-answers.ts +2 -2
- package/plugins/ragents.processes/contract.ts +5 -5
- package/plugins/ragents.processes/server/methods.ts +4 -4
- package/plugins/ragents.processes/server/observer.ts +8 -8
- package/plugins/ragents.processes/server/run-processes.ts +2 -2
- package/plugins/ragents.processes/web/ProcessHeader.tsx +10 -10
- package/plugins/ragents.processes/web/processes.ts +10 -10
- package/plugins/ragents.product/server/config.ts +1 -1
- package/plugins/ragents.product/server/index.ts +4 -4
- package/plugins/ragents.product/server/runtime.ts +9 -10
- package/plugins/ragents.product/web/index.tsx +1 -1
- package/plugins/ragents.profile-distribution/contract.ts +10 -10
- package/plugins/ragents.profile-distribution/server/archive.ts +20 -20
- package/plugins/ragents.profile-distribution/server/config.ts +2 -2
- package/plugins/ragents.profile-distribution/server/index.ts +4 -4
- package/plugins/ragents.reference/examples.ts +27 -27
- package/plugins/ragents.reference/run-scripts/balcony-wizard/RUN.md +19 -19
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +2 -2
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +14 -14
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +2 -2
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +49 -49
- package/plugins/ragents.reference/run-scripts/balcony-wizard/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/balcony-wizard/src/server.ts +9 -9
- package/plugins/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +9 -9
- package/plugins/ragents.reference/run-scripts/conversation-circle/RUN.md +7 -7
- package/plugins/ragents.reference/run-scripts/conversation-circle/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/conversation-circle/src/server.ts +13 -13
- package/plugins/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +1 -1
- package/plugins/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +8 -8
- package/plugins/ragents.reference/run-scripts/learning-afternoon/RUN.md +16 -16
- package/plugins/ragents.reference/run-scripts/learning-afternoon/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +3 -3
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/server.ts +9 -9
- package/plugins/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +39 -39
- package/plugins/ragents.reference/run-scripts/moderated-round/RUN.md +7 -7
- package/plugins/ragents.reference/run-scripts/moderated-round/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/moderated-round/src/server.ts +9 -9
- package/plugins/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +1 -1
- package/plugins/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +6 -6
- package/plugins/ragents.reference/run-scripts/shared-actor-list/RUN.md +12 -12
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +2 -2
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +3 -3
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +4 -4
- package/plugins/ragents.reference/run-scripts/shared-actor-list/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/shared-actor-list/src/server.ts +11 -11
- package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +1 -1
- package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +13 -13
- package/plugins/ragents.reference/run-scripts/word-game/RUN.md +18 -18
- package/plugins/ragents.reference/run-scripts/word-game/package.json +2 -2
- package/plugins/ragents.reference/run-scripts/word-game/src/client.tsx +1 -1
- package/plugins/ragents.reference/run-scripts/word-game/src/contract.ts +2 -2
- package/plugins/ragents.reference/run-scripts/word-game/src/server.ts +16 -16
- package/plugins/ragents.reference/run-scripts/word-game/tests/program.test.ts +39 -39
- package/plugins/ragents.reference/skills/100-shared-actor-list/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/110-all-card-slots/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/150-editorial-workbench/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/160-learning-companion/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/170-photo-collection/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/180-decision-workbench/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/190-review-queue/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/20-circle-of-four/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/210-moderator-handover/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/220-actor-approval-list/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/230-shared-state-views/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/240-live-result-list/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/250-balcony-wizard/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/35-actor-input-fifo/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/40-subscription-matrix/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/50-subscription-removal/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/70-headless-counter/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/75-lsp-demo/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/80-actor-text-analysis/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/90-actor-notes/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/95-hello-world/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/decision-brief/SKILL.md +24 -24
- package/plugins/ragents.reference/skills/learning-sprint/SKILL.md +24 -24
- package/plugins/ragents.reference/walkthroughs.ts +128 -128
- package/plugins/ragents.reference/web/StartGuides.tsx +23 -23
- package/plugins/ragents.todo/contract.ts +0 -3
- 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 +63 -63
- 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 +50 -50
- package/plugins/ragents.workspace/server/config.ts +7 -7
- package/plugins/ragents.workspace/server/index.ts +3 -3
- package/plugins/ragents.workspace/server/runtime.ts +26 -26
- package/plugins/ragents.workspace/server/shell-platform.ts +1 -1
- package/plugins/ragents.workspace/web/FileBrowser.tsx +10 -10
- package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +24 -24
- package/plugins/ragents.workspace/web/index.tsx +1 -1
- package/ragents.config.core.ts +1 -1
- package/ragents.config.developer.ts +3 -3
- package/ragents.config.showcase.ts +2 -2
- package/scripts/agent/agent-cli.ts +96 -96
- package/scripts/agent/journal.ts +5 -5
- package/scripts/agent/turn-control.ts +4 -4
- package/scripts/package/build-package.ts +31 -31
- 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 +49 -49
- package/scripts/remote/start.ts +18 -18
- package/scripts/workspace-client/run-workspace-client.ts +23 -23
- package/apps/web/dist/assets/main-DnnqWHkH.js +0 -11
- package/apps/web/dist/assets/mermaid-HWGCJPDP-BLLeth5_.js +0 -568
- package/apps/web/dist/assets/runPanel-DPm7s3KM.js +0 -21
- package/bundles/ragents.ask/server/chunks/chunk-PDJO75SQ.js.map +0 -7
- package/bundles/ragents.ask/web/chunks/chunk-4VXWWEG7.js +0 -2
- package/bundles/ragents.ask/web/chunks/chunk-4VXWWEG7.js.map +0 -7
- package/bundles/ragents.ask/web/chunks/chunk-VUBJDIKQ.js +0 -2
- package/bundles/ragents.ask/web/chunks/chunk-VUBJDIKQ.js.map +0 -7
- package/bundles/ragents.ask/web/chunks/chunk-WFN4374U.js.map +0 -7
- package/bundles/ragents.orchestration/web/chunks/chunk-OQYCNYXN.js +0 -2
- /package/bundles/ragents.orchestration/web/chunks/{chunk-OSKPH6SZ.js.map → chunk-CFMJD5ZI.js.map} +0 -0
- /package/bundles/ragents.orchestration/web/chunks/{chunk-ODMMQGX2.js.map → chunk-UCIMT2R4.js.map} +0 -0
|
@@ -15,7 +15,7 @@ import { defaultDataDirectory } from "./data-directory.js";
|
|
|
15
15
|
import { MissingEnvironmentError } from "./missing-environment.js";
|
|
16
16
|
import { isPluginPath, pluginFolderFor } from "./plugin-support/plugins-root.js";
|
|
17
17
|
|
|
18
|
-
//
|
|
18
|
+
// The finding about a missing environment variable belongs to loading the configuration; that is why main.ts gets it from here.
|
|
19
19
|
export { missingEnvironmentOf, reportMissingEnvironment } from "./missing-environment.js";
|
|
20
20
|
|
|
21
21
|
const rootDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../..");
|
|
@@ -55,33 +55,33 @@ const resolveUserToken = (
|
|
|
55
55
|
): string | undefined => {
|
|
56
56
|
if (raw === undefined) return undefined;
|
|
57
57
|
if (!isEnvironmentReference(raw) || typeof raw.name !== "string" || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(raw.name)) {
|
|
58
|
-
throw new Error(`${location}.token
|
|
58
|
+
throw new Error(`${location}.token needs env("ENV_NAME"); a token never appears in plain text in the profile file`);
|
|
59
59
|
}
|
|
60
|
-
//
|
|
60
|
+
// A user still signs in with their password; without the variable set they just have no personal token.
|
|
61
61
|
const token = environment[raw.name];
|
|
62
62
|
if (!token) return undefined;
|
|
63
|
-
// $
|
|
63
|
+
// $ and ! are off limits because the consumer evaluates the token as an API key with template and command syntax.
|
|
64
64
|
if (token.length < MIN_TOKEN_LENGTH || token.length > MAX_TOKEN_LENGTH || !/^[\x21-\x7e]+$/.test(token) || /[$!]/.test(token)) {
|
|
65
|
-
throw new Error(`${location}.token (${raw.name})
|
|
65
|
+
throw new Error(`${location}.token (${raw.name}) needs ${MIN_TOKEN_LENGTH} to ${MAX_TOKEN_LENGTH} printable ASCII characters without spaces, $ and !`);
|
|
66
66
|
}
|
|
67
67
|
return token;
|
|
68
68
|
};
|
|
69
69
|
|
|
70
70
|
const resolveIdentity = (location: string, entry: Record<string, unknown>): AccessUser => {
|
|
71
71
|
if (typeof entry.id !== "string" || !/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$/.test(entry.id)) {
|
|
72
|
-
throw new Error(`${location}.id
|
|
72
|
+
throw new Error(`${location}.id needs 1 to 64 characters: letters, digits, period, underscore or hyphen`);
|
|
73
73
|
}
|
|
74
74
|
if (entry.label !== undefined && (typeof entry.label !== "string" || !entry.label.trim() || entry.label.length > 120)) {
|
|
75
|
-
throw new Error(`${location}.label
|
|
75
|
+
throw new Error(`${location}.label needs 1 to 120 characters`);
|
|
76
76
|
}
|
|
77
77
|
if (!Array.isArray(entry.rights) || !entry.rights.every(isAccessRight)) {
|
|
78
|
-
throw new Error(`${location}.rights
|
|
78
|
+
throw new Error(`${location}.rights needs valid rights as strings or "*" for all rights`);
|
|
79
79
|
}
|
|
80
|
-
if (new Set(entry.rights).size !== entry.rights.length) throw new Error(`${location}.rights
|
|
80
|
+
if (new Set(entry.rights).size !== entry.rights.length) throw new Error(`${location}.rights contains duplicate rights`);
|
|
81
81
|
if (entry.startEntries !== undefined && (!Array.isArray(entry.startEntries)
|
|
82
82
|
|| !entry.startEntries.every((id) => typeof id === "string" && START_ENTRY_ID.test(id))
|
|
83
83
|
|| new Set(entry.startEntries).size !== entry.startEntries.length)) {
|
|
84
|
-
throw new Error(`${location}.startEntries
|
|
84
|
+
throw new Error(`${location}.startEntries needs unique template ids as strings`);
|
|
85
85
|
}
|
|
86
86
|
return Object.freeze({
|
|
87
87
|
id: entry.id,
|
|
@@ -94,19 +94,19 @@ const resolveIdentity = (location: string, entry: Record<string, unknown>): Acce
|
|
|
94
94
|
export const resolveAnonymousUser = (source: string, raw: unknown): AccessUser | undefined => {
|
|
95
95
|
if (raw === undefined) return undefined;
|
|
96
96
|
const location = `${source}: anonymousUser`;
|
|
97
|
-
if (!raw || typeof raw !== "object" || Array.isArray(raw)) throw new Error(`${location}
|
|
97
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) throw new Error(`${location} is not a user`);
|
|
98
98
|
const entry = raw as Record<string, unknown>;
|
|
99
99
|
if (Object.keys(entry).some((key) => !["id", "label", "rights", "startEntries"].includes(key))) {
|
|
100
|
-
throw new Error(`${location}
|
|
100
|
+
throw new Error(`${location} allows only id, label, rights and startEntries`);
|
|
101
101
|
}
|
|
102
102
|
return resolveIdentity(location, entry);
|
|
103
103
|
};
|
|
104
104
|
|
|
105
|
-
/**
|
|
105
|
+
/** The template a new run takes without a choice; whether it is registered is checked by the PluginHost at startup. */
|
|
106
106
|
export const resolveDefaultStartEntry = (source: string, raw: unknown): string | undefined => {
|
|
107
107
|
if (raw === undefined) return undefined;
|
|
108
108
|
if (typeof raw !== "string" || !START_ENTRY_ID.test(raw)) {
|
|
109
|
-
throw new Error(`${source}: defaultStartEntry
|
|
109
|
+
throw new Error(`${source}: defaultStartEntry needs a template id as a string, such as "acme.tasks.setup"`);
|
|
110
110
|
}
|
|
111
111
|
return raw;
|
|
112
112
|
};
|
|
@@ -118,30 +118,30 @@ export const resolveProfileUsers = (
|
|
|
118
118
|
): readonly ResolvedProfileUser[] | undefined => {
|
|
119
119
|
if (raw === undefined) return undefined;
|
|
120
120
|
if (!Array.isArray(raw) || raw.length === 0) {
|
|
121
|
-
throw new Error(`${source}: users
|
|
121
|
+
throw new Error(`${source}: users must be a non-empty list; without users, sign-in is turned off`);
|
|
122
122
|
}
|
|
123
123
|
const ids = new Set<string>();
|
|
124
124
|
const tokens = new Map<string, string>();
|
|
125
125
|
return raw.map((value: unknown, index: number) => {
|
|
126
126
|
const location = `${source}: users[${index}]`;
|
|
127
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`${location}
|
|
127
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`${location} is not a user`);
|
|
128
128
|
const entry = value as Record<string, unknown>;
|
|
129
129
|
if (Object.keys(entry).some((key) => !["id", "label", "password", "token", "rights", "startEntries"].includes(key))) {
|
|
130
|
-
throw new Error(`${location}
|
|
130
|
+
throw new Error(`${location} allows only id, label, password, token, rights and startEntries`);
|
|
131
131
|
}
|
|
132
132
|
const user = resolveIdentity(location, entry);
|
|
133
|
-
if (ids.has(user.id)) throw new Error(`${location}.id
|
|
133
|
+
if (ids.has(user.id)) throw new Error(`${location}.id is a duplicate: ${user.id}`);
|
|
134
134
|
ids.add(user.id);
|
|
135
135
|
if (typeof entry.password !== "string" && (!isEnvironmentReference(entry.password)
|
|
136
136
|
|| typeof entry.password.name !== "string" || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(entry.password.name))) {
|
|
137
|
-
throw new Error(`${location}.password
|
|
137
|
+
throw new Error(`${location}.password needs a text or env("ENV_NAME")`);
|
|
138
138
|
}
|
|
139
139
|
const password = typeof entry.password === "string" ? entry.password : environment[entry.password.name];
|
|
140
|
-
if (!password || password.length > 2048) throw new Error(`${location}.password
|
|
140
|
+
if (!password || password.length > 2048) throw new Error(`${location}.password is missing, empty or longer than 2048 characters`);
|
|
141
141
|
const token = resolveUserToken(location, entry.token, environment);
|
|
142
142
|
if (token !== undefined) {
|
|
143
143
|
const other = tokens.get(token);
|
|
144
|
-
if (other) throw new Error(`${location}.token
|
|
144
|
+
if (other) throw new Error(`${location}.token is the same as for user ${other}; every token belongs to exactly one user`);
|
|
145
145
|
tokens.set(token, user.id);
|
|
146
146
|
}
|
|
147
147
|
return Object.freeze({ ...user, password, ...(token !== undefined ? { token } : {}) });
|
|
@@ -152,7 +152,7 @@ export const listFromEnvironmentValue = (value: string): readonly string[] | und
|
|
|
152
152
|
if (!value.startsWith("[")) return undefined;
|
|
153
153
|
const parsed = JSON.parse(value) as unknown;
|
|
154
154
|
if (!Array.isArray(parsed) || parsed.some((entry) => typeof entry !== "string")) {
|
|
155
|
-
throw new Error(`
|
|
155
|
+
throw new Error(`The value ${value} looks like a list, but is not a list of strings`);
|
|
156
156
|
}
|
|
157
157
|
return parsed as string[];
|
|
158
158
|
};
|
|
@@ -164,16 +164,16 @@ const materialize = (value: Exclude<ConfigValue, EnvironmentReference | Provisio
|
|
|
164
164
|
return JSON.stringify(value);
|
|
165
165
|
};
|
|
166
166
|
|
|
167
|
-
/**
|
|
167
|
+
/** The host's data folder, in whose tools/ the provisioning puts its tools. */
|
|
168
168
|
const dataDirectoryOf = (source: string, raw: RAgentsConfig): string => {
|
|
169
169
|
const configured = raw.host?.DATA_DIR;
|
|
170
170
|
if (isEnvironmentReference(configured) && process.env[configured.name] === undefined) {
|
|
171
171
|
throw new MissingEnvironmentError({ variable: configured.name, section: "host", key: "DATA_DIR" },
|
|
172
|
-
`${source}: host.DATA_DIR
|
|
172
|
+
`${source}: host.DATA_DIR refers to the unset environment variable ${configured.name}`);
|
|
173
173
|
}
|
|
174
174
|
const fromFile = isEnvironmentReference(configured) ? process.env[configured.name] : typeof configured === "string" ? configured : undefined;
|
|
175
175
|
const profile = process.env.PRODUCT_PROFILE;
|
|
176
|
-
if (!profile) throw new Error(`${source}:
|
|
176
|
+
if (!profile) throw new Error(`${source}: without PRODUCT_PROFILE there is no data folder and therefore no tool folder`);
|
|
177
177
|
return path.resolve(process.env.DATA_DIR ?? fromFile ?? defaultDataDirectory(profile));
|
|
178
178
|
};
|
|
179
179
|
|
|
@@ -187,21 +187,21 @@ const entryFor = (source: string, section: string, key: string, value: ConfigVal
|
|
|
187
187
|
const resolved = process.env[value.name];
|
|
188
188
|
if (resolved === undefined) {
|
|
189
189
|
throw new MissingEnvironmentError({ variable: value.name, section, key },
|
|
190
|
-
`${source}: ${section}.${key}
|
|
191
|
-
+ `
|
|
192
|
-
+ "
|
|
190
|
+
`${source}: ${section}.${key} refers with env("${value.name}") to an environment variable `
|
|
191
|
+
+ `that is not set in this shell. Set it before starting (export ${value.name}=...) or `
|
|
192
|
+
+ "put it in your shell's startup file; secrets never appear in the configuration file.");
|
|
193
193
|
}
|
|
194
194
|
return { section, key, value: resolved, viaReference: true, overriddenByEnvironment };
|
|
195
195
|
}
|
|
196
196
|
if (typeof value === "string" && ENVIRONMENT_PLACEHOLDER.test(value)) {
|
|
197
197
|
throw new Error(
|
|
198
|
-
`${source}: ${section}.${key}
|
|
199
|
-
+ `
|
|
198
|
+
`${source}: ${section}.${key} appears as the text "${value}" in the configuration; `
|
|
199
|
+
+ `a reference to the environment is written as env("...")`);
|
|
200
200
|
}
|
|
201
201
|
if (SECRET_KEY_PATTERN.test(key)) {
|
|
202
202
|
throw new Error(
|
|
203
|
-
`${source}: ${section}.${key}
|
|
204
|
-
+ `
|
|
203
|
+
`${source}: ${section}.${key} is a secret and must not appear in plain text in the configuration; `
|
|
204
|
+
+ `set it through an environment variable or reference it as env("ENV_NAME")`);
|
|
205
205
|
}
|
|
206
206
|
return { section, key, value: materialize(value), viaReference: false, overriddenByEnvironment };
|
|
207
207
|
};
|
|
@@ -221,7 +221,7 @@ const parseEntries = (source: string, raw: RAgentsConfig): readonly ConfigFileEn
|
|
|
221
221
|
const existing = byKey.get(entry.key);
|
|
222
222
|
if (existing && existing.value !== entry.value) {
|
|
223
223
|
throw new Error(
|
|
224
|
-
`${source}: ${entry.key}
|
|
224
|
+
`${source}: ${entry.key} appears in ${existing.section} and ${entry.section} with different values`);
|
|
225
225
|
}
|
|
226
226
|
byKey.set(entry.key, entry);
|
|
227
227
|
}
|
|
@@ -236,14 +236,14 @@ export const profileFileName = (profile: string): string => `ragents.config.${pr
|
|
|
236
236
|
export const profileFilePath = (root: string, environment: Readonly<Record<string, string | undefined>> = process.env): string | undefined => {
|
|
237
237
|
const profile = environment.PRODUCT_PROFILE;
|
|
238
238
|
if (!profile) return undefined;
|
|
239
|
-
if (!PROFILE_NAME.test(profile)) throw new Error(`PRODUCT_PROFILE
|
|
239
|
+
if (!PROFILE_NAME.test(profile)) throw new Error(`PRODUCT_PROFILE is not a valid profile name: ${profile}`);
|
|
240
240
|
const file = environment.PRODUCT_PROFILE_FILE;
|
|
241
241
|
if (!file) return path.join(root, profileFileName(profile));
|
|
242
242
|
const source = path.resolve(file);
|
|
243
243
|
if (path.basename(source) !== profileFileName(profile)) {
|
|
244
|
-
throw new Error(`PRODUCT_PROFILE_FILE ${source}
|
|
244
|
+
throw new Error(`PRODUCT_PROFILE_FILE ${source} does not match the profile ${profile}; expected is ${profileFileName(profile)}`);
|
|
245
245
|
}
|
|
246
|
-
if (!statSync(source, { throwIfNoEntry: false })?.isFile()) throw new Error(`
|
|
246
|
+
if (!statSync(source, { throwIfNoEntry: false })?.isFile()) throw new Error(`The profile file ${source} is missing`);
|
|
247
247
|
return source;
|
|
248
248
|
};
|
|
249
249
|
|
|
@@ -260,12 +260,12 @@ const readProfileConfiguration = async (root: string): Promise<LoadedConfigFile
|
|
|
260
260
|
const module = await import(pathToFileURL(source).href) as Record<string, unknown>;
|
|
261
261
|
const loadedConfig = module.config;
|
|
262
262
|
if (typeof loadedConfig !== "object" || loadedConfig === null) {
|
|
263
|
-
throw new Error(`${source}
|
|
263
|
+
throw new Error(`${source} does not export a constant config with the configuration sections`);
|
|
264
264
|
}
|
|
265
265
|
const raw = withPluginPaths(source, loadedConfig as RAgentsConfig);
|
|
266
266
|
const users = resolveProfileUsers(source, module.users);
|
|
267
267
|
const anonymousUser = resolveAnonymousUser(source, module.anonymousUser);
|
|
268
|
-
if (users && anonymousUser) throw new Error(`${source}: users
|
|
268
|
+
if (users && anonymousUser) throw new Error(`${source}: users and anonymousUser exclude each other`);
|
|
269
269
|
const defaultStartEntry = resolveDefaultStartEntry(source, module.defaultStartEntry);
|
|
270
270
|
return { path: source, entries: parseEntries(source, raw), users, anonymousUser, defaultStartEntry };
|
|
271
271
|
};
|
|
@@ -274,7 +274,7 @@ let loadedConfigFile: LoadedConfigFile | undefined;
|
|
|
274
274
|
let loadCompleted = false;
|
|
275
275
|
|
|
276
276
|
export const loadConfigFile = async (root = rootDir): Promise<void> => {
|
|
277
|
-
if (loadCompleted) throw new Error("
|
|
277
|
+
if (loadCompleted) throw new Error("The configuration has already been loaded");
|
|
278
278
|
loadedConfigFile = await readProfileConfiguration(root);
|
|
279
279
|
loadCompleted = true;
|
|
280
280
|
if (!loadedConfigFile) return;
|
|
@@ -285,8 +285,8 @@ export const loadConfigFile = async (root = rootDir): Promise<void> => {
|
|
|
285
285
|
applied++;
|
|
286
286
|
}
|
|
287
287
|
const overridden = loadedConfigFile.entries.length - applied;
|
|
288
|
-
console.log(`
|
|
289
|
-
+ `(${applied}
|
|
288
|
+
console.log(`Configuration ${loadedConfigFile.path} loaded `
|
|
289
|
+
+ `(${applied} values applied, ${overridden} overridden by the environment)`);
|
|
290
290
|
};
|
|
291
291
|
|
|
292
292
|
export const configFilePath = (): string | null => loadedConfigFile?.path ?? null;
|
|
@@ -306,7 +306,7 @@ export interface ConfigFileValidationContext {
|
|
|
306
306
|
}
|
|
307
307
|
|
|
308
308
|
export const validateConfigFileSections = (context: ConfigFileValidationContext): void => {
|
|
309
|
-
if (!loadCompleted) throw new Error("
|
|
309
|
+
if (!loadCompleted) throw new Error("The configuration must be loaded before it is checked");
|
|
310
310
|
if (!loadedConfigFile) return;
|
|
311
311
|
const source = loadedConfigFile.path;
|
|
312
312
|
const known = new Set(context.knownPluginIds);
|
|
@@ -315,21 +315,21 @@ export const validateConfigFileSections = (context: ConfigFileValidationContext)
|
|
|
315
315
|
for (const section of new Set(loadedConfigFile.entries.map((entry) => entry.section))) {
|
|
316
316
|
if (section === "host") continue;
|
|
317
317
|
if (!known.has(section)) {
|
|
318
|
-
throw new Error(`${source}:
|
|
318
|
+
throw new Error(`${source}: unknown section ${section}; known are host, ${[...known].join(", ")}`);
|
|
319
319
|
}
|
|
320
320
|
if (!active.has(section)) {
|
|
321
|
-
console.log(`
|
|
321
|
+
console.log(`Configuration: section ${section} belongs to an inactive plugin and is ignored`);
|
|
322
322
|
}
|
|
323
323
|
}
|
|
324
324
|
for (const entry of loadedConfigFile.entries) {
|
|
325
325
|
if (secret.has(entry.key) && !entry.viaReference) {
|
|
326
326
|
throw new Error(
|
|
327
|
-
`${source}: ${entry.section}.${entry.key}
|
|
328
|
-
+ `in
|
|
327
|
+
`${source}: ${entry.section}.${entry.key} is declared as a secret and must not appear in plain text `
|
|
328
|
+
+ `in the configuration; set it through an environment variable or reference it as env("ENV_NAME")`);
|
|
329
329
|
}
|
|
330
330
|
if (entry.section === "host") {
|
|
331
331
|
if (!context.hostKeys.includes(entry.key)) {
|
|
332
|
-
throw new Error(`${source}: host.${entry.key}
|
|
332
|
+
throw new Error(`${source}: host.${entry.key} is not a host key; allowed are ${context.hostKeys.join(", ")}`);
|
|
333
333
|
}
|
|
334
334
|
continue;
|
|
335
335
|
}
|
|
@@ -337,8 +337,8 @@ export const validateConfigFileSections = (context: ConfigFileValidationContext)
|
|
|
337
337
|
const declared = context.declaredKeysFor(entry.section);
|
|
338
338
|
if (!declared.includes(entry.key)) {
|
|
339
339
|
throw new Error(
|
|
340
|
-
`${source}: ${entry.section}.${entry.key}
|
|
341
|
-
+ (declared.length > 0 ? `
|
|
340
|
+
`${source}: ${entry.section}.${entry.key} is not declared for this plugin; `
|
|
341
|
+
+ (declared.length > 0 ? `declared are ${declared.join(", ")}` : "the plugin declares no keys"));
|
|
342
342
|
}
|
|
343
343
|
}
|
|
344
344
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { fileURLToPath } from "node:url";
|
|
3
3
|
import { modelAliasEnvDescriptors } from "./plugin-support/model-aliases.js";
|
|
4
|
+
import { modelProviderEnvDescriptors } from "./plugin-support/model-providers.js";
|
|
4
5
|
import { declaredEnvironment } from "./plugin-support/plugin-config.js";
|
|
5
6
|
import { defaultDataDirectory } from "./data-directory.js";
|
|
6
7
|
import { hostWebDirectory } from "./host-web.js";
|
|
@@ -13,6 +14,7 @@ export const hostConfigDescriptors = [
|
|
|
13
14
|
{ key: "AGENT_THINKING", source: "environment" },
|
|
14
15
|
{ key: "COMPACTION_PROVIDER", source: "environment" },
|
|
15
16
|
{ key: "COMPACTION_MODEL", source: "environment" },
|
|
17
|
+
...modelProviderEnvDescriptors,
|
|
16
18
|
...modelAliasEnvDescriptors,
|
|
17
19
|
{ key: "PRODUCT_PROFILE", source: "environment" },
|
|
18
20
|
{ key: "PLUGINS", source: "environment" },
|
|
@@ -6,7 +6,7 @@ import { ragentsDataRoot } from "@ragents/workspace-executor/src/tools.ts";
|
|
|
6
6
|
export { ragentsDataRoot };
|
|
7
7
|
|
|
8
8
|
export function defaultDataDirectory(profile: string, home = homedir()): string {
|
|
9
|
-
if (!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(profile)) throw new Error("PRODUCT_PROFILE
|
|
9
|
+
if (!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(profile)) throw new Error("PRODUCT_PROFILE must be a simple profile name.");
|
|
10
10
|
return path.join(ragentsDataRoot(home), profile);
|
|
11
11
|
}
|
|
12
12
|
|
|
@@ -35,7 +35,7 @@ export async function assertDataDirectoryIsolated(directory: string): Promise<vo
|
|
|
35
35
|
if (error.code === "ENOENT") return undefined;
|
|
36
36
|
throw error;
|
|
37
37
|
});
|
|
38
|
-
if (entry) throw new Error(`DATA_DIR
|
|
38
|
+
if (entry) throw new Error(`DATA_DIR is inside a project (${filename}). Choose an external data folder, for example ~/.local/share/ragents/<profile>.`);
|
|
39
39
|
}
|
|
40
40
|
if (path.dirname(current) === current) return;
|
|
41
41
|
}
|
|
@@ -35,6 +35,6 @@ export const setExternalAccess = async (value: boolean): Promise<void> => {
|
|
|
35
35
|
export const externalGate = (req: IncomingMessage, res: ServerResponse): boolean => {
|
|
36
36
|
if (open || isLocalRequest(req)) return false;
|
|
37
37
|
res.writeHead(503, { "Content-Type": "text/plain; charset=utf-8" });
|
|
38
|
-
res.end("
|
|
38
|
+
res.end("External access is turned off.\n");
|
|
39
39
|
return true;
|
|
40
40
|
};
|
|
@@ -46,7 +46,7 @@ export const acquireLock = async (file: string): Promise<() => Promise<void>> =>
|
|
|
46
46
|
continue;
|
|
47
47
|
}
|
|
48
48
|
if (Date.now() - started > LOCK_TIMEOUT_MS) {
|
|
49
|
-
throw new Error(`${file}
|
|
49
|
+
throw new Error(`${file} has been held by process ${owner || "?"} for ${Math.round(LOCK_TIMEOUT_MS / 60_000)} minutes; is a build still running there?`);
|
|
50
50
|
}
|
|
51
51
|
await new Promise((resolve) => setTimeout(resolve, LOCK_POLL_MS));
|
|
52
52
|
}
|
|
@@ -37,7 +37,7 @@ export async function readHelpResponse(url: URL, webDistDir: string, method = "G
|
|
|
37
37
|
const notFound = (): HelpResponse => ({
|
|
38
38
|
status: 404,
|
|
39
39
|
headers: { "Content-Type": "text/plain; charset=utf-8" },
|
|
40
|
-
body: method === "HEAD" ? undefined : "
|
|
40
|
+
body: method === "HEAD" ? undefined : "Not found",
|
|
41
41
|
});
|
|
42
42
|
let requested: string;
|
|
43
43
|
try {
|
|
@@ -141,7 +141,8 @@
|
|
|
141
141
|
],
|
|
142
142
|
"@ragents/host/plugin-support/model-aliases": [
|
|
143
143
|
"configuredModelAliases",
|
|
144
|
-
"modelLabel"
|
|
144
|
+
"modelLabel",
|
|
145
|
+
"validatedAliasModel"
|
|
145
146
|
],
|
|
146
147
|
"@ragents/host/plugin-support/model-choice": [
|
|
147
148
|
"builtinCatalog",
|
|
@@ -150,8 +151,12 @@
|
|
|
150
151
|
"modelThinkingOptions"
|
|
151
152
|
],
|
|
152
153
|
"@ragents/host/plugin-support/model-completion": [
|
|
154
|
+
"aliasCompletionModelToken",
|
|
153
155
|
"openRouterCompletionModel"
|
|
154
156
|
],
|
|
157
|
+
"@ragents/host/plugin-support/model-providers": [
|
|
158
|
+
"configuredModelProviders"
|
|
159
|
+
],
|
|
155
160
|
"@ragents/host/plugin-support/model-upstreams": [
|
|
156
161
|
"modelUpstreamsToken"
|
|
157
162
|
],
|
|
@@ -58,11 +58,12 @@ export const hostApi: { readonly server: HostApiModules; readonly web: HostApiMo
|
|
|
58
58
|
"PayloadTooLargeError", "guardedJsonRoute", "readBody", "readJsonBody", "withAbort", "writeJson",
|
|
59
59
|
],
|
|
60
60
|
"@ragents/host/plugin-support/language-server/plugin": ["createLanguageServerPlugin"],
|
|
61
|
-
"@ragents/host/plugin-support/model-aliases": ["configuredModelAliases", "modelLabel"],
|
|
61
|
+
"@ragents/host/plugin-support/model-aliases": ["configuredModelAliases", "modelLabel", "validatedAliasModel"],
|
|
62
62
|
"@ragents/host/plugin-support/model-choice": [
|
|
63
63
|
"builtinCatalog", "modelChoiceEnvDescriptors", "modelChoiceFromEnvironment", "modelThinkingOptions",
|
|
64
64
|
],
|
|
65
|
-
"@ragents/host/plugin-support/model-completion": ["openRouterCompletionModel"],
|
|
65
|
+
"@ragents/host/plugin-support/model-completion": ["aliasCompletionModelToken", "openRouterCompletionModel"],
|
|
66
|
+
"@ragents/host/plugin-support/model-providers": ["configuredModelProviders"],
|
|
66
67
|
"@ragents/host/plugin-support/model-upstreams": ["modelUpstreamsToken"],
|
|
67
68
|
"@ragents/host/plugin-support/plugin-config": ["declaredEnvironment"],
|
|
68
69
|
"@ragents/host/plugin-support/plugin-folder": ["folderSystemPrompts", "pluginAsset", "pluginFolder"],
|
|
@@ -9,15 +9,15 @@ export interface HostRecord {
|
|
|
9
9
|
readonly startedAt: string;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
/**
|
|
12
|
+
/** The remembered host of a profile; ragents run and ragents start write the same file, stop --host reads it. */
|
|
13
13
|
export const hostRecordFile = (dataDirectory: string): string => path.join(dataDirectory, "host.json");
|
|
14
14
|
|
|
15
15
|
export const readHostRecord = (dataDirectory: string): HostRecord | undefined => {
|
|
16
16
|
const file = hostRecordFile(dataDirectory);
|
|
17
17
|
if (!statSync(file, { throwIfNoEntry: false })?.isFile()) return undefined;
|
|
18
18
|
const parsed = JSON.parse(readFileSync(file, "utf8")) as Partial<HostRecord>;
|
|
19
|
-
//
|
|
20
|
-
if (typeof parsed.url !== "string" || !Number.isInteger(parsed.pid) || (parsed.pid ?? 0) < 1) throw new Error(`${file}
|
|
19
|
+
// A PID below 1 would mean the whole process group to process.kill; it must never come from this file.
|
|
20
|
+
if (typeof parsed.url !== "string" || !Number.isInteger(parsed.pid) || (parsed.pid ?? 0) < 1) throw new Error(`${file} names no address or no PID of the host`);
|
|
21
21
|
return parsed as HostRecord;
|
|
22
22
|
};
|
|
23
23
|
|
|
@@ -43,14 +43,14 @@ const resolveFromBundle = async (bundle, specifier, context, next) => {
|
|
|
43
43
|
if (cross) {
|
|
44
44
|
const [, owner, name] = cross;
|
|
45
45
|
const folder = bundles.get(owner);
|
|
46
|
-
if (!folder) throw new Error(`
|
|
46
|
+
if (!folder) throw new Error(`The bundle ${bundle} imports ${specifier}, but ${owner} is not in the plugin list`);
|
|
47
47
|
const url = new URL(`server/exports/${name.replace(/\.js$/, "")}.js`, folder).href;
|
|
48
|
-
if (!existsSync(fileURLToPath(url))) throw new Error(`
|
|
48
|
+
if (!existsSync(fileURLToPath(url))) throw new Error(`The bundle ${bundle} imports ${specifier}, but the bundle ${owner} does not export ${name} for the server; rebuild both bundles from their sources`);
|
|
49
49
|
return { url, shortCircuit: true };
|
|
50
50
|
}
|
|
51
51
|
const listed = specifier.replace(/\.(js|ts|tsx)$/, "");
|
|
52
52
|
if (listed === "@ragents/workflow") return { url: workflowEntry, shortCircuit: true };
|
|
53
|
-
if (!serverModules.has(listed)) throw new Error(`
|
|
53
|
+
if (!serverModules.has(listed)) throw new Error(`The bundle ${bundle} imports ${specifier}, which the host does not provide; rebuild the bundle against this host`);
|
|
54
54
|
return next(specifier, { ...context, parentURL: serverEntry });
|
|
55
55
|
};
|
|
56
56
|
|
|
@@ -58,7 +58,7 @@ const resolveFromBundle = async (bundle, specifier, context, next) => {
|
|
|
58
58
|
export const load = async (url, context, next) =>
|
|
59
59
|
bundleOf(url) !== undefined && url.endsWith(".js") ? next(url, { ...context, format: "module" }) : next(url, context);
|
|
60
60
|
|
|
61
|
-
//
|
|
61
|
+
// Plain JavaScript, because Node loads this file in the loader thread and strips no types under node_modules there.
|
|
62
62
|
/** Bundles resolve strictly; other code outside the repository resolves bare imports through the host, so it needs no own node_modules. */
|
|
63
63
|
export const resolve = async (specifier, context, next) => {
|
|
64
64
|
const bundle = bundleOf(context.parentURL);
|
|
@@ -8,12 +8,12 @@ export const hostRoot = (): string => path.resolve(path.dirname(fileURLToPath(im
|
|
|
8
8
|
/** The value names of the host API and its number, relative to the host root; generated by pnpm update:host-api. */
|
|
9
9
|
export const HOST_API_RECORD_FILE = "apps/server/src/host-api.json";
|
|
10
10
|
|
|
11
|
-
/**
|
|
11
|
+
/** The host API number of a host anywhere; this way the extension also checks a host that is not itself. */
|
|
12
12
|
export const readHostApiVersion = (root: string = hostRoot()): number => {
|
|
13
13
|
const file = path.join(root, HOST_API_RECORD_FILE);
|
|
14
|
-
if (!statSync(file, { throwIfNoEntry: false })?.isFile()) throw new Error(`
|
|
14
|
+
if (!statSync(file, { throwIfNoEntry: false })?.isFile()) throw new Error(`The host API is unknown: ${file} is missing`);
|
|
15
15
|
const version = (JSON.parse(readFileSync(file, "utf8")) as { version?: unknown }).version;
|
|
16
|
-
if (typeof version !== "number" || !Number.isInteger(version) || version < 1) throw new Error(`${file}: version
|
|
16
|
+
if (typeof version !== "number" || !Number.isInteger(version) || version < 1) throw new Error(`${file}: version is not a host API number`);
|
|
17
17
|
return version;
|
|
18
18
|
};
|
|
19
19
|
|
|
@@ -26,7 +26,7 @@ export interface HostApiRecord {
|
|
|
26
26
|
|
|
27
27
|
export const readHostApiRecord = (root = hostRoot()): HostApiRecord => {
|
|
28
28
|
const file = path.join(root, HOST_API_RECORD_FILE);
|
|
29
|
-
if (!statSync(file, { throwIfNoEntry: false })?.isFile()) throw new Error(`${file}
|
|
29
|
+
if (!statSync(file, { throwIfNoEntry: false })?.isFile()) throw new Error(`${file} is missing; generate it with pnpm update:host-api`);
|
|
30
30
|
return JSON.parse(readFileSync(file, "utf8")) as HostApiRecord;
|
|
31
31
|
};
|
|
32
32
|
|
|
@@ -34,12 +34,12 @@ export const readHostApiRecord = (root = hostRoot()): HostApiRecord => {
|
|
|
34
34
|
export const checkedHostApiRecord = (root = hostRoot()): HostApiRecord => {
|
|
35
35
|
const record = readHostApiRecord(root);
|
|
36
36
|
if (record.version !== HOST_API_VERSION) {
|
|
37
|
-
throw new Error(`host-api.json
|
|
37
|
+
throw new Error(`host-api.json describes host API ${record.version}, the host offers ${HOST_API_VERSION}; pnpm update:host-api`);
|
|
38
38
|
}
|
|
39
39
|
for (const half of ["server", "web"] as const) {
|
|
40
40
|
const listed = [...hostApiModules(half)].sort().join("\n");
|
|
41
41
|
if (Object.keys(record[half]).sort().join("\n") !== listed) {
|
|
42
|
-
throw new Error(`host-api.json
|
|
42
|
+
throw new Error(`host-api.json names different modules for the ${half} half than apps/server/src/host-api.ts; pnpm update:host-api`);
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
return record;
|
|
@@ -51,7 +51,7 @@ export interface HostPackage {
|
|
|
51
51
|
readonly hostVersion: string;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
/**
|
|
54
|
+
/** The npm package @schlenkr/ragents carries the commit it was built from; a checkout does not have this file. */
|
|
55
55
|
export const readHostPackage = (root: string = hostRoot()): HostPackage | undefined => {
|
|
56
56
|
const file = path.join(root, "package.json");
|
|
57
57
|
if (!statSync(file, { throwIfNoEntry: false })?.isFile()) return undefined;
|
|
@@ -59,19 +59,19 @@ export const readHostPackage = (root: string = hostRoot()): HostPackage | undefi
|
|
|
59
59
|
const hostVersion = parsed.ragents?.hostVersion;
|
|
60
60
|
if (hostVersion === undefined) return undefined;
|
|
61
61
|
if (typeof hostVersion !== "string" || !/^[0-9a-f]{40}$/.test(hostVersion)) {
|
|
62
|
-
throw new Error(`${file}: ragents.hostVersion
|
|
62
|
+
throw new Error(`${file}: ragents.hostVersion must be a full Git commit, not ${JSON.stringify(hostVersion)}`);
|
|
63
63
|
}
|
|
64
|
-
if (typeof parsed.name !== "string" || typeof parsed.version !== "string") throw new Error(`${file}: name
|
|
64
|
+
if (typeof parsed.name !== "string" || typeof parsed.version !== "string") throw new Error(`${file}: name and version are missing`);
|
|
65
65
|
return { name: parsed.name, version: parsed.version, hostVersion };
|
|
66
66
|
};
|
|
67
67
|
|
|
68
|
-
/**
|
|
68
|
+
/** The version of the npm package: in the package its own, in the checkout that of the root; one source for both. */
|
|
69
69
|
export const readPackageVersion = (root: string = hostRoot()): string => {
|
|
70
70
|
const file = path.join(root, "package.json");
|
|
71
|
-
if (!statSync(file, { throwIfNoEntry: false })?.isFile()) throw new Error(`
|
|
71
|
+
if (!statSync(file, { throwIfNoEntry: false })?.isFile()) throw new Error(`The package version is unknown: ${file} is missing`);
|
|
72
72
|
const version = (JSON.parse(readFileSync(file, "utf8")) as { version?: unknown }).version;
|
|
73
73
|
if (typeof version !== "string" || !/^\d+\.\d+\.\d+/.test(version)) {
|
|
74
|
-
throw new Error(`${file}: version
|
|
74
|
+
throw new Error(`${file}: version is the package version and must be x.y.z, not ${JSON.stringify(version)}`);
|
|
75
75
|
}
|
|
76
76
|
return version;
|
|
77
77
|
};
|
|
@@ -79,10 +79,10 @@ export const readPackageVersion = (root: string = hostRoot()): string => {
|
|
|
79
79
|
const gitDirectoryOf = (root: string): string => {
|
|
80
80
|
const entry = path.join(root, ".git");
|
|
81
81
|
const stats = statSync(entry, { throwIfNoEntry: false });
|
|
82
|
-
if (!stats) throw new Error(`
|
|
82
|
+
if (!stats) throw new Error(`The host version is unknown: ${entry} is missing; the host needs a Git checkout or the package @schlenkr/ragents`);
|
|
83
83
|
if (stats.isDirectory()) return entry;
|
|
84
84
|
const pointer = /^gitdir:\s*(.+)\s*$/.exec(readFileSync(entry, "utf8"));
|
|
85
|
-
if (!pointer) throw new Error(`
|
|
85
|
+
if (!pointer) throw new Error(`The host version is unknown: ${entry} names no gitdir`);
|
|
86
86
|
return path.resolve(root, pointer[1]!.trim());
|
|
87
87
|
};
|
|
88
88
|
|
|
@@ -96,7 +96,7 @@ const refFrom = (gitDirectory: string, ref: string): string | undefined => {
|
|
|
96
96
|
return line?.split(" ")[0];
|
|
97
97
|
};
|
|
98
98
|
|
|
99
|
-
/**
|
|
99
|
+
/** The commit of the running host: from the package @schlenkr/ragents, otherwise from the Git checkout with worktrees and packed refs. */
|
|
100
100
|
export const readHostVersion = (root: string = hostRoot()): string => {
|
|
101
101
|
const packaged = readHostPackage(root);
|
|
102
102
|
if (packaged) return packaged.hostVersion;
|
|
@@ -105,11 +105,11 @@ export const readHostVersion = (root: string = hostRoot()): string => {
|
|
|
105
105
|
const ref = /^ref:\s*(.+)$/.exec(head)?.[1]?.trim();
|
|
106
106
|
if (!ref) {
|
|
107
107
|
if (/^[0-9a-f]{40}$/.test(head)) return head;
|
|
108
|
-
throw new Error(`
|
|
108
|
+
throw new Error(`The host version is unknown: HEAD in ${gitDirectory} is neither a ref nor a commit`);
|
|
109
109
|
}
|
|
110
110
|
const commonDirectory = statSync(path.join(gitDirectory, "commondir"), { throwIfNoEntry: false })?.isFile()
|
|
111
111
|
? path.resolve(gitDirectory, readFileSync(path.join(gitDirectory, "commondir"), "utf8").trim()) : undefined;
|
|
112
112
|
const commit = refFrom(gitDirectory, ref) ?? (commonDirectory ? refFrom(commonDirectory, ref) : undefined);
|
|
113
|
-
if (!commit || !/^[0-9a-f]{40}$/.test(commit)) throw new Error(`
|
|
113
|
+
if (!commit || !/^[0-9a-f]{40}$/.test(commit)) throw new Error(`The host version is unknown: ${ref} in ${gitDirectory} points to no commit`);
|
|
114
114
|
return commit;
|
|
115
115
|
};
|
|
@@ -40,7 +40,7 @@ const readRecord = (file: string): HostWebRecord | undefined => {
|
|
|
40
40
|
const inputs = raw.inputs;
|
|
41
41
|
if (typeof inputs !== "object" || inputs === null || Array.isArray(inputs)
|
|
42
42
|
|| Object.values(inputs).some((hash) => typeof hash !== "string")) {
|
|
43
|
-
throw new Error(`${file}
|
|
43
|
+
throw new Error(`${file} does not have the expected shape`);
|
|
44
44
|
}
|
|
45
45
|
return { inputs: inputs as Record<string, string> };
|
|
46
46
|
};
|
|
@@ -48,12 +48,12 @@ const readRecord = (file: string): HostWebRecord | undefined => {
|
|
|
48
48
|
/** Why a built web cannot be served as it is; with sources, a checkout also compares it with the files it was built from. */
|
|
49
49
|
export const hostWebProblem = (directory: string, root: string, sources: boolean): string | undefined => {
|
|
50
50
|
const missing = HOST_WEB_PAGES.filter((page) => !isFile(path.join(directory, page)));
|
|
51
|
-
if (missing.length > 0) return `
|
|
51
|
+
if (missing.length > 0) return `The host's web is missing under ${directory} (${missing.join(", ")})`;
|
|
52
52
|
if (!sources) return undefined;
|
|
53
53
|
const record = readRecord(path.join(directory, HOST_WEB_RECORD));
|
|
54
|
-
if (!record) return `
|
|
54
|
+
if (!record) return `The host's web under ${directory} has no source record (${HOST_WEB_RECORD})`;
|
|
55
55
|
const changed = changedInputs(record, root);
|
|
56
56
|
if (changed.length === 0) return undefined;
|
|
57
|
-
const shown = changed.slice(0, 5).join(", ") + (changed.length > 5 ? `
|
|
58
|
-
return `
|
|
57
|
+
const shown = changed.slice(0, 5).join(", ") + (changed.length > 5 ? ` and ${changed.length - 5} more` : "");
|
|
58
|
+
return `The host's web under ${directory} no longer matches its sources (changed: ${shown})`;
|
|
59
59
|
};
|