@schlenkr/ragents 0.1.0
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/LICENSE +166 -0
- package/README.md +88 -0
- package/apps/server/agent-home/settings.json +3 -0
- package/apps/server/package.json +29 -0
- package/apps/server/src/access-projection.ts +97 -0
- package/apps/server/src/access-service.ts +22 -0
- package/apps/server/src/access-session.ts +204 -0
- package/apps/server/src/api/contracts.ts +203 -0
- package/apps/server/src/api/core-methods.ts +163 -0
- package/apps/server/src/api/delivery.ts +40 -0
- package/apps/server/src/api/reference.ts +146 -0
- package/apps/server/src/api/rights.ts +26 -0
- package/apps/server/src/chat-attachments.ts +52 -0
- package/apps/server/src/chat-context.ts +6 -0
- package/apps/server/src/chat-events.ts +185 -0
- package/apps/server/src/chat-handler.ts +37 -0
- package/apps/server/src/config-definition.ts +80 -0
- package/apps/server/src/config-file.ts +324 -0
- package/apps/server/src/config.ts +46 -0
- package/apps/server/src/data-directory.ts +42 -0
- package/apps/server/src/external-access.ts +40 -0
- package/apps/server/src/help-files.ts +63 -0
- package/apps/server/src/host-resolution-hooks.mjs +31 -0
- package/apps/server/src/host-resolution.ts +3 -0
- package/apps/server/src/host-version.ts +74 -0
- package/apps/server/src/layout.ts +36 -0
- package/apps/server/src/main.ts +54 -0
- package/apps/server/src/plugin-support/actor-programs/capability-resolver.ts +107 -0
- package/apps/server/src/plugin-support/actor-programs/limits.ts +33 -0
- package/apps/server/src/plugin-support/actor-programs/operations.ts +19 -0
- package/apps/server/src/plugin-support/actor-programs/service.ts +16 -0
- package/apps/server/src/plugin-support/agent-tool.ts +60 -0
- package/apps/server/src/plugin-support/asset-path.ts +4 -0
- package/apps/server/src/plugin-support/await-with-signal.ts +18 -0
- package/apps/server/src/plugin-support/chat-display-contract.ts +7 -0
- package/apps/server/src/plugin-support/chat-display-policy.ts +55 -0
- package/apps/server/src/plugin-support/front-matter.ts +44 -0
- package/apps/server/src/plugin-support/http.ts +93 -0
- package/apps/server/src/plugin-support/language-server/contract.ts +18 -0
- package/apps/server/src/plugin-support/language-server/plugin.ts +32 -0
- package/apps/server/src/plugin-support/language-server/snapshot-method.ts +17 -0
- package/apps/server/src/plugin-support/language-server/tools.ts +73 -0
- package/apps/server/src/plugin-support/model-choice.ts +109 -0
- package/apps/server/src/plugin-support/model-upstreams.ts +12 -0
- package/apps/server/src/plugin-support/native-typescript-child.ts +78 -0
- package/apps/server/src/plugin-support/native-typescript-executor.ts +260 -0
- package/apps/server/src/plugin-support/plugin-config.ts +48 -0
- package/apps/server/src/plugin-support/plugin-folder.ts +81 -0
- package/apps/server/src/plugin-support/plugin-module.ts +14 -0
- package/apps/server/src/plugin-support/plugins-root.ts +41 -0
- package/apps/server/src/plugin-support/product-model-settings-contract.ts +24 -0
- package/apps/server/src/plugin-support/product-model-settings.ts +120 -0
- package/apps/server/src/plugin-support/product-start-options.ts +104 -0
- package/apps/server/src/plugin-support/prompt.ts +68 -0
- package/apps/server/src/plugin-support/provision.ts +85 -0
- package/apps/server/src/plugin-support/run-scripts.ts +88 -0
- package/apps/server/src/plugin-support/shell-platform.ts +21 -0
- package/apps/server/src/plugin-support/skills.ts +97 -0
- package/apps/server/src/plugin-support/start-entries-contract.ts +71 -0
- package/apps/server/src/plugin-support/start-options-contract.ts +65 -0
- package/apps/server/src/plugin-support/system-prompts.ts +138 -0
- package/apps/server/src/plugin-support/thinking-level.ts +8 -0
- package/apps/server/src/plugin-support/tool-availability.ts +20 -0
- package/apps/server/src/plugin-support/workspace-ownership.ts +36 -0
- package/apps/server/src/plugin-support/workspace-sandbox-host.ts +213 -0
- package/apps/server/src/plugin-support/workspace-tool-naming.ts +11 -0
- package/apps/server/src/plugin-support/zip.ts +69 -0
- package/apps/server/src/profile/compose.ts +69 -0
- package/apps/server/src/profile/plugin-discovery.ts +112 -0
- package/apps/server/src/profile/plugin-list.ts +19 -0
- package/apps/server/src/profile/provisioning.ts +81 -0
- package/apps/server/src/protocol.ts +106 -0
- package/apps/server/src/provider.ts +817 -0
- package/apps/server/src/ragents/actor-chat-history.ts +111 -0
- package/apps/server/src/ragents/chat-projection.ts +55 -0
- package/apps/server/src/ragents/chat-text-positions.ts +43 -0
- package/apps/server/src/ragents/coordinator.ts +5 -0
- package/apps/server/src/ragents/document-store.ts +12 -0
- package/apps/server/src/ragents/engine.ts +417 -0
- package/apps/server/src/ragents/global-chat.ts +40 -0
- package/apps/server/src/ragents/host-services.ts +26 -0
- package/apps/server/src/ragents/journal-chat-events.ts +52 -0
- package/apps/server/src/ragents/product-runtime.ts +31 -0
- package/apps/server/src/ragents/runtime-bridge.ts +7 -0
- package/apps/server/src/ragents/session.ts +859 -0
- package/apps/server/src/ragents/start-option-state.ts +37 -0
- package/apps/server/src/ragents/typescript-tools.ts +182 -0
- package/apps/server/src/ragents/workspace-runtime.ts +64 -0
- package/apps/server/src/rpc/dispatcher.ts +178 -0
- package/apps/server/src/rpc/http-transport.ts +178 -0
- package/apps/server/src/rpc/stdio-transport.ts +44 -0
- package/apps/server/src/run-preparation-contract.ts +20 -0
- package/apps/server/src/run-preparation-input.ts +16 -0
- package/apps/server/src/run-preparation.ts +147 -0
- package/apps/server/src/run-transfer.ts +264 -0
- package/apps/server/src/server.ts +312 -0
- package/apps/server/src/settings.ts +209 -0
- package/apps/server/src/startup.ts +13 -0
- package/apps/server/src/title-compactor.ts +131 -0
- package/apps/server/src/title-settings-contract.ts +9 -0
- package/apps/server/src/title-settings.ts +67 -0
- package/apps/web/package.json +41 -0
- package/apps/web/src/AccessContext.tsx +125 -0
- package/apps/web/src/App.tsx +315 -0
- package/apps/web/src/CanvasShortcuts.tsx +60 -0
- package/apps/web/src/DiffCode.tsx +89 -0
- package/apps/web/src/HelpDialog.tsx +87 -0
- package/apps/web/src/MaterialSettings.tsx +40 -0
- package/apps/web/src/Overview.tsx +201 -0
- package/apps/web/src/PluginActivation.ts +41 -0
- package/apps/web/src/PluginChat.tsx +552 -0
- package/apps/web/src/PluginRegistry.tsx +689 -0
- package/apps/web/src/RunPreparationChat.tsx +111 -0
- package/apps/web/src/RunStore.ts +86 -0
- package/apps/web/src/SessionList.tsx +148 -0
- package/apps/web/src/SettingsModal.tsx +949 -0
- package/apps/web/src/SourceCode.tsx +49 -0
- package/apps/web/src/StartOptions.tsx +231 -0
- package/apps/web/src/StartSurface.tsx +161 -0
- package/apps/web/src/StatusGroup.tsx +18 -0
- package/apps/web/src/ThemeSettings.tsx +46 -0
- package/apps/web/src/TitleModelSettings.tsx +100 -0
- package/apps/web/src/Toolbar.tsx +28 -0
- package/apps/web/src/WorkspacePanel.tsx +309 -0
- package/apps/web/src/access-session.ts +27 -0
- package/apps/web/src/access-token.ts +31 -0
- package/apps/web/src/api.ts +368 -0
- package/apps/web/src/chat/ChatInputToolbar.tsx +488 -0
- package/apps/web/src/chat/ChatMessages.tsx +666 -0
- package/apps/web/src/chat/ChatPanel.tsx +61 -0
- package/apps/web/src/chat/DetailModeSwitch.tsx +58 -0
- package/apps/web/src/chat/Markdown.tsx +104 -0
- package/apps/web/src/chat/QuestionCard.tsx +107 -0
- package/apps/web/src/chat/StepPopover.tsx +82 -0
- package/apps/web/src/chat/WorkingScenes.tsx +235 -0
- package/apps/web/src/chat/attachments.ts +53 -0
- package/apps/web/src/chat/chat-scroll.ts +41 -0
- package/apps/web/src/chat/chat-target.ts +21 -0
- package/apps/web/src/chat/requests.ts +23 -0
- package/apps/web/src/chat/texts.ts +61 -0
- package/apps/web/src/chat/types.ts +26 -0
- package/apps/web/src/chat/useAttachmentCapabilities.ts +35 -0
- package/apps/web/src/chat/useChat.ts +46 -0
- package/apps/web/src/chat/user-location.ts +22 -0
- package/apps/web/src/column/ColumnApp.tsx +158 -0
- package/apps/web/src/column/ColumnMenu.tsx +37 -0
- package/apps/web/src/column/ColumnRunHeader.tsx +43 -0
- package/apps/web/src/column/column-location.ts +30 -0
- package/apps/web/src/column/host-contract.ts +83 -0
- package/apps/web/src/column/host.ts +101 -0
- package/apps/web/src/column/use-session-list.ts +42 -0
- package/apps/web/src/column.tsx +43 -0
- package/apps/web/src/diff-view.css +38 -0
- package/apps/web/src/help-samples.ts +11 -0
- package/apps/web/src/highlighting.css +74 -0
- package/apps/web/src/highlighting.ts +262 -0
- package/apps/web/src/lib/format.ts +5 -0
- package/apps/web/src/lib/guards.ts +8 -0
- package/apps/web/src/lib/http.ts +9 -0
- package/apps/web/src/lib/labels.ts +11 -0
- package/apps/web/src/lib/local-storage-setting.ts +39 -0
- package/apps/web/src/main.tsx +30 -0
- package/apps/web/src/material-settings.ts +104 -0
- package/apps/web/src/model-settings-events.ts +1 -0
- package/apps/web/src/page-opener.tsx +14 -0
- package/apps/web/src/panel/LoginForm.tsx +31 -0
- package/apps/web/src/panel/OverviewPage.tsx +90 -0
- package/apps/web/src/panel/PanelPage.tsx +9 -0
- package/apps/web/src/panel/SettingsPage.tsx +102 -0
- package/apps/web/src/panel/contract.ts +101 -0
- package/apps/web/src/panel/target-state.ts +53 -0
- package/apps/web/src/panel.tsx +30 -0
- package/apps/web/src/plugin-bootstrap.ts +90 -0
- package/apps/web/src/plugin-discovery.ts +5 -0
- package/apps/web/src/rpc/client.ts +301 -0
- package/apps/web/src/rpc.ts +4 -0
- package/apps/web/src/run-overview.ts +34 -0
- package/apps/web/src/run-preparation.ts +16 -0
- package/apps/web/src/run-read-state.ts +33 -0
- package/apps/web/src/settings-contributions.ts +274 -0
- package/apps/web/src/theme.ts +135 -0
- package/apps/web/src/title-model-settings.ts +51 -0
- package/apps/web/src/toolLine.ts +67 -0
- package/apps/web/src/ui/ListDetail.tsx +149 -0
- package/apps/web/src/ui/SectionLabel.tsx +7 -0
- package/apps/web/src/ui/SvgEdge.tsx +39 -0
- package/apps/web/src/ui/alert.tsx +75 -0
- package/apps/web/src/ui/badge.tsx +51 -0
- package/apps/web/src/ui/button.tsx +57 -0
- package/apps/web/src/ui/card.tsx +102 -0
- package/apps/web/src/ui/checkbox.tsx +26 -0
- package/apps/web/src/ui/dialog.tsx +250 -0
- package/apps/web/src/ui/dropdown-menu.tsx +265 -0
- package/apps/web/src/ui/empty.tsx +103 -0
- package/apps/web/src/ui/field.tsx +236 -0
- package/apps/web/src/ui/frame.css +4 -0
- package/apps/web/src/ui/index.ts +43 -0
- package/apps/web/src/ui/input.tsx +19 -0
- package/apps/web/src/ui/label.tsx +17 -0
- package/apps/web/src/ui/modal-controller.ts +70 -0
- package/apps/web/src/ui/modal.tsx +62 -0
- package/apps/web/src/ui/popover.tsx +102 -0
- package/apps/web/src/ui/progress.tsx +80 -0
- package/apps/web/src/ui/radio-group.tsx +35 -0
- package/apps/web/src/ui/select.tsx +198 -0
- package/apps/web/src/ui/separator.tsx +22 -0
- package/apps/web/src/ui/skeleton.tsx +13 -0
- package/apps/web/src/ui/spinner.tsx +10 -0
- package/apps/web/src/ui/switch.tsx +29 -0
- package/apps/web/src/ui/table.tsx +113 -0
- package/apps/web/src/ui/tabs.tsx +79 -0
- package/apps/web/src/ui/tailwind.css +21 -0
- package/apps/web/src/ui/textarea.tsx +17 -0
- package/apps/web/src/ui/theme.css +300 -0
- package/apps/web/src/ui/toggle-group.tsx +87 -0
- package/apps/web/src/ui/toggle.tsx +42 -0
- package/apps/web/src/ui/tooltip.tsx +63 -0
- package/apps/web/src/ui/useFileInput.ts +50 -0
- package/apps/web/src/virtual-plugins.d.ts +3 -0
- package/apps/web/src/vite-env.d.ts +1 -0
- package/package.json +82 -0
- package/packages/agent/package.json +64 -0
- package/packages/agent/src/config.ts +161 -0
- package/packages/agent/src/core/agent-session-runtime.ts +548 -0
- package/packages/agent/src/core/agent-session-services.ts +224 -0
- package/packages/agent/src/core/agent-session.ts +3357 -0
- package/packages/agent/src/core/auth-guidance.ts +18 -0
- package/packages/agent/src/core/auth-storage.ts +271 -0
- package/packages/agent/src/core/bash-executor.ts +156 -0
- package/packages/agent/src/core/compaction/branch-summarization.ts +372 -0
- package/packages/agent/src/core/compaction/compaction.ts +875 -0
- package/packages/agent/src/core/compaction/index.ts +7 -0
- package/packages/agent/src/core/compaction/utils.ts +174 -0
- package/packages/agent/src/core/defaults.ts +3 -0
- package/packages/agent/src/core/diagnostics.ts +15 -0
- package/packages/agent/src/core/event-bus.ts +33 -0
- package/packages/agent/src/core/exec.ts +107 -0
- package/packages/agent/src/core/experimental.ts +3 -0
- package/packages/agent/src/core/extensions/index.ts +149 -0
- package/packages/agent/src/core/extensions/loader.ts +709 -0
- package/packages/agent/src/core/extensions/runner.ts +1132 -0
- package/packages/agent/src/core/extensions/types.ts +1460 -0
- package/packages/agent/src/core/extensions/wrapper.ts +45 -0
- package/packages/agent/src/core/footer-data-provider.ts +388 -0
- package/packages/agent/src/core/http-dispatcher.ts +106 -0
- package/packages/agent/src/core/index.ts +78 -0
- package/packages/agent/src/core/messages.ts +195 -0
- package/packages/agent/src/core/model-config.ts +287 -0
- package/packages/agent/src/core/model-registry.ts +126 -0
- package/packages/agent/src/core/model-resolver.ts +675 -0
- package/packages/agent/src/core/model-runtime.ts +517 -0
- package/packages/agent/src/core/output-guard.ts +108 -0
- package/packages/agent/src/core/package-manager.ts +2441 -0
- package/packages/agent/src/core/prompt-templates.ts +284 -0
- package/packages/agent/src/core/provider-composer.ts +549 -0
- package/packages/agent/src/core/resolve-config-value.ts +287 -0
- package/packages/agent/src/core/resource-loader.ts +946 -0
- package/packages/agent/src/core/runtime-credentials.ts +48 -0
- package/packages/agent/src/core/sdk.ts +358 -0
- package/packages/agent/src/core/session-cwd.ts +59 -0
- package/packages/agent/src/core/session-manager.ts +1623 -0
- package/packages/agent/src/core/settings-manager.ts +1212 -0
- package/packages/agent/src/core/skills.ts +487 -0
- package/packages/agent/src/core/slash-commands.ts +41 -0
- package/packages/agent/src/core/source-info.ts +40 -0
- package/packages/agent/src/core/system-prompt.ts +147 -0
- package/packages/agent/src/core/timings.ts +50 -0
- package/packages/agent/src/core/tools/bash.ts +314 -0
- package/packages/agent/src/core/tools/edit-diff.ts +704 -0
- package/packages/agent/src/core/tools/edit.ts +222 -0
- package/packages/agent/src/core/tools/file-mutation-queue.ts +61 -0
- package/packages/agent/src/core/tools/index.ts +130 -0
- package/packages/agent/src/core/tools/output-accumulator.ts +222 -0
- package/packages/agent/src/core/tools/path-utils.ts +118 -0
- package/packages/agent/src/core/tools/read.ts +195 -0
- package/packages/agent/src/core/tools/tool-definition-wrapper.ts +45 -0
- package/packages/agent/src/core/tools/truncate.ts +276 -0
- package/packages/agent/src/core/tools/write.ts +90 -0
- package/packages/agent/src/core/trust-manager.ts +244 -0
- package/packages/agent/src/index.ts +287 -0
- package/packages/agent/src/utils/ansi.ts +60 -0
- package/packages/agent/src/utils/child-process.ts +137 -0
- package/packages/agent/src/utils/exif-orientation.ts +183 -0
- package/packages/agent/src/utils/frontmatter.ts +39 -0
- package/packages/agent/src/utils/fs-watch.ts +30 -0
- package/packages/agent/src/utils/git.ts +226 -0
- package/packages/agent/src/utils/image-convert.ts +49 -0
- package/packages/agent/src/utils/image-process.ts +119 -0
- package/packages/agent/src/utils/image-resize-core.ts +164 -0
- package/packages/agent/src/utils/image-resize-worker.ts +42 -0
- package/packages/agent/src/utils/image-resize.ts +123 -0
- package/packages/agent/src/utils/json.ts +6 -0
- package/packages/agent/src/utils/mime.ts +116 -0
- package/packages/agent/src/utils/paths.ts +118 -0
- package/packages/agent/src/utils/photon.ts +139 -0
- package/packages/agent/src/utils/shell.ts +225 -0
- package/packages/agent/src/utils/sleep.ts +18 -0
- package/packages/agent/src/utils/tools-manager.ts +63 -0
- package/packages/agent-core/package.json +32 -0
- package/packages/agent-core/src/agent-loop.ts +877 -0
- package/packages/agent-core/src/agent.ts +598 -0
- package/packages/agent-core/src/index.ts +4 -0
- package/packages/agent-core/src/types.ts +455 -0
- package/packages/agent-core/src/uuid.ts +54 -0
- package/packages/ai/package.json +46 -0
- package/packages/ai/src/api/ai-sdk-messages.ts +102 -0
- package/packages/ai/src/api/ai-sdk-transport.ts +53 -0
- package/packages/ai/src/api/ai-sdk.lazy.ts +4 -0
- package/packages/ai/src/api/ai-sdk.ts +273 -0
- package/packages/ai/src/api/lazy.ts +75 -0
- package/packages/ai/src/api/openrouter-images.lazy.ts +10 -0
- package/packages/ai/src/api/openrouter-images.ts +98 -0
- package/packages/ai/src/api/simple-options.ts +77 -0
- package/packages/ai/src/api/transform-messages.ts +185 -0
- package/packages/ai/src/api-registry.ts +226 -0
- package/packages/ai/src/auth/context.ts +45 -0
- package/packages/ai/src/auth/credential-store.ts +51 -0
- package/packages/ai/src/auth/helpers.ts +47 -0
- package/packages/ai/src/auth/resolve.ts +139 -0
- package/packages/ai/src/auth/types.ts +220 -0
- package/packages/ai/src/compat/extension-oauth-types.ts +45 -0
- package/packages/ai/src/env-api-keys.ts +24 -0
- package/packages/ai/src/image-models.generated.ts +533 -0
- package/packages/ai/src/images-models.ts +274 -0
- package/packages/ai/src/index.ts +33 -0
- package/packages/ai/src/models-store.ts +38 -0
- package/packages/ai/src/models.generated.ts +6 -0
- package/packages/ai/src/models.ts +705 -0
- package/packages/ai/src/oauth.ts +10 -0
- package/packages/ai/src/providers/all.ts +64 -0
- package/packages/ai/src/providers/faux.ts +539 -0
- package/packages/ai/src/providers/openrouter-images.ts +14 -0
- package/packages/ai/src/providers/openrouter.models.ts +6050 -0
- package/packages/ai/src/providers/openrouter.ts +15 -0
- package/packages/ai/src/session-resources.ts +24 -0
- package/packages/ai/src/types.ts +692 -0
- package/packages/ai/src/utils/abort-signals.ts +41 -0
- package/packages/ai/src/utils/deferred-tools.ts +39 -0
- package/packages/ai/src/utils/diagnostics.ts +45 -0
- package/packages/ai/src/utils/error-body.ts +129 -0
- package/packages/ai/src/utils/estimate.ts +146 -0
- package/packages/ai/src/utils/event-stream.ts +88 -0
- package/packages/ai/src/utils/hash.ts +13 -0
- package/packages/ai/src/utils/headers.ts +18 -0
- package/packages/ai/src/utils/json-parse.ts +124 -0
- package/packages/ai/src/utils/node-http-proxy.ts +112 -0
- package/packages/ai/src/utils/overflow.ts +165 -0
- package/packages/ai/src/utils/provider-env.ts +52 -0
- package/packages/ai/src/utils/retry.ts +101 -0
- package/packages/ai/src/utils/sanitize-unicode.ts +25 -0
- package/packages/ai/src/utils/typebox-helpers.ts +24 -0
- package/packages/ai/src/utils/validation.ts +383 -0
- package/packages/ragents/package.json +31 -0
- package/packages/ragents/src/access.ts +54 -0
- package/packages/ragents/src/agents/actor-input.ts +191 -0
- package/packages/ragents/src/agents/catalog.ts +220 -0
- package/packages/ragents/src/agents/delivery.ts +187 -0
- package/packages/ragents/src/agents/live.ts +71 -0
- package/packages/ragents/src/agents/plugins.ts +130 -0
- package/packages/ragents/src/agents/scheduler.ts +1048 -0
- package/packages/ragents/src/agents/schemas.ts +64 -0
- package/packages/ragents/src/agents/tool-orientation.ts +12 -0
- package/packages/ragents/src/agents/tools.ts +709 -0
- package/packages/ragents/src/agents/toolset.ts +324 -0
- package/packages/ragents/src/agents/turn.ts +65 -0
- package/packages/ragents/src/agents/workspace-tools.ts +11 -0
- package/packages/ragents/src/agents/workspaces.ts +15 -0
- package/packages/ragents/src/domain/draft.ts +11 -0
- package/packages/ragents/src/domain/driver.ts +56 -0
- package/packages/ragents/src/domain/event-semantics.ts +668 -0
- package/packages/ragents/src/domain/event-validation.ts +620 -0
- package/packages/ragents/src/domain/events.ts +236 -0
- package/packages/ragents/src/domain/json-patch.ts +77 -0
- package/packages/ragents/src/domain/json.ts +86 -0
- package/packages/ragents/src/domain/model.ts +267 -0
- package/packages/ragents/src/domain/plugin-state.ts +33 -0
- package/packages/ragents/src/domain/portable-id.ts +9 -0
- package/packages/ragents/src/domain/projection.ts +506 -0
- package/packages/ragents/src/domain/schema-errors.ts +56 -0
- package/packages/ragents/src/domain/vocabulary.ts +37 -0
- package/packages/ragents/src/drivers/agent-runtime.ts +1503 -0
- package/packages/ragents/src/drivers/agent.ts +108 -0
- package/packages/ragents/src/drivers/attachments.ts +56 -0
- package/packages/ragents/src/drivers/skill-preload.ts +205 -0
- package/packages/ragents/src/drivers/types.ts +77 -0
- package/packages/ragents/src/http/contracts.ts +80 -0
- package/packages/ragents/src/http/methods.ts +150 -0
- package/packages/ragents/src/index.ts +161 -0
- package/packages/ragents/src/plugin-host.ts +1184 -0
- package/packages/ragents/src/plugin-types.ts +373 -0
- package/packages/ragents/src/rpc/contract.ts +76 -0
- package/packages/ragents/src/rpc/contribution.ts +67 -0
- package/packages/ragents/src/rpc/peer.ts +208 -0
- package/packages/ragents/src/rpc/protocol.ts +129 -0
- package/packages/ragents/src/runtime/artifacts.ts +95 -0
- package/packages/ragents/src/runtime/canonical-hash.ts +5 -0
- package/packages/ragents/src/runtime/canonical-json.ts +41 -0
- package/packages/ragents/src/runtime/command.ts +35 -0
- package/packages/ragents/src/runtime/decisions/actions.ts +77 -0
- package/packages/ragents/src/runtime/decisions/actors.ts +283 -0
- package/packages/ragents/src/runtime/decisions/artifacts.ts +28 -0
- package/packages/ragents/src/runtime/decisions/inputs.ts +79 -0
- package/packages/ragents/src/runtime/decisions/subscriptions.ts +135 -0
- package/packages/ragents/src/runtime/decisions/turns.ts +166 -0
- package/packages/ragents/src/runtime/domain-error.ts +10 -0
- package/packages/ragents/src/runtime/durable-fs.ts +13 -0
- package/packages/ragents/src/runtime/failures.ts +18 -0
- package/packages/ragents/src/runtime/guards.ts +196 -0
- package/packages/ragents/src/runtime/journal-storage.ts +228 -0
- package/packages/ragents/src/runtime/journal.ts +952 -0
- package/packages/ragents/src/runtime/orchestration.ts +711 -0
- package/packages/ragents/src/runtime/serial-queue.ts +13 -0
- package/packages/ragents/src/runtime/services.ts +15 -0
- package/packages/ragents/src/runtime/stop.ts +186 -0
- package/packages/ragents/src/script/driver.ts +18 -0
- package/packages/ragents/src/script/mediators.ts +386 -0
- package/packages/ragents/src/script/programs.ts +10 -0
- package/packages/ragents/src/script/std.ts +27 -0
- package/packages/ragents/src/script/types.ts +6 -0
- package/packages/ragents/src/typescript/async-compiler.ts +322 -0
- package/packages/ragents/src/typescript/build-contract.ts +14 -0
- package/packages/ragents/src/typescript/compiler-worker.ts +52 -0
- package/packages/ragents/src/typescript/compiler.ts +304 -0
- package/packages/ragents/src/typescript/index.ts +48 -0
- package/packages/ragents/src/typescript/native-executor.ts +40 -0
- package/packages/ragents/src/typescript/native-program.ts +5 -0
- package/packages/ragents/src/typescript/run-context.ts +199 -0
- package/packages/ragents/src/typescript/schema.ts +176 -0
- package/packages/ragents/src/typescript/snippet.ts +121 -0
- package/packages/workspace-executor/package.json +25 -0
- package/packages/workspace-executor/src/context.ts +123 -0
- package/packages/workspace-executor/src/executor.ts +134 -0
- package/packages/workspace-executor/src/git-config-environment.ts +10 -0
- package/packages/workspace-executor/src/index.ts +52 -0
- package/packages/workspace-executor/src/language-server/adapters/fsharp.ts +59 -0
- package/packages/workspace-executor/src/language-server/adapters/index.ts +7 -0
- package/packages/workspace-executor/src/language-server/adapters/roslyn.ts +54 -0
- package/packages/workspace-executor/src/language-server/adapters/typescript.ts +46 -0
- package/packages/workspace-executor/src/language-server/contract.ts +23 -0
- package/packages/workspace-executor/src/language-server/diagnostics.ts +62 -0
- package/packages/workspace-executor/src/language-server/host.ts +409 -0
- package/packages/workspace-executor/src/language-server/json-rpc.ts +103 -0
- package/packages/workspace-executor/src/language-server/roots.ts +29 -0
- package/packages/workspace-executor/src/language-server/session.ts +442 -0
- package/packages/workspace-executor/src/language-server/solution.ts +13 -0
- package/packages/workspace-executor/src/managed-process.ts +329 -0
- package/packages/workspace-executor/src/paths.ts +43 -0
- package/packages/workspace-executor/src/run-marker.ts +6 -0
- package/packages/workspace-executor/src/safe-environment.ts +47 -0
- package/packages/workspace-executor/src/sandbox-tools.ts +258 -0
- package/packages/workspace-executor/src/session-ident.ts +37 -0
- package/packages/workspace-executor/src/shell-platform.ts +11 -0
- package/packages/workspace-executor/src/tools.ts +28 -0
- package/plugins/package.json +8 -0
- package/plugins/ragents.activity/server/index.ts +9 -0
- package/plugins/ragents.activity/web/ActivityHeader.tsx +58 -0
- package/plugins/ragents.activity/web/activity.ts +144 -0
- package/plugins/ragents.activity/web/index.tsx +13 -0
- package/plugins/ragents.actor-programs/client-ui/DataTable.tsx +100 -0
- package/plugins/ragents.actor-programs/client-ui/FilePicker.tsx +65 -0
- package/plugins/ragents.actor-programs/client-ui/FlowDiagram.tsx +234 -0
- package/plugins/ragents.actor-programs/client-ui/FlowDiagramRenderer.tsx +85 -0
- package/plugins/ragents.actor-programs/client-ui/Form.tsx +126 -0
- package/plugins/ragents.actor-programs/client-ui/Layout.tsx +27 -0
- package/plugins/ragents.actor-programs/client-ui/MessageList.tsx +30 -0
- package/plugins/ragents.actor-programs/client-ui/Viewers.tsx +41 -0
- package/plugins/ragents.actor-programs/client-ui/WorkflowDiagram.tsx +14 -0
- package/plugins/ragents.actor-programs/client-ui/contracts.d.ts +84 -0
- package/plugins/ragents.actor-programs/client-ui/file-contracts.d.ts +19 -0
- package/plugins/ragents.actor-programs/client-ui/file-selection.ts +24 -0
- package/plugins/ragents.actor-programs/client-ui/flow-diagram-contracts.d.ts +27 -0
- package/plugins/ragents.actor-programs/client-ui/flow-diagram.css +23 -0
- package/plugins/ragents.actor-programs/client-ui/form-contracts.d.ts +38 -0
- package/plugins/ragents.actor-programs/client-ui/frame-layout.ts +4 -0
- package/plugins/ragents.actor-programs/client-ui/index.tsx +81 -0
- package/plugins/ragents.actor-programs/client-ui/layout-contracts.d.ts +33 -0
- package/plugins/ragents.actor-programs/client-ui/message-list-contracts.d.ts +33 -0
- package/plugins/ragents.actor-programs/client-ui/table-contracts.d.ts +35 -0
- package/plugins/ragents.actor-programs/client-ui/viewer-contracts.d.ts +37 -0
- package/plugins/ragents.actor-programs/client-ui/workflow-diagram-contracts.d.ts +10 -0
- package/plugins/ragents.actor-programs/contract.ts +180 -0
- package/plugins/ragents.actor-programs/parameter-types.ts +3 -0
- package/plugins/ragents.actor-programs/prompt.hbs +79 -0
- package/plugins/ragents.actor-programs/server/agent-tools.ts +31 -0
- package/plugins/ragents.actor-programs/server/app-project.ts +284 -0
- package/plugins/ragents.actor-programs/server/authoring-contracts.ts +10 -0
- package/plugins/ragents.actor-programs/server/client-compiler.ts +174 -0
- package/plugins/ragents.actor-programs/server/client-contracts.ts +187 -0
- package/plugins/ragents.actor-programs/server/client-runtime.ts +16 -0
- package/plugins/ragents.actor-programs/server/controls-template.ts +118 -0
- package/plugins/ragents.actor-programs/server/controls-tool.ts +48 -0
- package/plugins/ragents.actor-programs/server/index.ts +51 -0
- package/plugins/ragents.actor-programs/server/methods.ts +72 -0
- package/plugins/ragents.actor-programs/server/project-diagnostics.ts +138 -0
- package/plugins/ragents.actor-programs/server/prompts.ts +21 -0
- package/plugins/ragents.actor-programs/server/routes.ts +235 -0
- package/plugins/ragents.actor-programs/server/runtime-libraries.ts +4 -0
- package/plugins/ragents.actor-programs/server/runtime.ts +721 -0
- package/plugins/ragents.actor-programs/server/tailwind.ts +22 -0
- package/plugins/ragents.actor-programs/server/templates.ts +400 -0
- package/plugins/ragents.actor-programs/server/tool-contributor.ts +29 -0
- package/plugins/ragents.actor-programs/summary.hbs +17 -0
- package/plugins/ragents.actor-programs/web/ActorViewFrame.tsx +463 -0
- package/plugins/ragents.actor-programs/web/AppsPanel.tsx +436 -0
- package/plugins/ragents.actor-programs/web/EmbeddedApps.tsx +116 -0
- package/plugins/ragents.actor-programs/web/ExpandIcon.tsx +5 -0
- package/plugins/ragents.actor-programs/web/FullscreenHost.tsx +31 -0
- package/plugins/ragents.actor-programs/web/FunctionForm.tsx +102 -0
- package/plugins/ragents.actor-programs/web/ProgramSource.tsx +81 -0
- package/plugins/ragents.actor-programs/web/api.ts +353 -0
- package/plugins/ragents.actor-programs/web/bridge.ts +122 -0
- package/plugins/ragents.actor-programs/web/chat-state.ts +37 -0
- package/plugins/ragents.actor-programs/web/context.ts +30 -0
- package/plugins/ragents.actor-programs/web/function-call.ts +28 -0
- package/plugins/ragents.actor-programs/web/function-input.ts +40 -0
- package/plugins/ragents.actor-programs/web/index.tsx +96 -0
- package/plugins/ragents.actor-programs/web/invocations.ts +43 -0
- package/plugins/ragents.actor-programs/web/program-state.ts +68 -0
- package/plugins/ragents.actor-programs/web/state-revision.ts +16 -0
- package/plugins/ragents.actor-programs/workflow/index.ts +202 -0
- package/plugins/ragents.actor-programs/workflow/prompt-reader.ts +15 -0
- package/plugins/ragents.ask/ask.hbs +4 -0
- package/plugins/ragents.ask/contract.ts +17 -0
- package/plugins/ragents.ask/server/answer-method.ts +15 -0
- package/plugins/ragents.ask/server/ask-service.ts +152 -0
- package/plugins/ragents.ask/server/ask-tool.ts +39 -0
- package/plugins/ragents.ask/server/contract.ts +22 -0
- package/plugins/ragents.ask/server/index.ts +26 -0
- package/plugins/ragents.ask/server/tool-contributor.ts +11 -0
- package/plugins/ragents.ask/web/QuestionSection.tsx +47 -0
- package/plugins/ragents.ask/web/api.ts +6 -0
- package/plugins/ragents.ask/web/constants.ts +1 -0
- package/plugins/ragents.ask/web/index.tsx +50 -0
- package/plugins/ragents.browser/provision.ts +48 -0
- package/plugins/ragents.browser/server/browser.ts +393 -0
- package/plugins/ragents.browser/server/contract.ts +36 -0
- package/plugins/ragents.browser/server/index.ts +35 -0
- package/plugins/ragents.browser/server/tools.ts +197 -0
- package/plugins/ragents.browser/skills/browser-testing/SKILL.md +36 -0
- package/plugins/ragents.documents/contract.ts +33 -0
- package/plugins/ragents.documents/prompt.hbs +18 -0
- package/plugins/ragents.documents/server/config.ts +14 -0
- package/plugins/ragents.documents/server/document-write-tool.ts +45 -0
- package/plugins/ragents.documents/server/files-route.ts +137 -0
- package/plugins/ragents.documents/server/index.ts +38 -0
- package/plugins/ragents.documents/server/show-document-tool.ts +73 -0
- package/plugins/ragents.documents/server/store.ts +35 -0
- package/plugins/ragents.documents/server/tool-contributor.ts +16 -0
- package/plugins/ragents.documents/web/DocumentViewer.tsx +450 -0
- package/plugins/ragents.documents/web/api.ts +8 -0
- package/plugins/ragents.documents/web/index.tsx +279 -0
- package/plugins/ragents.lsp-fsharp/provision.ts +74 -0
- package/plugins/ragents.lsp-fsharp/server/index.ts +16 -0
- package/plugins/ragents.lsp-fsharp/web/index.tsx +7 -0
- package/plugins/ragents.lsp-roslyn/provision.ts +54 -0
- package/plugins/ragents.lsp-roslyn/server/index.ts +15 -0
- package/plugins/ragents.lsp-roslyn/web/api.ts +10 -0
- package/plugins/ragents.lsp-roslyn/web/index.tsx +7 -0
- package/plugins/ragents.lsp-roslyn/web/language-server-plugin.tsx +236 -0
- package/plugins/ragents.lsp-typescript/server/index.ts +7 -0
- package/plugins/ragents.lsp-typescript/web/index.tsx +7 -0
- package/plugins/ragents.model-relay/server/config.ts +37 -0
- package/plugins/ragents.model-relay/server/index.ts +31 -0
- package/plugins/ragents.model-relay/server/relay.ts +213 -0
- package/plugins/ragents.orchestration/canvas.hbs +50 -0
- package/plugins/ragents.orchestration/contract.ts +322 -0
- package/plugins/ragents.orchestration/orchestration.hbs +105 -0
- package/plugins/ragents.orchestration/server/canvas-tool.ts +248 -0
- package/plugins/ragents.orchestration/server/index.ts +64 -0
- package/plugins/ragents.orchestration/server/run-stop-tool.ts +30 -0
- package/plugins/ragents.orchestration/tiled-layout.ts +47 -0
- package/plugins/ragents.orchestration/web/ActorCanvasControls.tsx +159 -0
- package/plugins/ragents.orchestration/web/ActorChat.tsx +56 -0
- package/plugins/ragents.orchestration/web/ActorChatControls.tsx +64 -0
- package/plugins/ragents.orchestration/web/ActorChatPreview.tsx +36 -0
- package/plugins/ragents.orchestration/web/ActorNet.tsx +607 -0
- package/plugins/ragents.orchestration/web/ActorPopout.tsx +36 -0
- package/plugins/ragents.orchestration/web/ActorShortcut.tsx +76 -0
- package/plugins/ragents.orchestration/web/ActorTile.tsx +22 -0
- package/plugins/ragents.orchestration/web/CanvasStartup.tsx +14 -0
- package/plugins/ragents.orchestration/web/CanvasTiles.tsx +47 -0
- package/plugins/ragents.orchestration/web/CardSizeSettings.tsx +42 -0
- package/plugins/ragents.orchestration/web/Center.tsx +576 -0
- package/plugins/ragents.orchestration/web/DocumentsSection.tsx +37 -0
- package/plugins/ragents.orchestration/web/ExecutionsPanel.tsx +109 -0
- package/plugins/ragents.orchestration/web/FlowInspector.tsx +932 -0
- package/plugins/ragents.orchestration/web/JournalStatus.tsx +87 -0
- package/plugins/ragents.orchestration/web/MaterialBody.tsx +104 -0
- package/plugins/ragents.orchestration/web/ScriptActorCard.tsx +56 -0
- package/plugins/ragents.orchestration/web/StopRunButton.tsx +52 -0
- package/plugins/ragents.orchestration/web/TiledCanvas.tsx +281 -0
- package/plugins/ragents.orchestration/web/ZoomSettings.tsx +38 -0
- package/plugins/ragents.orchestration/web/actor-conversation.ts +64 -0
- package/plugins/ragents.orchestration/web/actor-header-settings.ts +41 -0
- package/plugins/ragents.orchestration/web/api.ts +33 -0
- package/plugins/ragents.orchestration/web/canvas-layout-storage.ts +39 -0
- package/plugins/ragents.orchestration/web/canvas-layout.ts +326 -0
- package/plugins/ragents.orchestration/web/canvas-scene.ts +311 -0
- package/plugins/ragents.orchestration/web/canvas-stage.ts +21 -0
- package/plugins/ragents.orchestration/web/canvas-startup.ts +36 -0
- package/plugins/ragents.orchestration/web/canvas-view-settings.ts +48 -0
- package/plugins/ragents.orchestration/web/card-size-settings.ts +36 -0
- package/plugins/ragents.orchestration/web/column/AddresseeControl.tsx +116 -0
- package/plugins/ragents.orchestration/web/column/ColumnSettings.tsx +50 -0
- package/plugins/ragents.orchestration/web/column/RunColumn.tsx +370 -0
- package/plugins/ragents.orchestration/web/column/column-actors.ts +38 -0
- package/plugins/ragents.orchestration/web/column/column-settings.ts +47 -0
- package/plugins/ragents.orchestration/web/column/column-state.ts +59 -0
- package/plugins/ragents.orchestration/web/column/sheet-status.ts +30 -0
- package/plugins/ragents.orchestration/web/constants.ts +10 -0
- package/plugins/ragents.orchestration/web/contract.ts +25 -0
- package/plugins/ragents.orchestration/web/executions.ts +124 -0
- package/plugins/ragents.orchestration/web/format.ts +4 -0
- package/plugins/ragents.orchestration/web/index.tsx +182 -0
- package/plugins/ragents.orchestration/web/keyboard-navigation.ts +55 -0
- package/plugins/ragents.orchestration/web/material-layout.ts +14 -0
- package/plugins/ragents.orchestration/web/run-view.ts +199 -0
- package/plugins/ragents.orchestration/web/tile-docking.ts +99 -0
- package/plugins/ragents.orchestration/web/tiled-view-settings.ts +76 -0
- package/plugins/ragents.orchestration/web/useCanvasMeasurements.ts +78 -0
- package/plugins/ragents.orchestration/web/zoom-settings.ts +28 -0
- package/plugins/ragents.overseer/contract.ts +165 -0
- package/plugins/ragents.overseer/server/api.ts +82 -0
- package/plugins/ragents.overseer/server/coordinator-prompt.ts +13 -0
- package/plugins/ragents.overseer/server/index.ts +71 -0
- package/plugins/ragents.overseer/server/orientation.ts +33 -0
- package/plugins/ragents.overseer/server/quick-answer.ts +54 -0
- package/plugins/ragents.overseer/server/reset-method.ts +5 -0
- package/plugins/ragents.overseer/server/run-directory.ts +49 -0
- package/plugins/ragents.overseer/server/settings-method.ts +8 -0
- package/plugins/ragents.overseer/server/settings.ts +83 -0
- package/plugins/ragents.overseer/server/user-location.ts +96 -0
- package/plugins/ragents.overseer/web/ModelSettings.tsx +70 -0
- package/plugins/ragents.overseer/web/chat-display.ts +10 -0
- package/plugins/ragents.overseer/web/index.tsx +208 -0
- package/plugins/ragents.overseer/web/model-settings.ts +61 -0
- package/plugins/ragents.overseer/web/quick-answers.ts +64 -0
- package/plugins/ragents.processes/contract.ts +61 -0
- package/plugins/ragents.processes/server/index.ts +36 -0
- package/plugins/ragents.processes/server/methods.ts +39 -0
- package/plugins/ragents.processes/server/observer.ts +179 -0
- package/plugins/ragents.processes/server/process-table.ts +395 -0
- package/plugins/ragents.processes/server/snapshot.ts +63 -0
- package/plugins/ragents.processes/server/terminator.ts +164 -0
- package/plugins/ragents.processes/web/ProcessHeader.tsx +157 -0
- package/plugins/ragents.processes/web/index.tsx +23 -0
- package/plugins/ragents.processes/web/processes.ts +75 -0
- package/plugins/ragents.product/model-settings-contract.ts +10 -0
- package/plugins/ragents.product/preamble.hbs +9 -0
- package/plugins/ragents.product/server/config.ts +73 -0
- package/plugins/ragents.product/server/index.ts +117 -0
- package/plugins/ragents.product/server/relay.ts +118 -0
- package/plugins/ragents.product/server/runtime.ts +30 -0
- package/plugins/ragents.product/web/ModelControl.tsx +81 -0
- package/plugins/ragents.product/web/ProductModelSettings.tsx +131 -0
- package/plugins/ragents.product/web/SystemPromptControl.tsx +136 -0
- package/plugins/ragents.product/web/index.tsx +29 -0
- package/plugins/ragents.product/web/model-settings.ts +39 -0
- package/plugins/ragents.product/web/start-options.tsx +12 -0
- package/plugins/ragents.profile-distribution/contract.ts +38 -0
- package/plugins/ragents.profile-distribution/server/archive.ts +159 -0
- package/plugins/ragents.profile-distribution/server/config.ts +27 -0
- package/plugins/ragents.profile-distribution/server/index.ts +93 -0
- package/plugins/ragents.profile-distribution/server/web.ts +48 -0
- package/plugins/ragents.reference/examples.ts +33 -0
- package/plugins/ragents.reference/run-scripts/balcony-wizard/RUN.md +27 -0
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +10 -0
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +80 -0
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +82 -0
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +154 -0
- package/plugins/ragents.reference/run-scripts/balcony-wizard/package.json +9 -0
- package/plugins/ragents.reference/run-scripts/balcony-wizard/src/server.ts +32 -0
- package/plugins/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +59 -0
- package/plugins/ragents.reference/run-scripts/conversation-circle/RUN.md +14 -0
- package/plugins/ragents.reference/run-scripts/conversation-circle/package.json +9 -0
- package/plugins/ragents.reference/run-scripts/conversation-circle/src/server.ts +87 -0
- package/plugins/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +26 -0
- package/plugins/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +32 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/RUN.md +24 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/package.json +10 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +5 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/client.tsx +27 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/server.ts +127 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/state.ts +38 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/view.tsx +42 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/workflow.ts +38 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +223 -0
- package/plugins/ragents.reference/run-scripts/moderated-round/RUN.md +12 -0
- package/plugins/ragents.reference/run-scripts/moderated-round/package.json +9 -0
- package/plugins/ragents.reference/run-scripts/moderated-round/src/server.ts +60 -0
- package/plugins/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +26 -0
- package/plugins/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +24 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/RUN.md +18 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +16 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/client.tsx +39 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +15 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/server.ts +14 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +13 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/package.json +9 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/src/server.ts +65 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +26 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +42 -0
- package/plugins/ragents.reference/run-scripts/word-game/RUN.md +25 -0
- package/plugins/ragents.reference/run-scripts/word-game/package.json +11 -0
- package/plugins/ragents.reference/run-scripts/word-game/src/client.tsx +27 -0
- package/plugins/ragents.reference/run-scripts/word-game/src/contract.ts +23 -0
- package/plugins/ragents.reference/run-scripts/word-game/src/server.ts +106 -0
- package/plugins/ragents.reference/run-scripts/word-game/src/state.ts +22 -0
- package/plugins/ragents.reference/run-scripts/word-game/src/view.tsx +54 -0
- package/plugins/ragents.reference/run-scripts/word-game/tests/program.test.ts +253 -0
- package/plugins/ragents.reference/server/index.ts +12 -0
- package/plugins/ragents.reference/skills/100-shared-actor-list/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/110-all-card-slots/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/120-canvas-conversation-circle/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/130-canvas-pipeline-with-approval/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/140-canvas-team-tree-and-topic-grid/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/150-editorial-workbench/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/160-learning-companion/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/170-photo-collection/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/180-decision-workbench/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/190-review-queue/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/20-circle-of-four/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/210-moderator-handover/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/220-actor-approval-list/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/230-shared-state-views/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/240-live-result-list/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/250-balcony-wizard/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/35-actor-input-fifo/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/40-subscription-matrix/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/50-subscription-removal/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/70-headless-counter/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/75-lsp-demo/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/80-actor-text-analysis/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/90-actor-notes/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/95-hello-world/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/decision-brief/SKILL.md +33 -0
- package/plugins/ragents.reference/skills/learning-sprint/SKILL.md +33 -0
- package/plugins/ragents.reference/walkthroughs.ts +219 -0
- package/plugins/ragents.reference/web/StartGuides.tsx +89 -0
- package/plugins/ragents.reference/web/index.tsx +10 -0
- package/plugins/ragents.todo/contract.ts +60 -0
- package/plugins/ragents.todo/server/index.ts +10 -0
- package/plugins/ragents.todo/server/todo-tool.ts +70 -0
- package/plugins/ragents.todo/server/tool-contributor.ts +9 -0
- package/plugins/ragents.todo/web/TodoSection.tsx +47 -0
- package/plugins/ragents.todo/web/index.ts +12 -0
- package/plugins/ragents.transcript/server/index.ts +20 -0
- package/plugins/ragents.transcript/server/transcript.ts +78 -0
- package/plugins/ragents.watch/contract.ts +48 -0
- package/plugins/ragents.watch/server/condition.ts +56 -0
- package/plugins/ragents.watch/server/contract.ts +4 -0
- package/plugins/ragents.watch/server/functions.ts +62 -0
- package/plugins/ragents.watch/server/index.ts +39 -0
- package/plugins/ragents.watch/server/observation.ts +69 -0
- package/plugins/ragents.watch/server/service.ts +294 -0
- package/plugins/ragents.workspace/client/transport.ts +13 -0
- package/plugins/ragents.workspace/client/workspace-client.ts +247 -0
- package/plugins/ragents.workspace/contract.ts +182 -0
- package/plugins/ragents.workspace/prompt.hbs +14 -0
- package/plugins/ragents.workspace/server/binding.ts +92 -0
- package/plugins/ragents.workspace/server/browse-route.ts +134 -0
- package/plugins/ragents.workspace/server/clients.ts +161 -0
- package/plugins/ragents.workspace/server/index.ts +91 -0
- package/plugins/ragents.workspace/server/runtime.ts +170 -0
- package/plugins/ragents.workspace/web/FileBrowser.tsx +271 -0
- package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +216 -0
- package/plugins/ragents.workspace/web/api.ts +8 -0
- package/plugins/ragents.workspace/web/file-icons.tsx +94 -0
- package/plugins/ragents.workspace/web/index.tsx +37 -0
- package/ragents.config.core.ts +65 -0
- package/ragents.config.developer.ts +46 -0
- package/scripts/agent/agent-cli.ts +461 -0
- package/scripts/agent/journal.ts +125 -0
- package/scripts/package/build-package.ts +249 -0
- package/scripts/package/host-links.d.mts +1 -0
- package/scripts/package/host-links.mjs +39 -0
- package/scripts/package/publish-package.ts +129 -0
- package/scripts/package/ragents.mjs +59 -0
- package/scripts/provision/run-provision.ts +72 -0
- package/scripts/remote/connect.ts +265 -0
- package/scripts/remote/start.ts +91 -0
- package/scripts/workspace-client/run-workspace-client.ts +112 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const THINKING_LABELS: Record<string, string> = {
|
|
2
|
+
off: "aus",
|
|
3
|
+
minimal: "minimal",
|
|
4
|
+
low: "niedrig",
|
|
5
|
+
medium: "mittel",
|
|
6
|
+
high: "hoch",
|
|
7
|
+
xhigh: "sehr hoch",
|
|
8
|
+
max: "maximal",
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export const thinkingLabel = (level: string) => THINKING_LABELS[level] ?? level;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { useMemo, useSyncExternalStore } from "react";
|
|
2
|
+
|
|
3
|
+
export function subscribeStorageChanges(browser: Window, matchesKey: (key: string) => boolean, listener: (event: StorageEvent) => void) {
|
|
4
|
+
const onStorage = (event: StorageEvent) => {
|
|
5
|
+
if (event.key === null || matchesKey(event.key)) listener(event);
|
|
6
|
+
};
|
|
7
|
+
browser.addEventListener("storage", onStorage);
|
|
8
|
+
return () => browser.removeEventListener("storage", onStorage);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function createLocalStorageSetting<T>({ changeEvent, matchesKey, parse, serialize }: {
|
|
12
|
+
changeEvent: string;
|
|
13
|
+
matchesKey: (key: string) => boolean;
|
|
14
|
+
parse: (raw: string | null) => T;
|
|
15
|
+
serialize: (value: T) => string;
|
|
16
|
+
}) {
|
|
17
|
+
const subscribe = (listener: () => void) => {
|
|
18
|
+
const unsubscribeStorage = subscribeStorageChanges(window, matchesKey, (event) => {
|
|
19
|
+
if (event.storageArea === window.localStorage) listener();
|
|
20
|
+
});
|
|
21
|
+
window.addEventListener(changeEvent, listener);
|
|
22
|
+
return () => {
|
|
23
|
+
window.removeEventListener(changeEvent, listener);
|
|
24
|
+
unsubscribeStorage();
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
useValue(key: string): T {
|
|
29
|
+
const raw = useSyncExternalStore(subscribe, () => window.localStorage.getItem(key), () => null);
|
|
30
|
+
return useMemo(() => parse(raw), [raw]);
|
|
31
|
+
},
|
|
32
|
+
save(key: string, value: T) {
|
|
33
|
+
const raw = serialize(value);
|
|
34
|
+
parse(raw);
|
|
35
|
+
window.localStorage.setItem(key, raw);
|
|
36
|
+
window.dispatchEvent(new Event(changeEvent));
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import "./ui/tailwind.css";
|
|
2
|
+
// Fremde Klassen von highlight.js und react-diff-view; hier statt in den Komponenten, die auch Mini-Apps bündeln.
|
|
3
|
+
import "./highlighting.css";
|
|
4
|
+
import "./diff-view.css";
|
|
5
|
+
import { StrictMode } from "react";
|
|
6
|
+
import { createRoot } from "react-dom/client";
|
|
7
|
+
import { Button } from "./ui";
|
|
8
|
+
import { App } from "./App";
|
|
9
|
+
import { AccessGate, AccessScreen } from "./AccessContext";
|
|
10
|
+
import { initializeTheme } from "./theme";
|
|
11
|
+
|
|
12
|
+
const root = document.getElementById("root");
|
|
13
|
+
if (!root) throw new Error("Root-Element fehlt");
|
|
14
|
+
|
|
15
|
+
const reactRoot = createRoot(root);
|
|
16
|
+
try {
|
|
17
|
+
const theme = initializeTheme(window);
|
|
18
|
+
import.meta.hot?.dispose(() => theme.dispose());
|
|
19
|
+
reactRoot.render(
|
|
20
|
+
<StrictMode>
|
|
21
|
+
<AccessGate><App /></AccessGate>
|
|
22
|
+
</StrictMode>,
|
|
23
|
+
);
|
|
24
|
+
} catch (cause) {
|
|
25
|
+
reactRoot.render(<AccessScreen>
|
|
26
|
+
<h1 className="my-3 text-[1.5rem]">Darstellung konnte nicht geladen werden</h1>
|
|
27
|
+
<p className="mb-6 leading-normal" role="alert">{cause instanceof Error ? cause.message : String(cause)}</p>
|
|
28
|
+
<Button onClick={() => window.location.reload()} variant="outline">Erneut laden</Button>
|
|
29
|
+
</AccessScreen>);
|
|
30
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { useSyncExternalStore } from "react";
|
|
2
|
+
import { subscribeStorageChanges } from "./lib/local-storage-setting";
|
|
3
|
+
|
|
4
|
+
export interface MaterialSettings {
|
|
5
|
+
steps: number;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const DEFAULT_MATERIAL_SETTINGS: MaterialSettings = Object.freeze({ steps: 1 });
|
|
9
|
+
export const MATERIAL_SETTINGS_LIMITS = { minSteps: 0, maxSteps: 5 };
|
|
10
|
+
export const MATERIAL_DEPTH_PER_STEP = 12;
|
|
11
|
+
export const MATERIAL_SETTINGS_STORAGE_KEY = "ragents.material-settings";
|
|
12
|
+
|
|
13
|
+
interface MaterialSettingsSnapshot {
|
|
14
|
+
settings: MaterialSettings;
|
|
15
|
+
error?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function parseMaterialSettings(raw: string | null): MaterialSettings {
|
|
19
|
+
if (raw === null) return DEFAULT_MATERIAL_SETTINGS;
|
|
20
|
+
const value: unknown = JSON.parse(raw);
|
|
21
|
+
if (!value || typeof value !== "object" || !("steps" in value)
|
|
22
|
+
|| typeof value.steps !== "number" || !Number.isInteger(value.steps) || value.steps < MATERIAL_SETTINGS_LIMITS.minSteps || value.steps > MATERIAL_SETTINGS_LIMITS.maxSteps) {
|
|
23
|
+
throw new Error("Ungültiges Material: Tiefenstufen müssen eine ganze Zahl von 0 bis 5 sein. Bitte die Materialeinstellungen zurücksetzen.");
|
|
24
|
+
}
|
|
25
|
+
return Object.freeze({ steps: value.steps });
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const errorMessage = (cause: unknown) => cause instanceof Error ? cause.message : String(cause);
|
|
29
|
+
const serverSnapshot: MaterialSettingsSnapshot = { settings: DEFAULT_MATERIAL_SETTINGS };
|
|
30
|
+
const getServerSnapshot = () => serverSnapshot;
|
|
31
|
+
const subscribeServer = () => () => {};
|
|
32
|
+
|
|
33
|
+
export function createMaterialSettingsStore(browser: Window) {
|
|
34
|
+
let snapshot: MaterialSettingsSnapshot;
|
|
35
|
+
try {
|
|
36
|
+
snapshot = { settings: parseMaterialSettings(browser.localStorage.getItem(MATERIAL_SETTINGS_STORAGE_KEY)) };
|
|
37
|
+
} catch (cause) {
|
|
38
|
+
snapshot = { settings: DEFAULT_MATERIAL_SETTINGS, error: `Das gespeicherte Material konnte nicht geladen werden. Die Standardwerte werden angezeigt. ${errorMessage(cause)}` };
|
|
39
|
+
}
|
|
40
|
+
const listeners = new Set<() => void>();
|
|
41
|
+
let disposed = false;
|
|
42
|
+
const publish = (next: MaterialSettingsSnapshot) => {
|
|
43
|
+
if (snapshot.settings.steps === next.settings.steps && snapshot.error === next.error) return;
|
|
44
|
+
snapshot = next;
|
|
45
|
+
for (const listener of listeners) listener();
|
|
46
|
+
};
|
|
47
|
+
const report = (message: string) => publish({ ...snapshot, error: message });
|
|
48
|
+
const storageChanged = (event: StorageEvent) => {
|
|
49
|
+
try {
|
|
50
|
+
const storage = browser.localStorage;
|
|
51
|
+
if (event.storageArea !== storage) return;
|
|
52
|
+
publish({ settings: parseMaterialSettings(storage.getItem(MATERIAL_SETTINGS_STORAGE_KEY)) });
|
|
53
|
+
} catch (cause) {
|
|
54
|
+
report(`Das Material aus einem anderen Browser-Tab konnte nicht übernommen werden. ${errorMessage(cause)}`);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const unsubscribeStorage = subscribeStorageChanges(browser, (key) => key === MATERIAL_SETTINGS_STORAGE_KEY, storageChanged);
|
|
58
|
+
return {
|
|
59
|
+
getSnapshot: () => snapshot,
|
|
60
|
+
subscribe(listener: () => void) {
|
|
61
|
+
if (disposed) throw new Error("Die Materialeinstellungen wurden bereits beendet.");
|
|
62
|
+
listeners.add(listener);
|
|
63
|
+
return () => { listeners.delete(listener); };
|
|
64
|
+
},
|
|
65
|
+
save(settings: MaterialSettings) {
|
|
66
|
+
if (disposed) throw new Error("Die Materialeinstellungen wurden bereits beendet.");
|
|
67
|
+
try {
|
|
68
|
+
const next = parseMaterialSettings(JSON.stringify(settings));
|
|
69
|
+
browser.localStorage.setItem(MATERIAL_SETTINGS_STORAGE_KEY, JSON.stringify(next));
|
|
70
|
+
publish({ settings: next });
|
|
71
|
+
} catch (cause) {
|
|
72
|
+
report(`Das Material konnte nicht gespeichert werden. ${errorMessage(cause)}`);
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
reset() {
|
|
76
|
+
if (disposed) throw new Error("Die Materialeinstellungen wurden bereits beendet.");
|
|
77
|
+
try {
|
|
78
|
+
browser.localStorage.removeItem(MATERIAL_SETTINGS_STORAGE_KEY);
|
|
79
|
+
publish({ settings: DEFAULT_MATERIAL_SETTINGS });
|
|
80
|
+
return true;
|
|
81
|
+
} catch (cause) {
|
|
82
|
+
report(`Das Material konnte nicht zurückgesetzt werden. ${errorMessage(cause)}`);
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
dispose() {
|
|
87
|
+
if (disposed) return;
|
|
88
|
+
disposed = true;
|
|
89
|
+
unsubscribeStorage();
|
|
90
|
+
listeners.clear();
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
let activeStore: ReturnType<typeof createMaterialSettingsStore> | undefined;
|
|
96
|
+
const materialSettingsStore = () => activeStore ??= createMaterialSettingsStore(window);
|
|
97
|
+
|
|
98
|
+
export function useMaterialSettings(): MaterialSettingsSnapshot {
|
|
99
|
+
const store = typeof window === "undefined" ? undefined : materialSettingsStore();
|
|
100
|
+
return useSyncExternalStore(store?.subscribe ?? subscribeServer, store?.getSnapshot ?? getServerSnapshot, getServerSnapshot);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export const saveMaterialSettings = (settings: MaterialSettings): void => materialSettingsStore().save(settings);
|
|
104
|
+
export const resetMaterialSettings = (): boolean => materialSettingsStore().reset();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const modelDefaultsChangedEvent = "ragents-model-defaults-changed";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createContext, useContext } from "react";
|
|
2
|
+
|
|
3
|
+
/** Ein Host, der Webseiten außerhalb der Oberfläche zeigen kann, etwa VS Code im Simple Browser; ohne Host bleibt es beim eigenen Dialog mit iframe. */
|
|
4
|
+
export interface PageOpener {
|
|
5
|
+
open(url: string, title: string): void;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const PageOpenerContext = createContext<PageOpener | undefined>(undefined);
|
|
9
|
+
|
|
10
|
+
export const PageOpenerProvider = PageOpenerContext.Provider;
|
|
11
|
+
|
|
12
|
+
export function useOptionalPageOpener(): PageOpener | undefined {
|
|
13
|
+
return useContext(PageOpenerContext);
|
|
14
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { useState, type FormEvent } from "react";
|
|
2
|
+
import { Button, Input, Label } from "../ui";
|
|
3
|
+
import type { PanelAction, TargetView } from "./contract";
|
|
4
|
+
|
|
5
|
+
/** Die Anmeldung eines Ziels, direkt in seiner Karte: Benutzer und Passwort oder ein Zugangstoken. */
|
|
6
|
+
export function LoginForm({ target, mode, busy, send, submitLabel }: {
|
|
7
|
+
target: TargetView;
|
|
8
|
+
mode: "password" | "token";
|
|
9
|
+
busy: boolean;
|
|
10
|
+
send: (action: PanelAction) => void;
|
|
11
|
+
submitLabel: string;
|
|
12
|
+
}) {
|
|
13
|
+
const [user, setUser] = useState(target.loginUser ?? "");
|
|
14
|
+
const [password, setPassword] = useState("");
|
|
15
|
+
const [token, setToken] = useState("");
|
|
16
|
+
const complete = mode === "token" ? token.trim() !== "" : user.trim() !== "" && password !== "";
|
|
17
|
+
const field = `${target.name}-${mode}`;
|
|
18
|
+
const submit = (event: FormEvent) => {
|
|
19
|
+
event.preventDefault();
|
|
20
|
+
send(mode === "token" ? { action: "login", name: target.name, token } : { action: "login", name: target.name, user, password });
|
|
21
|
+
};
|
|
22
|
+
return <form className="grid gap-2.5" onSubmit={submit}>
|
|
23
|
+
{mode === "token"
|
|
24
|
+
? <div className="grid gap-1.5"><Label htmlFor={`token-${field}`}>Zugangstoken</Label><Input autoComplete="off" disabled={busy} id={`token-${field}`} onChange={(event) => setToken(event.target.value)} type="password" value={token} /></div>
|
|
25
|
+
: <>
|
|
26
|
+
<div className="grid gap-1.5"><Label htmlFor={`user-${field}`}>Benutzer</Label><Input autoComplete="username" disabled={busy} id={`user-${field}`} onChange={(event) => setUser(event.target.value)} value={user} /></div>
|
|
27
|
+
<div className="grid gap-1.5"><Label htmlFor={`password-${field}`}>Passwort</Label><Input autoComplete="current-password" disabled={busy} id={`password-${field}`} onChange={(event) => setPassword(event.target.value)} type="password" value={password} /></div>
|
|
28
|
+
</>}
|
|
29
|
+
<Button className="w-full" disabled={busy || !complete} size="sm" type="submit">{submitLabel}</Button>
|
|
30
|
+
</form>;
|
|
31
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { BookIcon, CodeIcon, PlusIcon, SettingsIcon } from "lucide-react";
|
|
2
|
+
import { Button, Card } from "../ui";
|
|
3
|
+
import type { PanelAction, PanelState, TargetEntry, TargetRun, TargetView } from "./contract";
|
|
4
|
+
import { LoginForm } from "./LoginForm";
|
|
5
|
+
import { runStateLabel, runTone, stateDetail, stateLabel, stateTone } from "./target-state";
|
|
6
|
+
|
|
7
|
+
export interface PanelPageProps {
|
|
8
|
+
readonly state: PanelState;
|
|
9
|
+
readonly send: (action: PanelAction) => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const rowClass = "flex w-full min-w-0 items-center gap-2 rounded-md px-2 py-1.5 text-left hover:bg-accent focus-visible:outline-2 focus-visible:outline-ring/60 focus-visible:-outline-offset-2 disabled:opacity-50";
|
|
13
|
+
|
|
14
|
+
function RunRow({ target, run, busy, send }: { target: TargetView; run: TargetRun; busy: boolean; send: PanelPageProps["send"] }) {
|
|
15
|
+
return <li>
|
|
16
|
+
<button className={rowClass} disabled={busy} onClick={() => send({ action: "openRun", name: target.name, runId: run.id })} type="button">
|
|
17
|
+
<span aria-hidden className={`size-[7px] flex-none rounded-full bg-current ${runTone(run)}`} />
|
|
18
|
+
<span className="min-w-0 flex-1 truncate text-[0.82rem] font-medium">{run.title}</span>
|
|
19
|
+
<span className={`flex-none text-[0.7rem] ${runTone(run)}`}>{runStateLabel(run)}</span>
|
|
20
|
+
</button>
|
|
21
|
+
</li>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function EntryRow({ target, entry, busy, send }: { target: TargetView; entry: TargetEntry; busy: boolean; send: PanelPageProps["send"] }) {
|
|
25
|
+
return <li>
|
|
26
|
+
<button className={rowClass} disabled={busy} onClick={() => send({ action: "newRun", name: target.name, entryId: entry.id })} title={entry.description} type="button">
|
|
27
|
+
{entry.action === "skill" ? <BookIcon aria-hidden className="size-3.5 flex-none text-muted-foreground" /> : <CodeIcon aria-hidden className="size-3.5 flex-none text-muted-foreground" />}
|
|
28
|
+
<span className="min-w-0 flex-1 truncate text-[0.82rem]">{entry.title}</span>
|
|
29
|
+
</button>
|
|
30
|
+
</li>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function TargetActions({ target, busy, send }: { target: TargetView; busy: boolean; send: PanelPageProps["send"] }) {
|
|
34
|
+
const state = target.state;
|
|
35
|
+
if (state.kind === "stopped") return <Button disabled={busy} onClick={() => send({ action: "connect", name: target.name })} size="sm" variant="secondary">{target.kind === "profile" ? "Starten" : "Verbinden"}</Button>;
|
|
36
|
+
if (state.kind === "unreachable" || state.kind === "failed") return <Button disabled={busy} onClick={() => send({ action: "connect", name: target.name })} size="sm" variant="secondary">Erneut versuchen</Button>;
|
|
37
|
+
if (state.kind === "connected") return <Button disabled={busy} onClick={() => send({ action: "disconnect", name: target.name })} size="sm" variant="ghost">{target.kind === "profile" ? "Stoppen" : "Trennen"}</Button>;
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function TargetCard({ target, send }: { target: TargetView; send: PanelPageProps["send"] }) {
|
|
42
|
+
const detail = stateDetail(target);
|
|
43
|
+
const connected = target.state.kind === "connected";
|
|
44
|
+
const busy = target.state.kind === "starting" || target.state.kind === "connecting";
|
|
45
|
+
return <Card className="gap-3 p-4">
|
|
46
|
+
<header className="grid gap-1">
|
|
47
|
+
<div className="flex min-w-0 items-center gap-2">
|
|
48
|
+
<strong className="min-w-0 flex-1 truncate text-[0.95rem] font-semibold">{target.name}</strong>
|
|
49
|
+
<span className={`flex-none text-[0.72rem] font-medium ${stateTone(target)}`}>{stateLabel(target)}</span>
|
|
50
|
+
</div>
|
|
51
|
+
<p className="truncate text-[0.72rem] text-muted-foreground" title={target.description}>{target.description}</p>
|
|
52
|
+
</header>
|
|
53
|
+
{detail && <p className="text-[0.75rem] leading-normal text-destructive [overflow-wrap:anywhere]" role="alert">{detail}</p>}
|
|
54
|
+
{target.problem && <p className="text-[0.75rem] leading-normal text-destructive [overflow-wrap:anywhere]" role="alert">{target.problem}</p>}
|
|
55
|
+
{target.state.kind === "login-required" && <LoginForm busy={busy} mode={target.state.mode} send={send} submitLabel="Anmelden" target={target} />}
|
|
56
|
+
{connected && <>
|
|
57
|
+
{target.runs.length > 0
|
|
58
|
+
? <ul className="-mx-2 grid gap-0.5">{target.runs.map((run) => <RunRow busy={busy} key={run.id} run={run} send={send} target={target} />)}</ul>
|
|
59
|
+
: <p className="text-[0.75rem] text-muted-foreground">Noch keine Runs.</p>}
|
|
60
|
+
{target.canCreate && <>
|
|
61
|
+
<Button disabled={busy} onClick={() => send({ action: "newRun", name: target.name })} size="sm" variant="secondary"><PlusIcon data-icon="inline-start" />Neuer Run</Button>
|
|
62
|
+
{target.entries.length > 0 && <details className="-mx-2">
|
|
63
|
+
<summary className="cursor-pointer rounded-md px-2 py-1 text-[0.72rem] font-semibold text-muted-foreground hover:bg-accent">Startvorlagen <span className="font-mono opacity-80">{target.entries.length}</span></summary>
|
|
64
|
+
<ul className="mt-1 grid gap-0.5">{target.entries.map((entry) => <EntryRow busy={busy} entry={entry} key={entry.id} send={send} target={target} />)}</ul>
|
|
65
|
+
</details>}
|
|
66
|
+
</>}
|
|
67
|
+
</>}
|
|
68
|
+
<footer className="flex flex-wrap items-center gap-2 empty:hidden">
|
|
69
|
+
<TargetActions busy={busy} send={send} target={target} />
|
|
70
|
+
{connected && target.user && <Button disabled={busy} onClick={() => send({ action: "logout", name: target.name })} size="sm" variant="ghost">Abmelden</Button>}
|
|
71
|
+
</footer>
|
|
72
|
+
</Card>;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Die Startseite des Panels: alle Ziele nebeneinander, je Ziel Zustand, Runs und Startvorlagen. */
|
|
76
|
+
export function OverviewPage({ state, send }: PanelPageProps) {
|
|
77
|
+
return <div className="grid gap-3">
|
|
78
|
+
<div className="flex items-center justify-between gap-2">
|
|
79
|
+
<h1 className="text-[1.15rem] font-semibold">Übersicht</h1>
|
|
80
|
+
<Button aria-label="Einstellungen" onClick={() => send({ action: "page", page: "settings" })} size="icon-sm" title="Einstellungen" variant="ghost"><SettingsIcon /></Button>
|
|
81
|
+
</div>
|
|
82
|
+
{state.problem && <p className="text-[0.8rem] leading-normal text-destructive [overflow-wrap:anywhere]" role="alert">{state.problem}</p>}
|
|
83
|
+
{state.targets.length === 0
|
|
84
|
+
? <Card className="gap-3 p-4">
|
|
85
|
+
<p className="text-[0.85rem] leading-normal text-muted-foreground">Noch kein Ziel. Lege einen Server oder ein lokales Profil an.</p>
|
|
86
|
+
<Button onClick={() => send({ action: "page", page: "settings" })}><PlusIcon data-icon="inline-start" />Ziel anlegen</Button>
|
|
87
|
+
</Card>
|
|
88
|
+
: state.targets.map((target) => <TargetCard key={target.name} send={send} target={target} />)}
|
|
89
|
+
</div>;
|
|
90
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { OverviewPage, type PanelPageProps } from "./OverviewPage";
|
|
2
|
+
import { SettingsPage } from "./SettingsPage";
|
|
3
|
+
|
|
4
|
+
/** Das Panel der Erweiterung ohne geöffneten Run: die Übersicht aller Ziele, dahinter die Einstellungsseite. */
|
|
5
|
+
export function PanelPage(props: PanelPageProps) {
|
|
6
|
+
return <main className="min-h-dvh p-3">
|
|
7
|
+
{props.state.page === "settings" ? <SettingsPage {...props} /> : <OverviewPage {...props} />}
|
|
8
|
+
</main>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { ArrowLeftIcon, FolderOpenIcon, PlusIcon, SettingsIcon, Trash2Icon } from "lucide-react";
|
|
2
|
+
import { useEffect, useState, type FormEvent } from "react";
|
|
3
|
+
import { Button, Card, Input, Label, Toggle } from "../ui";
|
|
4
|
+
import type { PanelAction, TargetView } from "./contract";
|
|
5
|
+
import { LoginForm } from "./LoginForm";
|
|
6
|
+
import type { PanelPageProps } from "./OverviewPage";
|
|
7
|
+
import { stateLabel, stateTone } from "./target-state";
|
|
8
|
+
|
|
9
|
+
const sectionTitleClass = "text-[0.8rem] font-semibold";
|
|
10
|
+
|
|
11
|
+
function Credentials({ target, busy, send }: { target: TargetView; busy: boolean; send: (action: PanelAction) => void }) {
|
|
12
|
+
const demanded = target.state.kind === "login-required" ? target.state.mode : "password";
|
|
13
|
+
const [mode, setMode] = useState<"password" | "token">(demanded);
|
|
14
|
+
return <details className="rounded-md border border-border-soft px-2.5 py-2">
|
|
15
|
+
<summary className="cursor-pointer text-[0.75rem] font-semibold text-muted-foreground">Anmeldedaten {target.savedLogin ? "(gespeichert)" : ""}</summary>
|
|
16
|
+
<div className="mt-2.5 grid gap-2.5">
|
|
17
|
+
<div className="flex gap-1.5">
|
|
18
|
+
<Toggle onPressedChange={() => setMode("password")} pressed={mode === "password"} size="sm" variant="outline">Benutzer</Toggle>
|
|
19
|
+
<Toggle onPressedChange={() => setMode("token")} pressed={mode === "token"} size="sm" variant="outline">Zugangstoken</Toggle>
|
|
20
|
+
</div>
|
|
21
|
+
<LoginForm busy={busy} mode={mode} send={send} submitLabel="Speichern und anmelden" target={target} />
|
|
22
|
+
{target.savedLogin && <Button disabled={busy} onClick={() => send({ action: "logout", name: target.name })} size="sm" variant="ghost">Anmeldedaten löschen</Button>}
|
|
23
|
+
</div>
|
|
24
|
+
</details>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function TargetRow({ target, send }: { target: TargetView; send: (action: PanelAction) => void }) {
|
|
28
|
+
const [confirming, setConfirming] = useState(false);
|
|
29
|
+
const busy = target.state.kind === "starting" || target.state.kind === "connecting";
|
|
30
|
+
return <Card className="gap-2.5 p-3.5">
|
|
31
|
+
<div className="flex min-w-0 items-start gap-2">
|
|
32
|
+
<span className="min-w-0 flex-1">
|
|
33
|
+
<strong className="block truncate text-[0.9rem] font-semibold">{target.name}</strong>
|
|
34
|
+
<span className="block truncate text-[0.72rem] text-muted-foreground" title={target.description}>{target.description}</span>
|
|
35
|
+
<span className={`block text-[0.7rem] ${stateTone(target)}`}>{stateLabel(target)}</span>
|
|
36
|
+
</span>
|
|
37
|
+
{confirming
|
|
38
|
+
? <span className="flex flex-none items-center gap-1">
|
|
39
|
+
<Button disabled={busy} onClick={() => send({ action: "remove", name: target.name })} size="xs" variant="destructive">Entfernen</Button>
|
|
40
|
+
<Button onClick={() => setConfirming(false)} size="xs" variant="ghost">Nein</Button>
|
|
41
|
+
</span>
|
|
42
|
+
: <Button aria-label={`${target.name} entfernen`} disabled={busy} onClick={() => setConfirming(true)} size="icon-sm" variant="ghost"><Trash2Icon /></Button>}
|
|
43
|
+
</div>
|
|
44
|
+
{target.problem && <p className="text-[0.75rem] leading-normal text-destructive [overflow-wrap:anywhere]" role="alert">{target.problem}</p>}
|
|
45
|
+
{target.kind === "server" && <Credentials busy={busy} send={send} target={target} />}
|
|
46
|
+
</Card>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function AddServer({ send }: { send: (action: PanelAction) => void }) {
|
|
50
|
+
const [name, setName] = useState("");
|
|
51
|
+
const [url, setUrl] = useState("");
|
|
52
|
+
const submit = (event: FormEvent) => {
|
|
53
|
+
event.preventDefault();
|
|
54
|
+
send({ action: "addServer", name, url });
|
|
55
|
+
setName("");
|
|
56
|
+
setUrl("");
|
|
57
|
+
};
|
|
58
|
+
return <form className="grid gap-2.5" onSubmit={submit}>
|
|
59
|
+
<h2 className={sectionTitleClass}>Server hinzufügen</h2>
|
|
60
|
+
<div className="grid gap-1.5"><Label htmlFor="server-name">Name</Label><Input id="server-name" onChange={(event) => setName(event.target.value)} placeholder="Werkstatt" value={name} /></div>
|
|
61
|
+
<div className="grid gap-1.5"><Label htmlFor="server-url">Adresse</Label><Input id="server-url" onChange={(event) => setUrl(event.target.value)} placeholder="https://werkstatt.example.com" value={url} /></div>
|
|
62
|
+
<Button disabled={!name.trim() || !url.trim()} size="sm" type="submit"><PlusIcon data-icon="inline-start" />Server anlegen</Button>
|
|
63
|
+
</form>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function AddProfile({ picked, send }: { picked: string | undefined; send: (action: PanelAction) => void }) {
|
|
67
|
+
const [name, setName] = useState("");
|
|
68
|
+
const [profileFile, setProfileFile] = useState("");
|
|
69
|
+
useEffect(() => { if (picked) setProfileFile(picked); }, [picked]);
|
|
70
|
+
const submit = (event: FormEvent) => {
|
|
71
|
+
event.preventDefault();
|
|
72
|
+
send({ action: "addProfile", name, profileFile });
|
|
73
|
+
setName("");
|
|
74
|
+
setProfileFile("");
|
|
75
|
+
};
|
|
76
|
+
return <form className="grid gap-2.5" onSubmit={submit}>
|
|
77
|
+
<h2 className={sectionTitleClass}>Lokales Profil hinzufügen</h2>
|
|
78
|
+
<div className="grid gap-1.5"><Label htmlFor="profile-name">Name</Label><Input id="profile-name" onChange={(event) => setName(event.target.value)} placeholder="core" value={name} /></div>
|
|
79
|
+
<div className="grid gap-1.5"><Label htmlFor="profile-file">Profildatei</Label><Input id="profile-file" onChange={(event) => setProfileFile(event.target.value)} placeholder="~/repos/RAgents/ragents.config.core.ts" value={profileFile} /></div>
|
|
80
|
+
<div className="flex flex-wrap gap-2">
|
|
81
|
+
<Button onClick={() => send({ action: "pickProfile" })} size="sm" type="button" variant="ghost"><FolderOpenIcon data-icon="inline-start" />Datei wählen ...</Button>
|
|
82
|
+
<Button className="flex-1" disabled={!name.trim() || !profileFile.trim()} size="sm" type="submit"><PlusIcon data-icon="inline-start" />Profil anlegen</Button>
|
|
83
|
+
</div>
|
|
84
|
+
</form>;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Eine Seite für alles, was eingerichtet wird: Ziele anlegen und entfernen, Anmeldedaten je Server. */
|
|
88
|
+
export function SettingsPage({ state, send }: PanelPageProps) {
|
|
89
|
+
return <div className="grid gap-3">
|
|
90
|
+
<div className="flex items-center gap-2">
|
|
91
|
+
<Button aria-label="Zur Übersicht" onClick={() => send({ action: "page", page: "overview" })} size="icon-sm" title="Zur Übersicht" variant="ghost"><ArrowLeftIcon /></Button>
|
|
92
|
+
<h1 className="min-w-0 flex-1 text-[1.15rem] font-semibold">Einstellungen</h1>
|
|
93
|
+
<Button aria-label="Einstellung öffnen" onClick={() => send({ action: "settingsFile" })} size="icon-sm" title="Einstellung öffnen (settings.json)" variant="ghost"><SettingsIcon /></Button>
|
|
94
|
+
</div>
|
|
95
|
+
{state.problem && <p className="text-[0.8rem] leading-normal text-destructive [overflow-wrap:anywhere]" role="alert">{state.problem}</p>}
|
|
96
|
+
{state.targets.length === 0
|
|
97
|
+
? <p className="text-[0.85rem] leading-normal text-muted-foreground">Noch kein Ziel.</p>
|
|
98
|
+
: state.targets.map((target) => <TargetRow key={target.name} send={send} target={target} />)}
|
|
99
|
+
<Card className="gap-4 p-4"><AddServer send={send} /></Card>
|
|
100
|
+
<Card className="gap-4 p-4"><AddProfile picked={state.pickedProfileFile} send={send} /></Card>
|
|
101
|
+
</div>;
|
|
102
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { ColumnTheme } from "../column/host-contract";
|
|
2
|
+
|
|
3
|
+
/** Ein Ziel der Erweiterung: ein RAgents-Server oder ein lokales Profil, das sie selbst startet. */
|
|
4
|
+
export type TargetKind = "server" | "profile";
|
|
5
|
+
|
|
6
|
+
export type TargetState =
|
|
7
|
+
| { readonly kind: "stopped" }
|
|
8
|
+
| { readonly kind: "starting"; readonly detail?: string }
|
|
9
|
+
| { readonly kind: "connecting" }
|
|
10
|
+
| { readonly kind: "connected" }
|
|
11
|
+
| { readonly kind: "unreachable"; readonly message: string }
|
|
12
|
+
| { readonly kind: "login-required"; readonly mode: "password" | "token" }
|
|
13
|
+
| { readonly kind: "forbidden"; readonly message: string }
|
|
14
|
+
| { readonly kind: "failed"; readonly message: string };
|
|
15
|
+
|
|
16
|
+
export interface TargetRun {
|
|
17
|
+
readonly id: string;
|
|
18
|
+
readonly title: string;
|
|
19
|
+
readonly state: "running" | "waiting" | "idle" | "ended";
|
|
20
|
+
readonly questions: number;
|
|
21
|
+
readonly updatedAt: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface TargetEntry {
|
|
25
|
+
readonly id: string;
|
|
26
|
+
readonly title: string;
|
|
27
|
+
readonly description: string;
|
|
28
|
+
readonly action: "skill" | "script";
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface TargetView {
|
|
32
|
+
readonly name: string;
|
|
33
|
+
readonly kind: TargetKind;
|
|
34
|
+
/** Adresse des Servers oder Profil samt Pfad. */
|
|
35
|
+
readonly description: string;
|
|
36
|
+
readonly state: TargetState;
|
|
37
|
+
readonly runs: readonly TargetRun[];
|
|
38
|
+
readonly entries: readonly TargetEntry[];
|
|
39
|
+
/** Neue Runs sind erlaubt; ohne das Recht bleibt nur die Liste. */
|
|
40
|
+
readonly canCreate: boolean;
|
|
41
|
+
/** Der angemeldete Benutzer, sofern der Server Benutzer führt. */
|
|
42
|
+
readonly user?: string;
|
|
43
|
+
/** Die zuletzt versuchte Kennung; das Anmeldeformular übernimmt sie. */
|
|
44
|
+
readonly loginUser?: string;
|
|
45
|
+
/** Anmeldedaten liegen in der SecretStorage, damit sich das Ziel still anmeldet. */
|
|
46
|
+
readonly savedLogin?: boolean;
|
|
47
|
+
/** Fehler der letzten Aktion an diesem Ziel, direkt in seiner Karte. */
|
|
48
|
+
readonly problem?: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface PanelState {
|
|
52
|
+
readonly theme: ColumnTheme;
|
|
53
|
+
readonly page: "overview" | "settings";
|
|
54
|
+
readonly targets: readonly TargetView[];
|
|
55
|
+
/** Die Einstellung ragents.connections ist fehlerhaft; die Seite nennt den Grund. */
|
|
56
|
+
readonly problem?: string;
|
|
57
|
+
/** Der zuletzt über den Dateidialog gewählte Profilpfad; das Formular übernimmt ihn. */
|
|
58
|
+
readonly pickedProfileFile?: string;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Der Zustand kommt von der Erweiterung, zuerst eingebettet in die Seite, danach als Nachricht. */
|
|
62
|
+
export interface PanelStateMessage {
|
|
63
|
+
readonly type: "ragents.panel.state";
|
|
64
|
+
readonly state: PanelState;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Was die Panelseite an die Erweiterung schickt. */
|
|
68
|
+
export type PanelAction =
|
|
69
|
+
| { readonly action: "page"; readonly page: "overview" | "settings" }
|
|
70
|
+
| { readonly action: "settingsFile" }
|
|
71
|
+
| { readonly action: "pickProfile" }
|
|
72
|
+
| { readonly action: "addServer"; readonly name: string; readonly url: string }
|
|
73
|
+
| { readonly action: "addProfile"; readonly name: string; readonly profileFile: string }
|
|
74
|
+
| { readonly action: "remove" | "connect" | "disconnect" | "logout"; readonly name: string }
|
|
75
|
+
| { readonly action: "login"; readonly name: string; readonly user: string; readonly password: string }
|
|
76
|
+
| { readonly action: "login"; readonly name: string; readonly token: string }
|
|
77
|
+
| { readonly action: "openRun"; readonly name: string; readonly runId: string }
|
|
78
|
+
| { readonly action: "newRun"; readonly name: string; readonly entryId?: string };
|
|
79
|
+
|
|
80
|
+
export type PanelActionMessage = PanelAction & { readonly type: "ragents.panel" };
|
|
81
|
+
|
|
82
|
+
const text = (value: unknown, key: string): boolean => typeof (value as Record<string, unknown>)[key] === "string";
|
|
83
|
+
|
|
84
|
+
export const isPanelActionMessage = (value: unknown): value is PanelActionMessage => {
|
|
85
|
+
if (typeof value !== "object" || value === null || (value as { type?: unknown }).type !== "ragents.panel") return false;
|
|
86
|
+
switch ((value as { action?: unknown }).action) {
|
|
87
|
+
case "page": return (value as { page?: unknown }).page === "overview" || (value as { page?: unknown }).page === "settings";
|
|
88
|
+
case "settingsFile": case "pickProfile": return true;
|
|
89
|
+
case "addServer": return text(value, "name") && text(value, "url");
|
|
90
|
+
case "addProfile": return text(value, "name") && text(value, "profileFile");
|
|
91
|
+
case "remove": case "connect": case "disconnect": case "logout": return text(value, "name");
|
|
92
|
+
case "login": return text(value, "name") && (text(value, "token") || (text(value, "user") && text(value, "password")));
|
|
93
|
+
case "openRun": return text(value, "name") && text(value, "runId");
|
|
94
|
+
case "newRun": return text(value, "name") && ((value as { entryId?: unknown }).entryId === undefined || text(value, "entryId"));
|
|
95
|
+
default: return false;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export const isPanelStateMessage = (value: unknown): value is PanelStateMessage =>
|
|
100
|
+
typeof value === "object" && value !== null && (value as { type?: unknown }).type === "ragents.panel.state"
|
|
101
|
+
&& typeof (value as { state?: unknown }).state === "object";
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { TargetRun, TargetView } from "./contract";
|
|
2
|
+
|
|
3
|
+
/** Wie der Zustand eines Ziels in seiner Karte steht; ein lokales Profil ist nicht getrennt, sondern nicht gestartet. */
|
|
4
|
+
export const stateLabel = (target: TargetView): string => {
|
|
5
|
+
switch (target.state.kind) {
|
|
6
|
+
case "stopped": return target.kind === "profile" ? "nicht gestartet" : "getrennt";
|
|
7
|
+
case "starting": return target.state.detail ?? (target.kind === "profile" ? "startet ..." : "verbindet ...");
|
|
8
|
+
case "connecting": return "verbindet ...";
|
|
9
|
+
case "connected": return target.user ? `verbunden als ${target.user}` : "verbunden";
|
|
10
|
+
case "unreachable": return "nicht erreichbar";
|
|
11
|
+
case "login-required": return target.state.mode === "token" ? "Zugangstoken nötig" : "Anmeldung nötig";
|
|
12
|
+
case "forbidden": return "kein Zugriff";
|
|
13
|
+
case "failed": return "Start fehlgeschlagen";
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const stateTone = (target: TargetView): string => {
|
|
18
|
+
switch (target.state.kind) {
|
|
19
|
+
case "connected": return "text-success";
|
|
20
|
+
case "starting":
|
|
21
|
+
case "connecting": return "text-info";
|
|
22
|
+
case "login-required": return "text-warning";
|
|
23
|
+
case "unreachable":
|
|
24
|
+
case "forbidden":
|
|
25
|
+
case "failed": return "text-destructive";
|
|
26
|
+
case "stopped": return "text-muted-foreground";
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/** Der Grund, der zum Zustand gehört; er steht unter der Kopfzeile der Karte. */
|
|
31
|
+
export const stateDetail = (target: TargetView): string | undefined => {
|
|
32
|
+
const state = target.state;
|
|
33
|
+
if (state.kind === "unreachable" || state.kind === "forbidden" || state.kind === "failed") return state.message;
|
|
34
|
+
return undefined;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const runStateLabel = (run: TargetRun): string => {
|
|
38
|
+
switch (run.state) {
|
|
39
|
+
case "running": return "läuft";
|
|
40
|
+
case "waiting": return run.questions === 1 ? "1 Rückfrage" : `${run.questions} Rückfragen`;
|
|
41
|
+
case "ended": return "beendet";
|
|
42
|
+
case "idle": return "ruht";
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export const runTone = (run: TargetRun): string => {
|
|
47
|
+
switch (run.state) {
|
|
48
|
+
case "running": return "text-info";
|
|
49
|
+
case "waiting": return "text-warning";
|
|
50
|
+
case "ended": return "text-muted-foreground";
|
|
51
|
+
case "idle": return "text-muted-foreground";
|
|
52
|
+
}
|
|
53
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import "./ui/tailwind.css";
|
|
2
|
+
import { StrictMode, useEffect, useState } from "react";
|
|
3
|
+
import { createRoot } from "react-dom/client";
|
|
4
|
+
import { PanelPage } from "./panel/PanelPage";
|
|
5
|
+
import { isPanelStateMessage, type PanelAction, type PanelState } from "./panel/contract";
|
|
6
|
+
import { initializeTheme } from "./theme";
|
|
7
|
+
|
|
8
|
+
declare function acquireVsCodeApi(): { postMessage(message: unknown): void };
|
|
9
|
+
|
|
10
|
+
const root = document.getElementById("root");
|
|
11
|
+
const embedded = document.getElementById("state");
|
|
12
|
+
if (!root || !embedded?.textContent) throw new Error("Root-Element oder eingebetteter Zustand fehlt");
|
|
13
|
+
|
|
14
|
+
const vscode = acquireVsCodeApi();
|
|
15
|
+
const initial = JSON.parse(embedded.textContent) as PanelState;
|
|
16
|
+
const theme = initializeTheme(window);
|
|
17
|
+
|
|
18
|
+
function App() {
|
|
19
|
+
const [state, setState] = useState(initial);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
const listener = (event: MessageEvent) => { if (isPanelStateMessage(event.data)) setState(event.data.state); };
|
|
22
|
+
window.addEventListener("message", listener);
|
|
23
|
+
return () => window.removeEventListener("message", listener);
|
|
24
|
+
}, []);
|
|
25
|
+
useEffect(() => theme.setPreference(state.theme), [state.theme]);
|
|
26
|
+
const send = (action: PanelAction) => vscode.postMessage({ type: "ragents.panel", ...action });
|
|
27
|
+
return <PanelPage send={send} state={state} />;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
createRoot(root).render(<StrictMode><App /></StrictMode>);
|