@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
package/apps/server/src/main.ts
CHANGED
|
@@ -4,12 +4,12 @@ import { configuredAnonymousUser, configuredUsers, loadConfigFile, missingEnviro
|
|
|
4
4
|
const startupFailure = (error: unknown): never => {
|
|
5
5
|
const message = error instanceof Error ? error.message : String(error);
|
|
6
6
|
if (error instanceof Error && error.constructor !== Error && missingEnvironmentOf(error) === undefined) console.error(error.stack ?? message);
|
|
7
|
-
console.error(`\nRAgents
|
|
7
|
+
console.error(`\nRAgents does not start: ${message}`);
|
|
8
8
|
reportMissingEnvironment(error, (line) => console.error(line));
|
|
9
9
|
process.exit(1);
|
|
10
10
|
};
|
|
11
11
|
|
|
12
|
-
/**
|
|
12
|
+
/** Start modes: --stdio (JSON-RPC over stdin and stdout, no HTTP without --port), --port 0 (private port announced on stdout), --port N. */
|
|
13
13
|
const parseArguments = (argv: readonly string[]): { stdio: boolean; port: number | undefined } => {
|
|
14
14
|
let stdio = false;
|
|
15
15
|
let port: number | undefined;
|
|
@@ -18,12 +18,12 @@ const parseArguments = (argv: readonly string[]): { stdio: boolean; port: number
|
|
|
18
18
|
if (argument === "--stdio") { stdio = true; continue; }
|
|
19
19
|
if (argument === "--port") {
|
|
20
20
|
const value = Number(argv[index + 1]);
|
|
21
|
-
if (!Number.isInteger(value) || value < 0 || value > 65535) throw new Error(`--port
|
|
21
|
+
if (!Number.isInteger(value) || value < 0 || value > 65535) throw new Error(`--port needs an integer from 0 to 65535, not ${argv[index + 1]}`);
|
|
22
22
|
port = value;
|
|
23
23
|
index += 1;
|
|
24
24
|
continue;
|
|
25
25
|
}
|
|
26
|
-
throw new Error(`
|
|
26
|
+
throw new Error(`Unknown argument: ${argument} (allowed: --stdio, --port <n>)`);
|
|
27
27
|
}
|
|
28
28
|
return { stdio, port };
|
|
29
29
|
};
|
|
@@ -31,8 +31,8 @@ const parseArguments = (argv: readonly string[]): { stdio: boolean; port: number
|
|
|
31
31
|
try {
|
|
32
32
|
if (!process.env.PRODUCT_PROFILE) {
|
|
33
33
|
throw new Error(
|
|
34
|
-
"PRODUCT_PROFILE
|
|
35
|
-
+ "
|
|
34
|
+
"PRODUCT_PROFILE is not set. scripts/start.sh <profile> sets the profile; "
|
|
35
|
+
+ "for pnpm start, run export PRODUCT_PROFILE=<profile> first.",
|
|
36
36
|
);
|
|
37
37
|
}
|
|
38
38
|
const arguments_ = parseArguments(process.argv.slice(2));
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** A configuration names env("NAME") for an environment variable the process does not have; plus what it is needed for. */
|
|
2
2
|
export interface MissingEnvironment {
|
|
3
3
|
readonly variable: string;
|
|
4
4
|
readonly section: string;
|
|
5
5
|
readonly key: string;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
/**
|
|
8
|
+
/** The same error as before, except that it carries the name instead of hiding it in the sentence. */
|
|
9
9
|
export class MissingEnvironmentError extends Error {
|
|
10
10
|
constructor(readonly missing: MissingEnvironment, message: string) {
|
|
11
11
|
super(message);
|
|
@@ -23,14 +23,14 @@ const asMissingEnvironment = (value: unknown): MissingEnvironment | undefined =>
|
|
|
23
23
|
return { variable: missing.variable, section: missing.section, key: missing.key };
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
-
/**
|
|
26
|
+
/** The finding on an error; its content is checked, not its class, because it also comes from another module. */
|
|
27
27
|
export const missingEnvironmentOf = (error: unknown): MissingEnvironment | undefined =>
|
|
28
28
|
asMissingEnvironment((error as { missing?: unknown } | null | undefined)?.missing);
|
|
29
29
|
|
|
30
|
-
/**
|
|
30
|
+
/** The line with which a child process passes the finding on to whoever started it; its text stays alongside. */
|
|
31
31
|
export const missingEnvironmentNotice = (missing: MissingEnvironment): string => NOTICE + JSON.stringify(missing);
|
|
32
32
|
|
|
33
|
-
/**
|
|
33
|
+
/** The finding from an output line; anything else is none. */
|
|
34
34
|
export const parseMissingEnvironmentNotice = (line: string): MissingEnvironment | undefined => {
|
|
35
35
|
if (!line.startsWith(NOTICE)) return undefined;
|
|
36
36
|
try {
|
|
@@ -40,7 +40,7 @@ export const parseMissingEnvironmentNotice = (line: string): MissingEnvironment
|
|
|
40
40
|
}
|
|
41
41
|
};
|
|
42
42
|
|
|
43
|
-
/**
|
|
43
|
+
/** What a process additionally prints when it fails because of a missing environment variable. */
|
|
44
44
|
export const reportMissingEnvironment = (error: unknown, write: (line: string) => void): void => {
|
|
45
45
|
const missing = missingEnvironmentOf(error);
|
|
46
46
|
if (missing) write(missingEnvironmentNotice(missing));
|
|
@@ -3,12 +3,12 @@ const CHECK_INTERVAL_MS = 5_000;
|
|
|
3
3
|
export interface ParentWatch {
|
|
4
4
|
readonly parentPid: string | undefined;
|
|
5
5
|
readonly onGone: (pid: number) => void;
|
|
6
|
-
/**
|
|
6
|
+
/** Tests only: the liveness check and the watcher's interval. */
|
|
7
7
|
readonly alive?: (pid: number) => boolean;
|
|
8
8
|
readonly intervalMs?: number;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
/**
|
|
11
|
+
/** Is the process still alive? ESRCH means gone, EPERM means alive under another owner. */
|
|
12
12
|
export const processAlive = (pid: number): boolean => {
|
|
13
13
|
try {
|
|
14
14
|
process.kill(pid, 0);
|
|
@@ -18,12 +18,12 @@ export const processAlive = (pid: number): boolean => {
|
|
|
18
18
|
}
|
|
19
19
|
};
|
|
20
20
|
|
|
21
|
-
/**
|
|
21
|
+
/** Ends the host as soon as the process from RAGENTS_PARENT_PID disappears; without the variable there is no watcher. */
|
|
22
22
|
export const watchParentProcess = (watch: ParentWatch): (() => void) | undefined => {
|
|
23
23
|
const given = watch.parentPid;
|
|
24
24
|
if (given === undefined) return undefined;
|
|
25
25
|
if (!/^\d+$/.test(given) || !Number.isSafeInteger(Number(given)) || Number(given) <= 0) {
|
|
26
|
-
throw new Error(`RAGENTS_PARENT_PID
|
|
26
|
+
throw new Error(`RAGENTS_PARENT_PID names the caller's process id; ${JSON.stringify(given)} is not a positive integer.`);
|
|
27
27
|
}
|
|
28
28
|
const pid = Number(given);
|
|
29
29
|
const alive = watch.alive ?? processAlive;
|
|
@@ -86,8 +86,8 @@ const hostModuleShim = (specifier: string, names: readonly string[]): string =>
|
|
|
86
86
|
const HOST_READ_SOURCE = [
|
|
87
87
|
`export const read = (specifier, name) => {`,
|
|
88
88
|
` const module = globalThis[${JSON.stringify(HOST_MODULES_GLOBAL)}]?.[specifier];`,
|
|
89
|
-
` if (module === undefined) throw new Error(\`
|
|
90
|
-
` if (!(name in module)) throw new Error(\`
|
|
89
|
+
` if (module === undefined) throw new Error(\`The host does not provide \${specifier}\`);`,
|
|
90
|
+
` if (!(name in module)) throw new Error(\`The host does not provide \${name} from \${specifier}; the bundle was built against a newer host\`);`,
|
|
91
91
|
` return module[name];`,
|
|
92
92
|
`};`,
|
|
93
93
|
].join("\n");
|
|
@@ -119,15 +119,15 @@ export const pluginCodeProblems = (file: string, text: string, id: string, asset
|
|
|
119
119
|
};
|
|
120
120
|
const visit = (node: ts.Node): void => {
|
|
121
121
|
if (ts.isMetaProperty(node) && node.keywordToken === ts.SyntaxKind.ImportKeyword) {
|
|
122
|
-
report(node, "import.meta
|
|
122
|
+
report(node, "import.meta is not allowed in a bundle; the plugin's files go through pluginAsset(id, name) or pluginFolder(id)");
|
|
123
123
|
} else if (ts.isIdentifier(node) && ["__dirname", "__filename", "createRequire"].includes(node.text)) {
|
|
124
|
-
report(node, `${node.text}
|
|
124
|
+
report(node, `${node.text} is not allowed in a bundle; the plugin's files go through pluginAsset(id, name) or pluginFolder(id)`);
|
|
125
125
|
} else if (ts.isPropertyAccessExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === "require" && node.name.text === "resolve") {
|
|
126
|
-
report(node, "require.resolve
|
|
126
|
+
report(node, "require.resolve is not allowed in a bundle; the plugin's files go through pluginAsset(id, name) or pluginFolder(id)");
|
|
127
127
|
} else if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === "pluginAsset") {
|
|
128
128
|
const [owner, name] = node.arguments;
|
|
129
129
|
if (owner && name && ts.isStringLiteralLike(owner) && ts.isStringLiteralLike(name) && owner.text === id && !coveredByAssets(assets, name.text)) {
|
|
130
|
-
report(name, `pluginAsset
|
|
130
|
+
report(name, `pluginAsset names ${name.text}, which does not go into the bundle; name it under assets in ragents-plugin.json`);
|
|
131
131
|
}
|
|
132
132
|
}
|
|
133
133
|
ts.forEachChild(node, visit);
|
|
@@ -153,10 +153,10 @@ const platformProblem = (packageRoot: string): string | undefined => {
|
|
|
153
153
|
name?: string; os?: unknown; cpu?: unknown; optionalDependencies?: Record<string, string>;
|
|
154
154
|
};
|
|
155
155
|
const name = manifest.name ?? path.basename(packageRoot);
|
|
156
|
-
if (manifest.os !== undefined || manifest.cpu !== undefined) return `
|
|
156
|
+
if (manifest.os !== undefined || manifest.cpu !== undefined) return `The package ${name} is bound to an operating system or processor (os/cpu in package.json)`;
|
|
157
157
|
const platformDependencies = Object.keys(manifest.optionalDependencies ?? {}).filter((dependency) => PLATFORM_PACKAGE.test(dependency));
|
|
158
158
|
if (platformDependencies.length > 0) {
|
|
159
|
-
return `
|
|
159
|
+
return `The package ${name} has platform-dependent optional dependencies (${platformDependencies.join(", ")}); native code is provided by the host or fetched by the provisioning`;
|
|
160
160
|
}
|
|
161
161
|
return undefined;
|
|
162
162
|
};
|
|
@@ -188,8 +188,8 @@ const boundaryPlugin = (
|
|
|
188
188
|
|
|
189
189
|
/** The executor contribution loads in every process without the host's loader, the VS Code extension included. */
|
|
190
190
|
const outsideContribution = (specifier: string) => ({ errors: [{
|
|
191
|
-
text: `${specifier}:
|
|
192
|
-
+ "
|
|
191
|
+
text: `${specifier}: the executor contribution loads in every Node process without the host's resolution; it imports only node:*, its own files, `
|
|
192
|
+
+ "bundled libraries and types from the host (import type), everything else it gets through the machine",
|
|
193
193
|
}] });
|
|
194
194
|
|
|
195
195
|
const crossImport = (owner: string, name: string) => {
|
|
@@ -211,7 +211,7 @@ const boundaryPlugin = (
|
|
|
211
211
|
}));
|
|
212
212
|
|
|
213
213
|
build.onResolve({ filter: /\.node$/ }, (args) => ({
|
|
214
|
-
errors: [{ text: `${args.path}
|
|
214
|
+
errors: [{ text: `${args.path} is a platform-dependent binary; native code is provided by the host or fetched by the provisioning into <data-folder>/tools/${id}/` }],
|
|
215
215
|
}));
|
|
216
216
|
|
|
217
217
|
build.onResolve({ filter: /.*/ }, async (args) => {
|
|
@@ -221,35 +221,35 @@ const boundaryPlugin = (
|
|
|
221
221
|
if (specifier.startsWith("node:") || isBuiltin(specifier)) {
|
|
222
222
|
return half === "server"
|
|
223
223
|
? { path: specifier, external: true }
|
|
224
|
-
: { errors: [{ text: `${specifier}
|
|
224
|
+
: { errors: [{ text: `${specifier} is a Node module and does not exist in the browser` }] };
|
|
225
225
|
}
|
|
226
226
|
if (isBare(specifier)) {
|
|
227
227
|
const cross = /^@ragents\/plugins\/([^/]+)\/(.+)$/.exec(specifier);
|
|
228
228
|
if (cross) {
|
|
229
229
|
const [, owner, rawName] = cross as unknown as [string, string, string];
|
|
230
230
|
const name = normalizedSpecifier(rawName);
|
|
231
|
-
if (owner === id) return { errors: [{ text: `${specifier}
|
|
231
|
+
if (owner === id) return { errors: [{ text: `${specifier} imports the plugin itself through the package name; import own files relatively` }] };
|
|
232
232
|
const other = environment.catalog(owner);
|
|
233
|
-
if (!other) return { errors: [{ text: `
|
|
233
|
+
if (!other) return { errors: [{ text: `The plugin ${owner} from ${specifier} is neither next to ${id} nor in the host` }] };
|
|
234
234
|
if (!other.description.exports[half].includes(name)) {
|
|
235
|
-
return { errors: [{ text: `${owner}
|
|
235
|
+
return { errors: [{ text: `${owner} does not export ${name} for the ${half} half; the export belongs in its ragents-plugin.json under exports.${half}` }] };
|
|
236
236
|
}
|
|
237
237
|
return crossImport(owner, name);
|
|
238
238
|
}
|
|
239
239
|
if (selfContained && (providedByHost(half, specifier) || hostOnly(specifier))) return outsideContribution(specifier);
|
|
240
240
|
if (providedByHost(half, specifier)) {
|
|
241
241
|
if (args.kind === "dynamic-import" && (half === "web" || !isLibrary(half, specifier))) {
|
|
242
|
-
return { errors: [{ text: `import()
|
|
242
|
+
return { errors: [{ text: `import() of ${specifier}: a host module is imported statically so that the build checks every name against the host API` }] };
|
|
243
243
|
}
|
|
244
244
|
if (args.kind === "require-call" && half === "server") {
|
|
245
|
-
return { errors: [{ text: `require(${JSON.stringify(specifier)}):
|
|
245
|
+
return { errors: [{ text: `require(${JSON.stringify(specifier)}): the host provides ${specifier} only through import; otherwise the bundle would get a second copy or none` }] };
|
|
246
246
|
}
|
|
247
247
|
return half === "server"
|
|
248
248
|
? { path: specifier, external: true }
|
|
249
249
|
: { path: normalizedSpecifier(specifier), namespace: HOST_NAMESPACE, sideEffects: false };
|
|
250
250
|
}
|
|
251
251
|
if (hostOnly(specifier)) {
|
|
252
|
-
return { errors: [{ text: `${specifier}
|
|
252
|
+
return { errors: [{ text: `${specifier} is not in the ${half} list of the host API (apps/server/src/host-api.ts); a plugin gets from the host only what is listed there` }] };
|
|
253
253
|
}
|
|
254
254
|
return undefined;
|
|
255
255
|
}
|
|
@@ -258,19 +258,19 @@ const boundaryPlugin = (
|
|
|
258
258
|
if (resolved.errors.length > 0) return { errors: resolved.errors };
|
|
259
259
|
const owner = owningPluginFolder(resolved.path);
|
|
260
260
|
if (owner === source.folder) return { path: resolved.path, sideEffects: resolved.sideEffects };
|
|
261
|
-
if (!owner) return { errors: [{ text: `${specifier}
|
|
261
|
+
if (!owner) return { errors: [{ text: `${specifier} is outside the plugin folder (${resolved.path}); a plugin imports only its own files relatively` }] };
|
|
262
262
|
const other = readPluginSource(owner);
|
|
263
263
|
const name = exportOfFile(other, half, resolved.path);
|
|
264
264
|
if (!name) {
|
|
265
265
|
const relative = path.relative(owner, resolved.path).split(path.sep).join("/").replace(/\.(ts|tsx)$/, "");
|
|
266
|
-
return { errors: [{ text: `${other.description.id}
|
|
266
|
+
return { errors: [{ text: `${other.description.id} does not export ${relative} for the ${half} half; the export belongs in its ragents-plugin.json under exports.${half}` }] };
|
|
267
267
|
}
|
|
268
268
|
return crossImport(other.description.id, name);
|
|
269
269
|
});
|
|
270
270
|
|
|
271
271
|
build.onLoad({ filter: /.*/, namespace: HOST_NAMESPACE }, (args) => {
|
|
272
272
|
const names = environment.record.web[args.path];
|
|
273
|
-
if (!names) return { errors: [{ text: `host-api.json
|
|
273
|
+
if (!names) return { errors: [{ text: `host-api.json does not know ${args.path}; pnpm update:host-api` }] };
|
|
274
274
|
return { contents: hostModuleShim(args.path, names), loader: "js" };
|
|
275
275
|
});
|
|
276
276
|
build.onLoad({ filter: /.*/, namespace: HOST_VALUE_NAMESPACE }, (args) => {
|
|
@@ -293,7 +293,7 @@ const boundaryPlugin = (
|
|
|
293
293
|
const located = LIBRARY_LOCATIONS.filter(([pattern]) => pattern.test(text)).map(([, name]) => name);
|
|
294
294
|
const errors = [
|
|
295
295
|
...(platform ? [{ text: platform }] : []),
|
|
296
|
-
...(located.length > 0 ? [{ text: `${path.relative(packageRoot, args.path)} in ${path.basename(packageRoot)}
|
|
296
|
+
...(located.length > 0 ? [{ text: `${path.relative(packageRoot, args.path)} in ${path.basename(packageRoot)} locates files through its own location (${located.join(", ")}); in the bundle this location does not exist` }] : []),
|
|
297
297
|
];
|
|
298
298
|
return errors.length > 0 ? { errors } : { contents: text, loader };
|
|
299
299
|
});
|
|
@@ -329,7 +329,7 @@ const serverHostImports = (file: string, text: string, record: HostApiRecord): S
|
|
|
329
329
|
const problems: string[] = [];
|
|
330
330
|
const take = (specifier: string, name: string, offered: readonly string[]): void => {
|
|
331
331
|
if (offered.includes(name)) names.push([normalizedSpecifier(specifier), name]);
|
|
332
|
-
else problems.push(`${file}
|
|
332
|
+
else problems.push(`${file} imports ${name} from ${specifier}, which the host API does not offer (host-api.json)`);
|
|
333
333
|
};
|
|
334
334
|
for (const statement of source.statements) {
|
|
335
335
|
if (ts.isExportDeclaration(statement) && statement.moduleSpecifier && ts.isStringLiteral(statement.moduleSpecifier)) {
|
|
@@ -338,7 +338,7 @@ const serverHostImports = (file: string, text: string, record: HostApiRecord): S
|
|
|
338
338
|
if (!offered) continue;
|
|
339
339
|
const clause = statement.exportClause;
|
|
340
340
|
if (clause && ts.isNamedExports(clause)) for (const element of clause.elements) take(specifier, (element.propertyName ?? element.name).text, offered);
|
|
341
|
-
else if (!isLibrary("server", specifier)) problems.push(`${file}
|
|
341
|
+
else if (!isLibrary("server", specifier)) problems.push(`${file} re-exports ${specifier} as a whole; import only individual names from a host module`);
|
|
342
342
|
continue;
|
|
343
343
|
}
|
|
344
344
|
if (!ts.isImportDeclaration(statement)) continue;
|
|
@@ -352,7 +352,7 @@ const serverHostImports = (file: string, text: string, record: HostApiRecord): S
|
|
|
352
352
|
for (const element of bindings.elements) take(specifier, (element.propertyName ?? element.name).text, offered);
|
|
353
353
|
} else if (bindings && ts.isNamespaceImport(bindings) && !isLibrary("server", specifier)) {
|
|
354
354
|
const reads = namespaceReads(source, bindings.name);
|
|
355
|
-
if (reads.escapes) problems.push(`${file}
|
|
355
|
+
if (reads.escapes) problems.push(`${file} uses the namespace ${bindings.name.text} from ${specifier} as a whole; read only individual names from a host module so that the build checks them`);
|
|
356
356
|
for (const name of new Set(reads.names)) take(specifier, name, offered);
|
|
357
357
|
}
|
|
358
358
|
}
|
|
@@ -461,9 +461,9 @@ const tailwindCandidates = (source: PluginSource, metafile: Metafile): readonly
|
|
|
461
461
|
|
|
462
462
|
const copyAsset = async (from: string, to: string, name: string): Promise<void> => {
|
|
463
463
|
const stats = lstatSync(from);
|
|
464
|
-
if (stats.isSymbolicLink()) throw new Error(`
|
|
464
|
+
if (stats.isSymbolicLink()) throw new Error(`The asset ${name} contains a link (${from}); a bundle contains only files`);
|
|
465
465
|
if (stats.isDirectory()) {
|
|
466
|
-
if (path.basename(from) === "node_modules") throw new Error(`
|
|
466
|
+
if (path.basename(from) === "node_modules") throw new Error(`The asset ${name} contains node_modules; a bundle brings no dependencies`);
|
|
467
467
|
await mkdir(to, { recursive: true });
|
|
468
468
|
for (const entry of readdirSync(from).sort()) {
|
|
469
469
|
if (!SKIPPED_ASSET_FILES.has(entry)) await copyAsset(path.join(from, entry), path.join(to, entry), name);
|
|
@@ -497,7 +497,7 @@ const buildPlugin = async (folder: string, environment: BuildEnvironment, typeEr
|
|
|
497
497
|
in: sourceFileOf(path.join(source.folder, name))!,
|
|
498
498
|
out: `exports/${name}`,
|
|
499
499
|
}));
|
|
500
|
-
if (!serverEntry) return failed(["server/index.ts
|
|
500
|
+
if (!serverEntry) return failed(["server/index.ts is missing; every plugin has a server half with the module contract"]);
|
|
501
501
|
const hasWeb = webEntry !== undefined || source.description.exports.web.length > 0;
|
|
502
502
|
const results = await Promise.all([
|
|
503
503
|
buildHalf(source, "server", [{ in: provision ? "ragents-entry:server" : serverEntry, out: "index" }, ...exportEntries("server")], environment, assets),
|
|
@@ -511,7 +511,7 @@ const buildPlugin = async (folder: string, environment: BuildEnvironment, typeEr
|
|
|
511
511
|
const target = path.join(environment.out, id);
|
|
512
512
|
const relativeOf = (file: OutputFile): string => path.relative(target, file.path).split(path.sep).join("/");
|
|
513
513
|
const strayCss = files.map(relativeOf).filter((name) => name.endsWith(".css") && name !== "web/index.css");
|
|
514
|
-
if (strayCss.length > 0) return failed(strayCss.map((name) => `${name}: CSS
|
|
514
|
+
if (strayCss.length > 0) return failed(strayCss.map((name) => `${name}: CSS exists only through the web entry (web/index.css)`));
|
|
515
515
|
const serverImports = files.filter((file) => relativeOf(file).startsWith("server/") && file.path.endsWith(".js"))
|
|
516
516
|
.map((file) => serverHostImports(relativeOf(file), file.text, environment.record));
|
|
517
517
|
const importProblems = serverImports.flatMap((imports) => imports.problems);
|
|
@@ -573,7 +573,7 @@ interface HostBuildContext {
|
|
|
573
573
|
const hostContextFor = (folders: readonly string[], options: Pick<PluginBuildOptions, "out" | "root">): HostBuildContext => {
|
|
574
574
|
const ids = folders.map((folder) => path.basename(path.resolve(folder)));
|
|
575
575
|
const duplicate = ids.find((id, index) => ids.indexOf(id) !== index);
|
|
576
|
-
if (duplicate) throw new Error(`
|
|
576
|
+
if (duplicate) throw new Error(`The plugin ${duplicate} is named more than once`);
|
|
577
577
|
const root = options.root ?? hostRoot();
|
|
578
578
|
return { root, record: checkedHostApiRecord(root), out: path.resolve(options.out) };
|
|
579
579
|
};
|
|
@@ -654,7 +654,7 @@ export const watchPlugins = async (
|
|
|
654
654
|
running = current;
|
|
655
655
|
pending.add(current);
|
|
656
656
|
};
|
|
657
|
-
//
|
|
657
|
+
// At startup only outdated ones, so that a server that is just starting with these bundles sees no swapped files.
|
|
658
658
|
run(true);
|
|
659
659
|
watchers.push(watch(folder, { recursive: true }, (_event, name) => {
|
|
660
660
|
const changed = name ? path.join(folder, name.toString()) : folder;
|
|
@@ -23,7 +23,7 @@ const parsedConfig = (file: string): ts.ParsedCommandLine => {
|
|
|
23
23
|
throw new Error(ts.flattenDiagnosticMessageText(diagnostic.messageText, " "));
|
|
24
24
|
},
|
|
25
25
|
});
|
|
26
|
-
if (!parsed) throw new Error(`${file}
|
|
26
|
+
if (!parsed) throw new Error(`${file} is not a valid tsconfig`);
|
|
27
27
|
return parsed;
|
|
28
28
|
};
|
|
29
29
|
|
|
@@ -40,7 +40,7 @@ export const typeViews = (half: HostApiHalf, root = hostRoot()): ReadonlyMap<str
|
|
|
40
40
|
const importer = path.join(root, place.importer);
|
|
41
41
|
const resolved = hostApiModules(half).map((specifier) => {
|
|
42
42
|
const module = ts.resolveModuleName(specifier, importer, options, ts.sys).resolvedModule;
|
|
43
|
-
if (!module) throw new Error(`${specifier}
|
|
43
|
+
if (!module) throw new Error(`${specifier} cannot be resolved for the ${half} half`);
|
|
44
44
|
return { specifier, module };
|
|
45
45
|
});
|
|
46
46
|
const probe = path.join(path.dirname(importer), "__host-api-probe__.ts");
|
|
@@ -55,7 +55,7 @@ export const typeViews = (half: HostApiHalf, root = hostRoot()): ReadonlyMap<str
|
|
|
55
55
|
const imports = program.getSourceFile(probe)!.statements.filter(ts.isImportDeclaration);
|
|
56
56
|
return new Map(resolved.map(({ specifier, module }, index) => {
|
|
57
57
|
const symbol = checker.getSymbolAtLocation(imports[index]!.moduleSpecifier);
|
|
58
|
-
if (!symbol) throw new Error(`${specifier}: ${module.resolvedFileName}
|
|
58
|
+
if (!symbol) throw new Error(`${specifier}: ${module.resolvedFileName} has no module symbol`);
|
|
59
59
|
const values = checker.getExportsOfModule(symbol).filter((exported) => {
|
|
60
60
|
const target = exported.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(exported) : exported;
|
|
61
61
|
return (target.flags & ts.SymbolFlags.Value) !== 0;
|
|
@@ -120,7 +120,7 @@ const webRuntimeNames = async (specifiers: readonly string[], root: string): Pro
|
|
|
120
120
|
const document = { createElement: () => ({}) };
|
|
121
121
|
vm.runInNewContext(code, { module, exports: module.exports, console, setTimeout, clearTimeout, queueMicrotask, TextEncoder, TextDecoder, URL, document });
|
|
122
122
|
const modules = module.exports.hostModules;
|
|
123
|
-
if (!modules) throw new Error("
|
|
123
|
+
if (!modules) throw new Error("The web half's register yields no modules");
|
|
124
124
|
return Object.fromEntries(Object.entries(modules).map(([specifier, namespace]) => [specifier, Object.keys(namespace)]));
|
|
125
125
|
};
|
|
126
126
|
|
|
@@ -129,12 +129,12 @@ const listedNames = (half: HostApiHalf, specifier: string, view: TypeView): read
|
|
|
129
129
|
const listed = hostApi[half][specifier]!;
|
|
130
130
|
const hostCode = specifier.startsWith("@ragents/");
|
|
131
131
|
if (listed === LIBRARY) {
|
|
132
|
-
if (hostCode) throw new Error(`${specifier}
|
|
132
|
+
if (hostCode) throw new Error(`${specifier} is host code, not a library; host-api.ts names its names individually`);
|
|
133
133
|
return LIBRARY;
|
|
134
134
|
}
|
|
135
|
-
if (!hostCode) throw new Error(`${specifier}
|
|
135
|
+
if (!hostCode) throw new Error(`${specifier} is a library; host-api.ts releases it as a whole`);
|
|
136
136
|
const missing = listed.filter((name) => !view.names.includes(name));
|
|
137
|
-
if (missing.length > 0) throw new Error(`host-api.ts
|
|
137
|
+
if (missing.length > 0) throw new Error(`host-api.ts names ${missing.join(", ")} for ${specifier}, but the module does not export it as a value`);
|
|
138
138
|
return [...listed].sort();
|
|
139
139
|
};
|
|
140
140
|
|
|
@@ -25,7 +25,7 @@ const HALVES = new Set(["server", "web"]);
|
|
|
25
25
|
|
|
26
26
|
const stringList = (value: unknown, where: string): readonly string[] => {
|
|
27
27
|
if (!Array.isArray(value) || value.some((entry) => typeof entry !== "string" || entry.length === 0)) {
|
|
28
|
-
throw new Error(`${where}
|
|
28
|
+
throw new Error(`${where} must be a list of paths`);
|
|
29
29
|
}
|
|
30
30
|
return value as readonly string[];
|
|
31
31
|
};
|
|
@@ -33,7 +33,7 @@ const stringList = (value: unknown, where: string): readonly string[] => {
|
|
|
33
33
|
/** A relative path inside the plugin folder, written with forward slashes and without leaving the folder. */
|
|
34
34
|
const insidePath = (value: string, where: string): string => {
|
|
35
35
|
if (path.isAbsolute(value) || value.includes("\\") || value.split("/").some((part) => part === ".." || part === "." || part === "")) {
|
|
36
|
-
throw new Error(`${where}: ${value}
|
|
36
|
+
throw new Error(`${where}: ${value} is not a relative path in the plugin folder`);
|
|
37
37
|
}
|
|
38
38
|
return value;
|
|
39
39
|
};
|
|
@@ -46,42 +46,42 @@ export const sourceFileOf = (stem: string): string | undefined =>
|
|
|
46
46
|
export const readPluginDescription = (folder: string): PluginDescription => {
|
|
47
47
|
const file = path.join(folder, PLUGIN_DESCRIPTION_FILE);
|
|
48
48
|
if (!existsSync(file)) {
|
|
49
|
-
throw new Error(`${folder}
|
|
49
|
+
throw new Error(`${folder} has no ${PLUGIN_DESCRIPTION_FILE}; a plugin describes itself there with { "id": "${path.basename(folder)}" }`);
|
|
50
50
|
}
|
|
51
51
|
const raw = JSON.parse(readFileSync(file, "utf8")) as unknown;
|
|
52
|
-
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) throw new Error(`${file}
|
|
52
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) throw new Error(`${file} must contain an object`);
|
|
53
53
|
const record = raw as Record<string, unknown>;
|
|
54
54
|
const unknown = Object.keys(record).filter((key) => !DESCRIPTION_KEYS.has(key));
|
|
55
|
-
if (unknown.length > 0) throw new Error(`${file}:
|
|
55
|
+
if (unknown.length > 0) throw new Error(`${file}: unknown fields ${unknown.join(", ")}; allowed are id, exports and assets`);
|
|
56
56
|
const id = record.id;
|
|
57
|
-
if (typeof id !== "string" || !ID_PATTERN.test(id)) throw new Error(`${file}: id
|
|
58
|
-
if (id !== path.basename(folder)) throw new Error(`${file}:
|
|
57
|
+
if (typeof id !== "string" || !ID_PATTERN.test(id)) throw new Error(`${file}: id must be an id such as acme.tickets`);
|
|
58
|
+
if (id !== path.basename(folder)) throw new Error(`${file}: the id ${id} differs from the folder name ${path.basename(folder)}`);
|
|
59
59
|
const exportsValue = record.exports ?? {};
|
|
60
60
|
if (typeof exportsValue !== "object" || exportsValue === null || Array.isArray(exportsValue)) {
|
|
61
|
-
throw new Error(`${file}: exports
|
|
61
|
+
throw new Error(`${file}: exports must be an object with server and web`);
|
|
62
62
|
}
|
|
63
63
|
const halves = Object.keys(exportsValue).filter((half) => !HALVES.has(half));
|
|
64
|
-
if (halves.length > 0) throw new Error(`${file}: exports
|
|
64
|
+
if (halves.length > 0) throw new Error(`${file}: exports knows only server and web, not ${halves.join(", ")}`);
|
|
65
65
|
const exportsOf = (half: HostApiHalf): readonly string[] => {
|
|
66
66
|
const names = stringList((exportsValue as Record<string, unknown>)[half] ?? [], `${file}: exports.${half}`)
|
|
67
67
|
.map((name) => insidePath(name, `${file}: exports.${half}`));
|
|
68
68
|
for (const name of names) {
|
|
69
|
-
if (/\.(js|ts|tsx|mjs)$/.test(name)) throw new Error(`${file}:
|
|
70
|
-
if (!sourceFileOf(path.join(folder, name))) throw new Error(`${file}:
|
|
69
|
+
if (/\.(js|ts|tsx|mjs)$/.test(name)) throw new Error(`${file}: the export ${name} is named without an extension`);
|
|
70
|
+
if (!sourceFileOf(path.join(folder, name))) throw new Error(`${file}: the export ${name} for ${half} has no source file`);
|
|
71
71
|
}
|
|
72
72
|
return names;
|
|
73
73
|
};
|
|
74
74
|
const assets = stringList(record.assets ?? [], `${file}: assets`).map((name) => insidePath(name, `${file}: assets`));
|
|
75
75
|
for (const name of assets) {
|
|
76
|
-
if (RESERVED_ASSET_ROOTS.has(name.split("/")[0]!)) throw new Error(`${file}:
|
|
77
|
-
if (!existsSync(path.join(folder, name))) throw new Error(`${file}:
|
|
76
|
+
if (RESERVED_ASSET_ROOTS.has(name.split("/")[0]!)) throw new Error(`${file}: the asset ${name} is under ${name.split("/")[0]}, which the build tool writes itself`);
|
|
77
|
+
if (!existsSync(path.join(folder, name))) throw new Error(`${file}: the asset ${name} is missing in the plugin folder`);
|
|
78
78
|
}
|
|
79
79
|
return { id, exports: { server: exportsOf("server"), web: exportsOf("web") }, assets };
|
|
80
80
|
};
|
|
81
81
|
|
|
82
82
|
export const readPluginSource = (folder: string): PluginSource => {
|
|
83
83
|
const given = path.resolve(folder);
|
|
84
|
-
if (!statSync(given, { throwIfNoEntry: false })?.isDirectory()) throw new Error(`${given}
|
|
84
|
+
if (!statSync(given, { throwIfNoEntry: false })?.isDirectory()) throw new Error(`${given} is not a folder`);
|
|
85
85
|
const real = realpathSync.native(given);
|
|
86
86
|
return { folder: real, description: readPluginDescription(real) };
|
|
87
87
|
};
|
|
@@ -110,7 +110,7 @@ export const pluginCatalog = (folders: readonly string[], builtIn = pluginsRoot)
|
|
|
110
110
|
if (known.has(id)) return known.get(id);
|
|
111
111
|
const found = roots.map((root) => path.join(root, id)).filter((folder) => existsSync(path.join(folder, PLUGIN_DESCRIPTION_FILE)));
|
|
112
112
|
const distinct = [...new Set(found.map((folder) => realpathSync.native(folder)))];
|
|
113
|
-
if (distinct.length > 1) throw new Error(`
|
|
113
|
+
if (distinct.length > 1) throw new Error(`The plugin ${id} exists more than once: ${distinct.join(", ")}`);
|
|
114
114
|
const source = distinct[0] ? readPluginSource(distinct[0]) : undefined;
|
|
115
115
|
known.set(id, source);
|
|
116
116
|
return source;
|
|
@@ -26,7 +26,7 @@ const configOptions = (file: string): ts.CompilerOptions => {
|
|
|
26
26
|
throw new Error(ts.flattenDiagnosticMessageText(diagnostic.messageText, " "));
|
|
27
27
|
},
|
|
28
28
|
});
|
|
29
|
-
if (!parsed) throw new Error(`${file}
|
|
29
|
+
if (!parsed) throw new Error(`${file} is not a valid tsconfig`);
|
|
30
30
|
return parsed.options;
|
|
31
31
|
};
|
|
32
32
|
|
|
@@ -26,7 +26,7 @@ const libraryDirectory = (name: string): string => {
|
|
|
26
26
|
if (existsSync(file) && (JSON.parse(readFileSync(file, "utf8")) as { name?: string }).name === name) return directory;
|
|
27
27
|
directory = path.dirname(directory);
|
|
28
28
|
}
|
|
29
|
-
throw new Error(`
|
|
29
|
+
throw new Error(`The installed package ${name} has no package metadata.`);
|
|
30
30
|
}
|
|
31
31
|
};
|
|
32
32
|
const json = (value: unknown): string => `${JSON.stringify(value, null, 2)}\n`;
|
|
@@ -34,7 +34,7 @@ const link = async (source: string, target: string): Promise<void> => {
|
|
|
34
34
|
await mkdir(path.dirname(target), { recursive: true });
|
|
35
35
|
await symlink(source, target).catch(async (error: NodeJS.ErrnoException) => {
|
|
36
36
|
if (error.code !== "EEXIST") throw error;
|
|
37
|
-
if (await realpath(target) !== await realpath(source)) throw new Error(`
|
|
37
|
+
if (await realpath(target) !== await realpath(source)) throw new Error(`The prepared library ${target} has a different origin.`);
|
|
38
38
|
});
|
|
39
39
|
};
|
|
40
40
|
export const prepareAppDependencies = async (directory: string): Promise<void> => {
|
|
@@ -96,15 +96,15 @@ export function createTestContextWithContracts(options, contracts) {
|
|
|
96
96
|
const controller = new AbortController();
|
|
97
97
|
const statePort = {read:()=>structuredClone(state),replace:value=>{state=structuredClone(value);}};
|
|
98
98
|
const declared = new Map(contracts.map(contract=>[contract.id,contract]));
|
|
99
|
-
for (const name of Object.keys(options.functions ?? {})) if (!declared.has(name)) throw new Error("
|
|
99
|
+
for (const name of Object.keys(options.functions ?? {})) if (!declared.has(name)) throw new Error("Unknown test function "+name);
|
|
100
100
|
const capabilities = {descriptors:()=>contracts,call:async(name,input)=>{
|
|
101
101
|
const contract=declared.get(name);
|
|
102
102
|
const call=options.functions?.[name];
|
|
103
|
-
if(!call)throw new Error("
|
|
104
|
-
if(!Value.Check(contract.schema,input))throw new Error("
|
|
103
|
+
if(!call)throw new Error("The test is missing the function "+name);
|
|
104
|
+
if(!Value.Check(contract.schema,input))throw new Error("Test input violates the contract of "+name+": "+schemaComplaints(contract.schema,input));
|
|
105
105
|
const result=await call(input);
|
|
106
|
-
assertJsonValue(result,"
|
|
107
|
-
if(!Value.Check(contract.resultSchema,result))throw new Error("
|
|
106
|
+
assertJsonValue(result,"Test response of "+name);
|
|
107
|
+
if(!Value.Check(contract.resultSchema,result))throw new Error("Test response violates the contract of "+name+": "+schemaComplaints(contract.resultSchema,result,"result"));
|
|
108
108
|
return result;
|
|
109
109
|
}};
|
|
110
110
|
return {...createRunContext({runId:"test",invocationId:"test",invocationKind:"tool",principal:{id:"test",kind:"service"},state:statePort,capabilities,log:()=>{},signal:controller.signal}),
|
|
@@ -163,7 +163,7 @@ const workflowSdkFiles = () => workflowSdk ??= (async () => {
|
|
|
163
163
|
const diagnostics = ts.getPreEmitDiagnostics(program);
|
|
164
164
|
if (diagnostics.length) throw new Error(diagnostics.map(diagnostic => ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")).join("\n"));
|
|
165
165
|
const emitted = program.emit(undefined, (name, content) => { if (name.endsWith("index.d.ts")) declarations = content; if (name.endsWith("prompt-reader.d.ts")) promptDeclarations = content; });
|
|
166
|
-
if (emitted.emitSkipped || !declarations) throw new Error("Workflow
|
|
166
|
+
if (emitted.emitSkipped || !declarations) throw new Error("Workflow SDK declarations could not be generated.");
|
|
167
167
|
const runtime = await build({ entryPoints: [workflowSource], bundle: true, write: false, platform: "neutral", format: "esm", target: "es2022", logLevel: "silent" });
|
|
168
168
|
const promptRuntime = await build({ entryPoints: [promptSource], bundle: true, write: false, platform: "node", format: "esm", target: "es2022", logLevel: "silent" });
|
|
169
169
|
return { javaScript: runtime.outputFiles[0]!.text, declarations, promptReader: promptRuntime.outputFiles[0]!.text, promptDeclarations };
|
|
@@ -215,10 +215,10 @@ export const prepareAppProject = async (directory: string): Promise<void> => {
|
|
|
215
215
|
|
|
216
216
|
export const readAppPackage = async (directory: string): Promise<AppPackage> => {
|
|
217
217
|
const pkg = JSON.parse(await readFile(path.join(directory, "package.json"), "utf8")) as Record<string, unknown>;
|
|
218
|
-
if (!Value.Check(appPackageSchema, pkg.ragents)) throw new Error(`package.json.ragents
|
|
219
|
-
if (!pkg.ragents.backend && !pkg.ragents.views?.length) throw new Error("
|
|
218
|
+
if (!Value.Check(appPackageSchema, pkg.ragents)) throw new Error(`package.json.ragents is invalid: ${schemaComplaints(appPackageSchema, pkg.ragents, "ragents")}`);
|
|
219
|
+
if (!pkg.ragents.backend && !pkg.ragents.views?.length) throw new Error("An actor package needs a backend or at least one view.");
|
|
220
220
|
const views = pkg.ragents.views ?? [];
|
|
221
|
-
if (new Set(views.map((view) => view.id)).size !== views.length) throw new Error("
|
|
221
|
+
if (new Set(views.map((view) => view.id)).size !== views.length) throw new Error("View names must be unique.");
|
|
222
222
|
return pkg.ragents;
|
|
223
223
|
};
|
|
224
224
|
|
|
@@ -228,7 +228,7 @@ export const projectSourceFiles = async (directory: string): Promise<{ path: str
|
|
|
228
228
|
for (const entry of await readdir(path.join(directory, relative), { withFileTypes: true })) {
|
|
229
229
|
if (["node_modules", ".build", "dist", ".git"].includes(entry.name)) continue;
|
|
230
230
|
const name = path.join(relative, entry.name);
|
|
231
|
-
if (entry.isSymbolicLink()) throw new Error(`App
|
|
231
|
+
if (entry.isSymbolicLink()) throw new Error(`App source files must not contain symlinks: ${name}`);
|
|
232
232
|
if (entry.isDirectory()) await walk(name);
|
|
233
233
|
else if (entry.isFile()) files.push({ path: name, content: await readFile(path.join(directory, name), "utf8") });
|
|
234
234
|
}
|
|
@@ -255,18 +255,18 @@ export const compileAppBackend = async (options: {
|
|
|
255
255
|
}): Promise<{ contract: AppContract; javaScript: string; hash: string }> => {
|
|
256
256
|
const signal = AbortSignal.any([...(options.signal ? [options.signal] : []), AbortSignal.timeout(15_000)]);
|
|
257
257
|
const entry = path.resolve(options.directory, options.backend);
|
|
258
|
-
if (!entry.startsWith(`${options.directory}${path.sep}`)) throw new Error("
|
|
258
|
+
if (!entry.startsWith(`${options.directory}${path.sep}`)) throw new Error("The backend entry lies outside the app.");
|
|
259
259
|
const result = await build({
|
|
260
260
|
stdin: { contents: `import actor from ${JSON.stringify(`./${options.backend}`)};
|
|
261
261
|
export const describe = () => {
|
|
262
|
-
for (const name of Object.keys(actor.contract.functions ?? {})) if (typeof actor.functions?.[name] !== 'function') throw new Error('
|
|
263
|
-
if (Boolean(actor.contract.input) !== (typeof actor.onInput === 'function')) throw new Error('input
|
|
262
|
+
for (const name of Object.keys(actor.contract.functions ?? {})) if (typeof actor.functions?.[name] !== 'function') throw new Error('Missing function ' + name);
|
|
263
|
+
if (Boolean(actor.contract.input) !== (typeof actor.onInput === 'function')) throw new Error('input and onInput must be present together.');
|
|
264
264
|
return JSON.parse(JSON.stringify(actor.contract));
|
|
265
265
|
};
|
|
266
266
|
export const handle = (request, context) => {
|
|
267
|
-
if (request.kind === 'input') { if (!actor.onInput) throw new Error('
|
|
267
|
+
if (request.kind === 'input') { if (!actor.onInput) throw new Error('This actor does not process input.'); return actor.onInput(request.input, context); }
|
|
268
268
|
const handler = actor.functions[request.functionId];
|
|
269
|
-
if (typeof handler !== 'function') throw new Error('
|
|
269
|
+
if (typeof handler !== 'function') throw new Error('Unknown actor function ' + request.functionId);
|
|
270
270
|
return handler(request.input, context);
|
|
271
271
|
};`, resolveDir: options.directory, sourcefile: "actor-entry.ts", loader: "ts" },
|
|
272
272
|
absWorkingDir: options.directory, platform: "node", format: "esm", target: "node22", bundle: true, packages: "external", write: false,
|
|
@@ -277,7 +277,7 @@ export const handle = (request, context) => {
|
|
|
277
277
|
program: { entry: "server.mjs", files: [{ fileName: "server.mjs", text: javaScript }], exportName: "describe" },
|
|
278
278
|
input: {}, state: {}, cwd: options.directory,
|
|
279
279
|
context: { runId: options.runId, invocationId: "app-contract", invocationKind: "tool", principal: { id: "app-build", kind: "service" }, capabilities: [] },
|
|
280
|
-
}, { signal, call: async () => { throw new Error("
|
|
281
|
-
if (!Value.Check(appContractSchema, described.result)) throw new Error(`
|
|
280
|
+
}, { signal, call: async () => { throw new Error("Run calls are not available while loading the app contract."); }, log: () => undefined });
|
|
281
|
+
if (!Value.Check(appContractSchema, described.result)) throw new Error(`The backend export needs defineActor({state, functions, input?}, {functions, onInput?}) with valid action contracts: ${schemaComplaints(appContractSchema, described.result, "contract")}`);
|
|
282
282
|
return { contract: described.result, javaScript, hash: canonicalHash({ javaScript }) };
|
|
283
283
|
};
|