@schlenkr/ragents 0.1.10 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/apps/server/package.json +1 -1
- package/apps/server/src/access-projection.ts +6 -6
- package/apps/server/src/access-service.ts +3 -3
- package/apps/server/src/access-session.ts +19 -19
- package/apps/server/src/api/contracts.ts +29 -29
- package/apps/server/src/api/core-methods.ts +17 -17
- package/apps/server/src/api/delivery.ts +2 -2
- package/apps/server/src/api/reference.ts +27 -27
- package/apps/server/src/api/rights.ts +18 -18
- package/apps/server/src/chat-handler.ts +5 -5
- package/apps/server/src/config-definition.ts +37 -10
- package/apps/server/src/config-file.ts +49 -49
- package/apps/server/src/config.ts +2 -0
- package/apps/server/src/data-directory.ts +2 -2
- package/apps/server/src/external-access.ts +1 -1
- package/apps/server/src/folder-install.ts +1 -1
- package/apps/server/src/help-files.ts +1 -1
- package/apps/server/src/host-api.json +6 -1
- package/apps/server/src/host-api.ts +3 -2
- package/apps/server/src/host-record.ts +3 -3
- package/apps/server/src/host-resolution-hooks.mjs +4 -4
- package/apps/server/src/host-version.ts +17 -17
- package/apps/server/src/host-web.ts +5 -5
- package/apps/server/src/main.ts +6 -6
- package/apps/server/src/missing-environment.ts +6 -6
- package/apps/server/src/parent-watch.ts +4 -4
- package/apps/server/src/plugin-build/build.ts +38 -38
- package/apps/server/src/plugin-build/host-api-names.ts +7 -7
- package/apps/server/src/plugin-build/plugin-description.ts +15 -15
- package/apps/server/src/plugin-build/typecheck.ts +1 -1
- package/apps/server/src/plugin-support/actor-programs/app-project.ts +19 -19
- package/apps/server/src/plugin-support/actor-programs/client-compiler.ts +4 -4
- package/apps/server/src/plugin-support/actor-programs/client-contracts.ts +11 -11
- package/apps/server/src/plugin-support/actor-programs/contract.ts +17 -17
- package/apps/server/src/plugin-support/actor-programs/runtime-libraries.ts +1 -1
- package/apps/server/src/plugin-support/actor-programs/workflow/index.ts +5 -5
- package/apps/server/src/plugin-support/actor-programs/workflow/prompt-reader.ts +2 -2
- package/apps/server/src/plugin-support/chat-display-policy.ts +2 -2
- package/apps/server/src/plugin-support/front-matter.ts +6 -6
- package/apps/server/src/plugin-support/http.ts +2 -2
- package/apps/server/src/plugin-support/language-server/contract.ts +8 -8
- package/apps/server/src/plugin-support/language-server/plugin.ts +2 -2
- package/apps/server/src/plugin-support/language-server/snapshot-method.ts +1 -1
- package/apps/server/src/plugin-support/language-server/tools.ts +11 -11
- package/apps/server/src/plugin-support/model-aliases.ts +30 -20
- package/apps/server/src/plugin-support/model-choice.ts +15 -15
- package/apps/server/src/plugin-support/model-completion.ts +44 -23
- package/apps/server/src/plugin-support/model-providers.ts +170 -0
- package/apps/server/src/plugin-support/model-upstreams.ts +1 -1
- package/apps/server/src/plugin-support/native-typescript-child.ts +4 -4
- package/apps/server/src/plugin-support/native-typescript-executor.ts +12 -12
- package/apps/server/src/plugin-support/plugin-config.ts +3 -3
- package/apps/server/src/plugin-support/plugin-folder.ts +2 -2
- package/apps/server/src/plugin-support/plugins-root.ts +2 -2
- package/apps/server/src/plugin-support/process-sandbox.ts +39 -39
- package/apps/server/src/plugin-support/product-model-settings-contract.ts +3 -3
- package/apps/server/src/plugin-support/product-model-settings.ts +10 -10
- package/apps/server/src/plugin-support/product-relay.ts +9 -9
- package/apps/server/src/plugin-support/product-start-options.ts +4 -4
- package/apps/server/src/plugin-support/prompt.ts +1 -1
- package/apps/server/src/plugin-support/provision.ts +8 -8
- package/apps/server/src/plugin-support/run-scripts.ts +17 -17
- package/apps/server/src/plugin-support/skills.ts +18 -18
- package/apps/server/src/plugin-support/start-entries-contract.ts +17 -17
- package/apps/server/src/plugin-support/start-options-contract.ts +5 -5
- package/apps/server/src/plugin-support/system-prompts.ts +11 -11
- package/apps/server/src/plugin-support/thinking-level.ts +2 -2
- package/apps/server/src/plugin-support/tool-availability.ts +2 -2
- package/apps/server/src/plugin-support/workspace-ownership.ts +5 -5
- package/apps/server/src/plugin-support/workspace-sandbox-host.ts +37 -37
- package/apps/server/src/plugin-support/zip.ts +7 -7
- package/apps/server/src/profile/bundle-manifest.ts +27 -27
- package/apps/server/src/profile/compose.ts +12 -7
- package/apps/server/src/profile/plugin-discovery.ts +14 -14
- package/apps/server/src/profile/provisioning.ts +5 -5
- package/apps/server/src/profile-target.ts +10 -10
- package/apps/server/src/protocol.ts +2 -2
- package/apps/server/src/provider.ts +62 -57
- package/apps/server/src/ragents/actor-chat-history.ts +8 -8
- package/apps/server/src/ragents/chat-text-positions.ts +2 -2
- package/apps/server/src/ragents/coordinator.ts +2 -2
- package/apps/server/src/ragents/engine.ts +23 -23
- package/apps/server/src/ragents/global-chat.ts +8 -8
- package/apps/server/src/ragents/host-services.ts +6 -3
- package/apps/server/src/ragents/journal-chat-events.ts +1 -1
- package/apps/server/src/ragents/run-owner.ts +2 -2
- package/apps/server/src/ragents/session.ts +49 -49
- package/apps/server/src/ragents/typescript-tools.ts +12 -12
- package/apps/server/src/ragents/workspace-runtime.ts +28 -28
- package/apps/server/src/rpc/dispatcher.ts +19 -19
- package/apps/server/src/rpc/http-transport.ts +11 -11
- package/apps/server/src/rpc/stdio-transport.ts +3 -3
- package/apps/server/src/run-preparation-input.ts +5 -5
- package/apps/server/src/run-preparation.ts +24 -24
- package/apps/server/src/run-transfer.ts +39 -39
- package/apps/server/src/server.ts +48 -48
- package/apps/server/src/settings.ts +1 -1
- package/apps/server/src/startup.ts +3 -3
- package/apps/server/src/title-compactor.ts +9 -9
- package/apps/server/src/title-settings.ts +3 -3
- package/apps/server/src/web-bundles.ts +2 -2
- package/apps/server/src/web-stylesheet.ts +2 -2
- package/apps/web/dist/assets/{highlighted-body-KPVGNVTW-BO4wLQtE.js → highlighted-body-KPVGNVTW-CpPi6QLr.js} +1 -1
- package/apps/web/dist/assets/main-DJmCHGzM.js +11 -0
- package/apps/web/dist/assets/mermaid-HWGCJPDP-q-mf1kLN.js +608 -0
- package/apps/web/dist/assets/runPanel-nk_aMxSn.js +21 -0
- package/apps/web/dist/help/guide-access.html +5 -5
- package/apps/web/dist/help/guide-access.md +2 -2
- package/apps/web/dist/help/guide-clients.html +53 -54
- package/apps/web/dist/help/guide-clients.md +50 -51
- package/apps/web/dist/help/guide-distributed.html +12 -7
- package/apps/web/dist/help/guide-distributed.md +9 -4
- package/apps/web/dist/help/guide-functions.html +3 -3
- package/apps/web/dist/help/guide-getting-started.html +24 -15
- package/apps/web/dist/help/guide-getting-started.md +22 -12
- package/apps/web/dist/help/guide-ideas.html +3 -3
- package/apps/web/dist/help/guide-plugins.html +5 -4
- package/apps/web/dist/help/guide-plugins.md +2 -1
- package/apps/web/dist/help/guide-programs.html +3 -3
- package/apps/web/dist/help/guide-runtime.html +6 -6
- package/apps/web/dist/help/guide-runtime.md +3 -3
- package/apps/web/dist/help/guide.html +3 -3
- package/apps/web/dist/help/index.html +196 -144
- package/apps/web/dist/help/mini-app.css +6 -0
- package/apps/web/dist/help/mini-app.js +14 -14
- package/apps/web/dist/host-web.json +91 -91
- package/apps/web/dist/index.html +3 -3
- package/apps/web/dist/run-panel.html +3 -3
- package/apps/web/package.json +1 -1
- package/apps/web/src/AccessContext.tsx +15 -15
- package/apps/web/src/App.tsx +13 -13
- package/apps/web/src/DiffCode.tsx +2 -2
- package/apps/web/src/HelpDialog.tsx +3 -3
- package/apps/web/src/Overview.tsx +13 -13
- package/apps/web/src/PluginActivation.ts +1 -1
- package/apps/web/src/PluginChat.tsx +15 -15
- package/apps/web/src/PluginFailureNotice.tsx +1 -1
- package/apps/web/src/PluginRegistry.tsx +44 -44
- package/apps/web/src/RunPreparationChat.tsx +11 -11
- package/apps/web/src/RunStore.ts +1 -1
- package/apps/web/src/SessionList.tsx +14 -14
- package/apps/web/src/SettingsModal.tsx +112 -112
- package/apps/web/src/StartOptions.tsx +11 -11
- package/apps/web/src/StartSelection.tsx +11 -11
- package/apps/web/src/StartTiles.tsx +8 -8
- package/apps/web/src/SurfaceShortcuts.tsx +3 -3
- package/apps/web/src/ThemeSettings.tsx +8 -8
- package/apps/web/src/TitleModelSettings.tsx +13 -13
- package/apps/web/src/WorkspacePanel.tsx +9 -9
- package/apps/web/src/access-session.ts +4 -4
- package/apps/web/src/access-token.ts +5 -5
- package/apps/web/src/actor-conversation.ts +3 -3
- package/apps/web/src/actor-programs/client-ui/DataTable.tsx +8 -8
- package/apps/web/src/actor-programs/client-ui/FilePicker.tsx +4 -4
- package/apps/web/src/actor-programs/client-ui/FlowDiagram.tsx +13 -13
- package/apps/web/src/actor-programs/client-ui/Viewers.tsx +4 -4
- package/apps/web/src/actor-programs/client-ui/WorkflowDiagram.tsx +1 -1
- package/apps/web/src/actor-programs/client-ui/file-contracts.d.ts +4 -4
- package/apps/web/src/actor-programs/client-ui/file-selection.ts +1 -1
- package/apps/web/src/actor-programs/client-ui/viewer-contracts.d.ts +3 -3
- package/apps/web/src/api.ts +7 -7
- package/apps/web/src/chat/QuasselHost.tsx +1 -1
- package/apps/web/src/chat/StoppedActorNotice.tsx +5 -5
- package/apps/web/src/chat/chat-target.ts +3 -3
- package/apps/web/src/chat/requests.ts +2 -2
- package/apps/web/src/chat/useAttachmentCapabilities.ts +2 -2
- package/apps/web/src/chat-view-settings.tsx +5 -6
- package/apps/web/src/diff-view.css +1 -1
- package/apps/web/src/highlighting.css +1 -1
- package/apps/web/src/language-server/language-server-plugin.tsx +30 -30
- package/apps/web/src/lib/labels.ts +6 -6
- package/apps/web/src/main.tsx +4 -4
- package/apps/web/src/offered-machines.ts +2 -2
- package/apps/web/src/page-opener.tsx +1 -1
- package/apps/web/src/panel/ConnectionsPage.tsx +23 -23
- package/apps/web/src/panel/LoginForm.tsx +6 -6
- package/apps/web/src/panel/PanelDialogs.tsx +22 -22
- package/apps/web/src/panel/PanelHeader.tsx +2 -2
- package/apps/web/src/panel/PanelPage.tsx +1 -1
- package/apps/web/src/panel/RunLine.tsx +4 -4
- package/apps/web/src/panel/RunsPage.tsx +15 -15
- package/apps/web/src/panel/StartPage.tsx +26 -26
- package/apps/web/src/panel/connection-state.ts +9 -9
- package/apps/web/src/panel/contract.ts +28 -28
- package/apps/web/src/panel.tsx +1 -1
- package/apps/web/src/plugin-bootstrap.ts +5 -5
- package/apps/web/src/product/ModelControl.tsx +3 -3
- package/apps/web/src/product/ProductModelSettings.tsx +16 -16
- package/apps/web/src/product/SystemPromptControl.tsx +11 -11
- package/apps/web/src/product/model-settings.ts +2 -2
- package/apps/web/src/rpc/client.ts +16 -16
- package/apps/web/src/rpc.ts +1 -1
- package/apps/web/src/run-overview.ts +1 -1
- package/apps/web/src/run-panel/RunPanelApp.tsx +39 -39
- package/apps/web/src/run-panel/RunPanelHeader.tsx +6 -6
- package/apps/web/src/run-panel/RunPanelMenu.tsx +6 -6
- package/apps/web/src/run-panel/RunPanelRail.tsx +4 -4
- package/apps/web/src/run-panel/RunPanelWorkspace.tsx +3 -3
- package/apps/web/src/run-panel/clipboard.ts +3 -3
- package/apps/web/src/run-panel/host-contract.ts +5 -5
- package/apps/web/src/run-panel/host.ts +15 -15
- package/apps/web/src/run-panel/input-bridge.ts +1 -1
- package/apps/web/src/run-panel/run-panel-location.ts +5 -5
- package/apps/web/src/run-panel/use-session-list.ts +1 -1
- package/apps/web/src/run-panel/workspace-state.ts +3 -3
- package/apps/web/src/run-panel.tsx +4 -4
- package/apps/web/src/run-preparation.ts +2 -2
- package/apps/web/src/run-view.ts +3 -3
- package/apps/web/src/settings-contributions.ts +32 -32
- package/apps/web/src/theme.ts +9 -9
- package/apps/web/src/title-model-settings.ts +6 -6
- package/apps/web/src/ui/ListDetail.tsx +9 -9
- package/apps/web/src/ui/dialog.tsx +2 -2
- package/apps/web/src/ui/modal-controller.ts +3 -3
- package/apps/web/src/ui/modal.tsx +2 -2
- package/apps/web/src/ui/popover.tsx +1 -1
- package/apps/web/src/ui/relative-time.ts +8 -8
- package/apps/web/src/ui/startup-notice.tsx +2 -2
- package/apps/web/src/ui/state-icon.tsx +1 -1
- package/apps/web/src/ui/state-vocabulary.ts +16 -16
- package/apps/web/src/ui/stop-button.tsx +2 -2
- package/bundles/ragents.activity/ragents-bundle.json +3 -3
- package/bundles/ragents.activity/web/classes.json +1 -1
- package/bundles/ragents.activity/web/index.js +1 -1
- package/bundles/ragents.activity/web/index.js.map +2 -2
- package/bundles/ragents.actor-programs/ragents-bundle.json +3 -3
- package/bundles/ragents.actor-programs/server/index.js +225 -225
- package/bundles/ragents.actor-programs/server/index.js.map +2 -2
- package/bundles/ragents.actor-programs/web/classes.json +1 -1
- package/bundles/ragents.actor-programs/web/index.js +1 -1
- package/bundles/ragents.actor-programs/web/index.js.map +3 -3
- package/bundles/ragents.ask/ragents-bundle.json +3 -3
- package/bundles/ragents.ask/server/chunks/{chunk-PDJO75SQ.js → chunk-YOV27MAR.js} +2 -2
- package/bundles/ragents.ask/server/chunks/chunk-YOV27MAR.js.map +7 -0
- package/bundles/ragents.ask/server/exports/server/contract.js +1 -1
- package/bundles/ragents.ask/server/index.js +23 -23
- package/bundles/ragents.ask/server/index.js.map +2 -2
- package/bundles/ragents.ask/web/chunks/{chunk-WFN4374U.js → chunk-D6NNB5DS.js} +1 -1
- package/bundles/ragents.ask/web/chunks/chunk-D6NNB5DS.js.map +7 -0
- package/bundles/ragents.ask/web/chunks/{chunk-MBRPS477.js → chunk-IQBHK7MV.js} +2 -2
- package/bundles/ragents.ask/web/chunks/{chunk-MBRPS477.js.map → chunk-IQBHK7MV.js.map} +3 -3
- package/bundles/ragents.ask/web/chunks/chunk-PWFIAMX4.js +2 -0
- package/bundles/ragents.ask/web/chunks/chunk-PWFIAMX4.js.map +7 -0
- package/bundles/ragents.ask/web/chunks/chunk-QHGKEESD.js +2 -0
- package/bundles/ragents.ask/web/chunks/chunk-QHGKEESD.js.map +7 -0
- package/bundles/ragents.ask/web/classes.json +1 -1
- package/bundles/ragents.ask/web/exports/ask-payload.js +1 -1
- package/bundles/ragents.ask/web/exports/web/QuestionCard.js +1 -1
- package/bundles/ragents.ask/web/exports/web/api.js +1 -1
- package/bundles/ragents.ask/web/index.js +1 -1
- package/bundles/ragents.ask/web/index.js.map +2 -2
- package/bundles/ragents.browser/executor/index.mjs +35 -35
- package/bundles/ragents.browser/executor/index.mjs.map +2 -2
- package/bundles/ragents.browser/ragents-bundle.json +3 -3
- package/bundles/ragents.browser/server/chunks/{chunk-CWLX4VA5.js → chunk-PYEISBNE.js} +1 -1
- package/bundles/ragents.browser/server/chunks/{chunk-CWLX4VA5.js.map → chunk-PYEISBNE.js.map} +1 -1
- package/bundles/ragents.browser/server/exports/server/contract.js +1 -1
- package/bundles/ragents.browser/server/index.js +31 -31
- package/bundles/ragents.browser/server/index.js.map +2 -2
- package/bundles/ragents.browser/skills/browser-testing/SKILL.md +30 -30
- package/bundles/ragents.documents/prompt.hbs +1 -1
- package/bundles/ragents.documents/ragents-bundle.json +3 -3
- package/bundles/ragents.documents/server/chunks/{chunk-QIECRZ7C.js → chunk-KMZWOVTI.js} +3 -3
- package/bundles/ragents.documents/server/chunks/{chunk-QIECRZ7C.js.map → chunk-KMZWOVTI.js.map} +2 -2
- package/bundles/ragents.documents/server/exports/contract.js +1 -1
- package/bundles/ragents.documents/server/index.js +26 -26
- package/bundles/ragents.documents/server/index.js.map +2 -2
- package/bundles/ragents.documents/web/classes.json +1 -1
- package/bundles/ragents.documents/web/index.js +1 -1
- package/bundles/ragents.documents/web/index.js.map +3 -3
- package/bundles/ragents.lsp-fsharp/executor/index.mjs +4 -4
- package/bundles/ragents.lsp-fsharp/executor/index.mjs.map +2 -2
- package/bundles/ragents.lsp-fsharp/ragents-bundle.json +3 -3
- package/bundles/ragents.lsp-fsharp/server/index.js +5 -5
- package/bundles/ragents.lsp-fsharp/server/index.js.map +2 -2
- package/bundles/ragents.lsp-fsharp/web/index.js +1 -1
- package/bundles/ragents.lsp-fsharp/web/index.js.map +2 -2
- package/bundles/ragents.lsp-roslyn/executor/index.mjs +3 -3
- package/bundles/ragents.lsp-roslyn/executor/index.mjs.map +2 -2
- package/bundles/ragents.lsp-roslyn/ragents-bundle.json +3 -3
- package/bundles/ragents.lsp-roslyn/server/index.js +17 -17
- package/bundles/ragents.lsp-roslyn/server/index.js.map +2 -2
- package/bundles/ragents.lsp-roslyn/web/index.js +1 -1
- package/bundles/ragents.lsp-roslyn/web/index.js.map +2 -2
- package/bundles/ragents.lsp-typescript/executor/index.mjs +2 -2
- package/bundles/ragents.lsp-typescript/executor/index.mjs.map +2 -2
- package/bundles/ragents.lsp-typescript/ragents-bundle.json +3 -3
- package/bundles/ragents.lsp-typescript/server/index.js.map +1 -1
- package/bundles/ragents.lsp-typescript/web/index.js +1 -1
- package/bundles/ragents.lsp-typescript/web/index.js.map +2 -2
- package/bundles/ragents.model-relay/ragents-bundle.json +8 -4
- package/bundles/ragents.model-relay/server/index.js +25 -21
- package/bundles/ragents.model-relay/server/index.js.map +2 -2
- package/bundles/ragents.orchestration/ragents-bundle.json +3 -3
- package/bundles/ragents.orchestration/server/index.js +28 -28
- package/bundles/ragents.orchestration/server/index.js.map +2 -2
- package/bundles/ragents.orchestration/web/chunks/{chunk-OSKPH6SZ.js → chunk-CFMJD5ZI.js} +2 -2
- package/bundles/ragents.orchestration/web/chunks/chunk-HOBLI364.js +2 -0
- package/bundles/ragents.orchestration/web/chunks/{chunk-OQYCNYXN.js.map → chunk-HOBLI364.js.map} +2 -2
- package/bundles/ragents.orchestration/web/chunks/{chunk-ODMMQGX2.js → chunk-UCIMT2R4.js} +2 -2
- package/bundles/ragents.orchestration/web/classes.json +1 -1
- package/bundles/ragents.orchestration/web/exports/web/program-slot.js +1 -1
- package/bundles/ragents.orchestration/web/exports/web/surface-entities.js +1 -1
- package/bundles/ragents.orchestration/web/index.js +8 -8
- package/bundles/ragents.orchestration/web/index.js.map +2 -2
- package/bundles/ragents.overseer/ragents-bundle.json +3 -3
- package/bundles/ragents.overseer/server/index.js +98 -98
- package/bundles/ragents.overseer/server/index.js.map +2 -2
- package/bundles/ragents.overseer/web/classes.json +1 -1
- package/bundles/ragents.overseer/web/index.js +1 -1
- package/bundles/ragents.overseer/web/index.js.map +2 -2
- package/bundles/ragents.processes/ragents-bundle.json +3 -3
- package/bundles/ragents.processes/server/index.js +11 -11
- package/bundles/ragents.processes/server/index.js.map +2 -2
- package/bundles/ragents.processes/web/classes.json +1 -1
- package/bundles/ragents.processes/web/index.js +3 -3
- package/bundles/ragents.processes/web/index.js.map +2 -2
- package/bundles/ragents.product/ragents-bundle.json +3 -3
- package/bundles/ragents.product/server/index.js +12 -13
- package/bundles/ragents.product/server/index.js.map +2 -2
- package/bundles/ragents.product/web/classes.json +1 -1
- package/bundles/ragents.product/web/index.js +1 -1
- package/bundles/ragents.product/web/index.js.map +2 -2
- package/bundles/ragents.profile-distribution/ragents-bundle.json +3 -3
- package/bundles/ragents.profile-distribution/server/index.js +31 -31
- package/bundles/ragents.profile-distribution/server/index.js.map +2 -2
- package/bundles/ragents.reference/ragents-bundle.json +3 -3
- package/bundles/ragents.reference/run-scripts/balcony-wizard/RUN.md +19 -19
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +2 -2
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +14 -14
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +2 -2
- package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +49 -49
- package/bundles/ragents.reference/run-scripts/balcony-wizard/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/balcony-wizard/src/server.ts +9 -9
- package/bundles/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +9 -9
- package/bundles/ragents.reference/run-scripts/conversation-circle/RUN.md +7 -7
- package/bundles/ragents.reference/run-scripts/conversation-circle/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/conversation-circle/src/server.ts +13 -13
- package/bundles/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +1 -1
- package/bundles/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +8 -8
- package/bundles/ragents.reference/run-scripts/learning-afternoon/RUN.md +16 -16
- package/bundles/ragents.reference/run-scripts/learning-afternoon/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -1
- package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +3 -3
- package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -1
- package/bundles/ragents.reference/run-scripts/learning-afternoon/src/server.ts +9 -9
- package/bundles/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +39 -39
- package/bundles/ragents.reference/run-scripts/moderated-round/RUN.md +7 -7
- package/bundles/ragents.reference/run-scripts/moderated-round/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/moderated-round/src/server.ts +9 -9
- package/bundles/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +1 -1
- package/bundles/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +6 -6
- package/bundles/ragents.reference/run-scripts/shared-actor-list/RUN.md +12 -12
- package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +2 -2
- package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +3 -3
- package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +4 -4
- package/bundles/ragents.reference/run-scripts/shared-actor-list/package.json +1 -1
- package/bundles/ragents.reference/run-scripts/shared-actor-list/src/server.ts +11 -11
- package/bundles/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +1 -1
- package/bundles/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +13 -13
- package/bundles/ragents.reference/run-scripts/word-game/RUN.md +18 -18
- package/bundles/ragents.reference/run-scripts/word-game/package.json +2 -2
- package/bundles/ragents.reference/run-scripts/word-game/src/client.tsx +1 -1
- package/bundles/ragents.reference/run-scripts/word-game/src/contract.ts +2 -2
- package/bundles/ragents.reference/run-scripts/word-game/src/server.ts +16 -16
- package/bundles/ragents.reference/run-scripts/word-game/tests/program.test.ts +39 -39
- package/bundles/ragents.reference/skills/100-shared-actor-list/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/110-all-card-slots/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/150-editorial-workbench/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/160-learning-companion/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/170-photo-collection/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/180-decision-workbench/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/190-review-queue/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/20-circle-of-four/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/210-moderator-handover/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/220-actor-approval-list/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/230-shared-state-views/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/240-live-result-list/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/250-balcony-wizard/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/35-actor-input-fifo/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/40-subscription-matrix/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/50-subscription-removal/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/70-headless-counter/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/75-lsp-demo/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/80-actor-text-analysis/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/90-actor-notes/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/95-hello-world/SKILL.md +5 -5
- package/bundles/ragents.reference/skills/decision-brief/SKILL.md +24 -24
- package/bundles/ragents.reference/skills/learning-sprint/SKILL.md +24 -24
- package/bundles/ragents.reference/web/classes.json +1 -1
- package/bundles/ragents.reference/web/index.js +1 -1
- package/bundles/ragents.reference/web/index.js.map +2 -2
- package/bundles/ragents.todo/ragents-bundle.json +3 -3
- package/bundles/ragents.todo/server/index.js +5 -8
- package/bundles/ragents.todo/server/index.js.map +2 -2
- package/bundles/ragents.todo/web/classes.json +1 -1
- package/bundles/ragents.todo/web/index.js +1 -1
- package/bundles/ragents.todo/web/index.js.map +2 -2
- package/bundles/ragents.transcript/ragents-bundle.json +3 -3
- package/bundles/ragents.transcript/server/index.js +11 -11
- package/bundles/ragents.transcript/server/index.js.map +2 -2
- package/bundles/ragents.watch/ragents-bundle.json +3 -3
- package/bundles/ragents.watch/server/index.js +48 -48
- package/bundles/ragents.watch/server/index.js.map +2 -2
- package/bundles/ragents.workspace/ragents-bundle.json +3 -3
- package/bundles/ragents.workspace/server/index.js +83 -83
- package/bundles/ragents.workspace/server/index.js.map +2 -2
- package/bundles/ragents.workspace/web/classes.json +1 -1
- package/bundles/ragents.workspace/web/index.js +1 -1
- package/bundles/ragents.workspace/web/index.js.map +2 -2
- package/package.json +4 -4
- package/packages/agent/dist/core/model-runtime.d.ts +7 -2
- package/packages/agent/dist/index.d.ts +1 -1
- package/packages/agent/dist/loop/agent-loop.d.ts +2 -2
- package/packages/agent/src/core/compaction/utils.ts +1 -1
- package/packages/agent/src/core/model-runtime.ts +45 -5
- package/packages/agent/src/index.ts +1 -1
- package/packages/agent/src/loop/agent-loop.ts +2 -2
- package/packages/ai/dist/models.d.ts +1 -0
- package/packages/ai/dist/models.generated.d.ts +4544 -983
- package/packages/ai/dist/providers/openrouter.models.d.ts +4544 -983
- package/packages/ai/src/api/ai-sdk.ts +33 -7
- package/packages/ai/src/api-registry.ts +1 -1
- package/packages/ai/src/index.ts +2 -2
- package/packages/ai/src/models.generated.ts +1 -1
- package/packages/ai/src/models.ts +1 -1
- package/packages/ai/src/providers/openrouter.models.ts +3725 -552
- package/packages/ragents/src/access.ts +12 -12
- package/packages/ragents/src/agents/actor-input.ts +33 -33
- package/packages/ragents/src/agents/catalog.ts +1 -1
- package/packages/ragents/src/agents/delivery.ts +17 -17
- package/packages/ragents/src/agents/plugins.ts +1 -1
- package/packages/ragents/src/agents/scheduler.ts +7 -7
- package/packages/ragents/src/agents/schemas.ts +1 -1
- package/packages/ragents/src/agents/tool-orientation.ts +4 -4
- package/packages/ragents/src/agents/tools.ts +20 -20
- package/packages/ragents/src/agents/toolset.ts +5 -5
- package/packages/ragents/src/agents/workspaces.ts +1 -1
- package/packages/ragents/src/domain/events.ts +1 -1
- package/packages/ragents/src/domain/model.ts +5 -5
- package/packages/ragents/src/drivers/agent-runtime.ts +1 -1
- package/packages/ragents/src/drivers/agent-turn.ts +4 -4
- package/packages/ragents/src/drivers/agent.ts +2 -2
- package/packages/ragents/src/drivers/attachments.ts +4 -4
- package/packages/ragents/src/http/contracts.ts +14 -14
- package/packages/ragents/src/http/methods.ts +6 -6
- package/packages/ragents/src/plugin-host.ts +119 -119
- package/packages/ragents/src/plugin-types.ts +16 -16
- package/packages/ragents/src/rpc/contract.ts +5 -5
- package/packages/ragents/src/rpc/contribution.ts +2 -2
- package/packages/ragents/src/rpc/peer.ts +11 -11
- package/packages/ragents/src/rpc/protocol.ts +2 -2
- package/packages/ragents/src/runtime/decisions/turns.ts +1 -1
- package/packages/ragents/src/runtime/journal-storage.ts +1 -1
- package/packages/ragents/src/runtime/journal.ts +10 -10
- package/packages/ragents/src/runtime/orchestration.ts +8 -8
- package/packages/ragents/src/runtime/stop.ts +2 -2
- package/packages/ragents/src/script/mediators.ts +35 -35
- package/packages/ragents/src/typescript/async-compiler.ts +14 -14
- package/packages/ragents/src/typescript/compiler-worker.ts +2 -2
- package/packages/ragents/src/typescript/compiler.ts +7 -7
- package/packages/ragents/src/typescript/snippet.ts +5 -5
- package/packages/workspace-executor/src/bash-launch.ts +13 -13
- package/packages/workspace-executor/src/commands.ts +18 -18
- package/packages/workspace-executor/src/context.ts +15 -15
- package/packages/workspace-executor/src/contributions.ts +44 -44
- package/packages/workspace-executor/src/errors.ts +1 -1
- package/packages/workspace-executor/src/executor.ts +16 -16
- package/packages/workspace-executor/src/files.ts +31 -31
- package/packages/workspace-executor/src/index.ts +1 -1
- package/packages/workspace-executor/src/language-server/contract.ts +2 -2
- package/packages/workspace-executor/src/language-server/diagnostics.ts +4 -4
- package/packages/workspace-executor/src/language-server/host.ts +36 -36
- package/packages/workspace-executor/src/language-server/json-rpc.ts +4 -4
- package/packages/workspace-executor/src/language-server/module.ts +11 -11
- package/packages/workspace-executor/src/language-server/roots.ts +3 -3
- package/packages/workspace-executor/src/language-server/session.ts +15 -15
- package/packages/workspace-executor/src/language-server/workspace-solutions.ts +3 -3
- package/packages/workspace-executor/src/managed-process.ts +12 -12
- package/packages/workspace-executor/src/module.ts +8 -8
- package/packages/workspace-executor/src/modules.ts +3 -3
- package/packages/workspace-executor/src/paths.ts +11 -11
- package/packages/workspace-executor/src/process-sandbox.ts +3 -3
- package/packages/workspace-executor/src/processes/module.ts +3 -3
- package/packages/workspace-executor/src/processes/process-table.ts +20 -20
- package/packages/workspace-executor/src/processes/scanner.ts +3 -3
- package/packages/workspace-executor/src/processes/snapshot.ts +2 -2
- package/packages/workspace-executor/src/processes/terminator.ts +13 -13
- package/packages/workspace-executor/src/run-folders.ts +3 -3
- package/packages/workspace-executor/src/safe-environment.ts +4 -4
- package/packages/workspace-executor/src/sandbox-tools.ts +28 -28
- package/packages/workspace-executor/src/session-ident.ts +2 -2
- package/packages/workspace-executor/src/shell-platform.ts +2 -2
- package/packages/workspace-executor/src/tools.ts +5 -5
- package/plugins/ragents.activity/web/ActivityHeader.tsx +3 -3
- package/plugins/ragents.activity/web/activity.ts +2 -2
- package/plugins/ragents.actor-programs/server/access-projections.ts +1 -1
- package/plugins/ragents.actor-programs/server/agent-tools.ts +2 -2
- package/plugins/ragents.actor-programs/server/capability-resolver.ts +3 -3
- package/plugins/ragents.actor-programs/server/controls-template.ts +46 -46
- package/plugins/ragents.actor-programs/server/controls-tool.ts +4 -4
- package/plugins/ragents.actor-programs/server/limits.ts +3 -3
- package/plugins/ragents.actor-programs/server/methods.ts +1 -1
- package/plugins/ragents.actor-programs/server/project-diagnostics.ts +8 -8
- package/plugins/ragents.actor-programs/server/routes.ts +8 -8
- package/plugins/ragents.actor-programs/server/runtime.ts +90 -90
- package/plugins/ragents.actor-programs/server/templates.ts +59 -59
- package/plugins/ragents.actor-programs/server/test-report.ts +5 -5
- package/plugins/ragents.actor-programs/server/tool-contributor.ts +1 -1
- package/plugins/ragents.actor-programs/web/ActorViewFrame.tsx +17 -17
- package/plugins/ragents.actor-programs/web/AppsPanel.tsx +26 -26
- package/plugins/ragents.actor-programs/web/EmbeddedApps.tsx +3 -3
- package/plugins/ragents.actor-programs/web/FullscreenHost.tsx +2 -2
- package/plugins/ragents.actor-programs/web/FunctionForm.tsx +16 -16
- package/plugins/ragents.actor-programs/web/ProgramSource.tsx +5 -5
- package/plugins/ragents.actor-programs/web/api.ts +36 -36
- package/plugins/ragents.actor-programs/web/bridge.ts +8 -8
- package/plugins/ragents.actor-programs/web/chat-state.ts +4 -4
- package/plugins/ragents.actor-programs/web/context.ts +1 -1
- package/plugins/ragents.actor-programs/web/function-input.ts +6 -6
- package/plugins/ragents.actor-programs/web/index.tsx +1 -1
- package/plugins/ragents.actor-programs/web/program-state.ts +4 -4
- package/plugins/ragents.ask/ask-payload.ts +1 -1
- package/plugins/ragents.ask/contract.ts +5 -5
- package/plugins/ragents.ask/server/answer-method.ts +1 -1
- package/plugins/ragents.ask/server/ask-service.ts +9 -9
- package/plugins/ragents.ask/server/ask-tool.ts +10 -10
- package/plugins/ragents.ask/server/contract.ts +5 -5
- package/plugins/ragents.ask/web/AskActionView.tsx +1 -1
- package/plugins/ragents.ask/web/QuestionCard.tsx +22 -22
- package/plugins/ragents.ask/web/index.tsx +2 -2
- package/plugins/ragents.browser/executor/contract.ts +6 -6
- package/plugins/ragents.browser/executor/index.ts +1 -1
- package/plugins/ragents.browser/executor/module.ts +6 -6
- package/plugins/ragents.browser/executor/pages.ts +32 -32
- package/plugins/ragents.browser/executor/playwright.ts +8 -8
- package/plugins/ragents.browser/provision.ts +7 -7
- package/plugins/ragents.browser/server/browser.ts +14 -14
- package/plugins/ragents.browser/server/contract.ts +1 -1
- package/plugins/ragents.browser/server/index.ts +1 -1
- package/plugins/ragents.browser/server/tools.ts +14 -14
- package/plugins/ragents.browser/skills/browser-testing/SKILL.md +30 -30
- package/plugins/ragents.documents/contract.ts +2 -2
- package/plugins/ragents.documents/prompt.hbs +1 -1
- package/plugins/ragents.documents/server/document-write-tool.ts +12 -12
- package/plugins/ragents.documents/server/files-route.ts +6 -6
- package/plugins/ragents.documents/server/show-document-tool.ts +26 -26
- package/plugins/ragents.documents/server/store.ts +1 -1
- package/plugins/ragents.documents/web/DocumentViewer.tsx +37 -37
- package/plugins/ragents.documents/web/index.tsx +11 -11
- package/plugins/ragents.lsp-fsharp/executor.ts +7 -7
- package/plugins/ragents.lsp-fsharp/provision.ts +7 -7
- package/plugins/ragents.lsp-roslyn/executor.ts +5 -5
- package/plugins/ragents.lsp-roslyn/provision.ts +4 -4
- package/plugins/ragents.lsp-roslyn/server/index.ts +5 -5
- package/plugins/ragents.lsp-roslyn/server/solution-on-start.ts +13 -13
- package/plugins/ragents.lsp-typescript/executor.ts +3 -3
- package/plugins/ragents.model-relay/server/config.ts +6 -2
- package/plugins/ragents.model-relay/server/index.ts +2 -2
- package/plugins/ragents.model-relay/server/relay.ts +23 -22
- package/plugins/ragents.orchestration/contract.ts +8 -8
- package/plugins/ragents.orchestration/server/index.ts +4 -4
- package/plugins/ragents.orchestration/server/run-stop-tool.ts +3 -3
- package/plugins/ragents.orchestration/server/surface-tool.ts +5 -5
- package/plugins/ragents.orchestration/tiled-layout.ts +11 -11
- package/plugins/ragents.orchestration/web/ActorChat.tsx +3 -3
- package/plugins/ragents.orchestration/web/ActorChatControls.tsx +4 -5
- package/plugins/ragents.orchestration/web/ActorChatPreview.tsx +1 -1
- package/plugins/ragents.orchestration/web/ActorPopout.tsx +1 -1
- package/plugins/ragents.orchestration/web/ActorShortcut.tsx +6 -6
- package/plugins/ragents.orchestration/web/ActorSurfaceControls.tsx +15 -15
- package/plugins/ragents.orchestration/web/Center.tsx +5 -5
- package/plugins/ragents.orchestration/web/DocumentsSection.tsx +2 -2
- package/plugins/ragents.orchestration/web/ExecutionsPanel.tsx +15 -15
- package/plugins/ragents.orchestration/web/FlowInspector.tsx +103 -103
- package/plugins/ragents.orchestration/web/JournalStatus.tsx +11 -11
- package/plugins/ragents.orchestration/web/MaterialBody.tsx +2 -2
- package/plugins/ragents.orchestration/web/StopRunButton.tsx +6 -6
- package/plugins/ragents.orchestration/web/TiledSurface.tsx +9 -9
- package/plugins/ragents.orchestration/web/actor-header-settings.ts +5 -5
- package/plugins/ragents.orchestration/web/constants.ts +2 -2
- package/plugins/ragents.orchestration/web/executions.ts +6 -6
- package/plugins/ragents.orchestration/web/format.ts +1 -1
- package/plugins/ragents.orchestration/web/index.tsx +2 -2
- package/plugins/ragents.orchestration/web/run-panel/AddresseeControl.tsx +7 -7
- package/plugins/ragents.orchestration/web/run-panel/AddresseeTree.tsx +8 -8
- package/plugins/ragents.orchestration/web/run-panel/RunPanel.tsx +22 -22
- package/plugins/ragents.orchestration/web/run-panel/RunPanelSettings.tsx +7 -7
- package/plugins/ragents.orchestration/web/run-panel/addressee-tree.ts +13 -13
- package/plugins/ragents.orchestration/web/run-panel/run-panel-actors.ts +3 -3
- package/plugins/ragents.orchestration/web/run-panel/run-panel-settings.ts +2 -2
- package/plugins/ragents.orchestration/web/run-panel/run-panel-startup.ts +3 -3
- package/plugins/ragents.orchestration/web/run-panel/run-panel-state.ts +7 -7
- package/plugins/ragents.orchestration/web/run-panel/sheet-status.ts +9 -9
- package/plugins/ragents.orchestration/web/surface-startup.ts +8 -8
- package/plugins/ragents.orchestration/web/surface-view-settings.ts +1 -1
- package/plugins/ragents.orchestration/web/tiled-view-settings.ts +1 -1
- package/plugins/ragents.overseer/contract.ts +20 -20
- package/plugins/ragents.overseer/server/api.ts +6 -6
- package/plugins/ragents.overseer/server/coordinator-prompt.ts +10 -10
- package/plugins/ragents.overseer/server/coordinator.ts +4 -4
- package/plugins/ragents.overseer/server/index.ts +24 -24
- package/plugins/ragents.overseer/server/orientation.ts +8 -8
- package/plugins/ragents.overseer/server/quick-answer.ts +9 -9
- package/plugins/ragents.overseer/server/run-directory.ts +5 -5
- package/plugins/ragents.overseer/server/settings.ts +6 -6
- package/plugins/ragents.overseer/server/user-location.ts +16 -16
- package/plugins/ragents.overseer/web/ModelSettings.tsx +9 -9
- package/plugins/ragents.overseer/web/index.tsx +20 -20
- package/plugins/ragents.overseer/web/model-settings.ts +1 -1
- package/plugins/ragents.overseer/web/quick-answers.ts +2 -2
- package/plugins/ragents.processes/contract.ts +5 -5
- package/plugins/ragents.processes/server/methods.ts +4 -4
- package/plugins/ragents.processes/server/observer.ts +8 -8
- package/plugins/ragents.processes/server/run-processes.ts +2 -2
- package/plugins/ragents.processes/web/ProcessHeader.tsx +10 -10
- package/plugins/ragents.processes/web/processes.ts +10 -10
- package/plugins/ragents.product/server/config.ts +1 -1
- package/plugins/ragents.product/server/index.ts +4 -4
- package/plugins/ragents.product/server/runtime.ts +9 -10
- package/plugins/ragents.product/web/index.tsx +1 -1
- package/plugins/ragents.profile-distribution/contract.ts +10 -10
- package/plugins/ragents.profile-distribution/server/archive.ts +20 -20
- package/plugins/ragents.profile-distribution/server/config.ts +2 -2
- package/plugins/ragents.profile-distribution/server/index.ts +4 -4
- package/plugins/ragents.reference/examples.ts +27 -27
- package/plugins/ragents.reference/run-scripts/balcony-wizard/RUN.md +19 -19
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +2 -2
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +14 -14
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +2 -2
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +49 -49
- package/plugins/ragents.reference/run-scripts/balcony-wizard/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/balcony-wizard/src/server.ts +9 -9
- package/plugins/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +9 -9
- package/plugins/ragents.reference/run-scripts/conversation-circle/RUN.md +7 -7
- package/plugins/ragents.reference/run-scripts/conversation-circle/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/conversation-circle/src/server.ts +13 -13
- package/plugins/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +1 -1
- package/plugins/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +8 -8
- package/plugins/ragents.reference/run-scripts/learning-afternoon/RUN.md +16 -16
- package/plugins/ragents.reference/run-scripts/learning-afternoon/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +3 -3
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -1
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/server.ts +9 -9
- package/plugins/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +39 -39
- package/plugins/ragents.reference/run-scripts/moderated-round/RUN.md +7 -7
- package/plugins/ragents.reference/run-scripts/moderated-round/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/moderated-round/src/server.ts +9 -9
- package/plugins/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +1 -1
- package/plugins/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +6 -6
- package/plugins/ragents.reference/run-scripts/shared-actor-list/RUN.md +12 -12
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +2 -2
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +3 -3
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +4 -4
- package/plugins/ragents.reference/run-scripts/shared-actor-list/package.json +1 -1
- package/plugins/ragents.reference/run-scripts/shared-actor-list/src/server.ts +11 -11
- package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +1 -1
- package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +13 -13
- package/plugins/ragents.reference/run-scripts/word-game/RUN.md +18 -18
- package/plugins/ragents.reference/run-scripts/word-game/package.json +2 -2
- package/plugins/ragents.reference/run-scripts/word-game/src/client.tsx +1 -1
- package/plugins/ragents.reference/run-scripts/word-game/src/contract.ts +2 -2
- package/plugins/ragents.reference/run-scripts/word-game/src/server.ts +16 -16
- package/plugins/ragents.reference/run-scripts/word-game/tests/program.test.ts +39 -39
- package/plugins/ragents.reference/skills/100-shared-actor-list/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/110-all-card-slots/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/150-editorial-workbench/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/160-learning-companion/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/170-photo-collection/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/180-decision-workbench/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/190-review-queue/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/20-circle-of-four/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/210-moderator-handover/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/220-actor-approval-list/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/230-shared-state-views/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/240-live-result-list/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/250-balcony-wizard/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/35-actor-input-fifo/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/40-subscription-matrix/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/50-subscription-removal/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/70-headless-counter/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/75-lsp-demo/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/80-actor-text-analysis/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/90-actor-notes/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/95-hello-world/SKILL.md +5 -5
- package/plugins/ragents.reference/skills/decision-brief/SKILL.md +24 -24
- package/plugins/ragents.reference/skills/learning-sprint/SKILL.md +24 -24
- package/plugins/ragents.reference/walkthroughs.ts +128 -128
- package/plugins/ragents.reference/web/StartGuides.tsx +23 -23
- package/plugins/ragents.todo/contract.ts +0 -3
- package/plugins/ragents.todo/server/todo-tool.ts +6 -6
- package/plugins/ragents.todo/web/TodoSection.tsx +1 -1
- package/plugins/ragents.transcript/server/transcript.ts +11 -11
- package/plugins/ragents.watch/server/condition.ts +4 -4
- package/plugins/ragents.watch/server/functions.ts +27 -27
- package/plugins/ragents.watch/server/observation.ts +2 -2
- package/plugins/ragents.watch/server/service.ts +14 -14
- package/plugins/ragents.workspace/client/transport.ts +1 -1
- package/plugins/ragents.workspace/client/workspace-client.ts +63 -63
- package/plugins/ragents.workspace/contract.ts +46 -46
- package/plugins/ragents.workspace/server/binding.ts +20 -20
- package/plugins/ragents.workspace/server/browse-route.ts +8 -8
- package/plugins/ragents.workspace/server/clients.ts +50 -50
- package/plugins/ragents.workspace/server/config.ts +7 -7
- package/plugins/ragents.workspace/server/index.ts +3 -3
- package/plugins/ragents.workspace/server/runtime.ts +26 -26
- package/plugins/ragents.workspace/server/shell-platform.ts +1 -1
- package/plugins/ragents.workspace/web/FileBrowser.tsx +10 -10
- package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +24 -24
- package/plugins/ragents.workspace/web/index.tsx +1 -1
- package/ragents.config.core.ts +1 -1
- package/ragents.config.developer.ts +3 -3
- package/ragents.config.showcase.ts +2 -2
- package/scripts/agent/agent-cli.ts +96 -96
- package/scripts/agent/journal.ts +5 -5
- package/scripts/agent/turn-control.ts +4 -4
- package/scripts/package/build-package.ts +31 -31
- package/scripts/package/host-links.mjs +3 -3
- package/scripts/package/publish-package.ts +29 -29
- package/scripts/package/ragents.mjs +19 -19
- package/scripts/plugin/build-builtin-plugins.ts +5 -5
- package/scripts/plugin/plugin-cli.ts +14 -14
- package/scripts/provision/run-provision.ts +14 -15
- package/scripts/remote/connect.ts +49 -49
- package/scripts/remote/start.ts +18 -18
- package/scripts/workspace-client/run-workspace-client.ts +23 -23
- package/apps/web/dist/assets/main-DnnqWHkH.js +0 -11
- package/apps/web/dist/assets/mermaid-HWGCJPDP-BLLeth5_.js +0 -568
- package/apps/web/dist/assets/runPanel-DPm7s3KM.js +0 -21
- package/bundles/ragents.ask/server/chunks/chunk-PDJO75SQ.js.map +0 -7
- package/bundles/ragents.ask/web/chunks/chunk-4VXWWEG7.js +0 -2
- package/bundles/ragents.ask/web/chunks/chunk-4VXWWEG7.js.map +0 -7
- package/bundles/ragents.ask/web/chunks/chunk-VUBJDIKQ.js +0 -2
- package/bundles/ragents.ask/web/chunks/chunk-VUBJDIKQ.js.map +0 -7
- package/bundles/ragents.ask/web/chunks/chunk-WFN4374U.js.map +0 -7
- package/bundles/ragents.orchestration/web/chunks/chunk-OQYCNYXN.js +0 -2
- /package/bundles/ragents.orchestration/web/chunks/{chunk-OSKPH6SZ.js.map → chunk-CFMJD5ZI.js.map} +0 -0
- /package/bundles/ragents.orchestration/web/chunks/{chunk-ODMMQGX2.js.map → chunk-UCIMT2R4.js.map} +0 -0
|
@@ -14,7 +14,7 @@ var agentToolsFrom = (host) => async (runId, actorId, provisional) => {
|
|
|
14
14
|
const view = runtime.view(runId);
|
|
15
15
|
const actor = provisional ?? view.actors.find((candidate) => candidate.id === actorId);
|
|
16
16
|
if (!actor || actor.kind === "human" || actor.lifecycle.kind === "stopped") {
|
|
17
|
-
throw new Error(`${actorId}
|
|
17
|
+
throw new Error(`${actorId} does not denote an active agent in this run.`);
|
|
18
18
|
}
|
|
19
19
|
const registry = new ToolRegistry();
|
|
20
20
|
host.tools.entries().forEach((contributor) => registry.register(contributor));
|
|
@@ -31,7 +31,7 @@ var agentToolsFrom = (host) => async (runId, actorId, provisional) => {
|
|
|
31
31
|
const availableNames = new Set(tools.map((tool) => tool.name));
|
|
32
32
|
const unknown = actor.toolNames.filter((name2) => !availableNames.has(name2));
|
|
33
33
|
if (unknown.length > 0) {
|
|
34
|
-
throw new Error(`Actor ${actorId}
|
|
34
|
+
throw new Error(`Actor ${actorId} requires unknown tools: ${unknown.join(", ")}.`);
|
|
35
35
|
}
|
|
36
36
|
const selected2 = new Set(actor.toolNames);
|
|
37
37
|
return tools.filter((tool) => selected2.has(tool.name));
|
|
@@ -51,7 +51,7 @@ var guarded = (code, status, work) => {
|
|
|
51
51
|
};
|
|
52
52
|
var checkedInput = (input) => {
|
|
53
53
|
if (Buffer.byteLength(JSON.stringify(input ?? null), "utf8") > MAX_INPUT_BYTES)
|
|
54
|
-
throw new DomainError("input-too-large", `
|
|
54
|
+
throw new DomainError("input-too-large", `The action input is larger than ${MAX_INPUT_BYTES} bytes.`, 413);
|
|
55
55
|
return input;
|
|
56
56
|
};
|
|
57
57
|
var createActorProgramMethods = (options) => {
|
|
@@ -112,7 +112,7 @@ var escapeForwarder = `
|
|
|
112
112
|
});`;
|
|
113
113
|
var themeReceiver = `
|
|
114
114
|
const applyHostTheme = (theme) => {
|
|
115
|
-
if (theme !== "light" && theme !== "dark") throw new Error("
|
|
115
|
+
if (theme !== "light" && theme !== "dark") throw new Error("The host theme must be light or dark.");
|
|
116
116
|
document.documentElement.dataset.theme = theme;
|
|
117
117
|
};`;
|
|
118
118
|
var frameContentSecurityPolicy = (nonce) => `sandbox allow-scripts allow-forms allow-downloads; default-src 'none'; script-src 'nonce-${nonce}'; style-src 'nonce-${nonce}'; img-src 'self' data: blob:; font-src data:; connect-src 'none'; media-src 'self' data: blob:; object-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'self' https://*.vscode-cdn.net vscode-file: vscode-webview:`;
|
|
@@ -156,7 +156,7 @@ globalThis.__ragentsAppContext = (() => {
|
|
|
156
156
|
if (!waiter || !terminal.has(message.invocation.status)) return;
|
|
157
157
|
pending.delete(id);
|
|
158
158
|
if (message.invocation.status === "succeeded") waiter.resolve(message.invocation.result);
|
|
159
|
-
else waiter.reject(new Error(message.invocation.error || "
|
|
159
|
+
else waiter.reject(new Error(message.invocation.error || "The app action was not completed."));
|
|
160
160
|
};
|
|
161
161
|
port.onmessage = ({ data }) => {
|
|
162
162
|
if (data?.version !== 1) return;
|
|
@@ -218,7 +218,7 @@ globalThis.__ragentsAppContext = (() => {
|
|
|
218
218
|
);
|
|
219
219
|
}
|
|
220
220
|
return Object.freeze({
|
|
221
|
-
get actor() { if (!currentApp) throw new Error("
|
|
221
|
+
get actor() { if (!currentApp) throw new Error("The actor view is not ready yet."); return Object.freeze({id:currentApp.actorId,handle:currentApp.actorHandle}); },
|
|
222
222
|
ready: ready.then(() => undefined),
|
|
223
223
|
run: Object.freeze({ id: "current" }),
|
|
224
224
|
principal: Object.freeze({ id: "operator", kind: "operator" }),
|
|
@@ -264,7 +264,7 @@ globalThis.__ragentsAppContext = (() => {
|
|
|
264
264
|
call: async (actionId, input = {}) => {
|
|
265
265
|
await ready;
|
|
266
266
|
if (!(currentApp?.actions ?? []).some((action) => action.id === actionId)) {
|
|
267
|
-
throw new Error("
|
|
267
|
+
throw new Error("The requested app action is not installed.");
|
|
268
268
|
}
|
|
269
269
|
return send({
|
|
270
270
|
type: "ragents.app.invoke",
|
|
@@ -280,7 +280,7 @@ globalThis.__ragentsAppContext = (() => {
|
|
|
280
280
|
</script>`;
|
|
281
281
|
var frameHtml = (frame, nonce) => {
|
|
282
282
|
const head = /<head(?:\s[^>]*)?>/i;
|
|
283
|
-
if (!head.test(frame.html)) throw new Error("
|
|
283
|
+
if (!head.test(frame.html)) throw new Error("The installed app has no valid head.");
|
|
284
284
|
const client = `<script nonce="${nonce}" type="module">await globalThis.__ragentsAppContext.ready;${escapedScript(frame.clientJavaScript)}</script>`;
|
|
285
285
|
return frame.html.replace(head, (value) => `${value}${typedBridgeSdk(nonce, `${browserRuntimeStyles}
|
|
286
286
|
${frame.styles}`)}${client}`);
|
|
@@ -292,7 +292,7 @@ var createMiniAppFrameRoutes = (options) => [
|
|
|
292
292
|
matches: (request, url) => request.method === "GET" && framePattern.test(url.pathname),
|
|
293
293
|
handle: async ({ request, response, url }) => {
|
|
294
294
|
const match = url.pathname.match(framePattern);
|
|
295
|
-
if (!match) throw new Error("
|
|
295
|
+
if (!match) throw new Error("Invalid app route.");
|
|
296
296
|
const [, runId, appId] = match;
|
|
297
297
|
await guardedJsonRoute({
|
|
298
298
|
request,
|
|
@@ -339,12 +339,12 @@ var jsonValue = (value, label) => {
|
|
|
339
339
|
assertJsonValue(value, label);
|
|
340
340
|
const text = JSON.stringify(value);
|
|
341
341
|
if (Buffer.byteLength(text, "utf8") > MAX_JSON_BYTES)
|
|
342
|
-
throw new Error(`${label}
|
|
342
|
+
throw new Error(`${label} is larger than ${MAX_JSON_BYTES} bytes.`);
|
|
343
343
|
const pending = [{ value, depth: 0 }];
|
|
344
344
|
while (pending.length > 0) {
|
|
345
345
|
const current = pending.pop();
|
|
346
346
|
if (current.depth > MAX_JSON_DEPTH)
|
|
347
|
-
throw new Error(`${label}
|
|
347
|
+
throw new Error(`${label} is nested deeper than ${MAX_JSON_DEPTH} levels.`);
|
|
348
348
|
if (Array.isArray(current.value)) {
|
|
349
349
|
current.value.forEach((entry) => pending.push({ value: entry, depth: current.depth + 1 }));
|
|
350
350
|
continue;
|
|
@@ -352,7 +352,7 @@ var jsonValue = (value, label) => {
|
|
|
352
352
|
if (current.value && typeof current.value === "object") {
|
|
353
353
|
Object.entries(current.value).forEach(([key, entry]) => {
|
|
354
354
|
if (key.length > MAX_JSON_KEY_LENGTH)
|
|
355
|
-
throw new Error(`${label}
|
|
355
|
+
throw new Error(`${label} contains a key with more than ${MAX_JSON_KEY_LENGTH} characters.`);
|
|
356
356
|
pending.push({ value: entry, depth: current.depth + 1 });
|
|
357
357
|
});
|
|
358
358
|
}
|
|
@@ -376,7 +376,7 @@ var selected = (available2, capabilityIds, idOf, unavailable) => {
|
|
|
376
376
|
const byId = new Map(available2.map((value) => [idOf(value), value]));
|
|
377
377
|
return capabilityIds.map((id) => {
|
|
378
378
|
const value = byId.get(id);
|
|
379
|
-
if (!value) throw unavailable(id, [...byId.keys()].sort().join(", ") || "
|
|
379
|
+
if (!value) throw unavailable(id, [...byId.keys()].sort().join(", ") || "none");
|
|
380
380
|
return value;
|
|
381
381
|
});
|
|
382
382
|
};
|
|
@@ -385,7 +385,7 @@ var operatorCapabilityBinding = (actorId, operations, capabilityIds) => {
|
|
|
385
385
|
operations.filter((operation) => operation.operator !== "unavailable"),
|
|
386
386
|
capabilityIds,
|
|
387
387
|
(operation) => operation.id,
|
|
388
|
-
(id, names) => new Error(`Capability ${id}
|
|
388
|
+
(id, names) => new Error(`Capability ${id} is not available to the operator. Available: ${names}.`)
|
|
389
389
|
);
|
|
390
390
|
const descriptors = resolved.map(descriptorOf);
|
|
391
391
|
return {
|
|
@@ -404,7 +404,7 @@ var agentCapabilityBinding = (actor, tools, capabilityIds, blockedNames) => {
|
|
|
404
404
|
capabilityIds,
|
|
405
405
|
(tool) => tool.name,
|
|
406
406
|
(id, names) => new Error(
|
|
407
|
-
`Capability ${id}
|
|
407
|
+
`Capability ${id} is not available to @${actor.handle}. Available: ${names}.`
|
|
408
408
|
)
|
|
409
409
|
);
|
|
410
410
|
const descriptors = resolved.map((tool) => descriptorOf({ ...tool, id: tool.name }));
|
|
@@ -428,11 +428,11 @@ import { runManagedProcess, sandboxedLaunch } from "@ragents/workspace-executor"
|
|
|
428
428
|
// server/controls-template.ts
|
|
429
429
|
var controlsTemplate = {
|
|
430
430
|
id: "controls",
|
|
431
|
-
title: "UI
|
|
432
|
-
description: "
|
|
431
|
+
title: "Try UI controls",
|
|
432
|
+
description: "Local demo with form, table, files, tasks, flow diagram, SVG connections, messages, document, and diff without function calls.",
|
|
433
433
|
ragents: {
|
|
434
|
-
title: "UI
|
|
435
|
-
description: "
|
|
434
|
+
title: "Try UI controls",
|
|
435
|
+
description: "A local demo of the available mini-app controls. Values and files stay in this view.",
|
|
436
436
|
views: [{ id: "main", client: "src/client.tsx" }]
|
|
437
437
|
},
|
|
438
438
|
files: {
|
|
@@ -443,67 +443,67 @@ import * as UI from "@ragents/client/ui";
|
|
|
443
443
|
type FormValues = Parameters<typeof UI.Form>[0]["values"];
|
|
444
444
|
type Row = { id: string; name: string; count: number };
|
|
445
445
|
const rows: Row[] = [
|
|
446
|
-
{ id: "analysis", name: "
|
|
446
|
+
{ id: "analysis", name: "Analysis", count: 12 },
|
|
447
447
|
{ id: "review", name: "Review", count: 4 },
|
|
448
|
-
{ id: "notes", name: "
|
|
448
|
+
{ id: "notes", name: "Documentation", count: 8 },
|
|
449
449
|
];
|
|
450
450
|
|
|
451
451
|
const App = () => {
|
|
452
|
-
const [values, setValues] = React.useState<FormValues>({ title: "
|
|
452
|
+
const [values, setValues] = React.useState<FormValues>({ title: "Review results", notes: "", count: 3, mode: "review", approved: false });
|
|
453
453
|
const [selected, setSelected] = React.useState<string[]>([]);
|
|
454
454
|
const [files, setFiles] = React.useState<File[]>([]);
|
|
455
|
-
const [result, setResult] = React.useState("
|
|
455
|
+
const [result, setResult] = React.useState("No form values applied yet.");
|
|
456
456
|
const [messages, setMessages] = React.useState<Parameters<typeof UI.MessageList>[0]["messages"]>([
|
|
457
|
-
{ key: "editorial", sender: "
|
|
458
|
-
{ key: "review", sender: "
|
|
457
|
+
{ key: "editorial", sender: "Editorial", text: "The notice should stay **short and clear**." },
|
|
458
|
+
{ key: "review", sender: "Text review", text: "Opening hours and the repair notice are kept." },
|
|
459
459
|
]);
|
|
460
460
|
const [done, setDone] = React.useState(false);
|
|
461
|
-
return <UI.AppLayout title="UI
|
|
461
|
+
return <UI.AppLayout title="Try UI controls" description="Local demo: no agents, uploads, or server actions. Values and file selection stay only in this view and are reset on reload.">
|
|
462
462
|
<UI.Stack gap="large">
|
|
463
|
-
<UI.Form title="
|
|
464
|
-
{ id: "title", label: "
|
|
465
|
-
{ id: "notes", label: "
|
|
466
|
-
{ id: "count", label: "
|
|
467
|
-
{ id: "mode", label: "
|
|
468
|
-
{ id: "approved", label: "
|
|
469
|
-
]} values={values} onChange={setValues} onSubmit={async (next) => { setResult(JSON.stringify(next, null, 2)); }} submitLabel="
|
|
463
|
+
<UI.Form title="Form" fields={[
|
|
464
|
+
{ id: "title", label: "Task", type: "text", placeholder: "What should be worked on?", required: true },
|
|
465
|
+
{ id: "notes", label: "Notes", type: "textarea", rows: 3, placeholder: "What should be taken into account while working on it?", hint: "Multi-line text stays aligned in the form." },
|
|
466
|
+
{ id: "count", label: "Count", type: "number", placeholder: "Number of results", hint: "1 to 10 results.", required: true, min: 1, max: 10 },
|
|
467
|
+
{ id: "mode", label: "Mode", type: "select", options: [{ value: "review", label: "Review" }, { value: "draft", label: "Draft" }] },
|
|
468
|
+
{ id: "approved", label: "Selection confirmed", type: "checkbox", required: true },
|
|
469
|
+
]} values={values} onChange={setValues} onSubmit={async (next) => { setResult(JSON.stringify(next, null, 2)); }} submitLabel="Show values locally" />
|
|
470
470
|
<UI.Stack gap="small">
|
|
471
|
-
<UI.DataTable<Row> title="
|
|
471
|
+
<UI.DataTable<Row> title="Data table" rows={rows} rowKey={(row) => row.id} filterable
|
|
472
472
|
selectedKeys={selected} onSelectionChange={setSelected}
|
|
473
|
-
columns={[{ id: "name", label: "
|
|
474
|
-
actions={[{ id: "select", label: "
|
|
475
|
-
<p aria-live="polite">{selected.length}
|
|
473
|
+
columns={[{ id: "name", label: "Work", value: (row) => row.name, sortable: true }, { id: "count", label: "Results", value: (row) => row.count, sortable: true }]}
|
|
474
|
+
actions={[{ id: "select", label: "Select", onClick: (row) => { setSelected([row.id]); } }]} />
|
|
475
|
+
<p aria-live="polite">{selected.length} rows selected</p>
|
|
476
476
|
</UI.Stack>
|
|
477
|
-
<UI.FilePicker label="
|
|
477
|
+
<UI.FilePicker label="Local file selection" files={files} onChange={setFiles} maxFiles={5} maxBytes={10 * 1024 * 1024} />
|
|
478
478
|
<UI.Stack gap="small">
|
|
479
|
-
<UI.TaskProgress title="
|
|
480
|
-
{ id: "read", label: "
|
|
481
|
-
{ id: "review", label: "
|
|
479
|
+
<UI.TaskProgress title="Example tasks" tasks={[
|
|
480
|
+
{ id: "read", label: "Read documents", status: "done" },
|
|
481
|
+
{ id: "review", label: "Review results", status: done ? "done" : "pending", description: "Local example status, no running actor." },
|
|
482
482
|
]} />
|
|
483
|
-
<UI.Stack direction="row"><UI.Button onClick={() => setDone((current) => !current)}>
|
|
483
|
+
<UI.Stack direction="row"><UI.Button onClick={() => setDone((current) => !current)}>Toggle example status</UI.Button></UI.Stack>
|
|
484
484
|
</UI.Stack>
|
|
485
485
|
<UI.Stack gap="small">
|
|
486
|
-
<h2>
|
|
487
|
-
<p>
|
|
488
|
-
<UI.FlowDiagram label={done ? "
|
|
486
|
+
<h2>Flow diagram</h2>
|
|
487
|
+
<p>The diagram gets its state from the same data as the task list.</p>
|
|
488
|
+
<UI.FlowDiagram label={done ? "Intake, review done, result ready" : "Intake, review running, result pending"}
|
|
489
489
|
nodes={[
|
|
490
|
-
{ id: "input", label: "
|
|
491
|
-
{ id: "check", label: "
|
|
492
|
-
{ id: "result", label: "
|
|
490
|
+
{ id: "input", label: "Intake", detail: "Documents are available", status: "done", kind: "service" },
|
|
491
|
+
{ id: "check", label: "Review", detail: done ? "Review completed" : "Documents are being reviewed", status: done ? "done" : "active", kind: "agent" },
|
|
492
|
+
{ id: "result", label: "Result", detail: done ? "Result ready" : "Waiting for the review", status: done ? "done" : "pending", kind: "actor" },
|
|
493
493
|
]}
|
|
494
494
|
edges={[{ source: "input", target: "check" }, { source: "check", target: "result" }]} />
|
|
495
495
|
</UI.Stack>
|
|
496
496
|
<UI.Stack gap="small">
|
|
497
|
-
<h2>SVG
|
|
498
|
-
<p>SvgEdge
|
|
499
|
-
<svg viewBox="0 0 360 160" role="img" aria-label={done ? "
|
|
497
|
+
<h2>SVG connections</h2>
|
|
498
|
+
<p>SvgEdge draws the edges. Nodes, labels, and positions are in the code of this view.</p>
|
|
499
|
+
<svg viewBox="0 0 360 160" role="img" aria-label={done ? "Intake done, review completed, result ready" : "Intake done, review running, result open"}
|
|
500
500
|
className="block h-auto w-full text-[13px]">
|
|
501
501
|
<UI.SvgEdge d="M112 42 L144 42" tone={done ? "success" : "warning"} active={!done} />
|
|
502
502
|
<UI.SvgEdge d="M252 42 C320 42 320 118 252 118" arrow={done ? "end" : "none"} tone={done ? "success" : "neutral"} lineStyle={done ? "solid" : "dashed"} />
|
|
503
503
|
<UI.SvgEdge d="M144 118 C64 118 64 96 64 72" arrow="both" tone="accent" />
|
|
504
|
-
{[{ x: 8, y: 12, label: "
|
|
505
|
-
{ x: 148, y: 12, label: "
|
|
506
|
-
{ x: 148, y: 88, label: "
|
|
504
|
+
{[{ x: 8, y: 12, label: "Intake", status: "Done" },
|
|
505
|
+
{ x: 148, y: 12, label: "Review", status: done ? "Done" : "Running" },
|
|
506
|
+
{ x: 148, y: 88, label: "Result", status: done ? "Ready" : "Open" }].map((node) => <g key={node.label}>
|
|
507
507
|
<rect x={node.x} y={node.y} width="104" height="56" rx="8" className="fill-background stroke-border-strong" />
|
|
508
508
|
<text x={node.x + 52} y={node.y + 23} textAnchor="middle" className="fill-foreground font-semibold">{node.label}</text>
|
|
509
509
|
<text x={node.x + 52} y={node.y + 42} textAnchor="middle" className="fill-muted-foreground text-[11px]">{node.status}</text>
|
|
@@ -511,20 +511,20 @@ const App = () => {
|
|
|
511
511
|
</svg>
|
|
512
512
|
</UI.Stack>
|
|
513
513
|
<UI.Stack gap="small">
|
|
514
|
-
<UI.MessageList messages={messages} label="
|
|
514
|
+
<UI.MessageList messages={messages} label="Local editorial notes" />
|
|
515
515
|
<UI.Stack direction="row"><UI.Button onClick={() => setMessages((current) => [...current, {
|
|
516
|
-
key: "note-" + current.length, sender: current.length % 2 ? "
|
|
517
|
-
text: "
|
|
518
|
-
}])}>
|
|
516
|
+
key: "note-" + current.length, sender: current.length % 2 ? "Text review" : "Editorial",
|
|
517
|
+
text: "Local example note " + (current.length - 1) + ": This message was just added.",
|
|
518
|
+
}])}>Add local message</UI.Button></UI.Stack>
|
|
519
519
|
</UI.Stack>
|
|
520
|
-
<UI.DocumentViewer title="
|
|
521
|
-
<UI.DiffViewer title="
|
|
520
|
+
<UI.DocumentViewer title="Local form result" format="text" content={result} />
|
|
521
|
+
<UI.DiffViewer title="Example change" patch={"--- a/result.txt\\n+++ b/result.txt\\n@@ -1 +1 @@\\n-Status: open\\n+Status: reviewed"} />
|
|
522
522
|
</UI.Stack>
|
|
523
523
|
</UI.AppLayout>;
|
|
524
524
|
};
|
|
525
525
|
|
|
526
526
|
const root = document.getElementById("root");
|
|
527
|
-
if (!root) throw new Error("
|
|
527
|
+
if (!root) throw new Error("The #root element is missing.");
|
|
528
528
|
createRoot(root).render(<App />);
|
|
529
529
|
`
|
|
530
530
|
}
|
|
@@ -533,11 +533,11 @@ createRoot(root).render(<App />);
|
|
|
533
533
|
// server/templates.ts
|
|
534
534
|
var blank = {
|
|
535
535
|
id: "blank",
|
|
536
|
-
title: "
|
|
537
|
-
description: "
|
|
536
|
+
title: "Blank mini-app",
|
|
537
|
+
description: "A pure React view on the existing actor without an additional server function.",
|
|
538
538
|
ragents: {
|
|
539
|
-
title: "
|
|
540
|
-
description: "
|
|
539
|
+
title: "My view",
|
|
540
|
+
description: "A small interface of the existing actor.",
|
|
541
541
|
views: [{ id: "main", client: "src/client.tsx" }]
|
|
542
542
|
},
|
|
543
543
|
files: {
|
|
@@ -545,24 +545,24 @@ var blank = {
|
|
|
545
545
|
import * as UI from "@ragents/client/ui";
|
|
546
546
|
|
|
547
547
|
const App = () => (
|
|
548
|
-
<UI.AppLayout title="
|
|
549
|
-
<UI.Stack><p>
|
|
548
|
+
<UI.AppLayout title="My view">
|
|
549
|
+
<UI.Stack><p>Ready for your content.</p></UI.Stack>
|
|
550
550
|
</UI.AppLayout>
|
|
551
551
|
);
|
|
552
552
|
|
|
553
553
|
const root = document.getElementById("root");
|
|
554
|
-
if (!root) throw new Error("
|
|
554
|
+
if (!root) throw new Error("The #root element is missing.");
|
|
555
555
|
createRoot(root).render(<App />);
|
|
556
556
|
`
|
|
557
557
|
}
|
|
558
558
|
};
|
|
559
559
|
var chat = {
|
|
560
560
|
id: "chat",
|
|
561
|
-
title: "Actor
|
|
562
|
-
description: "
|
|
561
|
+
title: "Actor chat",
|
|
562
|
+
description: "Reusable chat with history and optional input to the actor of this view.",
|
|
563
563
|
ragents: {
|
|
564
|
-
title: "Actor
|
|
565
|
-
description: "
|
|
564
|
+
title: "Actor chat",
|
|
565
|
+
description: "Shows the conversation with an actor and sends it user input.",
|
|
566
566
|
views: [{ id: "main", client: "src/client.tsx" }]
|
|
567
567
|
},
|
|
568
568
|
files: {
|
|
@@ -571,22 +571,22 @@ import * as UI from "@ragents/client/ui";
|
|
|
571
571
|
import { context } from "@ragents/client";
|
|
572
572
|
|
|
573
573
|
const App = () => (
|
|
574
|
-
<UI.Chat actor={"@" + context.actor.handle} className="h-full" showInput placeholder="
|
|
574
|
+
<UI.Chat actor={"@" + context.actor.handle} className="h-full" showInput placeholder="Message to the actor" />
|
|
575
575
|
);
|
|
576
576
|
|
|
577
577
|
const root = document.getElementById("root");
|
|
578
|
-
if (!root) throw new Error("
|
|
578
|
+
if (!root) throw new Error("The #root element is missing.");
|
|
579
579
|
createRoot(root).render(<App />);
|
|
580
580
|
`
|
|
581
581
|
}
|
|
582
582
|
};
|
|
583
583
|
var textAnalysis = {
|
|
584
584
|
id: "text-analysis",
|
|
585
|
-
title: "
|
|
586
|
-
description: "
|
|
585
|
+
title: "Text analysis",
|
|
586
|
+
description: "A TypeScript actor analyzes texts with its own function, state, and React view.",
|
|
587
587
|
ragents: {
|
|
588
|
-
title: "
|
|
589
|
-
description: "
|
|
588
|
+
title: "Text analysis",
|
|
589
|
+
description: "Counts characters, words, and lines and remembers the number of analyses.",
|
|
590
590
|
backend: "src/server.ts",
|
|
591
591
|
views: [{ id: "main", client: "src/client.tsx" }]
|
|
592
592
|
},
|
|
@@ -601,23 +601,23 @@ type FormValues = Parameters<typeof UI.Form>[0]["values"];
|
|
|
601
601
|
const App = () => {
|
|
602
602
|
const state = useAppState();
|
|
603
603
|
const [values, setValues] = React.useState<FormValues>({ text: "" });
|
|
604
|
-
const [result, setResult] = React.useState("
|
|
604
|
+
const [result, setResult] = React.useState("Ready");
|
|
605
605
|
|
|
606
606
|
const analyse = async (next: FormValues): Promise<void> => {
|
|
607
607
|
const answer = await context.capabilities.call("analyse", { text: String(next.text ?? "") });
|
|
608
608
|
setResult([
|
|
609
|
-
\`
|
|
610
|
-
\`
|
|
611
|
-
\`
|
|
609
|
+
\`Characters: \${answer.characters}\`,
|
|
610
|
+
\`Words: \${answer.words}\`,
|
|
611
|
+
\`Lines: \${answer.lines}\`,
|
|
612
612
|
].join("\\n"));
|
|
613
613
|
};
|
|
614
614
|
|
|
615
615
|
return (
|
|
616
|
-
<UI.AppLayout title="
|
|
616
|
+
<UI.AppLayout title="Text analysis" description={<>Analyses: {state.analyses ?? 0}</>}>
|
|
617
617
|
<UI.Grid>
|
|
618
618
|
<UI.Form fields={[
|
|
619
|
-
{ id: "text", label: "Text", type: "textarea", rows: 6, placeholder: "
|
|
620
|
-
]} values={values} onChange={setValues} onSubmit={analyse} submitLabel="
|
|
619
|
+
{ id: "text", label: "Text", type: "textarea", rows: 6, placeholder: "Enter text" },
|
|
620
|
+
]} values={values} onChange={setValues} onSubmit={analyse} submitLabel="Analyze" />
|
|
621
621
|
<UI.Stack><pre aria-live="polite" className="min-h-[90px] overflow-auto rounded-md border border-border bg-muted p-2.5 font-mono whitespace-pre-wrap">{result}</pre></UI.Stack>
|
|
622
622
|
</UI.Grid>
|
|
623
623
|
</UI.AppLayout>
|
|
@@ -625,7 +625,7 @@ const App = () => {
|
|
|
625
625
|
};
|
|
626
626
|
|
|
627
627
|
const root = document.getElementById("root");
|
|
628
|
-
if (!root) throw new Error("
|
|
628
|
+
if (!root) throw new Error("The #root element is missing.");
|
|
629
629
|
createRoot(root).render(<App />);
|
|
630
630
|
`,
|
|
631
631
|
"src/contract.ts": `import { Type } from "typebox";
|
|
@@ -634,10 +634,10 @@ export const contract = {
|
|
|
634
634
|
state: Type.Object({ analyses: Type.Optional(Type.Integer({"minimum": 0})) }, {"additionalProperties": false}),
|
|
635
635
|
functions: {
|
|
636
636
|
analyse: {
|
|
637
|
-
label: "
|
|
638
|
-
description: "
|
|
637
|
+
label: "Analyze text",
|
|
638
|
+
description: "Counts words, characters, and lines without external effects.",
|
|
639
639
|
tool: { name: "analyse_text" },
|
|
640
|
-
input: Type.Object({ text: Type.String({"description": "
|
|
640
|
+
input: Type.Object({ text: Type.String({"description": "The text to analyze."}) }, {"additionalProperties": false}),
|
|
641
641
|
output: Type.Object({ text: Type.String(), characters: Type.Integer({"minimum": 0}), words: Type.Integer({"minimum": 0}), lines: Type.Integer({"minimum": 0}), analyses: Type.Integer({"minimum": 1}) }, {"additionalProperties": false}),
|
|
642
642
|
capabilities: [],
|
|
643
643
|
},
|
|
@@ -673,9 +673,9 @@ import { createTestContext } from "@ragents/server/testing";
|
|
|
673
673
|
import { contract } from "../src/contract.ts";
|
|
674
674
|
import program from "../src/server.ts";
|
|
675
675
|
|
|
676
|
-
test("
|
|
676
|
+
test("counts words, lines, and further analyses", async () => {
|
|
677
677
|
const context = createTestContext<Static<typeof contract.state>>({ state: {} });
|
|
678
|
-
assert.deepEqual(await program.functions.analyse({"text": "
|
|
678
|
+
assert.deepEqual(await program.functions.analyse({"text": " Hello world\\nNew line "}, context), {"text": "Hello world\\nNew line", "characters": 20, "words": 4, "lines": 2, "analyses": 1});
|
|
679
679
|
assert.deepEqual(await program.functions.analyse({"text": ""}, context), {"text": "", "characters": 0, "words": 0, "lines": 0, "analyses": 2});
|
|
680
680
|
assert.deepEqual(context.state.read(), {"analyses": 2});
|
|
681
681
|
});
|
|
@@ -684,11 +684,11 @@ test("z\xE4hlt W\xF6rter, Zeilen und weitere Analysen", async () => {
|
|
|
684
684
|
};
|
|
685
685
|
var headlessCounter = {
|
|
686
686
|
id: "headless-counter",
|
|
687
|
-
title: "
|
|
688
|
-
description: "
|
|
687
|
+
title: "Counter without interface",
|
|
688
|
+
description: "A TypeScript actor counts inputs in its state and offers the same work as a function.",
|
|
689
689
|
ragents: {
|
|
690
|
-
title: "
|
|
691
|
-
description: "
|
|
690
|
+
title: "Counter",
|
|
691
|
+
description: "Collects incoming texts without model calls or interface.",
|
|
692
692
|
backend: "src/server.ts"
|
|
693
693
|
},
|
|
694
694
|
files: {
|
|
@@ -703,13 +703,13 @@ export const contract = {
|
|
|
703
703
|
state,
|
|
704
704
|
functions: {
|
|
705
705
|
record: {
|
|
706
|
-
label: "
|
|
706
|
+
label: "Count text",
|
|
707
707
|
input: Type.Object({ text: Type.String() }, { additionalProperties: false }),
|
|
708
708
|
output: Type.Object({ count: Type.Integer(), texts: Type.Array(Type.String()) }, { additionalProperties: false }),
|
|
709
709
|
tool: { name: "record_text" },
|
|
710
710
|
},
|
|
711
711
|
inspect: {
|
|
712
|
-
label: "
|
|
712
|
+
label: "Read counter",
|
|
713
713
|
input: Type.Object({}, { additionalProperties: false }),
|
|
714
714
|
output: state,
|
|
715
715
|
tool: { name: "read_counter" },
|
|
@@ -748,25 +748,25 @@ import { createTestContext } from "@ragents/server/testing";
|
|
|
748
748
|
import { contract } from "../src/contract.ts";
|
|
749
749
|
import program from "../src/server.ts";
|
|
750
750
|
|
|
751
|
-
test("
|
|
751
|
+
test("inputs and functions share the same counter", async () => {
|
|
752
752
|
const context = createTestContext<Static<typeof contract.state>>({ state: {} });
|
|
753
|
-
for (const content of ["
|
|
753
|
+
for (const content of ["one", "two", "three"]) {
|
|
754
754
|
await program.onInput!({ id: content, content, artifactIds: [], sourceEventIds: [], subscriptionId: null, event: null }, context);
|
|
755
755
|
}
|
|
756
|
-
assert.deepEqual(await program.functions.inspect({}, context), { texts: ["
|
|
757
|
-
assert.deepEqual(await program.functions.record({ text: "
|
|
758
|
-
assert.deepEqual(context.state.read(), { texts: ["
|
|
756
|
+
assert.deepEqual(await program.functions.inspect({}, context), { texts: ["one", "two", "three"], count: 3 });
|
|
757
|
+
assert.deepEqual(await program.functions.record({ text: "four" }, context), { texts: ["one", "two", "three", "four"], count: 4 });
|
|
758
|
+
assert.deepEqual(context.state.read(), { texts: ["one", "two", "three", "four"], count: 4 });
|
|
759
759
|
});
|
|
760
760
|
`
|
|
761
761
|
}
|
|
762
762
|
};
|
|
763
763
|
var sharedList = {
|
|
764
764
|
id: "shared-list",
|
|
765
|
-
title: "
|
|
766
|
-
description: "
|
|
765
|
+
title: "Shared list of an actor",
|
|
766
|
+
description: "An actor owns a function and a React view for the same list state.",
|
|
767
767
|
ragents: {
|
|
768
|
-
title: "
|
|
769
|
-
description: "
|
|
768
|
+
title: "Shared list",
|
|
769
|
+
description: "Collects texts from the app and from an agent tool in a shared list.",
|
|
770
770
|
backend: "src/server.ts",
|
|
771
771
|
views: [{ id: "main", client: "src/client.tsx" }]
|
|
772
772
|
},
|
|
@@ -781,21 +781,21 @@ type FormValues = Parameters<typeof UI.Form>[0]["values"];
|
|
|
781
781
|
const App = () => {
|
|
782
782
|
const state = useAppState();
|
|
783
783
|
const [values, setValues] = React.useState<FormValues>({ text: "" });
|
|
784
|
-
const [status, setStatus] = React.useState("
|
|
784
|
+
const [status, setStatus] = React.useState("Ready");
|
|
785
785
|
const entries = state.entries ?? [];
|
|
786
786
|
|
|
787
787
|
const append = async (next: FormValues): Promise<void> => {
|
|
788
788
|
const answer = await context.capabilities.call("append", { text: String(next.text ?? "") });
|
|
789
789
|
setValues({ text: "" });
|
|
790
|
-
setStatus(\`
|
|
790
|
+
setStatus(\`Added: \${answer.text}\`);
|
|
791
791
|
};
|
|
792
792
|
|
|
793
793
|
return (
|
|
794
|
-
<UI.AppLayout title="
|
|
794
|
+
<UI.AppLayout title="Shared list" description={<>{entries.length} {entries.length === 1 ? "item" : "items"}</>}>
|
|
795
795
|
<UI.Grid>
|
|
796
796
|
<UI.Form fields={[
|
|
797
|
-
{ id: "text", label: "
|
|
798
|
-
]} values={values} onChange={setValues} onSubmit={append} submitLabel="
|
|
797
|
+
{ id: "text", label: "New item", type: "textarea", placeholder: "Enter text" },
|
|
798
|
+
]} values={values} onChange={setValues} onSubmit={append} submitLabel="Add" />
|
|
799
799
|
<UI.Stack>
|
|
800
800
|
<p className="text-muted-foreground" role="status">{status}</p>
|
|
801
801
|
<ul className="border-t border-border">
|
|
@@ -808,7 +808,7 @@ const App = () => {
|
|
|
808
808
|
};
|
|
809
809
|
|
|
810
810
|
const root = document.getElementById("root");
|
|
811
|
-
if (!root) throw new Error("
|
|
811
|
+
if (!root) throw new Error("The #root element is missing.");
|
|
812
812
|
createRoot(root).render(<App />);
|
|
813
813
|
`,
|
|
814
814
|
"src/contract.ts": `import { Type } from "typebox";
|
|
@@ -817,9 +817,9 @@ export const contract = {
|
|
|
817
817
|
state: Type.Object({ entries: Type.Optional(Type.Array(Type.String())) }, {"additionalProperties": false}),
|
|
818
818
|
functions: {
|
|
819
819
|
append: {
|
|
820
|
-
label: "
|
|
821
|
-
description: "
|
|
822
|
-
input: Type.Object({ text: Type.String({"description": "
|
|
820
|
+
label: "Add entry",
|
|
821
|
+
description: "Appends the entered text to the shared list.",
|
|
822
|
+
input: Type.Object({ text: Type.String({"description": "The text for the new list entry."}) }, {"additionalProperties": false}),
|
|
823
823
|
output: Type.Object({ text: Type.String(), entries: Type.Array(Type.String()) }, {"additionalProperties": false}),
|
|
824
824
|
capabilities: [],
|
|
825
825
|
tool: { name: "append_to_list", card: true },
|
|
@@ -849,11 +849,11 @@ import { createTestContext } from "@ragents/server/testing";
|
|
|
849
849
|
import { contract } from "../src/contract.ts";
|
|
850
850
|
import program from "../src/server.ts";
|
|
851
851
|
|
|
852
|
-
test("
|
|
852
|
+
test("adds entries without losing existing entries", async () => {
|
|
853
853
|
const context = createTestContext<Static<typeof contract.state>>({ state: {} });
|
|
854
|
-
assert.deepEqual(await program.functions.append({"text": "
|
|
855
|
-
assert.deepEqual(await program.functions.append({"text": "
|
|
856
|
-
assert.deepEqual(context.state.read(), {"entries": ["
|
|
854
|
+
assert.deepEqual(await program.functions.append({"text": " First entry "}, context), {"text": "First entry", "entries": ["First entry"]});
|
|
855
|
+
assert.deepEqual(await program.functions.append({"text": "Second entry"}, context), {"text": "Second entry", "entries": ["First entry", "Second entry"]});
|
|
856
|
+
assert.deepEqual(context.state.read(), {"entries": ["First entry", "Second entry"]});
|
|
857
857
|
});
|
|
858
858
|
`
|
|
859
859
|
}
|
|
@@ -866,7 +866,7 @@ var templateFiles = (template, name2) => ({
|
|
|
866
866
|
});
|
|
867
867
|
var templateById = (id) => {
|
|
868
868
|
const template = runModuleTemplates.find((candidate) => candidate.id === id);
|
|
869
|
-
if (!template) throw new Error(`
|
|
869
|
+
if (!template) throw new Error(`Unknown actor program template ${id}. Valid: ${runModuleTemplates.map((entry) => entry.id).join(", ")}.`);
|
|
870
870
|
return template;
|
|
871
871
|
};
|
|
872
872
|
|
|
@@ -934,7 +934,7 @@ var createTestReport = async (directory) => {
|
|
|
934
934
|
const describe = (failure) => {
|
|
935
935
|
const fileOutput = failure.message === "test failed" && failure.file !== null ? stderrByFile.get(failure.file) ?? stderrByFile.get(relative(failure.file)) : void 0;
|
|
936
936
|
const message = fileOutput ? errorLines(fileOutput).join("; ") : failure.generated ? failure.message.split("\n")[0].replace(/:$/, "") : failure.message.trim().slice(0, 500);
|
|
937
|
-
const values = failure.expected === void 0 || failure.expected === failure.actual ? "" : ` -
|
|
937
|
+
const values = failure.expected === void 0 || failure.expected === failure.actual ? "" : ` - expected ${failure.expected}, actual ${failure.actual}`;
|
|
938
938
|
return `- ${failure.name} (${placeOf(failure)}): ${relative(message)}${relative(values)}`;
|
|
939
939
|
};
|
|
940
940
|
return {
|
|
@@ -946,10 +946,10 @@ var createTestReport = async (directory) => {
|
|
|
946
946
|
report: (name2, outcome) => {
|
|
947
947
|
record2(pending);
|
|
948
948
|
pending = "";
|
|
949
|
-
const summary = outcome.timedOut ? `Tests
|
|
949
|
+
const summary = outcome.timedOut ? `Tests for ${name2} canceled after a timeout: ${passed} passed, ${failed2} failed.` : `Tests for ${name2} failed: ${passed} passed, ${failed2} failed.`;
|
|
950
950
|
const details = failures.map(describe);
|
|
951
|
-
const more = failed2 > failures.length ? [`...
|
|
952
|
-
const withoutResult = failed2 === 0 ? [`
|
|
951
|
+
const more = failed2 > failures.length ? [`... and ${failed2 - failures.length} more`] : [];
|
|
952
|
+
const withoutResult = failed2 === 0 ? [`The test run ended${outcome.code === null ? "" : ` with code ${outcome.code}`} without a failed test:`, ...errorLines([...unparsed, ...outcome.stderr.split("\n")]).map(relative)] : [];
|
|
953
953
|
return [summary, ...details, ...more, ...withoutResult].join("\n");
|
|
954
954
|
}
|
|
955
955
|
};
|
|
@@ -969,16 +969,16 @@ var checkFailure = (title, lines, fallback) => {
|
|
|
969
969
|
const shown = all.slice(0, maxShownComplaints).map((line) => line.length > maxComplaintLength ? `${line.slice(0, maxComplaintLength - 3)}...` : line);
|
|
970
970
|
const omitted = all.length - shown.length;
|
|
971
971
|
return Object.assign(new Error([
|
|
972
|
-
`${title}: ${all.length}
|
|
972
|
+
`${title}: ${all.length} errors.`,
|
|
973
973
|
...shown,
|
|
974
|
-
...omitted > 0 ? [`...
|
|
974
|
+
...omitted > 0 ? [`... and ${omitted} more; all with actor_program_diagnostics.`] : []
|
|
975
975
|
].join("\n")), { lines: all });
|
|
976
976
|
};
|
|
977
977
|
var actorDescriptionOf = (text) => {
|
|
978
978
|
const line = (text ?? "").replace(/\s+/g, " ").trim();
|
|
979
979
|
return line.length <= actorDescriptionMaxLength ? line || void 0 : `${line.slice(0, actorDescriptionMaxLength - 3).trimEnd()}...`;
|
|
980
980
|
};
|
|
981
|
-
var exposed = defineToolAvailability({ availability: "conditional", availabilityDetail: "
|
|
981
|
+
var exposed = defineToolAvailability({ availability: "conditional", availabilityDetail: "Published function of an active actor in the run." }, () => true);
|
|
982
982
|
var objectSchema = { type: "object", additionalProperties: true };
|
|
983
983
|
var checked = (schema, value, label) => {
|
|
984
984
|
const result = jsonValue(value, label);
|
|
@@ -988,17 +988,17 @@ var checked = (schema, value, label) => {
|
|
|
988
988
|
};
|
|
989
989
|
var safePath = (name2) => {
|
|
990
990
|
if (!name2 || path.isAbsolute(name2) || name2.includes("\\") || name2.includes("\0") || name2.split("/").some((part) => !part || part === "." || part === ".."))
|
|
991
|
-
throw new Error(`
|
|
991
|
+
throw new Error(`Invalid package path ${name2}.`);
|
|
992
992
|
return name2;
|
|
993
993
|
};
|
|
994
994
|
var inside = async (directory, relative) => {
|
|
995
995
|
const root = await realpath2(directory);
|
|
996
996
|
const file = await realpath2(path.join(root, safePath(relative)));
|
|
997
997
|
if (!file.startsWith(`${root}${path.sep}`))
|
|
998
|
-
throw new Error(`
|
|
998
|
+
throw new Error(`Package path ${relative} is outside the package.`);
|
|
999
999
|
const stat = await lstat(file);
|
|
1000
1000
|
if (!stat.isFile() || stat.size > 2e6)
|
|
1001
|
-
throw new Error(`
|
|
1001
|
+
throw new Error(`Invalid or too large package file ${relative}.`);
|
|
1002
1002
|
return readFile(file, "utf8");
|
|
1003
1003
|
};
|
|
1004
1004
|
var occupied = (file) => {
|
|
@@ -1011,7 +1011,7 @@ var occupied = (file) => {
|
|
|
1011
1011
|
throw error;
|
|
1012
1012
|
}
|
|
1013
1013
|
};
|
|
1014
|
-
var packageExists = (name2) => new Error(`
|
|
1014
|
+
var packageExists = (name2) => new Error(`The package ${name2} already exists.`);
|
|
1015
1015
|
var commitPackage = (staged, directory, name2) => {
|
|
1016
1016
|
if (occupied(directory))
|
|
1017
1017
|
throw packageExists(name2);
|
|
@@ -1067,16 +1067,16 @@ var ActorProgramRuntime = class {
|
|
|
1067
1067
|
actor(runId, actorId) {
|
|
1068
1068
|
const actor = this.view(runId).actors.find((candidate) => candidate.id === actorId);
|
|
1069
1069
|
if (!actor || actor.kind === "human" || actor.lifecycle.kind === "stopped")
|
|
1070
|
-
throw new Error("
|
|
1070
|
+
throw new Error("The actor is not active.");
|
|
1071
1071
|
if (this.#removing.has(`${runId}\0${actorId}`))
|
|
1072
|
-
throw new Error("
|
|
1072
|
+
throw new Error("The actor package is being removed.");
|
|
1073
1073
|
return actor;
|
|
1074
1074
|
}
|
|
1075
1075
|
resolveActor(runId, callerId, reference) {
|
|
1076
1076
|
const actors = this.view(runId).actors;
|
|
1077
1077
|
const found = reference === "self" ? actors.find((candidate) => candidate.id === callerId) : actorByHandle(actors, reference);
|
|
1078
1078
|
if (!found)
|
|
1079
|
-
throw new Error(`Actor ${reference}
|
|
1079
|
+
throw new Error(`Actor ${reference} is unknown.`);
|
|
1080
1080
|
return this.actor(runId, found.id);
|
|
1081
1081
|
}
|
|
1082
1082
|
data(runId, actorId) {
|
|
@@ -1086,7 +1086,7 @@ var ActorProgramRuntime = class {
|
|
|
1086
1086
|
return { version: 1, revision, values: entry?.state ?? {} };
|
|
1087
1087
|
}
|
|
1088
1088
|
#writeProgram(context, runId, actorId, program) {
|
|
1089
|
-
this.runtime().replacePluginState(this.operatorContext(runId), runId, { pluginId: ACTOR_PROGRAMS_STATE_ID, scope: { kind: "actor", actorId }, state: jsonValue({ version: 1, program }, "Actor
|
|
1089
|
+
this.runtime().replacePluginState(this.operatorContext(runId), runId, { pluginId: ACTOR_PROGRAMS_STATE_ID, scope: { kind: "actor", actorId }, state: jsonValue({ version: 1, program }, "Actor program") });
|
|
1090
1090
|
}
|
|
1091
1091
|
#script(runId) {
|
|
1092
1092
|
return this.view(runId).pluginStates.find((entry) => entry.pluginId === ACTOR_SCRIPT_STATE_ID && entry.scope.kind === "run")?.state;
|
|
@@ -1095,7 +1095,7 @@ var ActorProgramRuntime = class {
|
|
|
1095
1095
|
for (const source of files) {
|
|
1096
1096
|
const file = path.join(directory, safePath(source.path));
|
|
1097
1097
|
if (source.path.split("/").includes("node_modules"))
|
|
1098
|
-
throw new Error("
|
|
1098
|
+
throw new Error("Package sources must not overwrite dependencies.");
|
|
1099
1099
|
await mkdir(path.dirname(file), { recursive: true });
|
|
1100
1100
|
await writeFile(file, source.content, { flag: "wx" });
|
|
1101
1101
|
}
|
|
@@ -1113,14 +1113,14 @@ var ActorProgramRuntime = class {
|
|
|
1113
1113
|
try {
|
|
1114
1114
|
await this.#activate(this.operatorContext(runId, "refresh"), runId, program.name, false, signal);
|
|
1115
1115
|
} catch (error) {
|
|
1116
|
-
throw new Error(`
|
|
1116
|
+
throw new Error(`The capability contract of ${program.name} has changed and the reactivation failed: ${errorText(error)}`);
|
|
1117
1117
|
}
|
|
1118
1118
|
}
|
|
1119
1119
|
async #bound(runId, actorId, revision, signal, contractOf, descriptorsFor) {
|
|
1120
1120
|
const current = () => {
|
|
1121
1121
|
const program2 = this.programs(runId).find((entry) => entry.actorId === actorId);
|
|
1122
1122
|
if (!program2)
|
|
1123
|
-
throw new Error("
|
|
1123
|
+
throw new Error("The actor has no active program.");
|
|
1124
1124
|
return program2;
|
|
1125
1125
|
};
|
|
1126
1126
|
const bind = (program2) => {
|
|
@@ -1130,14 +1130,14 @@ var ActorProgramRuntime = class {
|
|
|
1130
1130
|
};
|
|
1131
1131
|
const program = current();
|
|
1132
1132
|
if (revision !== void 0 && program.revision !== revision)
|
|
1133
|
-
throw new Error("
|
|
1133
|
+
throw new Error("The actor package was replaced.");
|
|
1134
1134
|
const bound = bind(program);
|
|
1135
1135
|
if (!bound.drifted)
|
|
1136
1136
|
return bound;
|
|
1137
1137
|
await this.#refresh(runId, program, signal);
|
|
1138
1138
|
const refreshed = bind(current());
|
|
1139
1139
|
if (refreshed.drifted)
|
|
1140
|
-
throw new Error(`
|
|
1140
|
+
throw new Error(`The capability contract of ${program.name} still differs after the reactivation.`);
|
|
1141
1141
|
return refreshed;
|
|
1142
1142
|
}
|
|
1143
1143
|
async workspaceDirectory(runId) {
|
|
@@ -1153,7 +1153,7 @@ var ActorProgramRuntime = class {
|
|
|
1153
1153
|
const directory = path.join(actors, name2);
|
|
1154
1154
|
const key = `${runId}\0${name2}`;
|
|
1155
1155
|
if (this.#creating.has(key))
|
|
1156
|
-
throw new Error(`
|
|
1156
|
+
throw new Error(`The package ${name2} is being created.`);
|
|
1157
1157
|
if (occupied(directory))
|
|
1158
1158
|
throw packageExists(name2);
|
|
1159
1159
|
this.#creating.add(key);
|
|
@@ -1204,16 +1204,16 @@ var ActorProgramRuntime = class {
|
|
|
1204
1204
|
this.#assertName(name2);
|
|
1205
1205
|
const directory = path.join(await this.workspaceDirectory(runId), name2);
|
|
1206
1206
|
if ((await lstat(directory)).isSymbolicLink())
|
|
1207
|
-
throw new Error("Actor
|
|
1207
|
+
throw new Error("Actor packages must not be symlinks.");
|
|
1208
1208
|
await prepareAppProject(directory);
|
|
1209
1209
|
const pkg = await readAppPackage(directory);
|
|
1210
1210
|
const previous = this.programs(runId).find((program) => program.name === name2);
|
|
1211
1211
|
const owner = reference ? this.resolveActor(runId, callerId, reference) : previous ? this.actor(runId, previous.actorId) : !pkg.backend ? this.actor(runId, callerId) : void 0;
|
|
1212
1212
|
if (previous && owner?.id !== previous.actorId)
|
|
1213
|
-
throw new Error("
|
|
1213
|
+
throw new Error("An activated package cannot move to another actor.");
|
|
1214
1214
|
const caller = this.view(runId).actors.find((candidate) => candidate.id === callerId);
|
|
1215
1215
|
if (!caller)
|
|
1216
|
-
throw new Error("
|
|
1216
|
+
throw new Error("Calling actor is missing.");
|
|
1217
1217
|
const provisional = owner ?? {
|
|
1218
1218
|
id: "pending",
|
|
1219
1219
|
handle: name2,
|
|
@@ -1237,23 +1237,23 @@ var ActorProgramRuntime = class {
|
|
|
1237
1237
|
const backend = pkg.backend ? await compileAppBackend({ directory, backend: pkg.backend, runId, executor: this.runtime().nativeTypeScriptExecutor, signal }) : void 0;
|
|
1238
1238
|
const contract = backend?.contract ?? { state: objectSchema, functions: {} };
|
|
1239
1239
|
if (contract.input && owner?.kind === "agent")
|
|
1240
|
-
throw new Error("
|
|
1240
|
+
throw new Error("An LLM actor processes inputs with its agent driver; onInput is only allowed for TypeScript actors.");
|
|
1241
1241
|
if (contract.state.type !== "object")
|
|
1242
|
-
throw new Error("Actor
|
|
1242
|
+
throw new Error("Actor state must be an object schema.");
|
|
1243
1243
|
const state = owner ? this.data(runId, owner.id).values : {};
|
|
1244
|
-
checked(contract.state, state, "Actor
|
|
1244
|
+
checked(contract.state, state, "Actor state");
|
|
1245
1245
|
const actorId = owner?.id ?? "pending";
|
|
1246
1246
|
const actorHandle = owner?.handle ?? name2;
|
|
1247
1247
|
const functions = Object.entries(contract.functions).map(([id, fn]) => {
|
|
1248
1248
|
if (!/^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/.test(id))
|
|
1249
|
-
throw new Error(`
|
|
1249
|
+
throw new Error(`Invalid function name ${id}.`);
|
|
1250
1250
|
if (fn.tool && !/^[a-z][a-z0-9_]{0,63}$/.test(fn.tool.name))
|
|
1251
|
-
throw new Error(`
|
|
1251
|
+
throw new Error(`Invalid tool name ${fn.tool.name}.`);
|
|
1252
1252
|
const capabilities = fn.capabilities ?? [];
|
|
1253
1253
|
const selected2 = capabilities.map((name3) => {
|
|
1254
1254
|
const entry = available2.find((item) => item.id === name3);
|
|
1255
1255
|
if (!entry)
|
|
1256
|
-
throw new Error(`Capability ${name3}
|
|
1256
|
+
throw new Error(`Capability ${name3} is not available.`);
|
|
1257
1257
|
return entry;
|
|
1258
1258
|
});
|
|
1259
1259
|
return {
|
|
@@ -1272,27 +1272,27 @@ var ActorProgramRuntime = class {
|
|
|
1272
1272
|
const inputDescriptors = inputCapabilities.map((id) => {
|
|
1273
1273
|
const found = available2.find((entry) => entry.id === id);
|
|
1274
1274
|
if (!found)
|
|
1275
|
-
throw new Error(`
|
|
1275
|
+
throw new Error(`Input capability ${id} is not available.`);
|
|
1276
1276
|
return found;
|
|
1277
1277
|
});
|
|
1278
1278
|
await installClientSdk(directory, { stateSchema: contract.state, actions: functions.map((fn) => ({ id: fn.id, inputSchema: fn.inputSchema, resultSchema: fn.resultSchema })) });
|
|
1279
1279
|
const hasServerFiles = pkg.backend || (await projectSourceFiles(directory)).some((file) => /^tests\/.*\.tsx?$/.test(file.path));
|
|
1280
1280
|
const serverErrors = hasServerFiles ? typecheckServerProject(directory, pkg.backend) : [];
|
|
1281
1281
|
if (serverErrors.length)
|
|
1282
|
-
throw checkFailure(`
|
|
1282
|
+
throw checkFailure(`Typecheck of ${name2}`, serverErrors, `The typecheck of ${name2} failed without a message.`);
|
|
1283
1283
|
const clients = [];
|
|
1284
1284
|
const views = [];
|
|
1285
1285
|
for (const view of pkg.views ?? []) {
|
|
1286
1286
|
const client = await compileClientProject({ directory, entryPoint: view.client, stateSchema: contract.state, actions: functions.map((fn) => ({ id: fn.id, inputSchema: fn.inputSchema, resultSchema: fn.resultSchema })) });
|
|
1287
1287
|
if (!client.valid)
|
|
1288
1288
|
throw checkFailure(
|
|
1289
|
-
`Client
|
|
1289
|
+
`Client build of ${view.client}`,
|
|
1290
1290
|
client.diagnostics.filter((item) => item.category === "error").map((item) => `${item.fileName ?? view.client}${item.start ? `:${item.start.line}:${item.start.column}` : ""} ${item.message.replace(/\s*\n\s*/g, " ")}`),
|
|
1291
|
-
`
|
|
1291
|
+
`The client build of ${view.client} failed without a message.`
|
|
1292
1292
|
);
|
|
1293
1293
|
const styles = view.styles ? await inside(directory, view.styles) : "";
|
|
1294
1294
|
if (/@import\b|url\s*\(\s*["']?\s*(?:https?:|\/\/)/i.test(styles))
|
|
1295
|
-
throw new Error("
|
|
1295
|
+
throw new Error("View CSS must not load external resources.");
|
|
1296
1296
|
const clientFile = `view-${view.id}.mjs`;
|
|
1297
1297
|
clients.push({ file: clientFile, javaScript: client.javaScript });
|
|
1298
1298
|
views.push({
|
|
@@ -1335,7 +1335,7 @@ var ActorProgramRuntime = class {
|
|
|
1335
1335
|
async #activate(context, runId, name2, idle, signal, reference) {
|
|
1336
1336
|
const key = `${runId}\0${name2}`;
|
|
1337
1337
|
if (this.#installing.has(key))
|
|
1338
|
-
throw new Error(`
|
|
1338
|
+
throw new Error(`Package ${name2} is already being activated.`);
|
|
1339
1339
|
const epoch = this.invocationPermit(runId);
|
|
1340
1340
|
this.#installing.add(key);
|
|
1341
1341
|
const original = this.programs(runId).find((item) => item.name === name2);
|
|
@@ -1369,23 +1369,23 @@ var ActorProgramRuntime = class {
|
|
|
1369
1369
|
throw new Error(report.report(name2, { code: result.code, timedOut: result.timedOut, stderr }));
|
|
1370
1370
|
}
|
|
1371
1371
|
if (canonicalHash(compiled.files) !== canonicalHash(await projectSourceFiles(compiled.directory)))
|
|
1372
|
-
throw new Error("
|
|
1372
|
+
throw new Error("Package files were changed during the check; activate again.");
|
|
1373
1373
|
if (epoch !== this.invocationPermit(runId))
|
|
1374
|
-
throw new Error("
|
|
1374
|
+
throw new Error("The run was stopped during the activation.");
|
|
1375
1375
|
if (this.programs(runId).find((item) => item.name === name2)?.revision !== original?.revision)
|
|
1376
|
-
throw new Error("
|
|
1376
|
+
throw new Error("The package was changed in the meantime.");
|
|
1377
1377
|
if (idle)
|
|
1378
1378
|
this.#assertIdle(runId, definition.actorId);
|
|
1379
1379
|
const names = /* @__PURE__ */ new Set([...agentTools.map((tool) => tool.name), ...this.#options.reservedToolNames(), ...this.programs(runId).filter((program) => program.name !== name2).flatMap((program) => program.functions.flatMap((fn) => fn.tool ? [fn.tool.name] : []))]);
|
|
1380
1380
|
for (const fn of definition.functions)
|
|
1381
1381
|
if (fn.tool) {
|
|
1382
1382
|
if (names.has(fn.tool.name))
|
|
1383
|
-
throw new Error(`
|
|
1383
|
+
throw new Error(`Tool name ${fn.tool.name} is already taken.`);
|
|
1384
1384
|
names.add(fn.tool.name);
|
|
1385
1385
|
}
|
|
1386
1386
|
const occupied2 = this.programs(runId).find((program) => program.actorId === definition.actorId && program.name !== name2);
|
|
1387
1387
|
if (occupied2)
|
|
1388
|
-
throw new Error(`Actor @${definition.actorHandle}
|
|
1388
|
+
throw new Error(`Actor @${definition.actorHandle} already owns the package ${occupied2.name}. Add functions or views there.`);
|
|
1389
1389
|
await mkdir(definition.directory, { recursive: true });
|
|
1390
1390
|
for (const source of compiled.files) {
|
|
1391
1391
|
const file = path.join(definition.directory, safePath(source.path));
|
|
@@ -1402,34 +1402,34 @@ var ActorProgramRuntime = class {
|
|
|
1402
1402
|
await syncWorkspaceOwnership(definition.directory, await this.#options.serverProcessContextFor(runId));
|
|
1403
1403
|
signal?.throwIfAborted();
|
|
1404
1404
|
if (epoch !== this.invocationPermit(runId))
|
|
1405
|
-
throw new Error("
|
|
1405
|
+
throw new Error("The run was stopped during the activation.");
|
|
1406
1406
|
if (this.programs(runId).find((item) => item.name === name2)?.revision !== original?.revision)
|
|
1407
|
-
throw new Error("
|
|
1407
|
+
throw new Error("The package was changed in the meantime.");
|
|
1408
1408
|
if (!compiled.createActor) {
|
|
1409
1409
|
this.actor(runId, definition.actorId);
|
|
1410
1410
|
if (idle)
|
|
1411
1411
|
this.#assertIdle(runId, definition.actorId);
|
|
1412
|
-
checked(definition.stateSchema, this.data(runId, definition.actorId).values, "Actor
|
|
1412
|
+
checked(definition.stateSchema, this.data(runId, definition.actorId).values, "Actor state");
|
|
1413
1413
|
if (this.programs(runId).some((item) => item.actorId === definition.actorId && item.name !== name2))
|
|
1414
|
-
throw new Error("
|
|
1414
|
+
throw new Error("The actor now owns another package.");
|
|
1415
1415
|
}
|
|
1416
1416
|
const currentNames = /* @__PURE__ */ new Set([...agentTools.map((tool) => tool.name), ...this.#options.reservedToolNames(), ...this.programs(runId).filter((program) => program.name !== name2).flatMap((program) => program.functions.flatMap((fn) => fn.tool ? [fn.tool.name] : []))]);
|
|
1417
1417
|
for (const fn of definition.functions)
|
|
1418
1418
|
if (fn.tool) {
|
|
1419
1419
|
if (currentNames.has(fn.tool.name))
|
|
1420
|
-
throw new Error(`
|
|
1420
|
+
throw new Error(`Tool name ${fn.tool.name} has been taken in the meantime.`);
|
|
1421
1421
|
currentNames.add(fn.tool.name);
|
|
1422
1422
|
}
|
|
1423
|
-
jsonValue({ version: 1, program: definition }, "Actor
|
|
1423
|
+
jsonValue({ version: 1, program: definition }, "Actor program");
|
|
1424
1424
|
if (compiled.createActor) {
|
|
1425
1425
|
const actors = this.view(runId).actors;
|
|
1426
1426
|
const caller = actors.find((actor2) => actor2.id === context.actorId);
|
|
1427
1427
|
const holder = actors.find((actor2) => actor2.handle === name2);
|
|
1428
1428
|
if (holder?.kind === "script" && holder.lifecycle.kind === "stopped") {
|
|
1429
|
-
checked(definition.stateSchema, this.data(runId, holder.id).values, "Actor
|
|
1430
|
-
this.runtime().restartActor(context, runId, holder.id, "Actor
|
|
1429
|
+
checked(definition.stateSchema, this.data(runId, holder.id).values, "Actor state");
|
|
1430
|
+
this.runtime().restartActor(context, runId, holder.id, "Actor package activated again");
|
|
1431
1431
|
} else if (holder)
|
|
1432
|
-
throw new Error(`Handle @${name2}
|
|
1432
|
+
throw new Error(`Handle @${name2} already belongs to the ${holder.kind !== "human" && holder.lifecycle.kind === "stopped" ? "stopped" : "active"} actor ${holder.displayName}; only a stopped TypeScript actor is restarted on activation. Choose another package name.`);
|
|
1433
1433
|
else
|
|
1434
1434
|
this.runtime().createScriptActor(context, runId, { handle: name2, displayName: definition.title, description: actorDescriptionOf(definition.description), grants: caller.grants.filter((grant) => grant.delegable), toolNames: null });
|
|
1435
1435
|
const actor = this.resolveActor(runId, context.actorId, `@${name2}`);
|
|
@@ -1461,7 +1461,7 @@ var ActorProgramRuntime = class {
|
|
|
1461
1461
|
const program = this.#program(runId, name2);
|
|
1462
1462
|
this.#assertIdle(runId, program.actorId);
|
|
1463
1463
|
if (this.#installing.has(`${runId}\0${name2}`))
|
|
1464
|
-
throw new Error("
|
|
1464
|
+
throw new Error("The package is being activated.");
|
|
1465
1465
|
const actor = this.actor(runId, program.actorId);
|
|
1466
1466
|
const key = `${runId}\0${program.actorId}`;
|
|
1467
1467
|
this.#removing.add(key);
|
|
@@ -1469,7 +1469,7 @@ var ActorProgramRuntime = class {
|
|
|
1469
1469
|
await this.stopActor(runId, program.actorId);
|
|
1470
1470
|
this.#writeProgram(context, runId, program.actorId, null);
|
|
1471
1471
|
if (actor.kind === "script")
|
|
1472
|
-
this.runtime().stopActor(context, runId, program.actorId, "Actor
|
|
1472
|
+
this.runtime().stopActor(context, runId, program.actorId, "Actor package removed");
|
|
1473
1473
|
await rm(program.directory, { recursive: true, force: true });
|
|
1474
1474
|
} finally {
|
|
1475
1475
|
this.#removing.delete(key);
|
|
@@ -1523,9 +1523,9 @@ var ActorProgramRuntime = class {
|
|
|
1523
1523
|
const program = this.#program(runId, viewId);
|
|
1524
1524
|
const view = program.views.find((item) => item.id === viewId);
|
|
1525
1525
|
if (!view || program.revision !== revision)
|
|
1526
|
-
throw new Error("
|
|
1526
|
+
throw new Error("The view was replaced or removed.");
|
|
1527
1527
|
if (!program.stylesFile)
|
|
1528
|
-
throw new Error("
|
|
1528
|
+
throw new Error("The program comes from an older activation without a stylesheet file. Please activate again.");
|
|
1529
1529
|
const frameStyles = readFileSync(path.join(program.directory, program.stylesFile), "utf8");
|
|
1530
1530
|
return { ...view, styles: `${frameStyles}
|
|
1531
1531
|
${view.styles}`, platformVersion: 2, clientJavaScript: readFileSync(path.join(program.directory, view.clientFile), "utf8") };
|
|
@@ -1552,7 +1552,7 @@ ${view.styles}`, platformVersion: 2, clientJavaScript: readFileSync(path.join(pr
|
|
|
1552
1552
|
const operation = previous.then(() => {
|
|
1553
1553
|
signal.throwIfAborted();
|
|
1554
1554
|
if (permit !== this.invocationPermit(runId))
|
|
1555
|
-
throw new Error("
|
|
1555
|
+
throw new Error("The run was stopped before the function started.");
|
|
1556
1556
|
this.actor(runId, actorId);
|
|
1557
1557
|
return execute();
|
|
1558
1558
|
});
|
|
@@ -1567,10 +1567,10 @@ ${view.styles}`, platformVersion: 2, clientJavaScript: readFileSync(path.join(pr
|
|
|
1567
1567
|
}
|
|
1568
1568
|
async #backend(runId, program, input, binding, descriptors, signal) {
|
|
1569
1569
|
if (!program.backendFile)
|
|
1570
|
-
throw new Error("
|
|
1570
|
+
throw new Error("The actor has no TypeScript backend.");
|
|
1571
1571
|
const current = this.#program(runId, program.name);
|
|
1572
1572
|
if (current.revision !== program.revision)
|
|
1573
|
-
throw new Error("
|
|
1573
|
+
throw new Error("The actor package was replaced.");
|
|
1574
1574
|
const logs = [];
|
|
1575
1575
|
let calls = 0;
|
|
1576
1576
|
const initial = this.data(runId, program.actorId);
|
|
@@ -1588,39 +1588,39 @@ ${view.styles}`, platformVersion: 2, clientJavaScript: readFileSync(path.join(pr
|
|
|
1588
1588
|
}, call: async (name2, value) => {
|
|
1589
1589
|
const capability = descriptors.find((entry) => entry.id === name2);
|
|
1590
1590
|
if (!capability)
|
|
1591
|
-
throw new Error(`Capability ${name2}
|
|
1591
|
+
throw new Error(`Capability ${name2} is not declared.`);
|
|
1592
1592
|
if (++calls > 64)
|
|
1593
|
-
throw new Error("
|
|
1593
|
+
throw new Error("A call may run at most 64 capabilities.");
|
|
1594
1594
|
if (program.functions.some((fn) => fn.tool?.name === name2))
|
|
1595
|
-
throw new Error("
|
|
1596
|
-
checked(capability.schema, value, `
|
|
1595
|
+
throw new Error("An actor function must not call itself through a tool; use a shared TypeScript function.");
|
|
1596
|
+
checked(capability.schema, value, `Input ${name2}`);
|
|
1597
1597
|
const output = await binding.call(name2, value, calls);
|
|
1598
|
-
return checked(capability.resultSchema, output, `
|
|
1598
|
+
return checked(capability.resultSchema, output, `Result ${name2}`);
|
|
1599
1599
|
} });
|
|
1600
1600
|
signal.throwIfAborted();
|
|
1601
1601
|
this.actor(runId, program.actorId);
|
|
1602
|
-
const state = checked(program.stateSchema, result.state, "Actor
|
|
1602
|
+
const state = checked(program.stateSchema, result.state, "Actor state");
|
|
1603
1603
|
return { result: result.result, logs, state, initial };
|
|
1604
1604
|
}
|
|
1605
1605
|
#commitState(runId, actorId, state, initial) {
|
|
1606
1606
|
if (canonicalHash(state) === canonicalHash(initial.values))
|
|
1607
1607
|
return;
|
|
1608
1608
|
if (this.data(runId, actorId).revision !== initial.revision)
|
|
1609
|
-
throw new Error("
|
|
1609
|
+
throw new Error("The actor state was changed during the call. Call again.");
|
|
1610
1610
|
this.runtime().replaceActorState(this.operatorContext(runId), runId, actorId, state);
|
|
1611
1611
|
}
|
|
1612
1612
|
#executeFunction(runId, bound, declared, input, binding, signal) {
|
|
1613
1613
|
const functionOf = (program) => {
|
|
1614
1614
|
const fn = program.functions.find((entry) => entry.id === declared.id);
|
|
1615
1615
|
if (!fn)
|
|
1616
|
-
throw new Error("
|
|
1616
|
+
throw new Error("The function is not declared.");
|
|
1617
1617
|
return fn;
|
|
1618
1618
|
};
|
|
1619
1619
|
return this.#serial(runId, bound.actorId, signal, async () => {
|
|
1620
1620
|
const { program, contract: fn, descriptors } = await this.#bound(runId, bound.actorId, bound.revision, signal, functionOf, binding.descriptorsFor);
|
|
1621
|
-
const value = checked(fn.inputSchema, input, `
|
|
1621
|
+
const value = checked(fn.inputSchema, input, `Input ${fn.id}`);
|
|
1622
1622
|
const result = await this.#backend(runId, program, { kind: "function", functionId: fn.id, input: value }, binding, descriptors, signal);
|
|
1623
|
-
const output = checked(fn.resultSchema, result.result, `
|
|
1623
|
+
const output = checked(fn.resultSchema, result.result, `Result ${fn.id}`);
|
|
1624
1624
|
this.#commitState(runId, program.actorId, result.state, result.initial);
|
|
1625
1625
|
binding.output?.push(...result.logs);
|
|
1626
1626
|
return output;
|
|
@@ -1631,7 +1631,7 @@ ${view.styles}`, platformVersion: 2, clientJavaScript: readFileSync(path.join(pr
|
|
|
1631
1631
|
try {
|
|
1632
1632
|
const inputOf = (program) => {
|
|
1633
1633
|
if (!program.input)
|
|
1634
|
-
throw new Error("
|
|
1634
|
+
throw new Error("This TypeScript actor has no onInput handler.");
|
|
1635
1635
|
return program.input;
|
|
1636
1636
|
};
|
|
1637
1637
|
const descriptorsFor = (capabilityIds) => agentCapabilityBinding(this.actor(request.runId, request.agentId), request.tools, capabilityIds, /* @__PURE__ */ new Set()).descriptors;
|
|
@@ -1650,44 +1650,44 @@ ${view.styles}`, platformVersion: 2, clientJavaScript: readFileSync(path.join(pr
|
|
|
1650
1650
|
}
|
|
1651
1651
|
invocationPermit(runId) {
|
|
1652
1652
|
if (this.#shuttingDown || this.#stopping.has(runId))
|
|
1653
|
-
throw new Error("
|
|
1653
|
+
throw new Error("The run is being stopped.");
|
|
1654
1654
|
return this.#epochs.get(runId) ?? 0;
|
|
1655
1655
|
}
|
|
1656
1656
|
startInvocation(runId, viewId, revision, functionId, requestId, input, permit = this.invocationPermit(runId)) {
|
|
1657
1657
|
const program = this.#program(runId, viewId);
|
|
1658
1658
|
if (!program.views.some((view) => view.id === viewId))
|
|
1659
|
-
throw new Error("
|
|
1659
|
+
throw new Error("The view is unknown.");
|
|
1660
1660
|
return this.#start(runId, program, viewId, revision, functionId, requestId, input, permit);
|
|
1661
1661
|
}
|
|
1662
1662
|
startFunctionInvocation(runId, actorHandle, revision, functionId, requestId, input, permit = this.invocationPermit(runId)) {
|
|
1663
1663
|
const program = this.programs(runId).find((entry) => entry.actorHandle === handleKey(actorHandle));
|
|
1664
1664
|
if (!program)
|
|
1665
|
-
throw new Error("
|
|
1665
|
+
throw new Error("The actor publishes no program.");
|
|
1666
1666
|
return this.#start(runId, program, program.name, revision, functionId, requestId, input, permit);
|
|
1667
1667
|
}
|
|
1668
1668
|
#start(runId, program, viewId, revision, functionId, requestId, input, permit) {
|
|
1669
1669
|
this.#knownRuns.add(runId);
|
|
1670
1670
|
if (permit !== this.invocationPermit(runId))
|
|
1671
|
-
throw new Error("
|
|
1671
|
+
throw new Error("The run has been stopped in the meantime.");
|
|
1672
1672
|
if (program.revision !== revision)
|
|
1673
|
-
throw new Error("
|
|
1673
|
+
throw new Error("The actor package was replaced. Refresh the view.");
|
|
1674
1674
|
const fn = program.functions.find((entry) => entry.id === functionId);
|
|
1675
1675
|
if (!fn)
|
|
1676
|
-
throw new Error("
|
|
1676
|
+
throw new Error("The function is not declared.");
|
|
1677
1677
|
const state = this.#invocations(runId);
|
|
1678
1678
|
const prior = state.invocations.find((entry) => entry.requestId === requestId);
|
|
1679
1679
|
if (prior) {
|
|
1680
1680
|
if (prior.actorId !== program.actorId || prior.actionId !== functionId || prior.revision !== revision || canonicalHash(prior.input) !== canonicalHash(input))
|
|
1681
|
-
throw new Error("
|
|
1681
|
+
throw new Error("The request ID was already used for another call.");
|
|
1682
1682
|
return prior;
|
|
1683
1683
|
}
|
|
1684
1684
|
if (!requestId || requestId.length > 200 || state.requestIds.includes(requestId))
|
|
1685
|
-
throw new Error("
|
|
1685
|
+
throw new Error("Invalid or already processed request ID.");
|
|
1686
1686
|
if (state.requestIds.length >= 1e4)
|
|
1687
|
-
throw new Error("
|
|
1687
|
+
throw new Error("The run has reached its call limit.");
|
|
1688
1688
|
if ([...this.#active.values()].filter((entry) => entry.runId === runId).length >= 8)
|
|
1689
|
-
throw new Error("
|
|
1690
|
-
checked(fn.inputSchema, input, "
|
|
1689
|
+
throw new Error("Eight actor functions are already running.");
|
|
1690
|
+
checked(fn.inputSchema, input, "Function input");
|
|
1691
1691
|
const invocation = { id: randomUUID(), requestId, actorId: program.actorId, actorHandle: program.actorHandle, appId: viewId, revision, actionId: functionId, input, output: [], createdAt: (/* @__PURE__ */ new Date()).toISOString(), status: "queued" };
|
|
1692
1692
|
this.#replaceInvocation(runId, invocation, true);
|
|
1693
1693
|
const controller = new AbortController();
|
|
@@ -1696,15 +1696,15 @@ ${view.styles}`, platformVersion: 2, clientJavaScript: readFileSync(path.join(pr
|
|
|
1696
1696
|
this.#replaceInvocation(runId, started);
|
|
1697
1697
|
try {
|
|
1698
1698
|
if (fn.confirmation && !await this.#confirm(runId, invocation, fn.confirmation, controller.signal))
|
|
1699
|
-
throw new Error("
|
|
1699
|
+
throw new Error("The function was not confirmed.");
|
|
1700
1700
|
const descriptorsFor = (capabilityIds) => operatorCapabilityBinding(this.ownerId(runId), this.#options.operations.list(), capabilityIds).descriptors;
|
|
1701
1701
|
const output = [];
|
|
1702
1702
|
const result = await this.#executeFunction(runId, program, fn, input, { output, id: invocation.id, kind: "app-action", principal: { id: this.ownerId(runId), kind: "operator" }, descriptorsFor, call: async (name2, value, index) => {
|
|
1703
1703
|
const operation = this.#options.operations.operation(name2);
|
|
1704
1704
|
const id = `${invocation.id}:capability:${index}`;
|
|
1705
|
-
const confirmation = operation.operator === "confirm" ? await this.#confirm(runId, invocation,
|
|
1705
|
+
const confirmation = operation.operator === "confirm" ? await this.#confirm(runId, invocation, `Run ${operation.label}?`, controller.signal, value) : true;
|
|
1706
1706
|
if (!confirmation)
|
|
1707
|
-
throw new Error("
|
|
1707
|
+
throw new Error("The action was not confirmed.");
|
|
1708
1708
|
return this.#options.operations.invoke(name2, { runId, invocationId: id, principal: { kind: "operator", actorId: this.ownerId(runId) }, signal: controller.signal, ...operation.operator === "confirm" ? { operatorConfirmation: { operationId: name2, invocationId: id, inputHash: canonicalHash(value) } } : {} }, value);
|
|
1709
1709
|
} }, controller.signal);
|
|
1710
1710
|
this.#replaceInvocation(runId, { ...started, status: "succeeded", result, output, finishedAt: (/* @__PURE__ */ new Date()).toISOString() });
|
|
@@ -1718,7 +1718,7 @@ ${view.styles}`, platformVersion: 2, clientJavaScript: readFileSync(path.join(pr
|
|
|
1718
1718
|
invocation(runId, reference, id) {
|
|
1719
1719
|
const invocation = this.#invocations(runId).invocations.find((entry) => entry.id === id && (entry.appId === reference || entry.actorHandle === reference));
|
|
1720
1720
|
if (!invocation)
|
|
1721
|
-
throw new Error("
|
|
1721
|
+
throw new Error("The function call is unknown.");
|
|
1722
1722
|
return invocation;
|
|
1723
1723
|
}
|
|
1724
1724
|
#invocations(runId) {
|
|
@@ -1734,18 +1734,18 @@ ${view.styles}`, platformVersion: 2, clientJavaScript: readFileSync(path.join(pr
|
|
|
1734
1734
|
finished.shift();
|
|
1735
1735
|
state.invocations = [...active, ...finished];
|
|
1736
1736
|
}
|
|
1737
|
-
assertJsonValue2(state, "Actor
|
|
1737
|
+
assertJsonValue2(state, "Actor calls");
|
|
1738
1738
|
this.runtime().replacePluginState(this.operatorContext(runId), runId, { pluginId: ACTOR_INVOCATIONS_STATE_ID, scope: { kind: "run" }, state });
|
|
1739
1739
|
}
|
|
1740
1740
|
async #confirm(runId, invocation, question, signal, input = invocation.input) {
|
|
1741
1741
|
const answer = await this.#options.askService().ask({ runId, agentId: this.ownerId(runId), turnId: null, commandId: `actor-confirm:${randomUUID()}` }, { question: `${question}
|
|
1742
|
-
|
|
1743
|
-
return answer === "
|
|
1742
|
+
Input: ${JSON.stringify(input).slice(0, 500)}`, options: ["Run", "Cancel"], multi: false, description: `Function ${invocation.actionId} of @${invocation.actorHandle}`, parameters: { source: ACTOR_PROGRAMS_STATE_ID, invocationId: invocation.id } }, signal);
|
|
1743
|
+
return answer === "Run";
|
|
1744
1744
|
}
|
|
1745
1745
|
#program(runId, reference) {
|
|
1746
1746
|
const program = this.programs(runId).find((entry) => entry.name === reference || entry.views.some((view) => view.id === reference));
|
|
1747
1747
|
if (!program)
|
|
1748
|
-
throw new Error(`Actor
|
|
1748
|
+
throw new Error(`Actor package ${reference} is not active.`);
|
|
1749
1749
|
return program;
|
|
1750
1750
|
}
|
|
1751
1751
|
#instance(program) {
|
|
@@ -1753,15 +1753,15 @@ Eingabe: ${JSON.stringify(input).slice(0, 500)}`, options: ["Ausf\xFChren", "Abb
|
|
|
1753
1753
|
}
|
|
1754
1754
|
#assertName(name2) {
|
|
1755
1755
|
if (!NAME.test(name2))
|
|
1756
|
-
throw new Error("
|
|
1756
|
+
throw new Error("Package names begin with a lowercase letter and contain at most 64 lowercase letters, digits, or hyphens.");
|
|
1757
1757
|
}
|
|
1758
1758
|
#assertIdle(runId, actorId) {
|
|
1759
1759
|
if (this.#queues.has(`${runId}\0${actorId}`) || [...this.#active.values()].some((entry) => entry.runId === runId && entry.actorId === actorId))
|
|
1760
|
-
throw new Error("
|
|
1760
|
+
throw new Error("The actor still has running functions or inputs.");
|
|
1761
1761
|
}
|
|
1762
1762
|
async stopActor(runId, actorId) {
|
|
1763
1763
|
const active = [...this.#active.values()].filter((entry) => entry.runId === runId && entry.actorId === actorId);
|
|
1764
|
-
active.forEach((entry) => entry.controller.abort(new Error("Actor
|
|
1764
|
+
active.forEach((entry) => entry.controller.abort(new Error("Actor stopped.")));
|
|
1765
1765
|
const state = this.view(runId).pluginStates.find((entry) => entry.pluginId === ACTOR_PROGRAMS_STATE_ID && entry.scope.kind === "actor" && entry.scope.actorId === actorId)?.state;
|
|
1766
1766
|
if (state?.program)
|
|
1767
1767
|
await this.runtime().nativeTypeScriptExecutor.stopInstance(runId, this.#instance(state.program));
|
|
@@ -1772,7 +1772,7 @@ Eingabe: ${JSON.stringify(input).slice(0, 500)}`, options: ["Ausf\xFChren", "Abb
|
|
|
1772
1772
|
this.#stopping.add(runId);
|
|
1773
1773
|
try {
|
|
1774
1774
|
const active = [...this.#active.values()].filter((entry) => entry.runId === runId);
|
|
1775
|
-
active.forEach((entry) => entry.controller.abort(new Error("Run
|
|
1775
|
+
active.forEach((entry) => entry.controller.abort(new Error("Run stopped.")));
|
|
1776
1776
|
await this.runtime().nativeTypeScriptExecutor.stopRun(runId);
|
|
1777
1777
|
await Promise.allSettled([...active.map((entry) => entry.completed), ...[...this.#queues].filter(([key]) => key.startsWith(`${runId}\0`)).map(([, queue]) => queue)]);
|
|
1778
1778
|
} finally {
|
|
@@ -1788,7 +1788,7 @@ Eingabe: ${JSON.stringify(input).slice(0, 500)}`, options: ["Ausf\xFChren", "Abb
|
|
|
1788
1788
|
return;
|
|
1789
1789
|
for (const invocation of this.#invocations(runId).invocations)
|
|
1790
1790
|
if (invocation.status === "queued" || invocation.status === "running")
|
|
1791
|
-
this.#replaceInvocation(runId, { ...invocation, status: "cancelled", error: "
|
|
1791
|
+
this.#replaceInvocation(runId, { ...invocation, status: "cancelled", error: "The server was stopped during the call.", finishedAt: (/* @__PURE__ */ new Date()).toISOString() });
|
|
1792
1792
|
}
|
|
1793
1793
|
async stopSession(runId, _signal) {
|
|
1794
1794
|
await this.stopRun(runId);
|
|
@@ -1819,7 +1819,7 @@ var metadata = [
|
|
|
1819
1819
|
{ name: "actor_program_diagnostics", label: "Actor Program Diagnostics", description: "Read the last project diagnostics.", longDescription: "Changed errors are automatically supplied before the next model request." }
|
|
1820
1820
|
];
|
|
1821
1821
|
var actorProgramManagementToolNames = metadata.map((entry) => entry.name);
|
|
1822
|
-
var actorProgramToolsAvailable = defineToolAvailability2({ availability: "conditional", availabilityDetail: "
|
|
1822
|
+
var actorProgramToolsAvailable = defineToolAvailability2({ availability: "conditional", availabilityDetail: "For executable actors with agent.spawn and plugin.state.write." }, (actor) => actor.kind !== "human" && holdsUsable(actor, "agent.spawn") && holdsUsable(actor, "plugin.state.write"));
|
|
1823
1823
|
var name = Type.String({ pattern: "^[a-z][a-z0-9-]{0,63}$" });
|
|
1824
1824
|
var managementTools = (runtime, diagnostics) => [
|
|
1825
1825
|
defineRunFunction2({ ...metadata[0], schema: Type.Object({ name, template: Type.Union(runtime.templates().map((entry) => Type.Literal(entry.id, { description: entry.description }))) }, { additionalProperties: false }), resultSchema: Type.Object({ name: Type.String(), directory: Type.String(), files: Type.Array(Type.String()) }, { additionalProperties: false }), available: actorProgramToolsAvailable, executionMode: "sequential", run: (scope, _id, input) => runtime.scaffold(scope.caller.runId, input.name, input.template) }),
|
|
@@ -1863,17 +1863,17 @@ var actorProgramSummary = boundToTools(
|
|
|
1863
1863
|
);
|
|
1864
1864
|
|
|
1865
1865
|
// server/controls-tool.ts
|
|
1866
|
-
var available = defineToolAvailability3({ availability: "always", availabilityDetail: "
|
|
1866
|
+
var available = defineToolAvailability3({ availability: "always", availabilityDetail: "Typed UI reference of the installed actor program plugin." }, () => true);
|
|
1867
1867
|
var metadata2 = {
|
|
1868
1868
|
name: "actor_program_controls",
|
|
1869
|
-
label: "
|
|
1869
|
+
label: "Look up actor program guide and controls",
|
|
1870
1870
|
description: "Read Mini-App control contracts or the actor-program authoring guide.",
|
|
1871
1871
|
longDescription: "With topic: guide, explain the TypeScript package workflow through actor_program_activate. Otherwise list control names, or select one component (for example Form) for only its TypeScript props and supporting types. Import controls from @ragents/client/ui and use these exact props."
|
|
1872
1872
|
};
|
|
1873
1873
|
var describeClientControls = (component) => {
|
|
1874
1874
|
const components = readClientUiComponentNames();
|
|
1875
1875
|
if (component === void 0) return { components };
|
|
1876
|
-
if (!components.includes(component)) throw new Error(`
|
|
1876
|
+
if (!components.includes(component)) throw new Error(`Unknown control ${component}. Valid: ${components.join(", ")}`);
|
|
1877
1877
|
return { files: readClientUiComponentContracts(component) };
|
|
1878
1878
|
};
|
|
1879
1879
|
var createControlsToolContributor = () => ({
|
|
@@ -1893,7 +1893,7 @@ var createControlsToolContributor = () => ({
|
|
|
1893
1893
|
]),
|
|
1894
1894
|
run: async (_scope, _call, input) => {
|
|
1895
1895
|
if (input.topic === "guide") {
|
|
1896
|
-
if (input.component !== void 0) throw new Error("component
|
|
1896
|
+
if (input.component !== void 0) throw new Error("component is only allowed with topic: controls or without topic; for topic: guide, omit component.");
|
|
1897
1897
|
return { guide: await actorProgramGuide.render({}) };
|
|
1898
1898
|
}
|
|
1899
1899
|
return describeClientControls(input.component);
|
|
@@ -1919,7 +1919,7 @@ var errorLines2 = (error) => {
|
|
|
1919
1919
|
const complete = error instanceof Error ? error.lines : void 0;
|
|
1920
1920
|
if (Array.isArray(complete) && complete.every((line) => typeof line === "string")) return [...new Set(complete)];
|
|
1921
1921
|
const lines = messageOf(error).split("\n").map((line) => line.trim()).filter(Boolean);
|
|
1922
|
-
const issues = lines.filter((line) => !/^(Build failed with \d+ errors?:|.*(?:
|
|
1922
|
+
const issues = lines.filter((line) => !/^(Build failed with \d+ errors?:|.*(?:Typecheck|Diagnostics).*:)$/i.test(line));
|
|
1923
1923
|
return [...new Set(issues.length ? issues : lines)];
|
|
1924
1924
|
};
|
|
1925
1925
|
var allErrors = (snapshot) => Object.entries(snapshot.programs).sort(([left], [right]) => left.localeCompare(right)).flatMap(([programName, program]) => program.errors.map((error) => `${programName}: ${error}`));
|
|
@@ -1955,7 +1955,7 @@ var createProjectDiagnostics = (options) => {
|
|
|
1955
1955
|
let fingerprint;
|
|
1956
1956
|
let errors = [];
|
|
1957
1957
|
try {
|
|
1958
|
-
if (entry.isSymbolicLink()) throw new Error("Actor
|
|
1958
|
+
if (entry.isSymbolicLink()) throw new Error("Actor projects must not be symlinks.");
|
|
1959
1959
|
fingerprint = fingerprintOf(await projectSourceFiles2(path2.join(directory, entry.name)));
|
|
1960
1960
|
} catch (error) {
|
|
1961
1961
|
errors = errorLines2(error);
|
|
@@ -1993,13 +1993,13 @@ var createProjectDiagnostics = (options) => {
|
|
|
1993
1993
|
const after = new Set(allErrors(next));
|
|
1994
1994
|
const added = [...after].filter((error) => !before.has(error));
|
|
1995
1995
|
const resolved = [...before].filter((error) => !after.has(error));
|
|
1996
|
-
const changes = [...added.map((error) => `
|
|
1996
|
+
const changes = [...added.map((error) => `New: ${error}`), ...resolved.map((error) => `Fixed: ${error}`)];
|
|
1997
1997
|
const lines = changes.slice(0, maxDeltaLines).map((line) => line.length > maxLineLength ? `${line.slice(0, maxLineLength - 3)}...` : line);
|
|
1998
1998
|
const omitted = changes.length - lines.length;
|
|
1999
1999
|
return [
|
|
2000
|
-
`Actor
|
|
2000
|
+
`Actor program project check (TypeScript and build): ${after.size} errors in ${Object.keys(next.programs).length} projects; ${added.length} new, ${resolved.length} fixed.`,
|
|
2001
2001
|
...lines,
|
|
2002
|
-
...omitted > 0 ? [`${omitted}
|
|
2002
|
+
...omitted > 0 ? [`${omitted} more changes. Complete last state: actor_program_diagnostics.`] : []
|
|
2003
2003
|
].join("\n");
|
|
2004
2004
|
}
|
|
2005
2005
|
};
|
|
@@ -2007,10 +2007,10 @@ var createProjectDiagnostics = (options) => {
|
|
|
2007
2007
|
contribution,
|
|
2008
2008
|
latest(runId, actorId, programName) {
|
|
2009
2009
|
const snapshot = snapshots.get(runId)?.get(actorId);
|
|
2010
|
-
if (!snapshot) return "
|
|
2010
|
+
if (!snapshot) return "No actor program project state checked for this agent yet.";
|
|
2011
2011
|
const programs = Object.entries(snapshot.programs).filter(([id]) => programName === void 0 || id === programName);
|
|
2012
|
-
if (programs.length === 0) return programName ? `
|
|
2013
|
-
return programs.sort(([left], [right]) => left.localeCompare(right)).map(([id, program]) => [`${id}: ${program.errors.length}
|
|
2012
|
+
if (programs.length === 0) return programName ? `No checked project state for ${programName}.` : "No actor program projects exist.";
|
|
2013
|
+
return programs.sort(([left], [right]) => left.localeCompare(right)).map(([id, program]) => [`${id}: ${program.errors.length} errors`, ...program.errors].join("\n")).join("\n\n");
|
|
2014
2014
|
},
|
|
2015
2015
|
forget(runId) {
|
|
2016
2016
|
snapshots.delete(runId);
|