@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
|
@@ -28,7 +28,7 @@ const StartOptionsContext = createContext<StartOptionsControl>(inertControl);
|
|
|
28
28
|
|
|
29
29
|
const messageOf = (cause: unknown): string => cause instanceof Error ? cause.message : String(cause);
|
|
30
30
|
|
|
31
|
-
/**
|
|
31
|
+
/** A preset applies only to options the run currently lets you choose; anything unknown is left alone. */
|
|
32
32
|
export const initialStartOptionUpdates = (
|
|
33
33
|
options: readonly StartOptionState[],
|
|
34
34
|
values: Readonly<Record<string, unknown>>,
|
|
@@ -36,7 +36,7 @@ export const initialStartOptionUpdates = (
|
|
|
36
36
|
.filter((option) => option.selectable && !option.locked && Object.hasOwn(values, option.id))
|
|
37
37
|
.map((option) => [option.id, values[option.id]] as const);
|
|
38
38
|
|
|
39
|
-
/**
|
|
39
|
+
/** Nothing presets what a template fixes; otherwise its start fails on the differing choice. */
|
|
40
40
|
export const withoutFixedStartOptions = (
|
|
41
41
|
values: Readonly<Record<string, unknown>>,
|
|
42
42
|
fixed: Readonly<Record<string, unknown>> | undefined,
|
|
@@ -47,7 +47,7 @@ export interface ShownStartOption {
|
|
|
47
47
|
readonly fixed: boolean;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
/**
|
|
50
|
+
/** What a place shows: the selectable open options and every option the template fixes, with the template's value and not selectable. */
|
|
51
51
|
export const shownStartOptions = (
|
|
52
52
|
options: readonly StartOptionState[],
|
|
53
53
|
fixed: Readonly<Record<string, unknown>>,
|
|
@@ -65,7 +65,7 @@ const sameJson = (left: unknown, right: unknown): boolean => {
|
|
|
65
65
|
&& keys.every((key) => Object.hasOwn(right, key) && sameJson((left as Record<string, unknown>)[key], (right as Record<string, unknown>)[key]));
|
|
66
66
|
};
|
|
67
67
|
|
|
68
|
-
/**
|
|
68
|
+
/** What was chosen before the start differently from what the template fixes; such a start fails on the server. */
|
|
69
69
|
export const conflictingStartOptions = (
|
|
70
70
|
options: readonly StartOptionState[],
|
|
71
71
|
fixed: Readonly<Record<string, unknown>>,
|
|
@@ -139,7 +139,7 @@ export function StartOptionsProvider({
|
|
|
139
139
|
const operation = active.current;
|
|
140
140
|
if (!operation || operation.sessionId !== sessionId || operation.controller.signal.aborted) return;
|
|
141
141
|
if (operation.pending || saving.current?.sessionId === sessionId) {
|
|
142
|
-
setState((current) => ({ ...current, errors: new Map(current.errors).set(optionId, "
|
|
142
|
+
setState((current) => ({ ...current, errors: new Map(current.errors).set(optionId, "The start options are still loading or saving. Please try again afterwards.") }));
|
|
143
143
|
return;
|
|
144
144
|
}
|
|
145
145
|
operation.pending = true;
|
|
@@ -189,7 +189,7 @@ export function StartOptionsProvider({
|
|
|
189
189
|
})();
|
|
190
190
|
}, [allowed, sessionId, set, state]);
|
|
191
191
|
|
|
192
|
-
//
|
|
192
|
+
// Until the server has answered after the first message, everything is locked; after that its locked applies.
|
|
193
193
|
const control = useMemo<StartOptionsControl>(() => ({
|
|
194
194
|
options: state.sessionId === sessionId ? state.options.map((option) => ({ ...option, locked: option.locked || (started && !state.loadedStarted) })) : [],
|
|
195
195
|
errors: state.sessionId === sessionId ? state.errors : new Map(),
|
|
@@ -207,9 +207,9 @@ const ChoiceControl = ({ disabled, error, option, setValue }: StartOptionControl
|
|
|
207
207
|
try {
|
|
208
208
|
const presentation = choicePresentationFrom(option.presentation, option.id);
|
|
209
209
|
if (!presentation) {
|
|
210
|
-
return { message: `
|
|
210
|
+
return { message: `The start option ${option.id} has neither a web component nor a choice presentation` };
|
|
211
211
|
}
|
|
212
|
-
if (typeof option.value !== "string") return { message: `
|
|
212
|
+
if (typeof option.value !== "string") return { message: `The value of the start option ${option.id} is not an identifier` };
|
|
213
213
|
return { presentation, value: option.value };
|
|
214
214
|
} catch (cause) {
|
|
215
215
|
return { message: messageOf(cause) };
|
|
@@ -233,12 +233,12 @@ const unchangeable = async () => undefined;
|
|
|
233
233
|
|
|
234
234
|
function FixedStartOption({ conflict, machines, option, registry }: { conflict: boolean; machines: OfferedMachines; option: StartOptionState; registry: PluginRegistry }) {
|
|
235
235
|
const Control = registry.startOptions.get(option.id)?.Control ?? ChoiceControl;
|
|
236
|
-
return <span className="contents" data-start-option-fixed={option.id} title="
|
|
237
|
-
<Control disabled error={conflict ? "
|
|
236
|
+
return <span className="contents" data-start-option-fixed={option.id} title="Set by the template">
|
|
237
|
+
<Control disabled error={conflict ? "A different value is chosen; the template sets this one." : undefined} machines={machines} option={option} setValue={unchangeable} />
|
|
238
238
|
</span>;
|
|
239
239
|
}
|
|
240
240
|
|
|
241
|
-
/**
|
|
241
|
+
/** The start options of a place; what the chosen template fixes is shown with its value instead of as a choice. */
|
|
242
242
|
export function StartOptionControls({ disabled, registry, placement = "page", fixed = noneFixed }: {
|
|
243
243
|
disabled: boolean;
|
|
244
244
|
registry: PluginRegistry;
|
|
@@ -14,16 +14,16 @@ const tileOf = (entry: StartEntry, guided: boolean, technical: boolean): Connect
|
|
|
14
14
|
title: entry.title,
|
|
15
15
|
description: entry.description,
|
|
16
16
|
kind: entry.action,
|
|
17
|
-
category: entry.category ?? (technical ? "Run
|
|
17
|
+
category: entry.category ?? (technical ? "Run scripts" : "Workflows"),
|
|
18
18
|
...(guided ? { guided: true } : {}),
|
|
19
19
|
});
|
|
20
20
|
|
|
21
|
-
/**
|
|
21
|
+
/** The start selection of a draft: the same tiles as Start in VS Code; New chat opens the empty run, a template starts right away or after its guide. */
|
|
22
22
|
export function StartSelection({ registry, session, initialEntryId, onOpen }: {
|
|
23
23
|
registry: PluginRegistry;
|
|
24
24
|
session: SessionContext;
|
|
25
25
|
initialEntryId?: string;
|
|
26
|
-
/**
|
|
26
|
+
/** The draft becomes the open run, as an empty chat or after a template starts. */
|
|
27
27
|
onOpen: () => void;
|
|
28
28
|
}) {
|
|
29
29
|
const access = useAccess();
|
|
@@ -61,7 +61,7 @@ export function StartSelection({ registry, session, initialEntryId, onOpen }: {
|
|
|
61
61
|
const open = useCallback((entryId: string) => {
|
|
62
62
|
const entry = registry.startEntries.find((candidate) => candidate.id === entryId);
|
|
63
63
|
if (!entry || !canStartEntry(access, entry.id)) {
|
|
64
|
-
setError("
|
|
64
|
+
setError("This template is not available in the current profile.");
|
|
65
65
|
return;
|
|
66
66
|
}
|
|
67
67
|
openStartEntry(entry, registry, modal, sessionRef, launch);
|
|
@@ -74,17 +74,17 @@ export function StartSelection({ registry, session, initialEntryId, onOpen }: {
|
|
|
74
74
|
}, [disabled, initialEntryId, open]);
|
|
75
75
|
|
|
76
76
|
return <div className="flex min-h-0 min-w-0 flex-1 flex-col overflow-auto px-10 pt-6 pb-5 max-md:px-3 max-md:pt-11 max-md:pb-4">
|
|
77
|
-
<section aria-label="
|
|
78
|
-
<StartSection count={startTileCount(tiles, defaultEntry, free)} title="
|
|
77
|
+
<section aria-label="Start selection" className="mx-auto grid w-full max-w-composer grid-cols-1 gap-1.5">
|
|
78
|
+
<StartSection count={startTileCount(tiles, defaultEntry, free)} title="New" />
|
|
79
79
|
{error && <p className="text-[0.8rem] text-destructive" role="alert">{error}</p>}
|
|
80
80
|
{tiles.length === 0 && !free
|
|
81
|
-
? <p className="text-[0.75rem] text-muted-foreground" role="status">
|
|
82
|
-
: <StartTiles defaultEntry={defaultEntry} disabled={disabled} entries={tiles} label="
|
|
81
|
+
? <p className="text-[0.75rem] text-muted-foreground" role="status">No template is shared with this user account.</p>
|
|
82
|
+
: <StartTiles defaultEntry={defaultEntry} disabled={disabled} entries={tiles} label="Templates" onNewChat={free ? onOpen : undefined} onStart={open} />}
|
|
83
83
|
</section>
|
|
84
84
|
</div>;
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
/**
|
|
87
|
+
/** Opens a template: its guide asks first, a skill with a guide then moves to the preparation chat, everything else starts right away. */
|
|
88
88
|
export function openStartEntry(entry: StartEntry, registry: PluginRegistry, modal: ModalController,
|
|
89
89
|
sessionRef: RefObject<SessionContext>, launch: (entry: StartEntry, value: JsonValue | null) => Promise<void>) {
|
|
90
90
|
const guide = registry.guideFor(entry);
|
|
@@ -100,11 +100,11 @@ export function openStartEntry(entry: StartEntry, registry: PluginRegistry, moda
|
|
|
100
100
|
void launch(entry, value);
|
|
101
101
|
return;
|
|
102
102
|
}
|
|
103
|
-
if (typeof value !== "string" || !value.trim()) throw new Error(`
|
|
103
|
+
if (typeof value !== "string" || !value.trim()) throw new Error(`The guide for ${entry.title} must return a non-empty task.`);
|
|
104
104
|
const prompt = value;
|
|
105
105
|
completed = true;
|
|
106
106
|
controller.back();
|
|
107
|
-
modal.open({ title: "
|
|
107
|
+
modal.open({ title: "Prepare task", subtitle: entry.title,
|
|
108
108
|
render: () => <RunPreparationChat entry={entry} initialPrompt={prompt} registry={registry} sessionRef={sessionRef} /> });
|
|
109
109
|
}} />,
|
|
110
110
|
});
|
|
@@ -2,7 +2,7 @@ import { BookIcon, ChevronRightIcon, CodeIcon, PlusIcon } from "lucide-react";
|
|
|
2
2
|
import type { ReactNode } from "react";
|
|
3
3
|
import type { ConnectionEntry } from "./panel/contract";
|
|
4
4
|
|
|
5
|
-
const NEW_CHAT = { category: "
|
|
5
|
+
const NEW_CHAT = { category: "No template", title: "New chat", description: "Empty run; the task takes shape in the chat." };
|
|
6
6
|
|
|
7
7
|
const sectionClass = "flex items-baseline gap-2 text-[0.66rem] font-bold uppercase tracking-[0.06em] text-muted-foreground";
|
|
8
8
|
const countClass = "font-mono text-[0.62rem] font-normal tracking-normal opacity-80";
|
|
@@ -12,7 +12,7 @@ const entryIcon = (entry: ConnectionEntry): ReactNode => entry.kind === "skill"
|
|
|
12
12
|
? <BookIcon aria-hidden className="size-3.5" />
|
|
13
13
|
: <CodeIcon aria-hidden className="size-3.5" />;
|
|
14
14
|
|
|
15
|
-
/**
|
|
15
|
+
/** The heading of a Start page section, with a count and an action on the right. */
|
|
16
16
|
export function StartSection({ title, count, children }: { title: string; count?: number; children?: ReactNode }) {
|
|
17
17
|
return <div className="flex items-baseline justify-between gap-2">
|
|
18
18
|
<h2 className={sectionClass}>{title}{count !== undefined && <span className={countClass}>{count}</span>}</h2>
|
|
@@ -25,7 +25,7 @@ function Tile({ category, title, description, icon, standard, guided, disabled,
|
|
|
25
25
|
title: string;
|
|
26
26
|
description: string;
|
|
27
27
|
icon: ReactNode;
|
|
28
|
-
/**
|
|
28
|
+
/** The template is its server's default. */
|
|
29
29
|
standard?: boolean;
|
|
30
30
|
guided?: boolean;
|
|
31
31
|
disabled: boolean;
|
|
@@ -36,28 +36,28 @@ function Tile({ category, title, description, icon, standard, guided, disabled,
|
|
|
36
36
|
<span className="flex min-w-0 items-center gap-1.5 text-(--tone)">
|
|
37
37
|
{icon}
|
|
38
38
|
<span className="truncate text-[0.58rem] font-semibold uppercase tracking-[0.06em] text-muted-foreground">{category}</span>
|
|
39
|
-
{standard && <span className="ml-auto flex-none rounded-sm border border-current px-1 text-[0.52rem] font-semibold uppercase tracking-[0.06em] leading-[1.5] opacity-70">
|
|
39
|
+
{standard && <span className="ml-auto flex-none rounded-sm border border-current px-1 text-[0.52rem] font-semibold uppercase tracking-[0.06em] leading-[1.5] opacity-70">Default</span>}
|
|
40
40
|
</span>
|
|
41
41
|
<span className="text-[0.76rem] font-semibold leading-snug [overflow-wrap:anywhere]">{title}</span>
|
|
42
42
|
<span className="line-clamp-2 text-[0.66rem] leading-[1.45] text-muted-foreground">{description}</span>
|
|
43
43
|
<span className="mt-auto flex items-center gap-0.5 pt-1.5 text-[0.62rem] font-semibold text-(--tone) opacity-50 group-enabled/tile:group-hover/tile:opacity-100">
|
|
44
|
-
{guided ? "
|
|
44
|
+
{guided ? "Set up" : "Start"}<ChevronRightIcon aria-hidden className="size-3" />
|
|
45
45
|
</span>
|
|
46
46
|
</button>
|
|
47
47
|
</li>;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
/**
|
|
50
|
+
/** How many tiles StartTiles shows: the templates, plus New chat when there is no default template. */
|
|
51
51
|
export const startTileCount = (entries: readonly ConnectionEntry[], defaultEntry: string | undefined, newChat: boolean): number =>
|
|
52
52
|
entries.length + (defaultEntry === undefined && newChat ? 1 : 0);
|
|
53
53
|
|
|
54
|
-
/**
|
|
54
|
+
/** A server's templates as tiles, the default template or New chat first: Start in VS Code and the start selection in the browser. */
|
|
55
55
|
export function StartTiles({ entries, defaultEntry, label, disabled = false, onNewChat, onStart }: {
|
|
56
56
|
entries: readonly ConnectionEntry[];
|
|
57
57
|
defaultEntry?: string;
|
|
58
58
|
label: string;
|
|
59
59
|
disabled?: boolean;
|
|
60
|
-
/**
|
|
60
|
+
/** Without it the New chat tile is missing. */
|
|
61
61
|
onNewChat?: () => void;
|
|
62
62
|
onStart: (entryId: string) => void;
|
|
63
63
|
}) {
|
|
@@ -51,10 +51,10 @@ export function SurfaceShortcuts({ children }: { children: ReactNode }) {
|
|
|
51
51
|
};
|
|
52
52
|
|
|
53
53
|
return <div className="flex min-w-0 flex-1" ref={containerRef}>
|
|
54
|
-
{scroll.overflow && <ToolbarItem as="button" aria-controls={id} aria-label="
|
|
55
|
-
<div aria-label="
|
|
54
|
+
{scroll.overflow && <ToolbarItem as="button" aria-controls={id} aria-label="Scroll apps and actors left" className="w-8 justify-center px-0" disabled={!scroll.left} onClick={() => move(-1)} title="Scroll left" type="button"><ChevronLeftIcon size={18} /></ToolbarItem>}
|
|
55
|
+
<div aria-label="Browse apps and actors" className="flex min-w-0 flex-1 items-stretch overflow-x-auto no-scrollbar focus-visible:outline-2 focus-visible:outline-ring/60 focus-visible:-outline-offset-3" id={id} ref={viewportRef} role="group" tabIndex={0}>
|
|
56
56
|
<div className="flex w-max flex-none items-stretch" ref={contentRef}>{children}</div>
|
|
57
57
|
</div>
|
|
58
|
-
{scroll.overflow && <ToolbarItem as="button" aria-controls={id} aria-label="
|
|
58
|
+
{scroll.overflow && <ToolbarItem as="button" aria-controls={id} aria-label="Scroll apps and actors right" className="w-8 justify-center border-r-0 border-l border-border px-0 [&>svg]:rotate-180" disabled={!scroll.right} onClick={() => move(1)} title="Scroll right" type="button"><ChevronLeftIcon size={18} /></ToolbarItem>}
|
|
59
59
|
</div>;
|
|
60
60
|
}
|
|
@@ -13,8 +13,8 @@ export function ThemeSettings() {
|
|
|
13
13
|
const writable = access.can("settings.write");
|
|
14
14
|
return <div className="mx-auto flex max-w-[1020px] flex-col gap-6 px-[clamp(20px,4vw,46px)] pt-7 pb-12 max-sm:px-3.5 max-sm:pt-5 max-sm:pb-9">
|
|
15
15
|
<header>
|
|
16
|
-
<h2 className="text-[1.08rem] text-foreground">
|
|
17
|
-
<p className="mt-2 max-w-[780px] text-xs leading-[1.55] text-muted-foreground">
|
|
16
|
+
<h2 className="text-[1.08rem] text-foreground">Appearance</h2>
|
|
17
|
+
<p className="mt-2 max-w-[780px] text-xs leading-[1.55] text-muted-foreground">Colors for the whole interface, the surface and the sidebar.</p>
|
|
18
18
|
</header>
|
|
19
19
|
<section aria-labelledby="theme-settings-title">
|
|
20
20
|
<Card className="flex-row flex-wrap items-center gap-5 p-6 max-sm:p-4">
|
|
@@ -25,9 +25,9 @@ export function ThemeSettings() {
|
|
|
25
25
|
</div>
|
|
26
26
|
<div className="flex-[1_1_220px]">
|
|
27
27
|
<h3 className="mb-1.5 text-lg font-semibold" id="theme-settings-title">Schichtwerk</h3>
|
|
28
|
-
<p className={noteClasses}>Matte
|
|
28
|
+
<p className={noteClasses}>Matte surfaces and drawn outlines.</p>
|
|
29
29
|
</div>
|
|
30
|
-
<ToggleGroup aria-label="Schichtwerk
|
|
30
|
+
<ToggleGroup aria-label="Schichtwerk color scheme" className="flex-none max-sm:w-full" disabled={!writable} size="sm" spacing={0}
|
|
31
31
|
value={[preference]} variant="outline"
|
|
32
32
|
onValueChange={([value]) => { if (value && writable) store.setPreference(parseThemePreference(value)); }}>
|
|
33
33
|
{themeOptions.map((option) => <ToggleGroupItem key={option.value} value={option.value}>{option.label}</ToggleGroupItem>)}
|
|
@@ -36,11 +36,11 @@ export function ThemeSettings() {
|
|
|
36
36
|
</section>
|
|
37
37
|
<p className={noteClasses} role="status">
|
|
38
38
|
{preference === "system"
|
|
39
|
-
? `
|
|
40
|
-
: `Schichtwerk ${appearance === "dark" ? "
|
|
41
|
-
{" "}
|
|
39
|
+
? `Follows the system setting. Schichtwerk ${appearance === "dark" ? "Dark" : "Light"} is currently active.`
|
|
40
|
+
: `Schichtwerk ${appearance === "dark" ? "Dark" : "Light"} is active.`}
|
|
41
|
+
{" "}Changes apply immediately and are saved in this browser.
|
|
42
42
|
</p>
|
|
43
|
-
{!writable && <p className={noteClasses}>
|
|
43
|
+
{!writable && <p className={noteClasses}>With your permissions, the appearance is read-only.</p>}
|
|
44
44
|
{error && <p className="text-sm leading-[1.6] text-destructive" role="alert">{error}</p>}
|
|
45
45
|
</div>;
|
|
46
46
|
}
|
|
@@ -47,9 +47,9 @@ export function TitleModelSettings() {
|
|
|
47
47
|
if (!readable) return null;
|
|
48
48
|
if (state.status === "failed") return <Alert className="grid justify-items-start gap-2" variant="destructive">
|
|
49
49
|
<AlertDescription>{state.error}</AlertDescription>
|
|
50
|
-
<Button variant="outline" onClick={() => { setState({ status: "loading" }); setRetry((value) => value + 1); }}>
|
|
50
|
+
<Button variant="outline" onClick={() => { setState({ status: "loading" }); setRetry((value) => value + 1); }}>Reload</Button>
|
|
51
51
|
</Alert>;
|
|
52
|
-
if (state.status !== "ready" || draft === undefined) return <p className={noteClasses} role="status">
|
|
52
|
+
if (state.status !== "ready" || draft === undefined) return <p className={noteClasses} role="status">Loading title settings ...</p>;
|
|
53
53
|
const { settings } = state;
|
|
54
54
|
const save = async () => {
|
|
55
55
|
if (!writable || saving.current || !dirty) return;
|
|
@@ -61,39 +61,39 @@ export function TitleModelSettings() {
|
|
|
61
61
|
const saved = await requestTitleModelSettings({ selection: draft });
|
|
62
62
|
setState({ status: "ready", settings: saved });
|
|
63
63
|
setDraft(saved.selection);
|
|
64
|
-
setNotice(saved.selection === null ? "
|
|
64
|
+
setNotice(saved.selection === null ? "Automatic titles are turned off." : "Model saved for the next automatic titles.");
|
|
65
65
|
window.dispatchEvent(new Event(titleModelSettingsChangedEvent));
|
|
66
66
|
} catch (cause) { setError(messageOf(cause)); }
|
|
67
67
|
finally { saving.current = false; setPending(false); }
|
|
68
68
|
};
|
|
69
69
|
|
|
70
70
|
const options = titleModelOptions(settings.models, draft, settings.models.length > 20 ? query : "");
|
|
71
|
-
return <form aria-label="
|
|
71
|
+
return <form aria-label="Model for automatic titles" className="flex min-w-0 flex-col items-start gap-3" onSubmit={(event) => {
|
|
72
72
|
event.preventDefault();
|
|
73
73
|
void save();
|
|
74
74
|
}}>
|
|
75
|
-
<p className={noteClasses}>
|
|
76
|
-
{settings.models.length === 0 && <p className={noteClasses}>
|
|
77
|
-
{!writable && <p className={noteClasses}>
|
|
78
|
-
{settings.models.length > 20 && <Input aria-label="
|
|
79
|
-
onChange={(event) => setQuery(event.target.value)} placeholder="
|
|
75
|
+
<p className={noteClasses}>Condenses the first task into a short title line. Applies to the next automatically generated titles.</p>
|
|
76
|
+
{settings.models.length === 0 && <p className={noteClasses}>The provider offers no model for titles; automatic titles stay off.</p>}
|
|
77
|
+
{!writable && <p className={noteClasses}>You have read access to these settings.</p>}
|
|
78
|
+
{settings.models.length > 20 && <Input aria-label="Search title models" className={controlClasses} disabled={!writable || pending}
|
|
79
|
+
onChange={(event) => setQuery(event.target.value)} placeholder="Search models ..." type="search" value={query} />}
|
|
80
80
|
<Select disabled={!writable || pending} items={options} value={titleSelectionKey(draft)} onValueChange={(key) => {
|
|
81
81
|
if (key === null) return;
|
|
82
82
|
setDraft(titleSelectionFromKey(key, settings.models));
|
|
83
83
|
setError(undefined);
|
|
84
84
|
setNotice(undefined);
|
|
85
85
|
}}>
|
|
86
|
-
<SelectTrigger aria-label="
|
|
86
|
+
<SelectTrigger aria-label="Model" className={controlClasses}><SelectValue /></SelectTrigger>
|
|
87
87
|
<SelectContent>
|
|
88
88
|
{options.map((option) => <SelectItem key={option.value} value={option.value}>{option.label}</SelectItem>)}
|
|
89
89
|
</SelectContent>
|
|
90
90
|
</Select>
|
|
91
91
|
<div className="flex flex-wrap items-center gap-x-3 gap-y-2">
|
|
92
|
-
<Button disabled={!writable || pending || !dirty} type="submit">{pending ? "
|
|
92
|
+
<Button disabled={!writable || pending || !dirty} type="submit">{pending ? "Saving ..." : "Save"}</Button>
|
|
93
93
|
{dirty && <Button variant="outline" disabled={pending} onClick={() => {
|
|
94
94
|
setDraft(settings.selection); setError(undefined); setNotice(undefined);
|
|
95
|
-
}}
|
|
96
|
-
<span className={`${noteClasses} empty:hidden`} role="status">{notice ?? (dirty ? "
|
|
95
|
+
}}>Discard changes</Button>}
|
|
96
|
+
<span className={`${noteClasses} empty:hidden`} role="status">{notice ?? (dirty ? "Unsaved changes" : "")}</span>
|
|
97
97
|
</div>
|
|
98
98
|
{error && <p className="text-[0.76rem] text-destructive" role="alert">{error}</p>}
|
|
99
99
|
</form>;
|
|
@@ -48,7 +48,7 @@ export function WorkspacePanel(props: WorkspacePanelProps) {
|
|
|
48
48
|
const tabs = props.tabs;
|
|
49
49
|
const activeTab = tabs.find((tab) => tab.id === props.navigation.activeTabId) ?? tabs[0];
|
|
50
50
|
const activeTabId = activeTab?.id;
|
|
51
|
-
const stateAction = collapsed ? "
|
|
51
|
+
const stateAction = collapsed ? "Expand sidebar" : "Collapse sidebar";
|
|
52
52
|
|
|
53
53
|
useLayoutEffect(() => {
|
|
54
54
|
const panel = panelRef.current;
|
|
@@ -147,7 +147,7 @@ export function WorkspacePanel(props: WorkspacePanelProps) {
|
|
|
147
147
|
frame = undefined;
|
|
148
148
|
applyWidth(currentWidth);
|
|
149
149
|
target.setAttribute("aria-valuenow", String(Math.round(currentWidth)));
|
|
150
|
-
target.setAttribute("aria-valuetext", `${Math.round(currentWidth)}
|
|
150
|
+
target.setAttribute("aria-valuetext", `${Math.round(currentWidth)} pixels`);
|
|
151
151
|
});
|
|
152
152
|
}
|
|
153
153
|
|
|
@@ -165,7 +165,7 @@ export function WorkspacePanel(props: WorkspacePanelProps) {
|
|
|
165
165
|
applyWidth(normalWidthRef.current);
|
|
166
166
|
const effective = clampWidth(normalWidthRef.current);
|
|
167
167
|
target.setAttribute("aria-valuenow", String(Math.round(effective)));
|
|
168
|
-
target.setAttribute("aria-valuetext", `${Math.round(effective)}
|
|
168
|
+
target.setAttribute("aria-valuetext", `${Math.round(effective)} pixels`);
|
|
169
169
|
}
|
|
170
170
|
|
|
171
171
|
window.addEventListener("pointermove", move);
|
|
@@ -196,7 +196,7 @@ export function WorkspacePanel(props: WorkspacePanelProps) {
|
|
|
196
196
|
|
|
197
197
|
return (
|
|
198
198
|
<aside
|
|
199
|
-
aria-label="
|
|
199
|
+
aria-label="Sidebar"
|
|
200
200
|
className={cn(
|
|
201
201
|
"relative z-20 flex min-h-0 min-w-0 flex-col @max-[960px]/chat-content:absolute @max-[960px]/chat-content:inset-y-0 @max-[960px]/chat-content:right-0 @max-[960px]/chat-content:left-auto",
|
|
202
202
|
collapsed
|
|
@@ -211,12 +211,12 @@ export function WorkspacePanel(props: WorkspacePanelProps) {
|
|
|
211
211
|
<div
|
|
212
212
|
aria-controls="workspace-panel"
|
|
213
213
|
aria-disabled={!resizable}
|
|
214
|
-
aria-label="
|
|
214
|
+
aria-label="Sidebar width"
|
|
215
215
|
aria-orientation="vertical"
|
|
216
216
|
aria-valuemax={Math.round(layoutBounds.max)}
|
|
217
217
|
aria-valuemin={Math.round(layoutBounds.min)}
|
|
218
218
|
aria-valuenow={Math.round(effectiveWidth)}
|
|
219
|
-
aria-valuetext={`${Math.round(effectiveWidth)}
|
|
219
|
+
aria-valuetext={`${Math.round(effectiveWidth)} pixels`}
|
|
220
220
|
className={cn(
|
|
221
221
|
"absolute inset-y-0 right-auto -left-1 z-30 w-2 touch-none",
|
|
222
222
|
resizable
|
|
@@ -227,11 +227,11 @@ export function WorkspacePanel(props: WorkspacePanelProps) {
|
|
|
227
227
|
onPointerDown={resizable ? startResize : undefined}
|
|
228
228
|
role="separator"
|
|
229
229
|
tabIndex={resizable ? 0 : -1}
|
|
230
|
-
title="
|
|
230
|
+
title="Drag to resize"
|
|
231
231
|
/>
|
|
232
232
|
)}
|
|
233
233
|
{props.headerContainer && createPortal(<TooltipProvider><div className="flex min-w-0 flex-1 items-center gap-1.5 overflow-hidden pr-[7px] pl-[9px]" data-workspace-state={props.state}>
|
|
234
|
-
<nav aria-label="
|
|
234
|
+
<nav aria-label="Sidebar" className="flex min-w-0 flex-1 flex-nowrap gap-[3px] overflow-x-auto no-scrollbar" hidden={collapsed} role="tablist">
|
|
235
235
|
{tabs.map((tab) => (
|
|
236
236
|
<Tooltip key={tab.id}>
|
|
237
237
|
<TooltipTrigger
|
|
@@ -253,7 +253,7 @@ export function WorkspacePanel(props: WorkspacePanelProps) {
|
|
|
253
253
|
/>
|
|
254
254
|
)}
|
|
255
255
|
</TooltipTrigger>
|
|
256
|
-
<TooltipContent side="bottom">{props.pendingTabIds.includes(tab.id) ? `${tab.label} -
|
|
256
|
+
<TooltipContent side="bottom">{props.pendingTabIds.includes(tab.id) ? `${tab.label} - new activity` : tab.label}</TooltipContent>
|
|
257
257
|
</Tooltip>
|
|
258
258
|
))}
|
|
259
259
|
</nav>
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import type { AccessSnapshot } from "../../../packages/ragents/src/access";
|
|
2
2
|
|
|
3
3
|
export function accessSnapshotFrom(value: unknown): AccessSnapshot {
|
|
4
|
-
if (!value || typeof value !== "object") throw new Error("
|
|
4
|
+
if (!value || typeof value !== "object") throw new Error("Invalid user configuration");
|
|
5
5
|
const snapshot = value as Record<string, unknown>;
|
|
6
|
-
if (typeof snapshot.enabled !== "boolean") throw new Error("
|
|
6
|
+
if (typeof snapshot.enabled !== "boolean") throw new Error("Invalid sign-in mode");
|
|
7
7
|
if (snapshot.user === null) return { enabled: snapshot.enabled, user: null };
|
|
8
8
|
const user = snapshot.user as Record<string, unknown> | undefined;
|
|
9
9
|
if (!user || typeof user.id !== "string" || typeof user.label !== "string"
|
|
10
10
|
|| !Array.isArray(user.rights) || !user.rights.every((right) => typeof right === "string")
|
|
11
11
|
|| (user.startEntries !== undefined && (!Array.isArray(user.startEntries)
|
|
12
12
|
|| !user.startEntries.every((entry) => typeof entry === "string" && entry.length > 0)))) {
|
|
13
|
-
throw new Error("
|
|
13
|
+
throw new Error("Invalid signed-in user");
|
|
14
14
|
}
|
|
15
15
|
return { enabled: snapshot.enabled, user: { id: user.id, label: user.label, rights: user.rights,
|
|
16
16
|
...(user.startEntries !== undefined ? { startEntries: user.startEntries as string[] } : {}) } };
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
/**
|
|
19
|
+
/** The paths the server puts behind sign-in; all UI data flows through /rpc and /rpc/stream. */
|
|
20
20
|
const PROTECTED_PATH = /^\/(?:api|rpc|files)(?:\/|$)/;
|
|
21
21
|
|
|
22
22
|
export function observeAccessExpiry(request: typeof fetch, origin: string, onExpired: () => void): typeof fetch {
|
|
@@ -7,12 +7,12 @@ let installed: string | undefined;
|
|
|
7
7
|
const sameOrigin = (url: string, browser: Window): boolean => new URL(url, browser.location.href).origin === browser.location.origin;
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* Holds the access token of a page that runs without a sign-in cookie (iframe in a VS Code webview):
|
|
11
|
+
* every fetch to its own server carries it as a bearer, addresses without headers (event stream, frames) as a query parameter.
|
|
12
12
|
*/
|
|
13
13
|
export function installAccessToken(token: string, browser: Window = window): void {
|
|
14
|
-
if (!token) throw new Error("
|
|
15
|
-
if (installed !== undefined) throw new Error("
|
|
14
|
+
if (!token) throw new Error("The access token is empty.");
|
|
15
|
+
if (installed !== undefined) throw new Error("The access token is already installed.");
|
|
16
16
|
installed = token;
|
|
17
17
|
const original = browser.fetch.bind(browser);
|
|
18
18
|
browser.fetch = (input, init) => {
|
|
@@ -24,7 +24,7 @@ export function installAccessToken(token: string, browser: Window = window): voi
|
|
|
24
24
|
|
|
25
25
|
export const accessTokenInstalled = (): boolean => installed !== undefined;
|
|
26
26
|
|
|
27
|
-
/**
|
|
27
|
+
/** Appends the installed token to a server address; without a token the address stays unchanged. */
|
|
28
28
|
export function withAccessToken(path: string): string {
|
|
29
29
|
if (installed === undefined) return path;
|
|
30
30
|
return `${path}${path.includes("?") ? "&" : "?"}${ACCESS_TOKEN_QUERY}=${encodeURIComponent(installed)}`;
|
|
@@ -6,8 +6,8 @@ const ACTOR_HUES = [212, 158, 28, 283, 350, 190, 95, 320, 55, 245];
|
|
|
6
6
|
const shortId = (id: string) => id.length > 12 ? `${id.slice(0, 12)}...` : id;
|
|
7
7
|
|
|
8
8
|
export const actorInputLabel = (view: RunView, input: RunActorInput): string => input.subscriptionId
|
|
9
|
-
? "
|
|
10
|
-
: `
|
|
9
|
+
? "Delivered via subscription"
|
|
10
|
+
: `Delivered by @${view.actors.find((actor) => actor.id === input.enqueuedBy)?.handle ?? shortId(input.enqueuedBy)}`;
|
|
11
11
|
|
|
12
12
|
export const actorConversation = (view: RunView, actor: RunActor): Message[] => {
|
|
13
13
|
const colorOf = (actorId: string) => {
|
|
@@ -20,7 +20,7 @@ export const actorConversation = (view: RunView, actor: RunActor): Message[] =>
|
|
|
20
20
|
const fromOwner = input.enqueuedBy === view.ownerId;
|
|
21
21
|
const attachments = input.artifactIds.map((id) => {
|
|
22
22
|
const artifact = view.artifacts.find((entry) => entry.id === id);
|
|
23
|
-
if (!artifact) throw new Error(`
|
|
23
|
+
if (!artifact) throw new Error(`Attachment ${id} is missing from the run view`);
|
|
24
24
|
return {
|
|
25
25
|
name: artifact.title, mediaType: artifact.mediaType, size: artifact.size,
|
|
26
26
|
url: `/chat/${encodeURIComponent(view.id)}/attachments/${encodeURIComponent(id)}`,
|
|
@@ -4,11 +4,11 @@ import { Button, Checkbox, Input, Table, TableBody, TableCell, TableHead, TableH
|
|
|
4
4
|
import type { DataTableProps, TableAction, TableColumn, TableValue } from "./table-contracts";
|
|
5
5
|
|
|
6
6
|
export type TableSort = { id: string; direction: "asc" | "desc" };
|
|
7
|
-
const displayValue = (value: TableValue) => value === null || value === undefined ? "" : typeof value === "boolean" ? value ? "
|
|
7
|
+
const displayValue = (value: TableValue) => value === null || value === undefined ? "" : typeof value === "boolean" ? value ? "Yes" : "No" : String(value);
|
|
8
8
|
|
|
9
9
|
export function tableRows<Row>(rows: readonly Row[], columns: readonly TableColumn<Row>[], query: string, sort?: TableSort): Row[] {
|
|
10
|
-
const needle = query.trim().toLocaleLowerCase("
|
|
11
|
-
const filtered = rows.filter((row) => !needle || columns.some((column) => column.filterable !== false && displayValue(column.value(row)).toLocaleLowerCase("
|
|
10
|
+
const needle = query.trim().toLocaleLowerCase("en-US");
|
|
11
|
+
const filtered = rows.filter((row) => !needle || columns.some((column) => column.filterable !== false && displayValue(column.value(row)).toLocaleLowerCase("en-US").includes(needle)));
|
|
12
12
|
const column = sort && columns.find((entry) => entry.id === sort.id && entry.sortable);
|
|
13
13
|
if (!column || !sort) return filtered;
|
|
14
14
|
return filtered.sort((left, right) => {
|
|
@@ -18,7 +18,7 @@ export function tableRows<Row>(rows: readonly Row[], columns: readonly TableColu
|
|
|
18
18
|
if (b === null || b === undefined) return -1;
|
|
19
19
|
const order = typeof a === "number" && typeof b === "number" ? a - b
|
|
20
20
|
: typeof a === "boolean" && typeof b === "boolean" ? Number(a) - Number(b)
|
|
21
|
-
: String(a).localeCompare(String(b), "
|
|
21
|
+
: String(a).localeCompare(String(b), "en-US", { numeric: true });
|
|
22
22
|
return sort.direction === "asc" ? order : -order;
|
|
23
23
|
});
|
|
24
24
|
}
|
|
@@ -61,11 +61,11 @@ export function DataTable<Row>(props: DataTableProps<Row>) {
|
|
|
61
61
|
}
|
|
62
62
|
};
|
|
63
63
|
return (
|
|
64
|
-
<section aria-label={title ?? "
|
|
64
|
+
<section aria-label={title ?? "Data table"} aria-busy={loading} className="flex min-w-0 flex-col gap-3">
|
|
65
65
|
{title && <h2 className="text-base font-semibold">{title}</h2>}
|
|
66
|
-
{filterable && <Input aria-label="
|
|
66
|
+
{filterable && <Input aria-label="Search table" id={filterId} onChange={(event) => setQuery(event.target.value)} placeholder="Search table" type="search" value={query} />}
|
|
67
67
|
{loading && <p className="text-sm text-muted-foreground" role="status">Loading...</p>}
|
|
68
|
-
<div aria-label={title ?? "
|
|
68
|
+
<div aria-label={title ?? "Table content"} className="max-w-full overflow-auto" role="region" tabIndex={0}>
|
|
69
69
|
<Table>
|
|
70
70
|
<TableHeader><TableRow>
|
|
71
71
|
{selectable && <TableHead className="w-8"><Checkbox aria-label="Select all visible rows" checked={allSelected} disabled={loading || visible.length === 0} indeterminate={partiallySelected} onCheckedChange={toggleVisible} /></TableHead>}
|
|
@@ -76,7 +76,7 @@ export function DataTable<Row>(props: DataTableProps<Row>) {
|
|
|
76
76
|
</Button>
|
|
77
77
|
: column.label}
|
|
78
78
|
</TableHead>)}
|
|
79
|
-
{actions.length > 0 && <TableHead>
|
|
79
|
+
{actions.length > 0 && <TableHead>Actions</TableHead>}
|
|
80
80
|
</TableRow></TableHeader>
|
|
81
81
|
<TableBody>
|
|
82
82
|
{visible.map((row) => {
|
|
@@ -23,7 +23,7 @@ function FilePreview({ file }: { file: File }) {
|
|
|
23
23
|
return () => { active = false; };
|
|
24
24
|
}, [file]);
|
|
25
25
|
if (preview?.file !== file) return null;
|
|
26
|
-
if (preview.error) return <p className="text-sm text-destructive" role="alert">
|
|
26
|
+
if (preview.error) return <p className="text-sm text-destructive" role="alert">Preview failed: {preview.error}</p>;
|
|
27
27
|
if (preview.text !== undefined) return <div className="mt-3 max-h-56 overflow-auto rounded-md bg-muted"><SourceCode content={preview.text} path={file.name} /></div>;
|
|
28
28
|
if (!preview.url) return null;
|
|
29
29
|
if (file.type.startsWith("image/")) return <img alt={file.name} className="mt-3 block max-h-56 max-w-full rounded-md" src={preview.url} />;
|
|
@@ -53,12 +53,12 @@ export function FilePicker({ label, files, onChange, disabled, showPreview = tru
|
|
|
53
53
|
<Label htmlFor={id}>{label}</Label>
|
|
54
54
|
<input accept={options.accept} className="max-w-full min-w-0 text-sm file:mr-2 file:rounded-md file:border file:bg-background file:px-2 file:py-1 file:text-sm" disabled={blocked} id={id} multiple={options.multiple !== false} type="file" {...fileInput.inputProps} />
|
|
55
55
|
<p className="text-xs text-muted-foreground">Select files, drag them here, or paste while the file picker is focused.</p>
|
|
56
|
-
{options.accept && <p className="text-xs text-muted-foreground">
|
|
56
|
+
{options.accept && <p className="text-xs text-muted-foreground">Allowed: {options.accept}</p>}
|
|
57
57
|
</div>
|
|
58
58
|
{error && <p className="mt-2 text-sm text-destructive" role="alert">{error}</p>}
|
|
59
59
|
{files.length > 0 && <ul className="mt-2 divide-y">{files.map((file, index) => <li className="py-2" key={`${file.name}:${file.size}:${file.lastModified}:${index}`}>
|
|
60
|
-
<div className="flex items-start justify-between gap-3"><span className="min-w-0 break-words"><strong>{file.name}</strong> <small className="block text-muted-foreground">{new Intl.NumberFormat("
|
|
61
|
-
<Button aria-label={
|
|
60
|
+
<div className="flex items-start justify-between gap-3"><span className="min-w-0 break-words"><strong>{file.name}</strong> <small className="block text-muted-foreground">{new Intl.NumberFormat("en-US").format(file.size)} bytes</small></span>
|
|
61
|
+
<Button aria-label={`Remove ${file.name}`} disabled={blocked} onClick={() => { void change(() => files.filter((_, position) => position !== index)); }} size="sm" variant="outline">Remove</Button></div>
|
|
62
62
|
{showPreview && <FilePreview file={file} />}
|
|
63
63
|
</li>)}</ul>}
|
|
64
64
|
</section>;
|