@schlenkr/ragents 0.1.10 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/server/package.json +1 -1
- package/apps/server/src/access-projection.ts +4 -4
- package/apps/server/src/access-service.ts +3 -3
- package/apps/server/src/access-session.ts +19 -19
- package/apps/server/src/api/contracts.ts +29 -29
- package/apps/server/src/api/core-methods.ts +17 -17
- package/apps/server/src/api/delivery.ts +2 -2
- package/apps/server/src/api/reference.ts +27 -27
- package/apps/server/src/api/rights.ts +18 -18
- package/apps/server/src/chat-handler.ts +5 -5
- package/apps/server/src/config-definition.ts +37 -10
- package/apps/server/src/config-file.ts +49 -49
- package/apps/server/src/config.ts +2 -0
- package/apps/server/src/data-directory.ts +2 -2
- package/apps/server/src/external-access.ts +1 -1
- package/apps/server/src/folder-install.ts +1 -1
- package/apps/server/src/help-files.ts +1 -1
- package/apps/server/src/host-api.json +6 -1
- package/apps/server/src/host-api.ts +3 -2
- package/apps/server/src/host-record.ts +3 -3
- package/apps/server/src/host-resolution-hooks.mjs +4 -4
- package/apps/server/src/host-version.ts +17 -17
- package/apps/server/src/host-web.ts +5 -5
- package/apps/server/src/main.ts +6 -6
- package/apps/server/src/missing-environment.ts +6 -6
- package/apps/server/src/parent-watch.ts +4 -4
- package/apps/server/src/plugin-build/build.ts +31 -31
- package/apps/server/src/plugin-build/host-api-names.ts +7 -7
- package/apps/server/src/plugin-build/plugin-description.ts +15 -15
- package/apps/server/src/plugin-build/typecheck.ts +1 -1
- package/apps/server/src/plugin-support/actor-programs/app-project.ts +19 -19
- package/apps/server/src/plugin-support/actor-programs/client-compiler.ts +4 -4
- package/apps/server/src/plugin-support/actor-programs/client-contracts.ts +11 -11
- package/apps/server/src/plugin-support/actor-programs/contract.ts +17 -17
- package/apps/server/src/plugin-support/actor-programs/runtime-libraries.ts +1 -1
- package/apps/server/src/plugin-support/actor-programs/workflow/index.ts +5 -5
- package/apps/server/src/plugin-support/actor-programs/workflow/prompt-reader.ts +2 -2
- package/apps/server/src/plugin-support/chat-display-policy.ts +2 -2
- package/apps/server/src/plugin-support/front-matter.ts +6 -6
- package/apps/server/src/plugin-support/http.ts +2 -2
- package/apps/server/src/plugin-support/language-server/contract.ts +8 -8
- package/apps/server/src/plugin-support/language-server/plugin.ts +2 -2
- package/apps/server/src/plugin-support/language-server/snapshot-method.ts +1 -1
- package/apps/server/src/plugin-support/language-server/tools.ts +11 -11
- package/apps/server/src/plugin-support/model-aliases.ts +30 -20
- package/apps/server/src/plugin-support/model-choice.ts +15 -15
- package/apps/server/src/plugin-support/model-completion.ts +44 -23
- package/apps/server/src/plugin-support/model-providers.ts +170 -0
- package/apps/server/src/plugin-support/model-upstreams.ts +1 -1
- package/apps/server/src/plugin-support/native-typescript-child.ts +4 -4
- package/apps/server/src/plugin-support/native-typescript-executor.ts +12 -12
- package/apps/server/src/plugin-support/plugin-config.ts +3 -3
- package/apps/server/src/plugin-support/plugin-folder.ts +2 -2
- package/apps/server/src/plugin-support/plugins-root.ts +2 -2
- package/apps/server/src/plugin-support/process-sandbox.ts +39 -39
- package/apps/server/src/plugin-support/product-model-settings-contract.ts +3 -3
- package/apps/server/src/plugin-support/product-model-settings.ts +10 -10
- package/apps/server/src/plugin-support/product-relay.ts +9 -9
- package/apps/server/src/plugin-support/product-start-options.ts +4 -4
- package/apps/server/src/plugin-support/prompt.ts +1 -1
- package/apps/server/src/plugin-support/provision.ts +8 -8
- package/apps/server/src/plugin-support/run-scripts.ts +17 -17
- package/apps/server/src/plugin-support/skills.ts +18 -18
- package/apps/server/src/plugin-support/start-entries-contract.ts +17 -17
- package/apps/server/src/plugin-support/start-options-contract.ts +5 -5
- package/apps/server/src/plugin-support/system-prompts.ts +11 -11
- package/apps/server/src/plugin-support/thinking-level.ts +2 -2
- package/apps/server/src/plugin-support/tool-availability.ts +2 -2
- package/apps/server/src/plugin-support/workspace-ownership.ts +5 -5
- package/apps/server/src/plugin-support/workspace-sandbox-host.ts +37 -37
- package/apps/server/src/plugin-support/zip.ts +7 -7
- package/apps/server/src/profile/bundle-manifest.ts +17 -17
- package/apps/server/src/profile/compose.ts +12 -7
- package/apps/server/src/profile/plugin-discovery.ts +12 -12
- package/apps/server/src/profile/provisioning.ts +5 -5
- package/apps/server/src/profile-target.ts +10 -10
- package/apps/server/src/protocol.ts +2 -2
- package/apps/server/src/provider.ts +61 -56
- package/apps/server/src/ragents/actor-chat-history.ts +8 -8
- package/apps/server/src/ragents/chat-text-positions.ts +2 -2
- package/apps/server/src/ragents/coordinator.ts +2 -2
- package/apps/server/src/ragents/engine.ts +23 -23
- package/apps/server/src/ragents/global-chat.ts +8 -8
- package/apps/server/src/ragents/host-services.ts +6 -3
- package/apps/server/src/ragents/journal-chat-events.ts +1 -1
- package/apps/server/src/ragents/run-owner.ts +2 -2
- package/apps/server/src/ragents/session.ts +49 -49
- package/apps/server/src/ragents/typescript-tools.ts +12 -12
- package/apps/server/src/ragents/workspace-runtime.ts +28 -28
- package/apps/server/src/rpc/dispatcher.ts +19 -19
- package/apps/server/src/rpc/http-transport.ts +11 -11
- package/apps/server/src/rpc/stdio-transport.ts +3 -3
- package/apps/server/src/run-preparation-input.ts +5 -5
- package/apps/server/src/run-preparation.ts +24 -24
- package/apps/server/src/run-transfer.ts +39 -39
- package/apps/server/src/server.ts +48 -48
- package/apps/server/src/settings.ts +1 -1
- package/apps/server/src/startup.ts +3 -3
- package/apps/server/src/title-compactor.ts +9 -9
- package/apps/server/src/title-settings.ts +3 -3
- package/apps/server/src/web-bundles.ts +2 -2
- package/apps/server/src/web-stylesheet.ts +2 -2
- package/apps/web/dist/assets/{highlighted-body-KPVGNVTW-BO4wLQtE.js → highlighted-body-KPVGNVTW-BfNSGxjB.js} +1 -1
- package/apps/web/dist/assets/main-D6bsKcIK.js +11 -0
- package/apps/web/dist/assets/mermaid-HWGCJPDP-DROEqEeg.js +608 -0
- package/apps/web/dist/assets/runPanel-Dumuuqry.js +21 -0
- package/apps/web/dist/help/guide-access.html +5 -5
- package/apps/web/dist/help/guide-access.md +2 -2
- package/apps/web/dist/help/guide-clients.html +53 -54
- package/apps/web/dist/help/guide-clients.md +50 -51
- package/apps/web/dist/help/guide-distributed.html +12 -7
- package/apps/web/dist/help/guide-distributed.md +9 -4
- package/apps/web/dist/help/guide-functions.html +3 -3
- package/apps/web/dist/help/guide-getting-started.html +24 -15
- package/apps/web/dist/help/guide-getting-started.md +22 -12
- package/apps/web/dist/help/guide-ideas.html +3 -3
- package/apps/web/dist/help/guide-plugins.html +5 -4
- package/apps/web/dist/help/guide-plugins.md +2 -1
- package/apps/web/dist/help/guide-programs.html +3 -3
- package/apps/web/dist/help/guide-runtime.html +6 -6
- package/apps/web/dist/help/guide-runtime.md +3 -3
- package/apps/web/dist/help/guide.html +3 -3
- package/apps/web/dist/help/index.html +196 -144
- package/apps/web/dist/help/mini-app.css +6 -0
- package/apps/web/dist/help/mini-app.js +14 -14
- package/apps/web/dist/host-web.json +90 -90
- package/apps/web/dist/index.html +3 -3
- package/apps/web/dist/run-panel.html +3 -3
- package/apps/web/package.json +1 -1
- package/apps/web/src/AccessContext.tsx +15 -15
- package/apps/web/src/App.tsx +13 -13
- package/apps/web/src/DiffCode.tsx +2 -2
- package/apps/web/src/HelpDialog.tsx +3 -3
- package/apps/web/src/Overview.tsx +13 -13
- package/apps/web/src/PluginActivation.ts +1 -1
- package/apps/web/src/PluginChat.tsx +15 -15
- package/apps/web/src/PluginFailureNotice.tsx +1 -1
- package/apps/web/src/PluginRegistry.tsx +44 -44
- package/apps/web/src/RunPreparationChat.tsx +11 -11
- package/apps/web/src/RunStore.ts +1 -1
- package/apps/web/src/SessionList.tsx +14 -14
- package/apps/web/src/SettingsModal.tsx +112 -112
- package/apps/web/src/StartOptions.tsx +11 -11
- package/apps/web/src/StartSelection.tsx +11 -11
- package/apps/web/src/StartTiles.tsx +8 -8
- package/apps/web/src/SurfaceShortcuts.tsx +3 -3
- package/apps/web/src/ThemeSettings.tsx +8 -8
- package/apps/web/src/TitleModelSettings.tsx +13 -13
- package/apps/web/src/WorkspacePanel.tsx +9 -9
- package/apps/web/src/access-session.ts +4 -4
- package/apps/web/src/access-token.ts +5 -5
- package/apps/web/src/actor-conversation.ts +3 -3
- package/apps/web/src/actor-programs/client-ui/DataTable.tsx +8 -8
- package/apps/web/src/actor-programs/client-ui/FilePicker.tsx +4 -4
- package/apps/web/src/actor-programs/client-ui/FlowDiagram.tsx +13 -13
- package/apps/web/src/actor-programs/client-ui/Viewers.tsx +4 -4
- package/apps/web/src/actor-programs/client-ui/WorkflowDiagram.tsx +1 -1
- package/apps/web/src/actor-programs/client-ui/file-contracts.d.ts +4 -4
- package/apps/web/src/actor-programs/client-ui/file-selection.ts +1 -1
- package/apps/web/src/actor-programs/client-ui/viewer-contracts.d.ts +3 -3
- package/apps/web/src/api.ts +7 -7
- package/apps/web/src/chat/StoppedActorNotice.tsx +5 -5
- package/apps/web/src/chat/chat-target.ts +3 -3
- package/apps/web/src/chat/requests.ts +2 -2
- package/apps/web/src/chat/useAttachmentCapabilities.ts +2 -2
- package/apps/web/src/chat-view-settings.tsx +5 -6
- package/apps/web/src/diff-view.css +1 -1
- package/apps/web/src/highlighting.css +1 -1
- package/apps/web/src/language-server/language-server-plugin.tsx +30 -30
- package/apps/web/src/lib/labels.ts +6 -6
- package/apps/web/src/main.tsx +4 -4
- package/apps/web/src/offered-machines.ts +2 -2
- package/apps/web/src/page-opener.tsx +1 -1
- package/apps/web/src/panel/ConnectionsPage.tsx +23 -23
- package/apps/web/src/panel/LoginForm.tsx +6 -6
- package/apps/web/src/panel/PanelDialogs.tsx +22 -22
- package/apps/web/src/panel/PanelHeader.tsx +2 -2
- package/apps/web/src/panel/PanelPage.tsx +1 -1
- package/apps/web/src/panel/RunLine.tsx +4 -4
- package/apps/web/src/panel/RunsPage.tsx +15 -15
- package/apps/web/src/panel/StartPage.tsx +26 -26
- package/apps/web/src/panel/connection-state.ts +9 -9
- package/apps/web/src/panel/contract.ts +28 -28
- package/apps/web/src/panel.tsx +1 -1
- package/apps/web/src/plugin-bootstrap.ts +5 -5
- package/apps/web/src/product/ModelControl.tsx +3 -3
- package/apps/web/src/product/ProductModelSettings.tsx +16 -16
- package/apps/web/src/product/SystemPromptControl.tsx +11 -11
- package/apps/web/src/product/model-settings.ts +2 -2
- package/apps/web/src/rpc/client.ts +16 -16
- package/apps/web/src/rpc.ts +1 -1
- package/apps/web/src/run-overview.ts +1 -1
- package/apps/web/src/run-panel/RunPanelApp.tsx +39 -39
- package/apps/web/src/run-panel/RunPanelHeader.tsx +6 -6
- package/apps/web/src/run-panel/RunPanelMenu.tsx +6 -6
- package/apps/web/src/run-panel/RunPanelRail.tsx +4 -4
- package/apps/web/src/run-panel/RunPanelWorkspace.tsx +3 -3
- package/apps/web/src/run-panel/clipboard.ts +3 -3
- package/apps/web/src/run-panel/host-contract.ts +5 -5
- package/apps/web/src/run-panel/host.ts +15 -15
- package/apps/web/src/run-panel/input-bridge.ts +1 -1
- package/apps/web/src/run-panel/run-panel-location.ts +5 -5
- package/apps/web/src/run-panel/use-session-list.ts +1 -1
- package/apps/web/src/run-panel/workspace-state.ts +3 -3
- package/apps/web/src/run-panel.tsx +4 -4
- package/apps/web/src/run-preparation.ts +2 -2
- package/apps/web/src/run-view.ts +3 -3
- package/apps/web/src/settings-contributions.ts +32 -32
- package/apps/web/src/theme.ts +9 -9
- package/apps/web/src/title-model-settings.ts +6 -6
- package/apps/web/src/ui/ListDetail.tsx +9 -9
- package/apps/web/src/ui/dialog.tsx +2 -2
- package/apps/web/src/ui/modal-controller.ts +3 -3
- package/apps/web/src/ui/modal.tsx +2 -2
- package/apps/web/src/ui/popover.tsx +1 -1
- package/apps/web/src/ui/relative-time.ts +8 -8
- package/apps/web/src/ui/startup-notice.tsx +2 -2
- package/apps/web/src/ui/state-icon.tsx +1 -1
- package/apps/web/src/ui/state-vocabulary.ts +16 -16
- package/apps/web/src/ui/stop-button.tsx +2 -2
- package/bundles/ragents.activity/ragents-bundle.json +2 -2
- package/bundles/ragents.activity/web/classes.json +1 -1
- package/bundles/ragents.activity/web/index.js +1 -1
- package/bundles/ragents.activity/web/index.js.map +2 -2
- package/bundles/ragents.actor-programs/ragents-bundle.json +2 -2
- package/bundles/ragents.actor-programs/server/index.js +225 -225
- package/bundles/ragents.actor-programs/server/index.js.map +2 -2
- package/bundles/ragents.actor-programs/web/classes.json +1 -1
- package/bundles/ragents.actor-programs/web/index.js +1 -1
- package/bundles/ragents.actor-programs/web/index.js.map +3 -3
- package/bundles/ragents.ask/ragents-bundle.json +2 -2
- package/bundles/ragents.ask/server/chunks/{chunk-PDJO75SQ.js → chunk-YOV27MAR.js} +2 -2
- package/bundles/ragents.ask/server/chunks/chunk-YOV27MAR.js.map +7 -0
- package/bundles/ragents.ask/server/exports/server/contract.js +1 -1
- package/bundles/ragents.ask/server/index.js +23 -23
- package/bundles/ragents.ask/server/index.js.map +2 -2
- package/bundles/ragents.ask/web/chunks/{chunk-WFN4374U.js → chunk-D6NNB5DS.js} +1 -1
- package/bundles/ragents.ask/web/chunks/chunk-D6NNB5DS.js.map +7 -0
- package/bundles/ragents.ask/web/chunks/{chunk-MBRPS477.js → chunk-IQBHK7MV.js} +2 -2
- package/bundles/ragents.ask/web/chunks/{chunk-MBRPS477.js.map → chunk-IQBHK7MV.js.map} +3 -3
- package/bundles/ragents.ask/web/chunks/chunk-PWFIAMX4.js +2 -0
- package/bundles/ragents.ask/web/chunks/chunk-PWFIAMX4.js.map +7 -0
- package/bundles/ragents.ask/web/chunks/chunk-QHGKEESD.js +2 -0
- package/bundles/ragents.ask/web/chunks/chunk-QHGKEESD.js.map +7 -0
- package/bundles/ragents.ask/web/classes.json +1 -1
- package/bundles/ragents.ask/web/exports/ask-payload.js +1 -1
- package/bundles/ragents.ask/web/exports/web/QuestionCard.js +1 -1
- package/bundles/ragents.ask/web/exports/web/api.js +1 -1
- package/bundles/ragents.ask/web/index.js +1 -1
- package/bundles/ragents.ask/web/index.js.map +2 -2
- package/bundles/ragents.browser/executor/index.mjs +35 -35
- package/bundles/ragents.browser/executor/index.mjs.map +2 -2
- package/bundles/ragents.browser/ragents-bundle.json +2 -2
- package/bundles/ragents.browser/server/chunks/{chunk-CWLX4VA5.js → chunk-PYEISBNE.js} +1 -1
- package/bundles/ragents.browser/server/chunks/{chunk-CWLX4VA5.js.map → chunk-PYEISBNE.js.map} +1 -1
- package/bundles/ragents.browser/server/exports/server/contract.js +1 -1
- package/bundles/ragents.browser/server/index.js +31 -31
- package/bundles/ragents.browser/server/index.js.map +2 -2
- package/bundles/ragents.browser/skills/browser-testing/SKILL.md +30 -30
- package/bundles/ragents.documents/prompt.hbs +1 -1
- package/bundles/ragents.documents/ragents-bundle.json +2 -2
- package/bundles/ragents.documents/server/chunks/{chunk-QIECRZ7C.js → chunk-KMZWOVTI.js} +3 -3
- package/bundles/ragents.documents/server/chunks/{chunk-QIECRZ7C.js.map → chunk-KMZWOVTI.js.map} +2 -2
- package/bundles/ragents.documents/server/exports/contract.js +1 -1
- package/bundles/ragents.documents/server/index.js +26 -26
- package/bundles/ragents.documents/server/index.js.map +2 -2
- package/bundles/ragents.documents/web/classes.json +1 -1
- package/bundles/ragents.documents/web/index.js +1 -1
- package/bundles/ragents.documents/web/index.js.map +3 -3
- package/bundles/ragents.lsp-fsharp/executor/index.mjs +4 -4
- package/bundles/ragents.lsp-fsharp/executor/index.mjs.map +2 -2
- package/bundles/ragents.lsp-fsharp/ragents-bundle.json +2 -2
- package/bundles/ragents.lsp-fsharp/server/index.js +5 -5
- package/bundles/ragents.lsp-fsharp/server/index.js.map +2 -2
- package/bundles/ragents.lsp-fsharp/web/index.js +1 -1
- package/bundles/ragents.lsp-fsharp/web/index.js.map +2 -2
- package/bundles/ragents.lsp-roslyn/executor/index.mjs +3 -3
- package/bundles/ragents.lsp-roslyn/executor/index.mjs.map +2 -2
- package/bundles/ragents.lsp-roslyn/ragents-bundle.json +2 -2
- package/bundles/ragents.lsp-roslyn/server/index.js +17 -17
- package/bundles/ragents.lsp-roslyn/server/index.js.map +2 -2
- package/bundles/ragents.lsp-roslyn/web/index.js +1 -1
- package/bundles/ragents.lsp-roslyn/web/index.js.map +2 -2
- package/bundles/ragents.lsp-typescript/executor/index.mjs +2 -2
- package/bundles/ragents.lsp-typescript/executor/index.mjs.map +2 -2
- package/bundles/ragents.lsp-typescript/ragents-bundle.json +2 -2
- package/bundles/ragents.lsp-typescript/server/index.js.map +1 -1
- package/bundles/ragents.lsp-typescript/web/index.js +1 -1
- package/bundles/ragents.lsp-typescript/web/index.js.map +2 -2
- package/bundles/ragents.model-relay/ragents-bundle.json +7 -3
- package/bundles/ragents.model-relay/server/index.js +25 -21
- package/bundles/ragents.model-relay/server/index.js.map +2 -2
- package/bundles/ragents.orchestration/ragents-bundle.json +2 -2
- package/bundles/ragents.orchestration/server/index.js +28 -28
- package/bundles/ragents.orchestration/server/index.js.map +2 -2
- package/bundles/ragents.orchestration/web/chunks/{chunk-OSKPH6SZ.js → chunk-CFMJD5ZI.js} +2 -2
- package/bundles/ragents.orchestration/web/chunks/chunk-HOBLI364.js +2 -0
- package/bundles/ragents.orchestration/web/chunks/{chunk-OQYCNYXN.js.map → chunk-HOBLI364.js.map} +2 -2
- package/bundles/ragents.orchestration/web/chunks/{chunk-ODMMQGX2.js → chunk-UCIMT2R4.js} +2 -2
- package/bundles/ragents.orchestration/web/classes.json +1 -1
- package/bundles/ragents.orchestration/web/exports/web/program-slot.js +1 -1
- package/bundles/ragents.orchestration/web/exports/web/surface-entities.js +1 -1
- package/bundles/ragents.orchestration/web/index.js +8 -8
- package/bundles/ragents.orchestration/web/index.js.map +2 -2
- package/bundles/ragents.overseer/ragents-bundle.json +2 -2
- package/bundles/ragents.overseer/server/index.js +98 -98
- package/bundles/ragents.overseer/server/index.js.map +2 -2
- package/bundles/ragents.overseer/web/classes.json +1 -1
- package/bundles/ragents.overseer/web/index.js +1 -1
- package/bundles/ragents.overseer/web/index.js.map +2 -2
- package/bundles/ragents.processes/ragents-bundle.json +2 -2
- package/bundles/ragents.processes/server/index.js +11 -11
- package/bundles/ragents.processes/server/index.js.map +2 -2
- package/bundles/ragents.processes/web/classes.json +1 -1
- package/bundles/ragents.processes/web/index.js +3 -3
- package/bundles/ragents.processes/web/index.js.map +2 -2
- package/bundles/ragents.product/ragents-bundle.json +2 -2
- package/bundles/ragents.product/server/index.js +12 -13
- package/bundles/ragents.product/server/index.js.map +2 -2
- package/bundles/ragents.product/web/classes.json +1 -1
- package/bundles/ragents.product/web/index.js +1 -1
- package/bundles/ragents.product/web/index.js.map +2 -2
- package/bundles/ragents.profile-distribution/ragents-bundle.json +2 -2
- package/bundles/ragents.profile-distribution/server/index.js +31 -31
- package/bundles/ragents.profile-distribution/server/index.js.map +2 -2
- package/bundles/ragents.reference/ragents-bundle.json +2 -2
- package/bundles/ragents.reference/run-scripts/balcony-wizard/RUN.md +19 -19
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +2 -2
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +14 -14
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +2 -2
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +49 -49
- package/bundles/ragents.reference/run-scripts/balcony-wizard/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/balcony-wizard/src/server.ts +9 -9
- package/bundles/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +9 -9
- package/bundles/ragents.reference/run-scripts/conversation-circle/RUN.md +7 -7
- package/bundles/ragents.reference/run-scripts/conversation-circle/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/conversation-circle/src/server.ts +13 -13
- package/bundles/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +1 -1
- package/bundles/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +8 -8
- package/bundles/ragents.reference/run-scripts/learning-afternoon/RUN.md +16 -16
- package/bundles/ragents.reference/run-scripts/learning-afternoon/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -1
- package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +3 -3
- package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -1
- package/bundles/ragents.reference/run-scripts/learning-afternoon/src/server.ts +9 -9
- package/bundles/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +39 -39
- package/bundles/ragents.reference/run-scripts/moderated-round/RUN.md +7 -7
- package/bundles/ragents.reference/run-scripts/moderated-round/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/moderated-round/src/server.ts +9 -9
- package/bundles/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +1 -1
- package/bundles/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +6 -6
- package/bundles/ragents.reference/run-scripts/shared-actor-list/RUN.md +12 -12
- package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +2 -2
- package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +3 -3
- package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +4 -4
- package/bundles/ragents.reference/run-scripts/shared-actor-list/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/shared-actor-list/src/server.ts +11 -11
- package/bundles/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +1 -1
- package/bundles/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +13 -13
- package/bundles/ragents.reference/run-scripts/word-game/RUN.md +18 -18
- package/bundles/ragents.reference/run-scripts/word-game/package.json +2 -2
- package/bundles/ragents.reference/run-scripts/word-game/src/client.tsx +1 -1
- package/bundles/ragents.reference/run-scripts/word-game/src/contract.ts +2 -2
- package/bundles/ragents.reference/run-scripts/word-game/src/server.ts +16 -16
- package/bundles/ragents.reference/run-scripts/word-game/tests/program.test.ts +39 -39
- package/bundles/ragents.reference/skills/100-shared-actor-list/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/110-all-card-slots/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/150-editorial-workbench/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/160-learning-companion/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/170-photo-collection/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/180-decision-workbench/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/190-review-queue/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/20-circle-of-four/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/210-moderator-handover/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/220-actor-approval-list/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/230-shared-state-views/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/240-live-result-list/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/250-balcony-wizard/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/35-actor-input-fifo/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/40-subscription-matrix/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/50-subscription-removal/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/70-headless-counter/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/75-lsp-demo/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/80-actor-text-analysis/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/90-actor-notes/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/95-hello-world/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/decision-brief/SKILL.md +24 -24
- package/bundles/ragents.reference/skills/learning-sprint/SKILL.md +24 -24
- package/bundles/ragents.reference/web/classes.json +1 -1
- package/bundles/ragents.reference/web/index.js +1 -1
- package/bundles/ragents.reference/web/index.js.map +2 -2
- package/bundles/ragents.todo/ragents-bundle.json +2 -2
- package/bundles/ragents.todo/server/index.js +5 -5
- package/bundles/ragents.todo/server/index.js.map +2 -2
- package/bundles/ragents.todo/web/classes.json +1 -1
- package/bundles/ragents.todo/web/index.js +1 -1
- package/bundles/ragents.todo/web/index.js.map +2 -2
- package/bundles/ragents.transcript/ragents-bundle.json +2 -2
- package/bundles/ragents.transcript/server/index.js +11 -11
- package/bundles/ragents.transcript/server/index.js.map +2 -2
- package/bundles/ragents.watch/ragents-bundle.json +2 -2
- package/bundles/ragents.watch/server/index.js +48 -48
- package/bundles/ragents.watch/server/index.js.map +2 -2
- package/bundles/ragents.workspace/ragents-bundle.json +2 -2
- package/bundles/ragents.workspace/server/index.js +81 -81
- package/bundles/ragents.workspace/server/index.js.map +2 -2
- package/bundles/ragents.workspace/web/classes.json +1 -1
- package/bundles/ragents.workspace/web/index.js +1 -1
- package/bundles/ragents.workspace/web/index.js.map +2 -2
- package/package.json +4 -4
- package/packages/agent/dist/core/model-runtime.d.ts +7 -2
- package/packages/agent/dist/index.d.ts +1 -1
- package/packages/agent/dist/loop/agent-loop.d.ts +2 -2
- package/packages/agent/src/core/compaction/utils.ts +1 -1
- package/packages/agent/src/core/model-runtime.ts +45 -5
- package/packages/agent/src/index.ts +1 -1
- package/packages/agent/src/loop/agent-loop.ts +2 -2
- package/packages/ai/dist/models.d.ts +1 -0
- package/packages/ai/dist/models.generated.d.ts +4544 -983
- package/packages/ai/dist/providers/openrouter.models.d.ts +4544 -983
- package/packages/ai/src/api/ai-sdk.ts +33 -7
- package/packages/ai/src/api-registry.ts +1 -1
- package/packages/ai/src/index.ts +2 -2
- package/packages/ai/src/models.generated.ts +1 -1
- package/packages/ai/src/models.ts +1 -1
- package/packages/ai/src/providers/openrouter.models.ts +3723 -550
- package/packages/ragents/src/access.ts +12 -12
- package/packages/ragents/src/agents/actor-input.ts +33 -33
- package/packages/ragents/src/agents/catalog.ts +1 -1
- package/packages/ragents/src/agents/delivery.ts +17 -17
- package/packages/ragents/src/agents/plugins.ts +1 -1
- package/packages/ragents/src/agents/scheduler.ts +7 -7
- package/packages/ragents/src/agents/schemas.ts +1 -1
- package/packages/ragents/src/agents/tool-orientation.ts +4 -4
- package/packages/ragents/src/agents/tools.ts +20 -20
- package/packages/ragents/src/agents/toolset.ts +5 -5
- package/packages/ragents/src/agents/workspaces.ts +1 -1
- package/packages/ragents/src/domain/events.ts +1 -1
- package/packages/ragents/src/domain/model.ts +5 -5
- package/packages/ragents/src/drivers/agent-runtime.ts +1 -1
- package/packages/ragents/src/drivers/agent-turn.ts +4 -4
- package/packages/ragents/src/drivers/agent.ts +2 -2
- package/packages/ragents/src/drivers/attachments.ts +4 -4
- package/packages/ragents/src/http/contracts.ts +14 -14
- package/packages/ragents/src/http/methods.ts +6 -6
- package/packages/ragents/src/plugin-host.ts +119 -119
- package/packages/ragents/src/plugin-types.ts +16 -16
- package/packages/ragents/src/rpc/contract.ts +5 -5
- package/packages/ragents/src/rpc/contribution.ts +2 -2
- package/packages/ragents/src/rpc/peer.ts +11 -11
- package/packages/ragents/src/rpc/protocol.ts +2 -2
- package/packages/ragents/src/runtime/decisions/turns.ts +1 -1
- package/packages/ragents/src/runtime/journal.ts +10 -10
- package/packages/ragents/src/runtime/orchestration.ts +8 -8
- package/packages/ragents/src/runtime/stop.ts +2 -2
- package/packages/ragents/src/script/mediators.ts +35 -35
- package/packages/ragents/src/typescript/async-compiler.ts +14 -14
- package/packages/ragents/src/typescript/compiler-worker.ts +2 -2
- package/packages/ragents/src/typescript/compiler.ts +7 -7
- package/packages/ragents/src/typescript/snippet.ts +5 -5
- package/packages/workspace-executor/src/bash-launch.ts +13 -13
- package/packages/workspace-executor/src/commands.ts +18 -18
- package/packages/workspace-executor/src/context.ts +15 -15
- package/packages/workspace-executor/src/contributions.ts +35 -35
- package/packages/workspace-executor/src/errors.ts +1 -1
- package/packages/workspace-executor/src/executor.ts +15 -15
- package/packages/workspace-executor/src/files.ts +30 -30
- package/packages/workspace-executor/src/language-server/contract.ts +2 -2
- package/packages/workspace-executor/src/language-server/diagnostics.ts +4 -4
- package/packages/workspace-executor/src/language-server/host.ts +35 -35
- package/packages/workspace-executor/src/language-server/json-rpc.ts +4 -4
- package/packages/workspace-executor/src/language-server/module.ts +11 -11
- package/packages/workspace-executor/src/language-server/roots.ts +3 -3
- package/packages/workspace-executor/src/language-server/session.ts +15 -15
- package/packages/workspace-executor/src/language-server/workspace-solutions.ts +2 -2
- package/packages/workspace-executor/src/managed-process.ts +12 -12
- package/packages/workspace-executor/src/module.ts +8 -8
- package/packages/workspace-executor/src/modules.ts +3 -3
- package/packages/workspace-executor/src/paths.ts +11 -11
- package/packages/workspace-executor/src/process-sandbox.ts +3 -3
- package/packages/workspace-executor/src/processes/module.ts +3 -3
- package/packages/workspace-executor/src/processes/process-table.ts +20 -20
- package/packages/workspace-executor/src/processes/scanner.ts +3 -3
- package/packages/workspace-executor/src/processes/snapshot.ts +2 -2
- package/packages/workspace-executor/src/processes/terminator.ts +13 -13
- package/packages/workspace-executor/src/run-folders.ts +3 -3
- package/packages/workspace-executor/src/safe-environment.ts +4 -4
- package/packages/workspace-executor/src/sandbox-tools.ts +28 -28
- package/packages/workspace-executor/src/session-ident.ts +2 -2
- package/packages/workspace-executor/src/shell-platform.ts +2 -2
- package/packages/workspace-executor/src/tools.ts +5 -5
- package/plugins/ragents.activity/web/ActivityHeader.tsx +3 -3
- package/plugins/ragents.activity/web/activity.ts +2 -2
- package/plugins/ragents.actor-programs/server/access-projections.ts +1 -1
- package/plugins/ragents.actor-programs/server/agent-tools.ts +2 -2
- package/plugins/ragents.actor-programs/server/capability-resolver.ts +3 -3
- package/plugins/ragents.actor-programs/server/controls-template.ts +46 -46
- package/plugins/ragents.actor-programs/server/controls-tool.ts +4 -4
- package/plugins/ragents.actor-programs/server/limits.ts +3 -3
- package/plugins/ragents.actor-programs/server/methods.ts +1 -1
- package/plugins/ragents.actor-programs/server/project-diagnostics.ts +8 -8
- package/plugins/ragents.actor-programs/server/routes.ts +8 -8
- package/plugins/ragents.actor-programs/server/runtime.ts +90 -90
- package/plugins/ragents.actor-programs/server/templates.ts +59 -59
- package/plugins/ragents.actor-programs/server/test-report.ts +5 -5
- package/plugins/ragents.actor-programs/server/tool-contributor.ts +1 -1
- package/plugins/ragents.actor-programs/web/ActorViewFrame.tsx +17 -17
- package/plugins/ragents.actor-programs/web/AppsPanel.tsx +26 -26
- package/plugins/ragents.actor-programs/web/EmbeddedApps.tsx +3 -3
- package/plugins/ragents.actor-programs/web/FullscreenHost.tsx +2 -2
- package/plugins/ragents.actor-programs/web/FunctionForm.tsx +16 -16
- package/plugins/ragents.actor-programs/web/ProgramSource.tsx +5 -5
- package/plugins/ragents.actor-programs/web/api.ts +36 -36
- package/plugins/ragents.actor-programs/web/bridge.ts +8 -8
- package/plugins/ragents.actor-programs/web/chat-state.ts +4 -4
- package/plugins/ragents.actor-programs/web/context.ts +1 -1
- package/plugins/ragents.actor-programs/web/function-input.ts +6 -6
- package/plugins/ragents.actor-programs/web/index.tsx +1 -1
- package/plugins/ragents.actor-programs/web/program-state.ts +4 -4
- package/plugins/ragents.ask/ask-payload.ts +1 -1
- package/plugins/ragents.ask/contract.ts +5 -5
- package/plugins/ragents.ask/server/answer-method.ts +1 -1
- package/plugins/ragents.ask/server/ask-service.ts +9 -9
- package/plugins/ragents.ask/server/ask-tool.ts +10 -10
- package/plugins/ragents.ask/server/contract.ts +5 -5
- package/plugins/ragents.ask/web/AskActionView.tsx +1 -1
- package/plugins/ragents.ask/web/QuestionCard.tsx +22 -22
- package/plugins/ragents.ask/web/index.tsx +2 -2
- package/plugins/ragents.browser/executor/contract.ts +6 -6
- package/plugins/ragents.browser/executor/index.ts +1 -1
- package/plugins/ragents.browser/executor/module.ts +6 -6
- package/plugins/ragents.browser/executor/pages.ts +32 -32
- package/plugins/ragents.browser/executor/playwright.ts +8 -8
- package/plugins/ragents.browser/provision.ts +7 -7
- package/plugins/ragents.browser/server/browser.ts +14 -14
- package/plugins/ragents.browser/server/contract.ts +1 -1
- package/plugins/ragents.browser/server/index.ts +1 -1
- package/plugins/ragents.browser/server/tools.ts +14 -14
- package/plugins/ragents.browser/skills/browser-testing/SKILL.md +30 -30
- package/plugins/ragents.documents/contract.ts +2 -2
- package/plugins/ragents.documents/prompt.hbs +1 -1
- package/plugins/ragents.documents/server/document-write-tool.ts +12 -12
- package/plugins/ragents.documents/server/files-route.ts +6 -6
- package/plugins/ragents.documents/server/show-document-tool.ts +26 -26
- package/plugins/ragents.documents/server/store.ts +1 -1
- package/plugins/ragents.documents/web/DocumentViewer.tsx +37 -37
- package/plugins/ragents.documents/web/index.tsx +11 -11
- package/plugins/ragents.lsp-fsharp/executor.ts +7 -7
- package/plugins/ragents.lsp-fsharp/provision.ts +7 -7
- package/plugins/ragents.lsp-roslyn/executor.ts +5 -5
- package/plugins/ragents.lsp-roslyn/provision.ts +4 -4
- package/plugins/ragents.lsp-roslyn/server/index.ts +5 -5
- package/plugins/ragents.lsp-roslyn/server/solution-on-start.ts +13 -13
- package/plugins/ragents.lsp-typescript/executor.ts +3 -3
- package/plugins/ragents.model-relay/server/config.ts +6 -2
- package/plugins/ragents.model-relay/server/index.ts +2 -2
- package/plugins/ragents.model-relay/server/relay.ts +23 -22
- package/plugins/ragents.orchestration/contract.ts +8 -8
- package/plugins/ragents.orchestration/server/index.ts +4 -4
- package/plugins/ragents.orchestration/server/run-stop-tool.ts +3 -3
- package/plugins/ragents.orchestration/server/surface-tool.ts +5 -5
- package/plugins/ragents.orchestration/tiled-layout.ts +11 -11
- package/plugins/ragents.orchestration/web/ActorChat.tsx +2 -2
- package/plugins/ragents.orchestration/web/ActorChatControls.tsx +4 -4
- package/plugins/ragents.orchestration/web/ActorChatPreview.tsx +1 -1
- package/plugins/ragents.orchestration/web/ActorPopout.tsx +1 -1
- package/plugins/ragents.orchestration/web/ActorShortcut.tsx +6 -6
- package/plugins/ragents.orchestration/web/ActorSurfaceControls.tsx +15 -15
- package/plugins/ragents.orchestration/web/Center.tsx +5 -5
- package/plugins/ragents.orchestration/web/DocumentsSection.tsx +2 -2
- package/plugins/ragents.orchestration/web/ExecutionsPanel.tsx +15 -15
- package/plugins/ragents.orchestration/web/FlowInspector.tsx +103 -103
- package/plugins/ragents.orchestration/web/JournalStatus.tsx +11 -11
- package/plugins/ragents.orchestration/web/MaterialBody.tsx +2 -2
- package/plugins/ragents.orchestration/web/StopRunButton.tsx +6 -6
- package/plugins/ragents.orchestration/web/TiledSurface.tsx +9 -9
- package/plugins/ragents.orchestration/web/actor-header-settings.ts +5 -5
- package/plugins/ragents.orchestration/web/constants.ts +2 -2
- package/plugins/ragents.orchestration/web/executions.ts +6 -6
- package/plugins/ragents.orchestration/web/format.ts +1 -1
- package/plugins/ragents.orchestration/web/index.tsx +2 -2
- package/plugins/ragents.orchestration/web/run-panel/AddresseeControl.tsx +7 -7
- package/plugins/ragents.orchestration/web/run-panel/AddresseeTree.tsx +8 -8
- package/plugins/ragents.orchestration/web/run-panel/RunPanel.tsx +22 -22
- package/plugins/ragents.orchestration/web/run-panel/RunPanelSettings.tsx +7 -7
- package/plugins/ragents.orchestration/web/run-panel/addressee-tree.ts +13 -13
- package/plugins/ragents.orchestration/web/run-panel/run-panel-actors.ts +3 -3
- package/plugins/ragents.orchestration/web/run-panel/run-panel-settings.ts +2 -2
- package/plugins/ragents.orchestration/web/run-panel/run-panel-startup.ts +3 -3
- package/plugins/ragents.orchestration/web/run-panel/run-panel-state.ts +7 -7
- package/plugins/ragents.orchestration/web/run-panel/sheet-status.ts +9 -9
- package/plugins/ragents.orchestration/web/surface-startup.ts +8 -8
- package/plugins/ragents.orchestration/web/surface-view-settings.ts +1 -1
- package/plugins/ragents.orchestration/web/tiled-view-settings.ts +1 -1
- package/plugins/ragents.overseer/contract.ts +20 -20
- package/plugins/ragents.overseer/server/api.ts +6 -6
- package/plugins/ragents.overseer/server/coordinator-prompt.ts +10 -10
- package/plugins/ragents.overseer/server/coordinator.ts +4 -4
- package/plugins/ragents.overseer/server/index.ts +24 -24
- package/plugins/ragents.overseer/server/orientation.ts +8 -8
- package/plugins/ragents.overseer/server/quick-answer.ts +9 -9
- package/plugins/ragents.overseer/server/run-directory.ts +5 -5
- package/plugins/ragents.overseer/server/settings.ts +6 -6
- package/plugins/ragents.overseer/server/user-location.ts +16 -16
- package/plugins/ragents.overseer/web/ModelSettings.tsx +9 -9
- package/plugins/ragents.overseer/web/index.tsx +20 -20
- package/plugins/ragents.overseer/web/model-settings.ts +1 -1
- package/plugins/ragents.overseer/web/quick-answers.ts +2 -2
- package/plugins/ragents.processes/contract.ts +5 -5
- package/plugins/ragents.processes/server/methods.ts +4 -4
- package/plugins/ragents.processes/server/observer.ts +8 -8
- package/plugins/ragents.processes/server/run-processes.ts +2 -2
- package/plugins/ragents.processes/web/ProcessHeader.tsx +10 -10
- package/plugins/ragents.processes/web/processes.ts +10 -10
- package/plugins/ragents.product/server/config.ts +1 -1
- package/plugins/ragents.product/server/index.ts +4 -4
- package/plugins/ragents.product/server/runtime.ts +9 -10
- package/plugins/ragents.product/web/index.tsx +1 -1
- package/plugins/ragents.profile-distribution/contract.ts +10 -10
- package/plugins/ragents.profile-distribution/server/archive.ts +20 -20
- package/plugins/ragents.profile-distribution/server/config.ts +2 -2
- package/plugins/ragents.profile-distribution/server/index.ts +4 -4
- package/plugins/ragents.reference/examples.ts +27 -27
- package/plugins/ragents.reference/run-scripts/balcony-wizard/RUN.md +19 -19
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +2 -2
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +14 -14
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +2 -2
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +49 -49
- package/plugins/ragents.reference/run-scripts/balcony-wizard/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/balcony-wizard/src/server.ts +9 -9
- package/plugins/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +9 -9
- package/plugins/ragents.reference/run-scripts/conversation-circle/RUN.md +7 -7
- package/plugins/ragents.reference/run-scripts/conversation-circle/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/conversation-circle/src/server.ts +13 -13
- package/plugins/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +1 -1
- package/plugins/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +8 -8
- package/plugins/ragents.reference/run-scripts/learning-afternoon/RUN.md +16 -16
- package/plugins/ragents.reference/run-scripts/learning-afternoon/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +3 -3
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/server.ts +9 -9
- package/plugins/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +39 -39
- package/plugins/ragents.reference/run-scripts/moderated-round/RUN.md +7 -7
- package/plugins/ragents.reference/run-scripts/moderated-round/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/moderated-round/src/server.ts +9 -9
- package/plugins/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +1 -1
- package/plugins/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +6 -6
- package/plugins/ragents.reference/run-scripts/shared-actor-list/RUN.md +12 -12
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +2 -2
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +3 -3
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +4 -4
- package/plugins/ragents.reference/run-scripts/shared-actor-list/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/shared-actor-list/src/server.ts +11 -11
- package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +1 -1
- package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +13 -13
- package/plugins/ragents.reference/run-scripts/word-game/RUN.md +18 -18
- package/plugins/ragents.reference/run-scripts/word-game/package.json +2 -2
- package/plugins/ragents.reference/run-scripts/word-game/src/client.tsx +1 -1
- package/plugins/ragents.reference/run-scripts/word-game/src/contract.ts +2 -2
- package/plugins/ragents.reference/run-scripts/word-game/src/server.ts +16 -16
- package/plugins/ragents.reference/run-scripts/word-game/tests/program.test.ts +39 -39
- package/plugins/ragents.reference/skills/100-shared-actor-list/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/110-all-card-slots/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/150-editorial-workbench/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/160-learning-companion/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/170-photo-collection/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/180-decision-workbench/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/190-review-queue/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/20-circle-of-four/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/210-moderator-handover/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/220-actor-approval-list/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/230-shared-state-views/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/240-live-result-list/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/250-balcony-wizard/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/35-actor-input-fifo/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/40-subscription-matrix/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/50-subscription-removal/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/70-headless-counter/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/75-lsp-demo/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/80-actor-text-analysis/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/90-actor-notes/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/95-hello-world/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/decision-brief/SKILL.md +24 -24
- package/plugins/ragents.reference/skills/learning-sprint/SKILL.md +24 -24
- package/plugins/ragents.reference/walkthroughs.ts +128 -128
- package/plugins/ragents.reference/web/StartGuides.tsx +23 -23
- package/plugins/ragents.todo/server/todo-tool.ts +6 -6
- package/plugins/ragents.todo/web/TodoSection.tsx +1 -1
- package/plugins/ragents.transcript/server/transcript.ts +11 -11
- package/plugins/ragents.watch/server/condition.ts +4 -4
- package/plugins/ragents.watch/server/functions.ts +27 -27
- package/plugins/ragents.watch/server/observation.ts +2 -2
- package/plugins/ragents.watch/server/service.ts +14 -14
- package/plugins/ragents.workspace/client/transport.ts +1 -1
- package/plugins/ragents.workspace/client/workspace-client.ts +54 -54
- package/plugins/ragents.workspace/contract.ts +46 -46
- package/plugins/ragents.workspace/server/binding.ts +20 -20
- package/plugins/ragents.workspace/server/browse-route.ts +8 -8
- package/plugins/ragents.workspace/server/clients.ts +42 -42
- package/plugins/ragents.workspace/server/config.ts +7 -7
- package/plugins/ragents.workspace/server/index.ts +3 -3
- package/plugins/ragents.workspace/server/runtime.ts +26 -26
- package/plugins/ragents.workspace/server/shell-platform.ts +1 -1
- package/plugins/ragents.workspace/web/FileBrowser.tsx +10 -10
- package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +24 -24
- package/plugins/ragents.workspace/web/index.tsx +1 -1
- package/ragents.config.core.ts +1 -1
- package/ragents.config.developer.ts +3 -3
- package/ragents.config.showcase.ts +2 -2
- package/scripts/agent/agent-cli.ts +96 -96
- package/scripts/agent/journal.ts +5 -5
- package/scripts/agent/turn-control.ts +4 -4
- package/scripts/package/build-package.ts +29 -29
- package/scripts/package/host-links.mjs +3 -3
- package/scripts/package/publish-package.ts +29 -29
- package/scripts/package/ragents.mjs +19 -19
- package/scripts/plugin/build-builtin-plugins.ts +5 -5
- package/scripts/plugin/plugin-cli.ts +14 -14
- package/scripts/provision/run-provision.ts +14 -15
- package/scripts/remote/connect.ts +46 -46
- package/scripts/remote/start.ts +18 -18
- package/scripts/workspace-client/run-workspace-client.ts +23 -23
- package/apps/web/dist/assets/main-DnnqWHkH.js +0 -11
- package/apps/web/dist/assets/mermaid-HWGCJPDP-BLLeth5_.js +0 -568
- package/apps/web/dist/assets/runPanel-DPm7s3KM.js +0 -21
- package/bundles/ragents.ask/server/chunks/chunk-PDJO75SQ.js.map +0 -7
- package/bundles/ragents.ask/web/chunks/chunk-4VXWWEG7.js +0 -2
- package/bundles/ragents.ask/web/chunks/chunk-4VXWWEG7.js.map +0 -7
- package/bundles/ragents.ask/web/chunks/chunk-VUBJDIKQ.js +0 -2
- package/bundles/ragents.ask/web/chunks/chunk-VUBJDIKQ.js.map +0 -7
- package/bundles/ragents.ask/web/chunks/chunk-WFN4374U.js.map +0 -7
- package/bundles/ragents.orchestration/web/chunks/chunk-OQYCNYXN.js +0 -2
- /package/bundles/ragents.orchestration/web/chunks/{chunk-OSKPH6SZ.js.map → chunk-CFMJD5ZI.js.map} +0 -0
- /package/bundles/ragents.orchestration/web/chunks/{chunk-ODMMQGX2.js.map → chunk-UCIMT2R4.js.map} +0 -0
|
@@ -52,8 +52,8 @@
|
|
|
52
52
|
},
|
|
53
53
|
"web": {}
|
|
54
54
|
},
|
|
55
|
-
"stand": "
|
|
56
|
-
"sourceStand": "
|
|
55
|
+
"stand": "3e99cf5cb8921685ad83aa6aaf9657da4c648f9d68cb744988a73f227c342e1d",
|
|
56
|
+
"sourceStand": "fb91740c2ba401391492687dd52c06e2f6542bfaa990767757e2cd9d29ff98a6",
|
|
57
57
|
"server": "server/index.js",
|
|
58
58
|
"exports": {
|
|
59
59
|
"server": {},
|
|
@@ -12,25 +12,25 @@ import { defineOperation } from "@ragents/engine/src/rpc/contract";
|
|
|
12
12
|
var pluginEntry = Type.Object({
|
|
13
13
|
id: Type.String({ minLength: 1 }),
|
|
14
14
|
source: Type.Union([Type.Literal("host"), Type.Literal("archive")], {
|
|
15
|
-
description: "host:
|
|
15
|
+
description: "host: the client takes the built-in bundle of its host; archive: the bundle is in the archive"
|
|
16
16
|
})
|
|
17
17
|
}, { additionalProperties: false });
|
|
18
18
|
var description = Type.Object({
|
|
19
|
-
profile: Type.String({ minLength: 1, description: "
|
|
20
|
-
version: Type.String({ minLength: 64, maxLength: 64, description: "
|
|
21
|
-
hostApi: Type.Integer({ minimum: 1, description: "
|
|
22
|
-
hostVersion: Type.String({ minLength: 40, maxLength: 40, description: "Git
|
|
23
|
-
packageVersion: Type.String({ minLength: 1, description: "
|
|
24
|
-
file: Type.String({ minLength: 1, description: "
|
|
25
|
-
size: Type.Integer({ minimum: 0, description: "
|
|
26
|
-
archivePath: Type.String({ minLength: 1, description: "HTTP
|
|
19
|
+
profile: Type.String({ minLength: 1, description: "Profile name; the file is called ragents.config.<profile>.ts" }),
|
|
20
|
+
version: Type.String({ minLength: 64, maxLength: 64, description: "Version of the archive as SHA-256" }),
|
|
21
|
+
hostApi: Type.Integer({ minimum: 1, description: "Number of the host API the bundles in the archive are built against; the client's host must offer exactly this one" }),
|
|
22
|
+
hostVersion: Type.String({ minLength: 40, maxLength: 40, description: "Git commit of this server's host; a checkout with a different host API uses it to get a matching one" }),
|
|
23
|
+
packageVersion: Type.String({ minLength: 1, description: "Version of the npm package that carries this commit; an installation with a different host API uses it to get a matching one" }),
|
|
24
|
+
file: Type.String({ minLength: 1, description: "Path of the profile file inside the archive" }),
|
|
25
|
+
size: Type.Integer({ minimum: 0, description: "Archive size in bytes" }),
|
|
26
|
+
archivePath: Type.String({ minLength: 1, description: "HTTP path of the archive on this server" }),
|
|
27
27
|
plugins: Type.Array(pluginEntry)
|
|
28
28
|
}, { additionalProperties: false });
|
|
29
29
|
var profileArchivePath = (version) => `/profile/${version}.tar.gz`;
|
|
30
30
|
var profileDistributionContracts = {
|
|
31
31
|
describe: defineOperation({
|
|
32
32
|
id: "ragents.profile.describe",
|
|
33
|
-
description: "
|
|
33
|
+
description: "The client profile of this server: name, version, required host API, host and package version, plugins and archive. Right: profile.fetch.",
|
|
34
34
|
rights: ["profile.fetch"],
|
|
35
35
|
input: Type.Object({}, { additionalProperties: false }),
|
|
36
36
|
result: description
|
|
@@ -54,7 +54,7 @@ var commonRoot = (first, others) => {
|
|
|
54
54
|
for (const folder of others) {
|
|
55
55
|
while (folder !== root && !folder.startsWith(root + path.sep)) {
|
|
56
56
|
const parent = path.dirname(root);
|
|
57
|
-
if (parent === root) throw new Error(`
|
|
57
|
+
if (parent === root) throw new Error(`Profile file and plugin ${folder} have no common folder`);
|
|
58
58
|
root = parent;
|
|
59
59
|
}
|
|
60
60
|
}
|
|
@@ -64,36 +64,36 @@ var posixRelative = (root, target) => path.relative(root, target).split(path.sep
|
|
|
64
64
|
var placeholderEnvironment = new Proxy({}, { get: () => "client-placeholder-value" });
|
|
65
65
|
var checkSections = (source, raw, pluginIds) => {
|
|
66
66
|
for (const [section, value] of Object.entries(raw)) {
|
|
67
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`${source}:
|
|
68
|
-
if (section !== "host" && !pluginIds.has(section)) throw new Error(`${source}:
|
|
67
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`${source}: the section ${section} is not an object`);
|
|
68
|
+
if (section !== "host" && !pluginIds.has(section)) throw new Error(`${source}: the section ${section} belongs to no plugin from host.PLUGINS`);
|
|
69
69
|
for (const [key, entry] of Object.entries(value)) {
|
|
70
|
-
if (section === "host" && !hostConfigKeys.includes(key)) throw new Error(`${source}: host.${key}
|
|
70
|
+
if (section === "host" && !hostConfigKeys.includes(key)) throw new Error(`${source}: host.${key} is not a host key`);
|
|
71
71
|
if (isEnvironmentReference(entry) || isProvisionedReference(entry)) continue;
|
|
72
|
-
if (SECRET_KEY_PATTERN.test(key)) throw new Error(`${source}: ${section}.${key}
|
|
72
|
+
if (SECRET_KEY_PATTERN.test(key)) throw new Error(`${source}: ${section}.${key} is a secret and must be written as env("...")`);
|
|
73
73
|
const valid = typeof entry === "string" || typeof entry === "number" || typeof entry === "boolean" || Array.isArray(entry) && entry.every((item) => typeof item === "string") || Array.isArray(entry) && entry.every((item) => !!item && typeof item === "object" && !Array.isArray(item));
|
|
74
|
-
if (!valid) throw new Error(`${source}: ${section}.${key}
|
|
75
|
-
if (typeof entry === "string" && /^\$\{[A-Za-z_][A-Za-z0-9_]*\}$/.test(entry)) throw new Error(`${source}: ${section}.${key}
|
|
74
|
+
if (!valid) throw new Error(`${source}: ${section}.${key} has no valid value`);
|
|
75
|
+
if (typeof entry === "string" && /^\$\{[A-Za-z_][A-Za-z0-9_]*\}$/.test(entry)) throw new Error(`${source}: ${section}.${key} references the environment as text; use env("...")`);
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
};
|
|
79
79
|
var inspectClientProfile = async (source, root = bundlesRoot) => {
|
|
80
80
|
const name = PROFILE_FILE.exec(path.basename(source));
|
|
81
|
-
if (!name) throw new Error(`
|
|
82
|
-
if (!statSync(source, { throwIfNoEntry: false })?.isFile()) throw new Error(`
|
|
81
|
+
if (!name) throw new Error(`The client profile file must be called ragents.config.<profile>.ts: ${source}`);
|
|
82
|
+
if (!statSync(source, { throwIfNoEntry: false })?.isFile()) throw new Error(`The client profile file ${source} is missing`);
|
|
83
83
|
const profile = name[1];
|
|
84
84
|
const module = await import(pathToFileURL(source).href);
|
|
85
85
|
const raw = module.config;
|
|
86
|
-
if (!raw || typeof raw !== "object" || Array.isArray(raw)) throw new Error(`${source}
|
|
86
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) throw new Error(`${source} exports no constant config`);
|
|
87
87
|
const host = raw.host;
|
|
88
88
|
const entries = host?.PLUGINS;
|
|
89
89
|
if (!Array.isArray(entries) || entries.length === 0 || !entries.every((entry) => typeof entry === "string" && entry)) {
|
|
90
|
-
throw new Error(`${source}: host.PLUGINS
|
|
90
|
+
throw new Error(`${source}: host.PLUGINS must be a non-empty list`);
|
|
91
91
|
}
|
|
92
|
-
if (host?.PRODUCT_PROFILE !== profile) throw new Error(`${source}: host.PRODUCT_PROFILE
|
|
92
|
+
if (host?.PRODUCT_PROFILE !== profile) throw new Error(`${source}: host.PRODUCT_PROFILE must be ${profile}`);
|
|
93
93
|
const directory = path.dirname(source);
|
|
94
94
|
const unportable = entries.filter((entry) => isPluginPath(entry) && !/^\.{1,2}\//.test(entry));
|
|
95
95
|
if (unportable.length > 0) {
|
|
96
|
-
throw new Error(`${source}: ${unportable.join(", ")}
|
|
96
|
+
throw new Error(`${source}: ${unportable.join(", ")} names a bundle absolutely or with ~/; the client resolves this path on its own machine and would not find the delivered bundle there. In the client profile, name every bundle relative to the profile file (./ or ../)`);
|
|
97
97
|
}
|
|
98
98
|
const plugins = (() => {
|
|
99
99
|
try {
|
|
@@ -105,7 +105,7 @@ var inspectClientProfile = async (source, root = bundlesRoot) => {
|
|
|
105
105
|
checkSections(source, raw, /* @__PURE__ */ new Set([...discoverPluginIds(root), ...plugins.map((plugin2) => plugin2.id)]));
|
|
106
106
|
const users = resolveProfileUsers(source, module.users, placeholderEnvironment);
|
|
107
107
|
const anonymous = resolveAnonymousUser(source, module.anonymousUser);
|
|
108
|
-
if (users && anonymous) throw new Error(`${source}: users
|
|
108
|
+
if (users && anonymous) throw new Error(`${source}: users and anonymousUser exclude each other`);
|
|
109
109
|
const archived = plugins.filter((plugin2) => plugin2.source === "archive").map((plugin2) => plugin2.folder);
|
|
110
110
|
const commonDirectory = commonRoot(directory, archived);
|
|
111
111
|
return { profile, source, root: commonDirectory, file: posixRelative(commonDirectory, source), plugins };
|
|
@@ -114,7 +114,7 @@ var collectFiles = (folder, root) => {
|
|
|
114
114
|
const files = [];
|
|
115
115
|
for (const entry of readdirSync(folder, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name, "en"))) {
|
|
116
116
|
const absolute = path.join(folder, entry.name);
|
|
117
|
-
if (entry.isSymbolicLink()) throw new Error(`
|
|
117
|
+
if (entry.isSymbolicLink()) throw new Error(`The client profile contains a symbolic link that the archive does not represent: ${absolute}`);
|
|
118
118
|
if (entry.isDirectory()) {
|
|
119
119
|
files.push(...collectFiles(absolute, root));
|
|
120
120
|
} else if (entry.isFile()) {
|
|
@@ -126,7 +126,7 @@ var collectFiles = (folder, root) => {
|
|
|
126
126
|
var clientProfileEntries = (inspected) => {
|
|
127
127
|
const entries = [inspected.file, ...inspected.plugins.filter((plugin2) => plugin2.source === "archive").flatMap((plugin2) => collectFiles(plugin2.folder, inspected.root))];
|
|
128
128
|
for (const entry of entries) {
|
|
129
|
-
if (!lstatSync(path.join(inspected.root, entry)).isFile()) throw new Error(`
|
|
129
|
+
if (!lstatSync(path.join(inspected.root, entry)).isFile()) throw new Error(`The archive entry ${entry} is not a file`);
|
|
130
130
|
}
|
|
131
131
|
return entries;
|
|
132
132
|
};
|
|
@@ -159,7 +159,7 @@ var profileDistributionConfig = Object.freeze({
|
|
|
159
159
|
clientProfileFile: resolveClientProfileFile,
|
|
160
160
|
hostVersion: () => {
|
|
161
161
|
const value = env.optional("HOST_VERSION");
|
|
162
|
-
if (value !== void 0 && !/^[0-9a-f]{40}$/.test(value)) throw new Error(`HOST_VERSION
|
|
162
|
+
if (value !== void 0 && !/^[0-9a-f]{40}$/.test(value)) throw new Error(`HOST_VERSION must be a full Git commit, not "${value}"`);
|
|
163
163
|
return value;
|
|
164
164
|
}
|
|
165
165
|
});
|
|
@@ -175,7 +175,7 @@ var archiveRoute = (state) => ({
|
|
|
175
175
|
const current = state();
|
|
176
176
|
const version = archivePattern.exec(url.pathname)?.[1];
|
|
177
177
|
if (version !== current.description.version) {
|
|
178
|
-
writeJson(response, 404, { error: `
|
|
178
|
+
writeJson(response, 404, { error: `Version ${version} is no longer offered; the current one is ${current.description.version}` });
|
|
179
179
|
return;
|
|
180
180
|
}
|
|
181
181
|
response.writeHead(200, {
|
|
@@ -194,13 +194,13 @@ var profileDistributionPlugin = {
|
|
|
194
194
|
if (!file) {
|
|
195
195
|
host.lifecycle({
|
|
196
196
|
id: "ragents.profile-distribution",
|
|
197
|
-
initialize: () => console.log("
|
|
197
|
+
initialize: () => console.log("Profile distribution: CLIENT_PROFILE_FILE is not set, this server offers no client profile")
|
|
198
198
|
});
|
|
199
199
|
return;
|
|
200
200
|
}
|
|
201
201
|
let ready;
|
|
202
202
|
const state = () => {
|
|
203
|
-
if (!ready) throw new DomainError("profile-not-ready", "
|
|
203
|
+
if (!ready) throw new DomainError("profile-not-ready", "The client profile is not packed yet.", 503);
|
|
204
204
|
return ready;
|
|
205
205
|
};
|
|
206
206
|
host.lifecycle({
|
|
@@ -225,7 +225,7 @@ var profileDistributionPlugin = {
|
|
|
225
225
|
plugins: inspected.plugins.map((plugin2) => ({ id: plugin2.id, source: plugin2.source }))
|
|
226
226
|
}
|
|
227
227
|
};
|
|
228
|
-
console.log(`
|
|
228
|
+
console.log(`Profile distribution: ${inspected.profile} version ${packed.version.slice(0, 12)} (${packed.entries.length} files, ${packed.archive.byteLength} bytes, host API ${hostApi}, host ${hostVersion.slice(0, 12)}, package ${packageVersion})`);
|
|
229
229
|
}
|
|
230
230
|
});
|
|
231
231
|
host.methods(implement(profileDistributionContracts.describe, () => state().description));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../plugins/ragents.profile-distribution/server/index.ts", "../../../plugins/ragents.profile-distribution/contract.ts", "../../../plugins/ragents.profile-distribution/server/archive.ts", "../../../plugins/ragents.profile-distribution/server/config.ts"],
|
|
4
|
-
"sourcesContent": ["import { DomainError, implement, type HttpRouteContribution, type RAgentsPlugin } from \"@ragents/engine\";\nimport { readHostApiVersion, readHostVersion, readPackageVersion } from \"@ragents/host/host-version.js\";\nimport type { PluginModule } from \"@ragents/host/plugin-support/plugin-module.js\";\nimport { writeJson } from \"@ragents/host/plugin-support/http.js\";\nimport { profileArchivePath, profileDistributionContracts, type ClientProfileDescription } from \"../contract.js\";\nimport { inspectClientProfile, packClientProfile } from \"./archive.js\";\nimport { profileDistributionConfig, profileDistributionConfigDescriptors } from \"./config.js\";\n\ninterface DistributionState {\n readonly description: ClientProfileDescription;\n readonly archive: Buffer;\n}\n\nconst archivePattern = /^\\/profile\\/([0-9a-f]{64})\\.tar\\.gz$/;\n\nconst archiveRoute = (state: () => DistributionState): HttpRouteContribution => ({\n id: \"ragents.profile-distribution.archive\",\n isApiPath: (pathname) => pathname.startsWith(\"/profile/\"),\n matches: (request, url) => request.method === \"GET\" && archivePattern.test(url.pathname),\n requiredRights: [\"profile.fetch\"],\n handle: ({ response, url }) => {\n const current = state();\n const version = archivePattern.exec(url.pathname)?.[1];\n if (version !== current.description.version) {\n writeJson(response, 404, { error: `Der Stand ${version} wird nicht mehr angeboten; aktuell ist ${current.description.version}` });\n return;\n }\n response.writeHead(200, {\n \"Content-Type\": \"application/gzip\",\n \"Content-Length\": current.archive.byteLength,\n \"Cache-Control\": \"no-store\",\n });\n response.end(current.archive);\n },\n});\n\nconst profileDistributionPlugin: RAgentsPlugin = {\n manifest: { id: \"ragents.profile-distribution\" },\n register: (host) => {\n host.config(...profileDistributionConfigDescriptors);\n const file = profileDistributionConfig.clientProfileFile();\n if (!file) {\n host.lifecycle({\n id: \"ragents.profile-distribution\",\n initialize: () => console.log(\"Profilverteilung: CLIENT_PROFILE_FILE ist nicht gesetzt, dieser Server bietet kein Client-Profil an\"),\n });\n return;\n }\n let ready: DistributionState | undefined;\n const state = (): DistributionState => {\n if (!ready) throw new DomainError(\"profile-not-ready\", \"Das Client-Profil ist noch nicht gepackt.\", 503);\n return ready;\n };\n host.lifecycle({\n id: \"ragents.profile-distribution\",\n initialize: async () => {\n const hostVersion = profileDistributionConfig.hostVersion() ?? readHostVersion();\n const packageVersion = readPackageVersion();\n const hostApi = readHostApiVersion();\n const inspected = await inspectClientProfile(file);\n const packed = await packClientProfile(inspected);\n ready = {\n archive: packed.archive,\n description: {\n profile: inspected.profile,\n version: packed.version,\n hostApi,\n hostVersion,\n packageVersion,\n file: inspected.file,\n size: packed.archive.byteLength,\n archivePath: profileArchivePath(packed.version),\n plugins: inspected.plugins.map((plugin) => ({ id: plugin.id, source: plugin.source })),\n },\n };\n console.log(`Profilverteilung: ${inspected.profile} Stand ${packed.version.slice(0, 12)} (${packed.entries.length} Dateien, ${packed.archive.byteLength} Byte, Host-API ${hostApi}, Host ${hostVersion.slice(0, 12)}, Paket ${packageVersion})`);\n },\n });\n host.methods(implement(profileDistributionContracts.describe, () => state().description));\n host.http(archiveRoute(state));\n },\n};\n\nexport const plugin: PluginModule = {\n create: () => profileDistributionPlugin,\n};\n", "import { Type, type Static } from \"typebox\";\nimport { defineOperation } from \"@ragents/engine/src/rpc/contract\";\n\nconst pluginEntry = Type.Object({\n id: Type.String({ minLength: 1 }),\n source: Type.Union([Type.Literal(\"host\"), Type.Literal(\"archive\")], {\n description: \"host: der Client nimmt das eingebaute Bundle seines Hosts; archive: das Bundle liegt im Archiv\",\n }),\n}, { additionalProperties: false });\n\nconst description = Type.Object({\n profile: Type.String({ minLength: 1, description: \"Profilname; die Datei hei\u00DFt ragents.config.<profil>.ts\" }),\n version: Type.String({ minLength: 64, maxLength: 64, description: \"Stand des Archivs als SHA-256\" }),\n hostApi: Type.Integer({ minimum: 1, description: \"Nummer der Host-API, gegen die die Bundles im Archiv gebaut sind; der Host des Clients muss genau diese bieten\" }),\n hostVersion: Type.String({ minLength: 40, maxLength: 40, description: \"Git-Commit des Hosts dieses Servers; ein Checkout mit anderer Host-API kommt damit zu einer passenden\" }),\n packageVersion: Type.String({ minLength: 1, description: \"Fassung des npm-Pakets, die diesen Commit tr\u00E4gt; eine Installation mit anderer Host-API kommt damit zu einer passenden\" }),\n file: Type.String({ minLength: 1, description: \"Pfad der Profildatei innerhalb des Archivs\" }),\n size: Type.Integer({ minimum: 0, description: \"Archivgr\u00F6\u00DFe in Byte\" }),\n archivePath: Type.String({ minLength: 1, description: \"HTTP-Pfad des Archivs auf diesem Server\" }),\n plugins: Type.Array(pluginEntry),\n}, { additionalProperties: false });\n\nexport type ClientProfileDescription = Static<typeof description>;\n\nexport const profileArchivePath = (version: string): string => `/profile/${version}.tar.gz`;\n\nexport const profileDistributionContracts = {\n describe: defineOperation({\n id: \"ragents.profile.describe\",\n description: \"Das Client-Profil dieses Servers: Name, Stand, verlangte Host-API, Host- und Paketfassung, Plugins und Archiv. Recht: profile.fetch.\",\n rights: [\"profile.fetch\"],\n input: Type.Object({}, { additionalProperties: false }),\n result: description,\n }),\n};\n", "import { createHash } from \"node:crypto\";\nimport { readdirSync, statSync, lstatSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { create as createTar } from \"tar\";\nimport { hostConfigKeys } from \"@ragents/host/config.js\";\nimport { isEnvironmentReference, isProvisionedReference } from \"@ragents/host/config-definition.js\";\nimport { resolveAnonymousUser, resolveProfileUsers, SECRET_KEY_PATTERN } from \"@ragents/host/config-file.js\";\nimport { discoverPluginIds, resolvePluginEntries, type ResolvedPlugin } from \"@ragents/host/profile/plugin-discovery.js\";\nimport { bundlesRoot, isPluginPath } from \"@ragents/host/plugin-support/plugins-root.js\";\n\nexport interface ClientProfilePlugin extends ResolvedPlugin {\n readonly source: \"host\" | \"archive\";\n}\n\nexport interface InspectedClientProfile {\n readonly profile: string;\n readonly source: string;\n readonly root: string;\n readonly file: string;\n readonly plugins: readonly ClientProfilePlugin[];\n}\n\nexport interface PackedClientProfile {\n readonly archive: Buffer;\n readonly version: string;\n readonly entries: readonly string[];\n}\n\nconst PROFILE_FILE = /^ragents\\.config\\.([a-z0-9]+(?:-[a-z0-9]+)*)\\.ts$/;\n\nconst commonRoot = (first: string, others: readonly string[]): string => {\n let root = first;\n for (const folder of others) {\n while (folder !== root && !folder.startsWith(root + path.sep)) {\n const parent = path.dirname(root);\n if (parent === root) throw new Error(`Profildatei und Plugin ${folder} haben keinen gemeinsamen Ordner`);\n root = parent;\n }\n }\n return root;\n};\n\nconst posixRelative = (root: string, target: string): string => path.relative(root, target).split(path.sep).join(\"/\");\n\n// Jeder Name ist frei, damit ein Passwort- oder Token-Verweis auch ohne die Client-Umgebung pr\u00FCfbar ist.\nconst placeholderEnvironment: Readonly<Record<string, string | undefined>> = new Proxy({}, { get: () => \"client-placeholder-value\" });\n\nconst checkSections = (source: string, raw: Record<string, unknown>, pluginIds: ReadonlySet<string>): void => {\n for (const [section, value] of Object.entries(raw)) {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(`${source}: die Sektion ${section} ist kein Objekt`);\n if (section !== \"host\" && !pluginIds.has(section)) throw new Error(`${source}: die Sektion ${section} geh\u00F6rt zu keinem Plugin aus host.PLUGINS`);\n for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n if (section === \"host\" && !hostConfigKeys.includes(key)) throw new Error(`${source}: host.${key} ist kein Host-Schl\u00FCssel`);\n if (isEnvironmentReference(entry) || isProvisionedReference(entry)) continue;\n if (SECRET_KEY_PATTERN.test(key)) throw new Error(`${source}: ${section}.${key} ist ein Secret und muss als env(\"...\") stehen`);\n const valid = typeof entry === \"string\" || typeof entry === \"number\" || typeof entry === \"boolean\"\n || (Array.isArray(entry) && entry.every((item) => typeof item === \"string\"))\n || (Array.isArray(entry) && entry.every((item) => !!item && typeof item === \"object\" && !Array.isArray(item)));\n if (!valid) throw new Error(`${source}: ${section}.${key} hat keinen g\u00FCltigen Wert`);\n if (typeof entry === \"string\" && /^\\$\\{[A-Za-z_][A-Za-z0-9_]*\\}$/.test(entry)) throw new Error(`${source}: ${section}.${key} verweist als Text auf die Umgebung; env(\"...\") verwenden`);\n }\n }\n};\n\n/** Pr\u00FCft die Client-Profildatei ohne ihre Umgebung und bestimmt, welche Plugins ins Archiv geh\u00F6ren. */\nexport const inspectClientProfile = async (source: string, root = bundlesRoot): Promise<InspectedClientProfile> => {\n const name = PROFILE_FILE.exec(path.basename(source));\n if (!name) throw new Error(`Die Client-Profildatei muss ragents.config.<profil>.ts hei\u00DFen: ${source}`);\n if (!statSync(source, { throwIfNoEntry: false })?.isFile()) throw new Error(`Die Client-Profildatei ${source} fehlt`);\n const profile = name[1]!;\n const module = await import(pathToFileURL(source).href) as Record<string, unknown>;\n const raw = module.config;\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) throw new Error(`${source} exportiert keine Konstante config`);\n const host = (raw as Record<string, unknown>).host as Record<string, unknown> | undefined;\n const entries = host?.PLUGINS;\n if (!Array.isArray(entries) || entries.length === 0 || !entries.every((entry) => typeof entry === \"string\" && entry)) {\n throw new Error(`${source}: host.PLUGINS muss eine nicht leere Liste sein`);\n }\n if (host?.PRODUCT_PROFILE !== profile) throw new Error(`${source}: host.PRODUCT_PROFILE muss ${profile} sein`);\n const directory = path.dirname(source);\n const unportable = (entries as string[]).filter((entry) => isPluginPath(entry) && !/^\\.{1,2}\\//.test(entry));\n if (unportable.length > 0) {\n throw new Error(`${source}: ${unportable.join(\", \")} nennt ein Bundle absolut oder mit ~/; der Client l\u00F6st diesen Pfad auf seinem eigenen Rechner auf und f\u00E4nde dort nicht das gelieferte Bundle. Im Client-Profil jedes Bundle relativ zur Profildatei nennen (./ oder ../)`);\n }\n const plugins = ((): readonly ClientProfilePlugin[] => {\n try {\n return resolvePluginEntries(entries as string[], directory, root)\n .map((plugin, index) => ({ ...plugin, source: isPluginPath((entries as string[])[index]!) ? \"archive\" : \"host\" }));\n } catch (cause) {\n throw new Error(`${source}: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });\n }\n })();\n checkSections(source, raw as Record<string, unknown>, new Set([...discoverPluginIds(root), ...plugins.map((plugin) => plugin.id)]));\n const users = resolveProfileUsers(source, module.users, placeholderEnvironment);\n const anonymous = resolveAnonymousUser(source, module.anonymousUser);\n if (users && anonymous) throw new Error(`${source}: users und anonymousUser schlie\u00DFen einander aus`);\n const archived = plugins.filter((plugin) => plugin.source === \"archive\").map((plugin) => plugin.folder);\n const commonDirectory = commonRoot(directory, archived);\n return { profile, source, root: commonDirectory, file: posixRelative(commonDirectory, source), plugins };\n};\n\nconst collectFiles = (folder: string, root: string): string[] => {\n const files: string[] = [];\n for (const entry of readdirSync(folder, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name, \"en\"))) {\n const absolute = path.join(folder, entry.name);\n if (entry.isSymbolicLink()) throw new Error(`Das Client-Profil enth\u00E4lt einen symbolischen Link, den das Archiv nicht abbildet: ${absolute}`);\n if (entry.isDirectory()) {\n files.push(...collectFiles(absolute, root));\n } else if (entry.isFile()) {\n files.push(posixRelative(root, absolute));\n }\n }\n return files;\n};\n\n/** Die Eintr\u00E4ge des Archivs: die Profildatei und die Dateien der Bundles, die sie per Pfad nennt; das Web hat der Client selbst. */\nexport const clientProfileEntries = (inspected: InspectedClientProfile): readonly string[] => {\n const entries = [inspected.file, ...inspected.plugins.filter((plugin) => plugin.source === \"archive\").flatMap((plugin) => collectFiles(plugin.folder, inspected.root))];\n for (const entry of entries) {\n if (!lstatSync(path.join(inspected.root, entry)).isFile()) throw new Error(`Der Archiveintrag ${entry} ist keine Datei`);\n }\n return entries;\n};\n\n/** Packt die Eintr\u00E4ge deterministisch aus ihrem gemeinsamen Ordner; der Stand ist der SHA-256 des Archivs. */\nexport const packClientProfile = async (inspected: InspectedClientProfile): Promise<PackedClientProfile> => {\n const entries = clientProfileEntries(inspected);\n const chunks: Buffer[] = [];\n for await (const chunk of createTar({ gzip: { level: 9 }, cwd: inspected.root, portable: true, noMtime: true }, [...entries])) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const archive = Buffer.concat(chunks);\n return { archive, version: createHash(\"sha256\").update(archive).digest(\"hex\"), entries };\n};\n", "import path from \"node:path\";\nimport { configFilePath } from \"@ragents/host/config-file.js\";\nimport { declaredEnvironment } from \"@ragents/host/plugin-support/plugin-config.js\";\n\nexport const profileDistributionConfigDescriptors = [\n { key: \"CLIENT_PROFILE_FILE\", source: \"environment\" },\n { key: \"HOST_VERSION\", source: \"environment\" },\n] as const;\n\nconst env = declaredEnvironment(profileDistributionConfigDescriptors);\n\n/** Der Pfad gilt relativ zur Server-Profildatei, damit beide Dateien nebeneinander liegen k\u00F6nnen. */\nconst resolveClientProfileFile = (): string | undefined => {\n const value = env.optional(\"CLIENT_PROFILE_FILE\");\n if (!value) return undefined;\n const profile = configFilePath();\n return path.resolve(profile ? path.dirname(profile) : process.cwd(), value);\n};\n\nexport const profileDistributionConfig = Object.freeze({\n clientProfileFile: resolveClientProfileFile,\n hostVersion: () => {\n const value = env.optional(\"HOST_VERSION\");\n if (value !== undefined && !/^[0-9a-f]{40}$/.test(value)) throw new Error(`HOST_VERSION muss ein vollst\u00E4ndiger Git-Commit sein, nicht \"${value}\"`);\n return value;\n },\n});\n"],
|
|
5
|
-
"mappings": ";;;;AAAA,SAAS,aAAa,iBAAiE;AACvF,SAAS,oBAAoB,iBAAiB,0BAA0B;AAExE,SAAS,iBAAiB;;;ACH1B,SAAS,YAAyB;AAClC,SAAS,uBAAuB;AAEhC,IAAM,cAAc,KAAK,OAAO;AAAA,EAC9B,IAAI,KAAK,OAAO,EAAE,WAAW,EAAE,CAAC;AAAA,EAChC,QAAQ,KAAK,MAAM,CAAC,KAAK,QAAQ,MAAM,GAAG,KAAK,QAAQ,SAAS,CAAC,GAAG;AAAA,IAClE,aAAa;AAAA,EACf,CAAC;AACH,GAAG,EAAE,sBAAsB,MAAM,CAAC;AAElC,IAAM,cAAc,KAAK,OAAO;AAAA,EAC9B,SAAS,KAAK,OAAO,EAAE,WAAW,GAAG,aAAa,
|
|
4
|
+
"sourcesContent": ["import { DomainError, implement, type HttpRouteContribution, type RAgentsPlugin } from \"@ragents/engine\";\nimport { readHostApiVersion, readHostVersion, readPackageVersion } from \"@ragents/host/host-version.js\";\nimport type { PluginModule } from \"@ragents/host/plugin-support/plugin-module.js\";\nimport { writeJson } from \"@ragents/host/plugin-support/http.js\";\nimport { profileArchivePath, profileDistributionContracts, type ClientProfileDescription } from \"../contract.js\";\nimport { inspectClientProfile, packClientProfile } from \"./archive.js\";\nimport { profileDistributionConfig, profileDistributionConfigDescriptors } from \"./config.js\";\n\ninterface DistributionState {\n readonly description: ClientProfileDescription;\n readonly archive: Buffer;\n}\n\nconst archivePattern = /^\\/profile\\/([0-9a-f]{64})\\.tar\\.gz$/;\n\nconst archiveRoute = (state: () => DistributionState): HttpRouteContribution => ({\n id: \"ragents.profile-distribution.archive\",\n isApiPath: (pathname) => pathname.startsWith(\"/profile/\"),\n matches: (request, url) => request.method === \"GET\" && archivePattern.test(url.pathname),\n requiredRights: [\"profile.fetch\"],\n handle: ({ response, url }) => {\n const current = state();\n const version = archivePattern.exec(url.pathname)?.[1];\n if (version !== current.description.version) {\n writeJson(response, 404, { error: `Version ${version} is no longer offered; the current one is ${current.description.version}` });\n return;\n }\n response.writeHead(200, {\n \"Content-Type\": \"application/gzip\",\n \"Content-Length\": current.archive.byteLength,\n \"Cache-Control\": \"no-store\",\n });\n response.end(current.archive);\n },\n});\n\nconst profileDistributionPlugin: RAgentsPlugin = {\n manifest: { id: \"ragents.profile-distribution\" },\n register: (host) => {\n host.config(...profileDistributionConfigDescriptors);\n const file = profileDistributionConfig.clientProfileFile();\n if (!file) {\n host.lifecycle({\n id: \"ragents.profile-distribution\",\n initialize: () => console.log(\"Profile distribution: CLIENT_PROFILE_FILE is not set, this server offers no client profile\"),\n });\n return;\n }\n let ready: DistributionState | undefined;\n const state = (): DistributionState => {\n if (!ready) throw new DomainError(\"profile-not-ready\", \"The client profile is not packed yet.\", 503);\n return ready;\n };\n host.lifecycle({\n id: \"ragents.profile-distribution\",\n initialize: async () => {\n const hostVersion = profileDistributionConfig.hostVersion() ?? readHostVersion();\n const packageVersion = readPackageVersion();\n const hostApi = readHostApiVersion();\n const inspected = await inspectClientProfile(file);\n const packed = await packClientProfile(inspected);\n ready = {\n archive: packed.archive,\n description: {\n profile: inspected.profile,\n version: packed.version,\n hostApi,\n hostVersion,\n packageVersion,\n file: inspected.file,\n size: packed.archive.byteLength,\n archivePath: profileArchivePath(packed.version),\n plugins: inspected.plugins.map((plugin) => ({ id: plugin.id, source: plugin.source })),\n },\n };\n console.log(`Profile distribution: ${inspected.profile} version ${packed.version.slice(0, 12)} (${packed.entries.length} files, ${packed.archive.byteLength} bytes, host API ${hostApi}, host ${hostVersion.slice(0, 12)}, package ${packageVersion})`);\n },\n });\n host.methods(implement(profileDistributionContracts.describe, () => state().description));\n host.http(archiveRoute(state));\n },\n};\n\nexport const plugin: PluginModule = {\n create: () => profileDistributionPlugin,\n};\n", "import { Type, type Static } from \"typebox\";\nimport { defineOperation } from \"@ragents/engine/src/rpc/contract\";\n\nconst pluginEntry = Type.Object({\n id: Type.String({ minLength: 1 }),\n source: Type.Union([Type.Literal(\"host\"), Type.Literal(\"archive\")], {\n description: \"host: the client takes the built-in bundle of its host; archive: the bundle is in the archive\",\n }),\n}, { additionalProperties: false });\n\nconst description = Type.Object({\n profile: Type.String({ minLength: 1, description: \"Profile name; the file is called ragents.config.<profile>.ts\" }),\n version: Type.String({ minLength: 64, maxLength: 64, description: \"Version of the archive as SHA-256\" }),\n hostApi: Type.Integer({ minimum: 1, description: \"Number of the host API the bundles in the archive are built against; the client's host must offer exactly this one\" }),\n hostVersion: Type.String({ minLength: 40, maxLength: 40, description: \"Git commit of this server's host; a checkout with a different host API uses it to get a matching one\" }),\n packageVersion: Type.String({ minLength: 1, description: \"Version of the npm package that carries this commit; an installation with a different host API uses it to get a matching one\" }),\n file: Type.String({ minLength: 1, description: \"Path of the profile file inside the archive\" }),\n size: Type.Integer({ minimum: 0, description: \"Archive size in bytes\" }),\n archivePath: Type.String({ minLength: 1, description: \"HTTP path of the archive on this server\" }),\n plugins: Type.Array(pluginEntry),\n}, { additionalProperties: false });\n\nexport type ClientProfileDescription = Static<typeof description>;\n\nexport const profileArchivePath = (version: string): string => `/profile/${version}.tar.gz`;\n\nexport const profileDistributionContracts = {\n describe: defineOperation({\n id: \"ragents.profile.describe\",\n description: \"The client profile of this server: name, version, required host API, host and package version, plugins and archive. Right: profile.fetch.\",\n rights: [\"profile.fetch\"],\n input: Type.Object({}, { additionalProperties: false }),\n result: description,\n }),\n};\n", "import { createHash } from \"node:crypto\";\nimport { readdirSync, statSync, lstatSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { create as createTar } from \"tar\";\nimport { hostConfigKeys } from \"@ragents/host/config.js\";\nimport { isEnvironmentReference, isProvisionedReference } from \"@ragents/host/config-definition.js\";\nimport { resolveAnonymousUser, resolveProfileUsers, SECRET_KEY_PATTERN } from \"@ragents/host/config-file.js\";\nimport { discoverPluginIds, resolvePluginEntries, type ResolvedPlugin } from \"@ragents/host/profile/plugin-discovery.js\";\nimport { bundlesRoot, isPluginPath } from \"@ragents/host/plugin-support/plugins-root.js\";\n\nexport interface ClientProfilePlugin extends ResolvedPlugin {\n readonly source: \"host\" | \"archive\";\n}\n\nexport interface InspectedClientProfile {\n readonly profile: string;\n readonly source: string;\n readonly root: string;\n readonly file: string;\n readonly plugins: readonly ClientProfilePlugin[];\n}\n\nexport interface PackedClientProfile {\n readonly archive: Buffer;\n readonly version: string;\n readonly entries: readonly string[];\n}\n\nconst PROFILE_FILE = /^ragents\\.config\\.([a-z0-9]+(?:-[a-z0-9]+)*)\\.ts$/;\n\nconst commonRoot = (first: string, others: readonly string[]): string => {\n let root = first;\n for (const folder of others) {\n while (folder !== root && !folder.startsWith(root + path.sep)) {\n const parent = path.dirname(root);\n if (parent === root) throw new Error(`Profile file and plugin ${folder} have no common folder`);\n root = parent;\n }\n }\n return root;\n};\n\nconst posixRelative = (root: string, target: string): string => path.relative(root, target).split(path.sep).join(\"/\");\n\n// Every name is set so a password or token reference can be checked even without the client environment.\nconst placeholderEnvironment: Readonly<Record<string, string | undefined>> = new Proxy({}, { get: () => \"client-placeholder-value\" });\n\nconst checkSections = (source: string, raw: Record<string, unknown>, pluginIds: ReadonlySet<string>): void => {\n for (const [section, value] of Object.entries(raw)) {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(`${source}: the section ${section} is not an object`);\n if (section !== \"host\" && !pluginIds.has(section)) throw new Error(`${source}: the section ${section} belongs to no plugin from host.PLUGINS`);\n for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n if (section === \"host\" && !hostConfigKeys.includes(key)) throw new Error(`${source}: host.${key} is not a host key`);\n if (isEnvironmentReference(entry) || isProvisionedReference(entry)) continue;\n if (SECRET_KEY_PATTERN.test(key)) throw new Error(`${source}: ${section}.${key} is a secret and must be written as env(\"...\")`);\n const valid = typeof entry === \"string\" || typeof entry === \"number\" || typeof entry === \"boolean\"\n || (Array.isArray(entry) && entry.every((item) => typeof item === \"string\"))\n || (Array.isArray(entry) && entry.every((item) => !!item && typeof item === \"object\" && !Array.isArray(item)));\n if (!valid) throw new Error(`${source}: ${section}.${key} has no valid value`);\n if (typeof entry === \"string\" && /^\\$\\{[A-Za-z_][A-Za-z0-9_]*\\}$/.test(entry)) throw new Error(`${source}: ${section}.${key} references the environment as text; use env(\"...\")`);\n }\n }\n};\n\n/** Checks the client profile file without its environment and determines which plugins belong in the archive. */\nexport const inspectClientProfile = async (source: string, root = bundlesRoot): Promise<InspectedClientProfile> => {\n const name = PROFILE_FILE.exec(path.basename(source));\n if (!name) throw new Error(`The client profile file must be called ragents.config.<profile>.ts: ${source}`);\n if (!statSync(source, { throwIfNoEntry: false })?.isFile()) throw new Error(`The client profile file ${source} is missing`);\n const profile = name[1]!;\n const module = await import(pathToFileURL(source).href) as Record<string, unknown>;\n const raw = module.config;\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) throw new Error(`${source} exports no constant config`);\n const host = (raw as Record<string, unknown>).host as Record<string, unknown> | undefined;\n const entries = host?.PLUGINS;\n if (!Array.isArray(entries) || entries.length === 0 || !entries.every((entry) => typeof entry === \"string\" && entry)) {\n throw new Error(`${source}: host.PLUGINS must be a non-empty list`);\n }\n if (host?.PRODUCT_PROFILE !== profile) throw new Error(`${source}: host.PRODUCT_PROFILE must be ${profile}`);\n const directory = path.dirname(source);\n const unportable = (entries as string[]).filter((entry) => isPluginPath(entry) && !/^\\.{1,2}\\//.test(entry));\n if (unportable.length > 0) {\n throw new Error(`${source}: ${unportable.join(\", \")} names a bundle absolutely or with ~/; the client resolves this path on its own machine and would not find the delivered bundle there. In the client profile, name every bundle relative to the profile file (./ or ../)`);\n }\n const plugins = ((): readonly ClientProfilePlugin[] => {\n try {\n return resolvePluginEntries(entries as string[], directory, root)\n .map((plugin, index) => ({ ...plugin, source: isPluginPath((entries as string[])[index]!) ? \"archive\" : \"host\" }));\n } catch (cause) {\n throw new Error(`${source}: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });\n }\n })();\n checkSections(source, raw as Record<string, unknown>, new Set([...discoverPluginIds(root), ...plugins.map((plugin) => plugin.id)]));\n const users = resolveProfileUsers(source, module.users, placeholderEnvironment);\n const anonymous = resolveAnonymousUser(source, module.anonymousUser);\n if (users && anonymous) throw new Error(`${source}: users and anonymousUser exclude each other`);\n const archived = plugins.filter((plugin) => plugin.source === \"archive\").map((plugin) => plugin.folder);\n const commonDirectory = commonRoot(directory, archived);\n return { profile, source, root: commonDirectory, file: posixRelative(commonDirectory, source), plugins };\n};\n\nconst collectFiles = (folder: string, root: string): string[] => {\n const files: string[] = [];\n for (const entry of readdirSync(folder, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name, \"en\"))) {\n const absolute = path.join(folder, entry.name);\n if (entry.isSymbolicLink()) throw new Error(`The client profile contains a symbolic link that the archive does not represent: ${absolute}`);\n if (entry.isDirectory()) {\n files.push(...collectFiles(absolute, root));\n } else if (entry.isFile()) {\n files.push(posixRelative(root, absolute));\n }\n }\n return files;\n};\n\n/** The archive entries: the profile file and the files of the bundles it names by path; the client has the web itself. */\nexport const clientProfileEntries = (inspected: InspectedClientProfile): readonly string[] => {\n const entries = [inspected.file, ...inspected.plugins.filter((plugin) => plugin.source === \"archive\").flatMap((plugin) => collectFiles(plugin.folder, inspected.root))];\n for (const entry of entries) {\n if (!lstatSync(path.join(inspected.root, entry)).isFile()) throw new Error(`The archive entry ${entry} is not a file`);\n }\n return entries;\n};\n\n/** Packs the entries deterministically from their common folder; the version is the SHA-256 of the archive. */\nexport const packClientProfile = async (inspected: InspectedClientProfile): Promise<PackedClientProfile> => {\n const entries = clientProfileEntries(inspected);\n const chunks: Buffer[] = [];\n for await (const chunk of createTar({ gzip: { level: 9 }, cwd: inspected.root, portable: true, noMtime: true }, [...entries])) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const archive = Buffer.concat(chunks);\n return { archive, version: createHash(\"sha256\").update(archive).digest(\"hex\"), entries };\n};\n", "import path from \"node:path\";\nimport { configFilePath } from \"@ragents/host/config-file.js\";\nimport { declaredEnvironment } from \"@ragents/host/plugin-support/plugin-config.js\";\n\nexport const profileDistributionConfigDescriptors = [\n { key: \"CLIENT_PROFILE_FILE\", source: \"environment\" },\n { key: \"HOST_VERSION\", source: \"environment\" },\n] as const;\n\nconst env = declaredEnvironment(profileDistributionConfigDescriptors);\n\n/** The path is relative to the server profile file so both files can sit next to each other. */\nconst resolveClientProfileFile = (): string | undefined => {\n const value = env.optional(\"CLIENT_PROFILE_FILE\");\n if (!value) return undefined;\n const profile = configFilePath();\n return path.resolve(profile ? path.dirname(profile) : process.cwd(), value);\n};\n\nexport const profileDistributionConfig = Object.freeze({\n clientProfileFile: resolveClientProfileFile,\n hostVersion: () => {\n const value = env.optional(\"HOST_VERSION\");\n if (value !== undefined && !/^[0-9a-f]{40}$/.test(value)) throw new Error(`HOST_VERSION must be a full Git commit, not \"${value}\"`);\n return value;\n },\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["plugin", "path", "plugin"]
|
|
7
7
|
}
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
]
|
|
21
21
|
}
|
|
22
22
|
},
|
|
23
|
-
"stand": "
|
|
24
|
-
"sourceStand": "
|
|
23
|
+
"stand": "809c8770905fa2a4d557425abf27aee27a863aec8a80655b96e40bd82307f493",
|
|
24
|
+
"sourceStand": "f28ffeea9d423e150a95c58ccdbf2e52679d820e7bc39f13fe400fa3e6f86b72",
|
|
25
25
|
"server": "server/index.js",
|
|
26
26
|
"web": {
|
|
27
27
|
"entry": "web/index.js",
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
---
|
|
2
|
-
title:
|
|
3
|
-
description: "
|
|
2
|
+
title: Set up balcony wizard
|
|
3
|
+
description: "A prepared AI interview shows adaptive questions in a mini-app of its own. The advisor is the primary actor from the start; the form counts five answers."
|
|
4
4
|
order: 140
|
|
5
5
|
coordinator: false
|
|
6
|
-
tags: Run
|
|
6
|
+
tags: Run scripts, Use case, Concept demo, Mini-apps, LLM actor with view, Controlled chat, Primary actor
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
The TypeScript setup creates a balcony advisor with the role `standard` and explicitly
|
|
10
|
+
without tools. The bundled program `actors/balcony-app/` binds a standalone mini-app to
|
|
11
|
+
this actor. The surface shows only its tile instead of a chat tile; no coordinator
|
|
12
|
+
is created for this run. The advisor becomes the primary actor and keeps its own
|
|
13
|
+
interview prompt.
|
|
14
14
|
|
|
15
|
-
In
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
In the app, "Start consultation" begins the conversation. The LLM asks one question at a time
|
|
16
|
+
based on the previous answers, without a fixed list of questions. The app counts five answers and
|
|
17
|
+
then shows the recommendation on style, plants, furniture, care, and next steps. The user writes
|
|
18
|
+
into a form, not into a chat widget. Progress and completed answers can be reconstructed from the
|
|
19
|
+
conversation after a reload; a failed model answer can be requested again without counting
|
|
20
|
+
another answer.
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
The template needs no start values. The setup runs once and does not start a model call yet.
|
|
23
|
+
Only an action in the app sends text to the advisor. Questions and recommendations
|
|
24
|
+
remain model answers; the app does not check their subject-matter quality automatically.
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
This is a prepared demo to start directly. The separate skill "Balcony wizard"
|
|
27
|
+
still asks the run builder to build an app for this task itself.
|
package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
"private": true,
|
|
4
4
|
"type": "module",
|
|
5
5
|
"ragents": {
|
|
6
|
-
"title": "
|
|
7
|
-
"description": "
|
|
6
|
+
"title": "Balcony advice",
|
|
7
|
+
"description": "Five questions and a personal design recommendation in a mini-app of its own.",
|
|
8
8
|
"views": [{ "id": "main", "client": "src/client.tsx" }]
|
|
9
9
|
}
|
|
10
10
|
}
|
package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx
CHANGED
|
@@ -41,34 +41,34 @@ function App() {
|
|
|
41
41
|
const evaluating = conversation.answers === answerCount || sender.finalAnswer;
|
|
42
42
|
const disabled = Boolean(snapshot?.readOnly || snapshot?.running || pending);
|
|
43
43
|
|
|
44
|
-
return <UI.AppLayout title="
|
|
44
|
+
return <UI.AppLayout title="Your balcony" description="Five questions about your balcony. They lead to a personal design recommendation.">
|
|
45
45
|
<UI.Stack gap="large">
|
|
46
46
|
<UI.Stack gap="small">
|
|
47
|
-
<label htmlFor="interview-progress">{conversation.answers}
|
|
47
|
+
<label htmlFor="interview-progress">{conversation.answers} of {answerCount} answers</label>
|
|
48
48
|
<progress className="h-2.5 w-full [accent-color:var(--foreground)]" id="interview-progress" max={answerCount} value={conversation.answers} />
|
|
49
49
|
</UI.Stack>
|
|
50
|
-
{snapshot?.readOnly && <p>
|
|
50
|
+
{snapshot?.readOnly && <p>This run is read-only.</p>}
|
|
51
51
|
{(sendError || conversation.error) && <p role="alert">{sendError || conversation.error}</p>}
|
|
52
52
|
{conversation.phase === "start" && !pending && <UI.Stack>
|
|
53
|
-
<p>
|
|
54
|
-
<UI.Stack direction="row"><UI.Button disabled={disabled} onClick={() => void send(startMarker)}>
|
|
53
|
+
<p>You always answer only one question. Your previous answers are kept when you open this again.</p>
|
|
54
|
+
<UI.Stack direction="row"><UI.Button disabled={disabled} onClick={() => void send(startMarker)}>Start consultation</UI.Button></UI.Stack>
|
|
55
55
|
</UI.Stack>}
|
|
56
|
-
{waiting && <p role="status">{evaluating ? "
|
|
56
|
+
{waiting && <p role="status">{evaluating ? "Your answers are being evaluated. The recommendation is being created ..." : "Your next question is being created ..."}</p>}
|
|
57
57
|
{conversation.canRetry && <UI.Stack>
|
|
58
|
-
<p>
|
|
59
|
-
<UI.Stack direction="row"><UI.Button disabled={disabled} onClick={() => void send(retryMarker)} variant="outline">
|
|
58
|
+
<p>The next model answer could not be shown. The answers you already sent are kept.</p>
|
|
59
|
+
<UI.Stack direction="row"><UI.Button disabled={disabled} onClick={() => void send(retryMarker)} variant="outline">Request model answer again</UI.Button></UI.Stack>
|
|
60
60
|
</UI.Stack>}
|
|
61
61
|
{conversation.phase === "question" && !pending && <UI.Stack>
|
|
62
|
-
<h2>
|
|
62
|
+
<h2>Question {conversation.answers + 1} of {answerCount}</h2>
|
|
63
63
|
<UI.Markdown text={conversation.text} />
|
|
64
|
-
<UI.Form title="
|
|
65
|
-
{ id: "answer", label: "
|
|
64
|
+
<UI.Form title="Your answer" fields={[
|
|
65
|
+
{ id: "answer", label: "Answer", type: "textarea", rows: 4, required: true, placeholder: "Describe your balcony and your wishes ..." },
|
|
66
66
|
]} values={values} onChange={setValues} disabled={disabled} onSubmit={async (next) => {
|
|
67
67
|
await send(answerInput(conversation.answers, String(next.answer ?? "")));
|
|
68
|
-
}} submitLabel={conversation.answers === 4 ? "
|
|
68
|
+
}} submitLabel={conversation.answers === 4 ? "Send answer and evaluate" : "Send answer"} />
|
|
69
69
|
</UI.Stack>}
|
|
70
70
|
{conversation.phase === "complete" && !pending && <UI.Stack>
|
|
71
|
-
<h2>
|
|
71
|
+
<h2>Your design recommendation</h2>
|
|
72
72
|
<UI.Markdown text={conversation.text} />
|
|
73
73
|
</UI.Stack>}
|
|
74
74
|
</UI.Stack>
|
|
@@ -76,5 +76,5 @@ function App() {
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
const root = document.getElementById("root");
|
|
79
|
-
if (!root) throw new Error("
|
|
79
|
+
if (!root) throw new Error("The #root element is missing.");
|
|
80
80
|
createRoot(root).render(<App />);
|
package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts
CHANGED
|
@@ -52,8 +52,8 @@ export function deriveConversation(snapshot: ChatSnapshot | undefined): Conversa
|
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
export function answerInput(answers: number, text: string): string {
|
|
55
|
-
if (!Number.isInteger(answers) || answers < 0 || answers >= answerCount) throw new Error("
|
|
56
|
-
if (!text.trim()) throw new Error("
|
|
55
|
+
if (!Number.isInteger(answers) || answers < 0 || answers >= answerCount) throw new Error("The interview accepts exactly five answers.");
|
|
56
|
+
if (!text.trim()) throw new Error("Please enter an answer.");
|
|
57
57
|
return `ANSWER ${answers + 1}/5\n${text.trim()}`;
|
|
58
58
|
}
|
|
59
59
|
|